PIR Operator Reference
This section is a quick reference to PIR instructions. For more details and the latest changes, see imcc/docs/syntax.pod or dive into the source code in imcc/imcc.l and imcc/imcc.y.
=
R<DEST> = R<VAL>
Assign a value to a particular register, temporary register, or named variable.
+, +=
R<DEST> = R<VAL> + R<VAL> R<DEST> += R<VAL>
Add two numbers or PMCs.
-, -=
R<DEST> = R<VAL1> - R<VAL2> R<DEST> -= R<VAL1> R<DEST> = - R<VAL>
Subtract VAL1 from VAL2. The unary "-
" negates a number.
*, *=
R<DEST> = R<VAL> * R<VAL> R<DEST> *= R<VAL>
Multiply two numbers or PMCs.
/, /=
R<DEST> = R<VAL1> / R<VAL2> R<DEST> /= R<VAL1>
Divide VAL1 by VAL2.
**
R<DEST> = R<VAL1> ** R<VAL2>
Raise VAL1 to the power of VAL2.
%, %=
R<DEST> = R<VAL1> % R<VAL2> R<DEST> %= R<VAL1>
Divide VAL1 by VAL2 and return the (mod
) remainder.
., .=
R<DEST> = R<VAL> . R<VAL> R<DEST> .= R<VAL>
Concatenate two strings. The concat operator must be surrounded by whitespace.
<
if R<VAL1> E<lt> R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is less than VAL2.
<=
if R<VAL1> E<lt>= R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is less than or equal to VAL2.
>
if R<VAL1> E<gt> R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is greater than VAL2.
>=
if R<VAL1> E<gt>= R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is greater than or equal to VAL2.
==
if R<VAL1> == R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is equal to VAL2.
!=
if R<VAL1> != R<VAL2> goto R<LABEL>
Conditionally branch to a label if VAL1 is not equal to VAL2.
&&
R<DEST> = R<VAL1> && R<VAL2>
Logical AND. Return VAL1 if it's false, otherwise return VAL2.
||
R<DEST> = R<VAL1> || R<VAL2>
Logical OR. Return VAL1 if it's true, otherwise return VAL2.
~~
R<DEST> = R<VAL1> ~~ R<VAL2>
Logical XOR. If VAL1 is true and VAL2 is false, return VAL1. If VAL1 is false and VAL2 is true, return VAL2. Otherwise, return a false value.
!
R<DEST> = ! R<VAL>
Logical NOT. Return a true value if VAL is false.
&, &=
R<DEST> = R<VAL> & R<VAL> R<DEST> &= R<VAL>
Bitwise AND on two values.
|, |=
R<DEST> = R<VAL> | R<VAL> R<DEST> |= R<VAL>
Bitwise OR on two values.
~, ~=
R<DEST> = R<VAL> ~ R<VAL> R<DEST> ~= R<VAL> R<DEST> = ~ R<VAL>
Bitwise XOR on two values. The unary form is a bitwise NOT on a value.
<<, <<=
R<DEST> = R<VAL1> E<lt>E<lt> R<VAL2> R<DEST> E<lt>E<lt>= R<VAL2>
Bitwise shift VAL1 left by VAL2 number of bits.
>>, >>=
R<DEST> = R<VAL1> E<gt>E<gt> R<VAL2> R<DEST> E<gt>E<gt>= R<VAL2>
Bitwise shift VAL1 right by VAL2 number of bits.
>>>, >>>=
R<DEST> = R<VAL1> E<gt>E<gt>E<gt> R<VAL2> R<DEST> E<gt>E<gt>E<gt>= R<VAL2>
Logically shift VAL1 right by VAL2 number of bits.
[ ]
R<DEST> = R<PMC> [ R<KEY> ] R<PMC> [ R<KEY> ] = R<VAL>
Indexed access to a PMC and indexed assignment to a PMC.
DEST = STRING [ OFFSET ] STRING [ OFFSET ] = VAL
Access a one-character substring on a string, starting at a particular offset, or assign to that substring.
call
call R<NAME>
Call the named subroutine (a .sub
label).
global
R<DEST> = global R<NAME> global R<NAME> = R<VAL>
Access a global variable for read or write.
goto
goto R<NAME>
Jump to the named identifier (label or subroutine name).
if
if R<EXPR> goto R<NAME>
If the value or expression evaluates as true, jump to the named identifier.
unless
unless R<VAL> goto R<NAME>
Unless the value evaluates as true, jump to the named identifier.