pulley_interpreter::decode

Trait OpVisitor

Source
pub trait OpVisitor {
    type BytecodeStream: BytecodeStream;
    type Return;

Show 74 methods // Required methods fn bytecode(&mut self) -> &mut Self::BytecodeStream; fn ret(&mut self) -> Self::Return; fn call(&mut self, offset: PcRelOffset) -> Self::Return; fn call_indirect(&mut self, reg: XReg) -> Self::Return; fn jump(&mut self, offset: PcRelOffset) -> Self::Return; fn br_if(&mut self, cond: XReg, offset: PcRelOffset) -> Self::Return; fn br_if_not(&mut self, cond: XReg, offset: PcRelOffset) -> Self::Return; fn br_if_xeq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xneq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xslt32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xslteq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xult32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xulteq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xeq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xneq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xslt64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xslteq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xult64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_if_xulteq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return; fn br_table32(&mut self, idx: XReg, amt: u32) -> Self::Return; fn xmov(&mut self, dst: XReg, src: XReg) -> Self::Return; fn fmov(&mut self, dst: FReg, src: FReg) -> Self::Return; fn vmov(&mut self, dst: VReg, src: VReg) -> Self::Return; fn xconst8(&mut self, dst: XReg, imm: i8) -> Self::Return; fn xconst16(&mut self, dst: XReg, imm: i16) -> Self::Return; fn xconst32(&mut self, dst: XReg, imm: i32) -> Self::Return; fn xconst64(&mut self, dst: XReg, imm: i64) -> Self::Return; fn xadd32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xadd64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xeq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xneq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xslt64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xslteq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xult64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xulteq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xeq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xneq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xslt32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xslteq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xult32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn xulteq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return; fn load32_u(&mut self, dst: XReg, ptr: XReg) -> Self::Return; fn load32_s(&mut self, dst: XReg, ptr: XReg) -> Self::Return; fn load64(&mut self, dst: XReg, ptr: XReg) -> Self::Return; fn load32_u_offset8( &mut self, dst: XReg, ptr: XReg, offset: i8, ) -> Self::Return; fn load32_s_offset8( &mut self, dst: XReg, ptr: XReg, offset: i8, ) -> Self::Return; fn load64_offset8( &mut self, dst: XReg, ptr: XReg, offset: i8, ) -> Self::Return; fn load32_u_offset64( &mut self, dst: XReg, ptr: XReg, offset: i64, ) -> Self::Return; fn load32_s_offset64( &mut self, dst: XReg, ptr: XReg, offset: i64, ) -> Self::Return; fn load64_offset64( &mut self, dst: XReg, ptr: XReg, offset: i64, ) -> Self::Return; fn store32(&mut self, ptr: XReg, src: XReg) -> Self::Return; fn store64(&mut self, ptr: XReg, src: XReg) -> Self::Return; fn store32_offset8( &mut self, ptr: XReg, offset: i8, src: XReg, ) -> Self::Return; fn store64_offset8( &mut self, ptr: XReg, offset: i8, src: XReg, ) -> Self::Return; fn store32_offset64( &mut self, ptr: XReg, offset: i64, src: XReg, ) -> Self::Return; fn store64_offset64( &mut self, ptr: XReg, offset: i64, src: XReg, ) -> Self::Return; fn push_frame(&mut self) -> Self::Return; fn pop_frame(&mut self) -> Self::Return; fn xpush32(&mut self, src: XReg) -> Self::Return; fn xpush32_many(&mut self, srcs: RegSet<XReg>) -> Self::Return; fn xpush64(&mut self, src: XReg) -> Self::Return; fn xpush64_many(&mut self, srcs: RegSet<XReg>) -> Self::Return; fn xpop32(&mut self, dst: XReg) -> Self::Return; fn xpop32_many(&mut self, dsts: RegSet<XReg>) -> Self::Return; fn xpop64(&mut self, dst: XReg) -> Self::Return; fn xpop64_many(&mut self, dsts: RegSet<XReg>) -> Self::Return; fn bitcast_int_from_float_32( &mut self, dst: XReg, src: FReg, ) -> Self::Return; fn bitcast_int_from_float_64( &mut self, dst: XReg, src: FReg, ) -> Self::Return; fn bitcast_float_from_int_32( &mut self, dst: FReg, src: XReg, ) -> Self::Return; fn bitcast_float_from_int_64( &mut self, dst: FReg, src: XReg, ) -> Self::Return; fn stack_alloc32(&mut self, amt: u32) -> Self::Return; fn stack_free32(&mut self, amt: u32) -> Self::Return; // Provided methods fn before_visit(&mut self) { ... } fn after_visit(&mut self) { ... }
}
Available on crate feature decode only.
Expand description

