Expand description
Encoding support for pulley bytecode.
Traits§
- Helper trait to encode instructions into a “sink”.
Functions§
low32(dst) = bitcast low32(src) as f32
dst = bitcast src as f64
low32(dst) = bitcast low32(src) as i32
dst = bitcast src as i64
- Conditionally transfer control to the given PC offset if
low32(cond)
contains a non-zero value. - Conditionally transfer control to the given PC offset if
low32(cond)
contains a zero value. - Branch if
a == b
. - Branch if
a == b
. - Branch if
a == b
. - Branch if
a == b
. - Branch if
a == b
. - Branch if
a == b
. - Branch if
a !=
b. - Branch if
a !=
b. - Branch if
a !=
b. - Branch if
a !=
b. - Branch if
a !=
b. - Branch if
a !=
b. - Branch if signed
a > b
. - Branch if signed
a > b
. - Branch if signed
a > b
. - Branch if signed
a > b
. - Branch if signed
a >= b
. - Branch if signed
a >= b
. - Branch if signed
a >= b
. - Branch if signed
a >= b
. - Branch if signed
a < b
. - Branch if signed
a < b
. - Branch if signed
a < b
. - Branch if signed
a < b
. - Branch if signed
a < b
. - Branch if signed
a < b
. - Branch if signed
a <= b
. - Branch if signed
a <= b
. - Branch if signed
a <= b
. - Branch if signed
a <= b
. - Branch if signed
a <= b
. - Branch if signed
a <= b
. - Branch if unsigned
a > b
. - Branch if unsigned
a > b
. - Branch if unsigned
a > b
. - Branch if unsigned
a > b
. - Branch if unsigned
a >= b
. - Branch if unsigned
a >= b
. - Branch if unsigned
a >= b
. - Branch if unsigned
a >= b
. - Branch if unsigned
a < b
. - Branch if unsigned
a < b
. - Branch if unsigned
a < b
. - Branch if unsigned
a < b
. - Branch if unsigned
a < b
. - Branch if unsigned
a < b
. - Branch if unsigned
a <= b
. - Branch if unsigned
a <= b
. - Branch if unsigned
a <= b
. - Branch if unsigned
a <= b
. - Branch if unsigned
a <= b
. - Branch if unsigned
a <= b
. - Branch to the label indicated by
low32(idx)
. dst = byteswap(low32(src))
dst = byteswap(src)
- Transfer control to the PC at the given offset and set the
lr
register to the PC just after this instruction. - Like
call
, but alsox0 = arg1
- Like
call
, but alsox0, x1 = arg1, arg2
- Like
call
, but alsox0, x1, x2 = arg1, arg2, arg3
- Like
call
, but alsox0, x1, x2, x3 = arg1, arg2, arg3, arg4
- Transfer control to the PC in
reg
and setlr
to the PC just after this instruction. - A special opcode to halt interpreter execution and yield control back to the host.
low32(dst) = demote(src)
low32(dst) = checked_f32_from_signed(low32(src))
low32(dst) = checked_f32_from_unsigned(low32(src))
low32(dst) = checked_f32_from_signed(src)
low32(dst) = checked_f32_from_unsigned(src)
(st) = promote(low32(src))
dst = checked_f64_from_signed(low32(src))
dst = checked_f64_from_unsigned(low32(src))
dst = checked_f64_from_signed(src)
dst = checked_f64_from_unsigned(src)
low32(dst) = |low32(src)|
dst = |src|
low32(dst) = low32(src1) + low32(src2)
dst = src1 + src2
low32(dst) = ieee_ceil(low32(src))
dst = ieee_ceil(src)
low32(dst) = bits
dst = bits
low32(dst) = copysign(low32(src1), low32(src2))
dst = copysign(src1, src2)
low32(dst) = low32(src1) / low32(src2)
dst = src1 / src2
low32(dst) = zext(src1 == src2)
low32(dst) = zext(src1 == src2)
low32(dst) = src[lane]
dst = src[lane]
low32(dst) = ieee_floor(low32(src))
dst = ieee_floor(src)
low32(dst) = zext(*addr)
low32(dst) = zext(*addr)
low32(dst) = zext(*addr)
low32(dst) = zext(*addr)
dst = *addr
dst = *addr
dst = *addr
dst = *addr
low32(dst) = zext(src1 < src2)
low32(dst) = zext(src1 < src2)
low32(dst) = zext(src1 <= src2)
low32(dst) = zext(src1 <= src2)
low32(dst) = ieee_maximum(low32(src1), low32(src2))
dst = ieee_maximum(src1, src2)
low32(dst) = ieee_minimum(low32(src1), low32(src2))
dst = ieee_minimum(src1, src2)
- Move between
f
registers. low32(dst) = low32(src1) * low32(src2)
dst = src1 * src2
low32(dst) = ieee_nearest(low32(src))
dst = ieee_nearest(src)
low32(dst) = -low32(src)
dst = -src
low32(dst) = zext(src1 != src2)
low32(dst) = zext(src1 != src2)
low32(dst) = low32(cond) ? low32(if_nonzero) : low32(if_zero)
dst = low32(cond) ? if_nonzero : if_zero
low32(dst) = ieee_sqrt(low32(src))
dst = ieee_sqrt(src)
*addr = low32(src)
*addr = low32(src)
*addr = low32(src)
*addr = low32(src)
*addr = src
*addr = src
*addr = src
*addr = src
low32(dst) = low32(src1) - low32(src2)
dst = src1 - src2
low32(dst) = ieee_trunc(low32(src))
dst = ieee_trunc(src)
- Unconditionally transfer control to the PC at the given offset.
- Do nothing.
sp = fp; pop fp; pop lr
- Inverse of
push_frame_save
. Restoresregs
from the top of the stack, then runsstack_free32 amt
, then runspop_frame
. push lr; push fp; fp = sp
- Macro-instruction to enter a function, allocate some stack, and then save some registers.
- Transfer control the address in the
lr
register. dst = sext(low8(src))
dst = sext(low16(src))
dst = sext(low32(src))
sp = sp.checked_sub(amt)
sp = sp + amt
- Raise a trap.
dst = |src|
dst = |src|
dst = |src|
dst = |src|
dst = |src|
dst = |src|
dst = src1 + src2
dst = src1 + src2
dst = src1 + src2
dst = satruating_add(src1, src2)
dst = src1 + src2
dst = satruating_add(src1, src2)
dst = src1 + src2
dst = src1 + src2
dst = [src1[0] + src1[1], ..., src2[6] + src2[7]]
dst = [src1[0] + src1[1], ..., src2[2] + src2[3]]
dst = satruating_add(src1, src2)
dst = satruating_add(src1, src2)
- Store whether all lanes are nonzero in
dst
. - Store whether all lanes are nonzero in
dst
. - Store whether all lanes are nonzero in
dst
. - Store whether any lanes are nonzero in
dst
. - Store whether any lanes are nonzero in
dst
. - Store whether any lanes are nonzero in
dst
. - Store whether any lanes are nonzero in
dst
. - Store whether any lanes are nonzero in
dst
. dst = (src1 + src2 + 1) // 2
dst = (src1 + src2 + 1) // 2
dst = src1 & src2
- Collect high bits of each lane into the low 32-bits of the destination.
- Collect high bits of each lane into the low 32-bits of the destination.
- Collect high bits of each lane into the low 32-bits of the destination.
- Collect high bits of each lane into the low 32-bits of the destination.
dst = (c & x) | (!c & y)
dst = !src1
dst = src1 | src2
dst = src1 ^ src2
low128(dst) = ieee_ceil(low128(src))
low128(dst) = ieee_ceil(low128(src))
dst = imm
low128(dst) = low128(src1) / low128(src2)
dst = src1 / src2
dst = src == dst
dst = src == dst
dst = src == dst
dst = src == dst
dst = src == dst
dst = src == dst
- Int-to-float conversion (same as
f32_from_x32_s
) - Int-to-float conversion (same as
f32_from_x32_u
) - Int-to-float conversion (same as
f64_from_x64_s
) - Int-to-float conversion (same as
f64_from_x64_u
) - Demotes the two f64x2 lanes to f32x2 and then extends with two more zero lanes.
low128(dst) = ieee_floor(low128(src))
low128(dst) = ieee_floor(low128(src))
dst = ieee_fma(a, b, c)
dst = ieee_fma(a, b, c)
- Promotes the low two lanes of the f32x4 input to f64x2.
- Float-to-int conversion (same as
x32_from_f32_s
- Float-to-int conversion (same as
x32_from_f32_u
- Float-to-int conversion (same as
x64_from_f64_s
- Float-to-int conversion (same as
x64_from_f64_u
dst = src1; dst[lane] = src2
dst = src1; dst[lane] = src2
dst = src1; dst[lane] = src2
dst = src1; dst[lane] = src2
dst = src1; dst[lane] = src2
dst = src1; dst[lane] = src2
- Load the 64-bit source as i8x8 and sign-extend to i16x8.
- Load the 64-bit source as u8x8 and zero-extend to i16x8.
- Load the 64-bit source as i16x4 and sign-extend to i32x4.
- Load the 64-bit source as u16x4 and zero-extend to i32x4.
- Load the 64-bit source as i32x2 and sign-extend to i64x2.
- Load the 64-bit source as u32x2 and zero-extend to i64x2.
dst = *(ptr + offset)
dst = *addr
dst = *(ptr + offset)
dst = src <= dst
dst = src <= dst
dst = src < dst
dst = src < dst
dst = max(src1, src2)
(signed)dst = max(src1, src2)
(unsigned)dst = max(src1, src2)
(signed)dst = max(src1, src2)
(unsigned)dst = max(src1, src2)
(signed)dst = max(src1, src2)
(unsigned)dst = ieee_maximum(src1, src2)
dst = ieee_maximum(src1, src2)
dst = min(src1, src2)
(signed)dst = min(src1, src2)
(unsigned)dst = min(src1, src2)
(signed)dst = min(src1, src2)
(unsigned)dst = min(src1, src2)
(signed)dst = min(src1, src2)
(unsigned)dst = ieee_minimum(src1, src2)
dst = ieee_minimum(src1, src2)
- Move between
v
registers. low128(dst) = low128(src1) * low128(src2)
dst = src1 * src2
dst = src1 * src2
dst = src1 * src2
dst = src1 * src2
dst = src1 * src2
- Narrows the two 16x8 vectors, assuming all input lanes are signed, to half the width. Narrowing is signed and saturating.
- Narrows the two 16x8 vectors, assuming all input lanes are signed, to half the width. Narrowing is unsigned and saturating.
- Narrows the two 32x4 vectors, assuming all input lanes are signed, to half the width. Narrowing is signed and saturating.
- Narrows the two 32x4 vectors, assuming all input lanes are signed, to half the width. Narrowing is unsigned and saturating.
- Narrows the two 64x2 vectors, assuming all input lanes are signed, to half the width. Narrowing is signed and saturating.
- Narrows the two 64x2 vectors, assuming all input lanes are signed, to half the width. Narrowing is unsigned and saturating.
low128(dst) = ieee_nearest(low128(src))
low128(dst) = ieee_nearest(low128(src))
dst = -src
dst = -src
dst = -src
dst = -src
low128(dst) = -low128(src)
dst = -src
dst = src != dst
dst = src != dst
dst = src != dst
dst = src != dst
dst = src != dst
dst = src != dst
dst = count_ones(src)
dst = signed_saturate(src1 * src2 + (1 << (Q - 1)) >> Q)
dst = low32(cond) ? if_nonzero : if_zero
dst = src1 << src2
dst = src1 << src2
dst = src1 << src2
dst = src1 << src2
dst = src1 >> src2
(signed)dst = src1 >> src2
(unsigned)dst = src1 >> src2
(signed)dst = src1 >> src2
(unsigned)dst = src1 >> src2
(signed)dst = src1 >> src2
(unsigned)dst = src1 >> src2
(signed)dst = src1 >> src2
(unsigned)dst = shuffle(src1, src2, mask)
dst = src < dst
(signed)dst = src < dst
(signed)dst = src < dst
(signed)dst = src < dst
(signed)dst = src <= dst
(signed)dst = src <= dst
(signed)dst = src <= dst
(signed)dst = src <= dst
(signed)dst = splat(low32(src))
dst = splat(src)
dst = splat(low8(src))
dst = splat(low16(src))
dst = splat(low32(src))
dst = splat(src)
low32(dst) = ieee_sqrt(low32(src))
low32(dst) = ieee_sqrt(low32(src))
*(ptr + offset) = src
*addr = src
*(ptr + offset) = src
low128(dst) = low128(src1) - low128(src2)
dst = src1 - src2
dst = src1 - src2
dst = saturating_sub(src1, src2)
dst = src1 - src2
dst = saturating_sub(src1, src2)
dst = src1 - src2
dst = src1 - src2
dst = saturating_sub(src1, src2)
dst = saturating_sub(src1, src2)
dst = swizzle(src1, src2)
low128(dst) = ieee_trunc(low128(src))
low128(dst) = ieee_trunc(low128(src))
dst = src < dst
(unsigned)dst = src < dst
(unsigned)dst = src < dst
(unsigned)dst = src < dst
(unsigned)dst = src <= dst
(unsigned)dst = src <= dst
(unsigned)dst = src <= dst
(unsigned)dst = src <= dst
(unsigned)- Narrows the two 64x2 vectors, assuming all input lanes are unsigned, to half the width. Narrowing is unsigned and saturating.
- Widens the high lanes of the input vector, as signed, to twice the width.
- Widens the high lanes of the input vector, as unsigned, to twice the width.
- Widens the high lanes of the input vector, as signed, to twice the width.
- Widens the high lanes of the input vector, as unsigned, to twice the width.
- Widens the high lanes of the input vector, as signed, to twice the width.
- Widens the high lanes of the input vector, as unsigned, to twice the width.
- Widens the low lanes of the input vector, as signed, to twice the width.
- Widens the low lanes of the input vector, as unsigned, to twice the width.
- Widens the low lanes of the input vector, as signed, to twice the width.
- Widens the low lanes of the input vector, as unsigned, to twice the width.
- Widens the low lanes of the input vector, as signed, to twice the width.
- Widens the low lanes of the input vector, as unsigned, to twice the width.
low32(dst) = checked_signed_from_f32(low32(src))
low32(dst) = saturating_signed_from_f32(low32(src))
low32(dst) = checked_unsigned_from_f32(low32(src))
low32(dst) = saturating_unsigned_from_f32(low32(src))
low32(dst) = checked_signed_from_f64(src)
low32(dst) = saturating_signed_from_f64(src)
low32(dst) = checked_unsigned_from_f64(src)
low32(dst) = saturating_unsigned_from_f64(src)
dst = checked_signed_from_f32(low32(src))
dst = saturating_signed_from_f32(low32(src))
dst = checked_unsigned_from_f32(low32(src))
dst = saturating_unsigned_from_f32(low32(src))
dst = checked_signed_from_f64(src)
dst = saturating_signed_from_f64(src)
dst = checked_unsigned_from_f64(src)
dst = saturating_unsigned_from_f64(src)
low32(dst) = |low32(src)|
dst = |src|
- 32-bit wrapping addition:
low32(dst) = low32(src1) + low32(src2)
. - 64-bit wrapping addition:
dst = src1 + src2
. - Same as
xadd32
butsrc2
is a zero-extended 8-bit immediate. - Same as
xadd32
butsrc2
is a 32-bit immediate. - 32-bit checked unsigned addition:
low32(dst) = low32(src1) + low32(src2)
. - Same as
xadd64
butsrc2
is a zero-extended 8-bit immediate. - Same as
xadd64
butsrc2
is a zero-extended 32-bit immediate. - 64-bit checked unsigned addition:
dst = src1 + src2
. dst_hi:dst_lo = lhs_hi:lhs_lo + rhs_hi:rhs_lo
low32(dst) = low32(src1) & low32(src2)
dst = src1 & src2
- Same as
xband64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xband32
butsrc2
is a sign-extended 32-bit immediate. - Same as
xband64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xband64
butsrc2
is a sign-extended 32-bit immediate. - low32(dst) = if low32(src) == 0 { 0 } else { -1 }
- dst = if src == 0 { 0 } else { -1 }
low32(dst) = !low32(src1)
dst = !src1
low32(dst) = low32(src1) | low32(src2)
dst = src1 | src2
- Same as
xbor64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xbor32
butsrc2
is a sign-extended 32-bit immediate. - Same as
xbor64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xbor64
butsrc2
is a sign-extended 32-bit immediate. low32(dst) = low32(src1) ^ low32(src2)
dst = src1 ^ src2
- Same as
xbxor64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xbxor32
butsrc2
is a sign-extended 32-bit immediate. - Same as
xbxor64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xbxor64
butsrc2
is a sign-extended 32-bit immediate. low32(dst) = leading_zeros(low32(src))
dst = leading_zeros(src)
- Set
dst = sign_extend(imm8)
. - Set
dst = sign_extend(imm16)
. - Set
dst = sign_extend(imm32)
. - Set
dst = imm64
. low32(dst) = trailing_zeros(low32(src))
dst = trailing_zeros(src)
low32(dst) = low32(src1) / low32(src2)
(signed)low32(dst) = low32(src1) / low32(src2)
(unsigned)dst = src1 / src2
(signed)dst = src1 / src2
(unsigned)low32(dst) = low32(src1) == low32(src2)
low32(dst) = src1 == src2
low32(dst) = zext(src[lane])
low32(dst) = zext(src[lane])
low32(dst) = src[lane]
dst = src[lane]
- Unconditionally transfer control to the PC at specified register.
low32(dst) = sext_8_32(*addr)
low32(dst) = sext_8_32(*addr)
low32(dst) = sext_8_32(*addr)
low32(dst) = sext_8_32(*addr)
low32(dst) = zext_8_32(*addr)
low32(dst) = zext_8_32(*addr)
low32(dst) = zext_8_32(*addr)
low32(dst) = zext_8_32(*addr)
low32(dst) = sext(*addr)
low32(dst) = zext(*addr)
low32(dst) = sext_16_32(*addr)
low32(dst) = sext_16_32(*addr)
low32(dst) = sext_16_32(*addr)
low32(dst) = sext_16_32(*addr)
low32(dst) = zext_16_32(*addr)
low32(dst) = zext_16_32(*addr)
low32(dst) = o32ext_16_32(*addr)
low32(dst) = zext_16_32(*addr)
low32(dst) = zext(*addr)
low32(dst) = *addr
low32(dst) = *addr
low32(dst) = *addr
low32(dst) = *addr
dst = *addr
dst = *addr
dst = *addr
dst = *addr
dst = *addr
low32(dst) = low32(src1) * low32(src2) + low32(src3)
dst = src1 * src2 + src3
low32(dst) = max(low32(src1), low32(src2))
(signed)low32(dst) = max(low32(src1), low32(src2))
(unsigned)dst = max(src1, src2)
(signed)dst = max(src1, src2)
(unsigned)low32(dst) = min(low32(src1), low32(src2))
(signed)low32(dst) = min(low32(src1), low32(src2))
(unsigned)dst = min(src1, src2)
(signed)dst = min(src1, src2)
(unsigned)- Move between
x
registers. - Gets the special “fp” register and moves it into
dst
. - Gets the special “lr” register and moves it into
dst
. low32(dst) = low32(src1) * low32(src2)
dst = src1 * src2
- Same as
xmul64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xmul32
butsrc2
is a sign-extended 32-bit immediate. - Same as
xmul64
butsrc2
is a sign-extended 8-bit immediate. - Same as
xmul64
butsrc2
is a sign-extended 64-bit immediate. dst = high64(src1 * src2)
(signed)dst = high64(src1 * src2)
(unsigned)low32(dst) = -low32(src)
dst = -src
low32(dst) = low32(src1) != low32(src2)
low32(dst) = src1 != src2
- Set
dst = 1
low32(dst) = count_ones(low32(src))
dst = count_ones(src)
low32(dst) = low32(src1) % low32(src2)
(signed)low32(dst) = low32(src1) % low32(src2)
(unsigned)dst = src1 / src2
(signed)dst = src1 / src2
(unsigned)low32(dst) = rotate_left(low32(src1), low32(src2))
dst = rotate_left(src1, src2)
low32(dst) = rotate_right(low32(src1), low32(src2))
dst = rotate_right(src1, src2)
low32(dst) = low32(cond) ? low32(if_nonzero) : low32(if_zero)
dst = low32(cond) ? if_nonzero : if_zero
low32(dst) = low32(src1) << low5(src2)
dst = src1 << low5(src2)
low32(dst) = low32(src1) << low5(src2)
dst = src1 << low5(src2)
low32(dst) = low32(src1) >> low5(src2)
low32(dst) = low32(src1) >> low5(src2)
low32(dst) = low32(src1) >> low5(src2)
low32(dst) = low32(src1) >> low5(src2)
dst = src1 >> low6(src2)
dst = src1 >> low6(src2)
dst = src1 >> low6(src2)
dst = src1 >> low6(src2)
low32(dst) = low32(src1) < low32(src2)
(signed)low32(dst) = src1 < src2
(signed)low32(dst) = low32(src1) <= low32(src2)
(signed)low32(dst) = src1 <= src2
(signed)*addr = low8(src)
*addr = low8(src)
*addr = low8(src)
*addr = low8(src)
*addr = low16(src)
*addr = low16(src)
*addr = low16(src)
*addr = low16(src)
*addr = low16(src)
*addr = low32(src)
*addr = low32(src)
*addr = low32(src)
*addr = low32(src)
*addr = low32(src)
*addr = low64(src)
*addr = src
*addr = src
*addr = src
*addr = src
- 32-bit wrapping subtraction:
low32(dst) = low32(src1) - low32(src2)
. - 64-bit wrapping subtraction:
dst = src1 - src2
. - Same as
xsub32
butsrc2
is a zero-extended 8-bit immediate. - Same as
xsub32
butsrc2
is a 32-bit immediate. - Same as
xsub64
butsrc2
is a zero-extended 8-bit immediate. - Same as
xsub64
butsrc2
is a zero-extended 32-bit immediate. dst_hi:dst_lo = lhs_hi:lhs_lo - rhs_hi:rhs_lo
low32(dst) = low32(src1) < low32(src2)
(unsigned)low32(dst) = src1 < src2
(unsigned)low32(dst) = low32(src1) <= low32(src2)
(unsigned)low32(dst) = src1 <= src2
(unsigned)dst_hi:dst_lo = sext(lhs) * sext(rhs)
dst_hi:dst_lo = zext(lhs) * zext(rhs)
- Set
dst = 0
dst = zext(low8(src))
dst = zext(low16(src))
dst = zext(low32(src))