Syntax Reference
Prev |  |

## Syntax Reference

Name | Syntax | Description
COPY | `v0 = v1;` | Copy v1 into v0.
LOAD |
`* v1`
`*[spc]v1`
`*:2 v1`
`*[spc]:2 v1`
| Dereference v1 as pointer into default space. Optionally specify a space to load from and size of data in bytes.
STORE |
`*v0 = v1;`
`*[spc]v0 = v1;`
`*:4 v0 = v1;`
`*[spc]:4 v0 = v1;`
| Store in v1 in default space using v0 as pointer. Optionally specify space to store in and size of data in bytes.
BRANCH | `goto v0;` | Branch execution to address of v0.
CBRANCH | `if (v0) goto v1;` | Branch execution to address of v1 if v0 equals 1 (true).
BRANCHIND | `goto [v0];` | Branch execution to value in v0 viewed as an offset into the current space.
CALL | `call v0;` | Branch execution to address of v0. Hint that the branch is a subroutine call.
CALLIND | `call [v0];` | Branch execution to value in v0 viewed as an offset into the current space. Hint that the branch is a subroutine call.
RETURN | `return [v0];` | Branch execution to value in v0 viewed as an offset into the current space. Hint that the branch is a subroutine return.
PIECE | `<na>` | Concatenate two varnodes into a single varnode.
SUBPIECE | `v0:2` | The least significant n bytes of v0.
SUBPIECE | `v0(2)` | All but the least significant n bytes of v0.
POPCOUNT | `popcount(v0)` | Count 1 bits in v0.
LZCOUNT | `lzcount(v0)` | Counts the number of leading zero bits in v0.
INT_EQUAL | `v0 == v1` | True if v0 equals v1.
INT_NOTEQUAL | `v0 != v1` | True if v0 does not equal v1.
INT_LESS |
`v0 < v1`
`v1 > v0`
| True if v0 is less than v1 as an unsigned integer.
INT_SLESS |
`v0 s< v1`
`v1 s> v0`
| True if v0 is less than v1 as a signed integer.
INT_LESSEQUAL |
`v0 <= v1`
`v1 >= v0`
| True if v0 is less than or equal to v1 as an unsigned integer.
INT_SLESSEQUAL |
`v0 s<= v1`
`v1 s>= v0`
| True if v0 is less than or equal to v1 as a signed integer.
INT_ZEXT | `zext(v0)` | Zero extension of v0.
INT_SEXT | `sext(v0)` | Sign extension of v0.
INT_ADD | `v0 + v1` | Addition of v0 and v1 as integers.
INT_SUB | `v0 - v1` | Subtraction of v1 from v0 as integers.
INT_CARRY | `carry(v0,v1)` | True if adding v0 and v1 would produce an unsigned carry.
INT_SCARRY | `scarry(v0,v1)` | True if adding v0 and v1 would produce an signed carry.
INT_SBORROW | `sborrow(v0,v1)` | True if subtracting v1 from v0 would produce a signed borrow.
INT_2COMP | `-v0` | Twos complement of v0.
INT_NEGATE | `~v0` | Bitwise negation of v0.
INT_XOR | `v0 ^ v1` | Bitwise Exclusive Or of v0 with v1.
INT_AND | `v0 & v1` | Bitwise Logical And of v0 with v1.
INT_OR | `v0 | v1` | Bitwise Logical Or of v0 with v1.
INT_LEFT | `v0 << v1` | Left shift of v0 by v1 bits.
INT_RIGHT | `v0 >> v1` | Unsigned (logical) right shift of v0 by v1 bits.
INT_SRIGHT | `v0 s>> v1` | Signed (arithmetic) right shift of v0 by v1 bits.
INT_MULT | `v0 * v1` | Integer multiplication of v0 and v1.
INT_DIV | `v0 / v1` | Unsigned division of v0 by v1.
INT_REM | `v0 % v1` | Unsigned remainder of v0 modulo v1.
INT_SDIV | `v0 s/ v1` | Signed division of v0 by v1.
INT_SREM | `v0 s% v1` | Signed remainder of v0 modulo v1.
BOOL_NEGATE | `!v0` | Negation of boolean value v0.
BOOL_XOR | `v0 ^^ v1` | Exclusive-Or of booleans v0 and v1.
BOOL_AND | `v0 && v1` | Logical-And of booleans v0 and v1.
BOOL_OR | `v0 || v1` | Logical-Or of booleans v0 and v1.
FLOAT_EQUAL | `v0 f== v1` | True if v0 equals v1 viewed as floating-point numbers.
FLOAT_NOTEQUAL | `v0 f!= v1` | True if v0 does not equal v1 viewed as floating-point numbers.
FLOAT_LESS |
`v0 f< v1`
`v1 f> v0`
| True if v0 is less than v1 viewed as floating-point numbers.
FLOAT_LESSEQUAL |
`v0 f<= v1`
`v1 f>= v0`
| True if v0 is less than or equal to v1 viewed as floating-point numbers.
FLOAT_ADD | `v0 f+ v1` | Addition of v0 and v1 as floating-point numbers.
FLOAT_SUB | `v0 f- v1` | Subtraction of v1 from v0 as floating-point numbers.
FLOAT_MULT | `v0 f* v1` | Multiplication of v0 and v1 as floating-point numbers.
FLOAT_DIV | `v0 f/ v1` | Division of v0 by v1 as floating-point numbers.
FLOAT_NEG | `f- v0` | Additive inverse of v0 as a floating-point number.
FLOAT_ABS | `abs(v0)` | Absolute value of v0 as a floating-point number.
FLOAT_SQRT | `sqrt(v0)` | Square root of v0 as a floating-point number.
FLOAT_CEIL | `ceil(v0)` | Nearest integral floating-point value greater than v0, viewed as a floating-point number.
FLOAT_FLOOR | `floor(v0)` | Nearest integral floating-point value less than v0, viewed as a floating-point number.
FLOAT_ROUND | `round(v0)` | Nearest integral floating-point to v0, viewed as a floating-point number.
FLOAT_NAN | `nan(v0)` | True if v0 is not a valid floating-point number (NaN).
INT2FLOAT | `int2float(v0)` | Floating-point representation of v0 viewed as an integer.
FLOAT2FLOAT | `float2float(v0)` | Copy of floating-point number v0 with more or less precision.
TRUNC | `trunc(v0)` | Signed integer obtained by truncating v0 viewed as a floating-point number.
CPOOLREF | `cpool(v0,...)` | Obtain constant pool value.
NEW |
`newobject(v0)`
`newobject(v0,v1)`
| Allocate an object or an array of objects.
MULTIEQUAL | `<na>` | Compiler phi-node: values merging from multiple control-flow paths.
INDIRECT | `<na>` | Indirect effect from input varnode to output varnode.
CAST | `<na>` | Copy from input to output. A hint that the underlying datatype has changed.
PTRADD | `<na>` | Construct a pointer to an element from a pointer to the start of an array and an index.
PTRSUB | `<na>` | Construct a pointer to a field from a pointer to a structure and an offset.
INSERT | `<na>` | Insert a value as a bit-range into a varnode
EXTRACT | `<na>` | Extract a bit-range from a varnode

Prev |  |
Additional P-CODE Operations | Home |