Callbacks upon decoding instructions from bytecode.

Implement this trait for your type, give an instance of your type to a Decoder method, and the Decoder will invoke the associated method for each instruction that it decodes. For example, if the Decoder decodes an xadd32 instruction, then it will invoke the xadd32 visitor method, passing along any decoded immediates, operands, etc… as arguments.

Required Associated Types§

Source

type BytecodeStream: BytecodeStream

The type of this visitor’s bytecode stream.

Source

type Return

The type of values returned by each visitor method.

Required Methods§

Source

fn bytecode(&mut self) -> &mut Self::BytecodeStream

Get this visitor’s underlying bytecode stream.

Source

fn ret(&mut self) -> Self::Return

Transfer control the address in the lr register.

Source

fn call(&mut self, offset: PcRelOffset) -> Self::Return

Transfer control to the PC at the given offset and set the lr register to the PC just after this instruction.

Source

fn call_indirect(&mut self, reg: XReg) -> Self::Return

Transfer control to the PC in reg and set lr to the PC just after this instruction.

Source

fn jump(&mut self, offset: PcRelOffset) -> Self::Return

Unconditionally transfer control to the PC at the given offset.

Source

fn br_if(&mut self, cond: XReg, offset: PcRelOffset) -> Self::Return

Conditionally transfer control to the given PC offset if cond contains a non-zero value.

Source

fn br_if_not(&mut self, cond: XReg, offset: PcRelOffset) -> Self::Return

Conditionally transfer control to the given PC offset if cond contains a zero value.

Source

fn br_if_xeq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset) -> Self::Return

Branch if a == b.

Source

fn br_if_xneq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if a != b.

Source

fn br_if_xslt32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if signed a < b.

Source

fn br_if_xslteq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if signed a <= b.

Source

fn br_if_xult32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if unsigned a < b.

Source

fn br_if_xulteq32( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if unsigned a <= b.

Source

fn br_if_xeq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset) -> Self::Return

Branch if a == b.

Source

fn br_if_xneq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if a != b.

Source

fn br_if_xslt64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if signed a < b.

Source

fn br_if_xslteq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if signed a <= b.

Source

fn br_if_xult64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if unsigned a < b.

Source

fn br_if_xulteq64( &mut self, a: XReg, b: XReg, offset: PcRelOffset, ) -> Self::Return

Branch if unsigned a <= b.

Source

fn br_table32(&mut self, idx: XReg, amt: u32) -> Self::Return

Branch to the label indicated by idx.

After this instruction are amt instances of PcRelOffset and the idx selects which one will be branched to. The value of idx is clamped to amt - 1 (e.g. the last offset is the “default” one.

Source

fn xmov(&mut self, dst: XReg, src: XReg) -> Self::Return

Move between x registers.

Source

fn fmov(&mut self, dst: FReg, src: FReg) -> Self::Return

Move between f registers.

Source

fn vmov(&mut self, dst: VReg, src: VReg) -> Self::Return

Move between v registers.

Source

fn xconst8(&mut self, dst: XReg, imm: i8) -> Self::Return

Set dst = sign_extend(imm8).

Source

fn xconst16(&mut self, dst: XReg, imm: i16) -> Self::Return

Set dst = sign_extend(imm16).

Source

fn xconst32(&mut self, dst: XReg, imm: i32) -> Self::Return

Set dst = sign_extend(imm32).

Source

fn xconst64(&mut self, dst: XReg, imm: i64) -> Self::Return

Set dst = imm64.

Source

fn xadd32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit wrapping addition: low32(dst) = low32(src1) + low32(src2).

The upper 32-bits of dst are unmodified.

Source

fn xadd64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit wrapping addition: dst = src1 + src2.

Source

fn xeq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit equality.

Source

fn xneq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit inequality.

Source

fn xslt64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit signed less-than.

Source

fn xslteq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit signed less-than-equal.

Source

fn xult64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit unsigned less-than.

Source

fn xulteq64(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

64-bit unsigned less-than-equal.

Source

fn xeq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit equality.

Source

fn xneq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit inequality.

Source

fn xslt32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit signed less-than.

Source

fn xslteq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit signed less-than-equal.

Source

fn xult32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit unsigned less-than.

Source

fn xulteq32(&mut self, operands: BinaryOperands<XReg>) -> Self::Return

32-bit unsigned less-than-equal.

Source

fn load32_u(&mut self, dst: XReg, ptr: XReg) -> Self::Return

dst = zero_extend(load32(ptr))

Source

fn load32_s(&mut self, dst: XReg, ptr: XReg) -> Self::Return

dst = sign_extend(load32(ptr))

Source

fn load64(&mut self, dst: XReg, ptr: XReg) -> Self::Return

dst = load64(ptr)

Source

fn load32_u_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8) -> Self::Return

dst = zero_extend(load32(ptr + offset8))

Source

fn load32_s_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8) -> Self::Return

dst = sign_extend(load32(ptr + offset8))

Source

fn load64_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8) -> Self::Return

dst = load64(ptr + offset8)

Source

fn load32_u_offset64( &mut self, dst: XReg, ptr: XReg, offset: i64, ) -> Self::Return

dst = zero_extend(load32(ptr + offset64))

Source

fn load32_s_offset64( &mut self, dst: XReg, ptr: XReg, offset: i64, ) -> Self::Return

dst = sign_extend(load32(ptr + offset64))

Source

fn load64_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64) -> Self::Return

dst = load64(ptr + offset64)

Source

fn store32(&mut self, ptr: XReg, src: XReg) -> Self::Return

*ptr = low32(src)

Source

fn store64(&mut self, ptr: XReg, src: XReg) -> Self::Return

*ptr = src

Source

fn store32_offset8(&mut self, ptr: XReg, offset: i8, src: XReg) -> Self::Return

*(ptr + sign_extend(offset8)) = low32(src)

Source

fn store64_offset8(&mut self, ptr: XReg, offset: i8, src: XReg) -> Self::Return

*(ptr + sign_extend(offset8)) = src

Source

fn store32_offset64( &mut self, ptr: XReg, offset: i64, src: XReg, ) -> Self::Return

*(ptr + sign_extend(offset64)) = low32(src)

Source

fn store64_offset64( &mut self, ptr: XReg, offset: i64, src: XReg, ) -> Self::Return

*(ptr + sign_extend(offset64)) = src

Source

fn push_frame(&mut self) -> Self::Return

push lr; push fp; fp = sp

Source

fn pop_frame(&mut self) -> Self::Return

sp = fp; pop fp; pop lr

Source

fn xpush32(&mut self, src: XReg) -> Self::Return

*sp = low32(src); sp = sp.checked_add(4)

Source

fn xpush32_many(&mut self, srcs: RegSet<XReg>) -> Self::Return

for src in srcs { xpush32 src }

Source

fn xpush64(&mut self, src: XReg) -> Self::Return

*sp = src; sp = sp.checked_add(8)

Source

fn xpush64_many(&mut self, srcs: RegSet<XReg>) -> Self::Return

for src in srcs { xpush64 src }

Source

fn xpop32(&mut self, dst: XReg) -> Self::Return

*dst = *sp; sp -= 4

Source

fn xpop32_many(&mut self, dsts: RegSet<XReg>) -> Self::Return

for dst in dsts.rev() { xpop32 dst }

Source

fn xpop64(&mut self, dst: XReg) -> Self::Return

*dst = *sp; sp -= 8

Source

fn xpop64_many(&mut self, dsts: RegSet<XReg>) -> Self::Return

for dst in dsts.rev() { xpop64 dst }

Source

fn bitcast_int_from_float_32(&mut self, dst: XReg, src: FReg) -> Self::Return

low32(dst) = bitcast low32(src) as i32

Source

fn bitcast_int_from_float_64(&mut self, dst: XReg, src: FReg) -> Self::Return

dst = bitcast src as i64

Source

fn bitcast_float_from_int_32(&mut self, dst: FReg, src: XReg) -> Self::Return

low32(dst) = bitcast low32(src) as f32

Source

fn bitcast_float_from_int_64(&mut self, dst: FReg, src: XReg) -> Self::Return

dst = bitcast src as f64

Source

fn stack_alloc32(&mut self, amt: u32) -> Self::Return

sp = sp.checked_sub(amt)

Source

fn stack_free32(&mut self, amt: u32) -> Self::Return

sp = sp + amt

Provided Methods§

Source

fn before_visit(&mut self)

A callback invoked before starting to decode an instruction.

Does nothing by default.

Source

fn after_visit(&mut self)

A callback invoked after an instruction has been completely decoded.

Does nothing by default.

Implementors§

Source§

impl<'a> OpVisitor for Disassembler<'a>

Available on crate feature disas only.
Source§

impl<B: BytecodeStream> OpVisitor for MaterializeOpsVisitor<B>

Source§

impl<F, T, V1, V2> OpVisitor for SequencedVisitor<'_, F, V1, V2>
where F: FnMut(V1::Return, V2::Return) -> T, V1: OpVisitor, V2: OpVisitor<BytecodeStream = V1::BytecodeStream>,