pulley_interpreter::op

Struct MaterializeOpsVisitor

Source
pub struct MaterializeOpsVisitor<B> { /* private fields */ }
Available on crate feature decode only.
Expand description

A visitor that materializes whole Ops as it decodes the bytecode stream.

Implementations§

Source§

impl<B> MaterializeOpsVisitor<B>

Source

pub fn new(bytecode: B) -> Self

Create a new op-materializing visitor for the given bytecode.

Trait Implementations§

Source§

impl<B: Default> Default for MaterializeOpsVisitor<B>

Source§

fn default() -> MaterializeOpsVisitor<B>

Returns the “default value” for a type. Read more
Source§

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

Source§

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

Raise a trap.

Source§

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

Do nothing.

Source§

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

Copy the special sp stack pointer register into an x register.

Source§

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

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 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 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 += 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 += 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§

type BytecodeStream = B

The type of this visitor’s bytecode stream.
Source§

type Return = Op

The type of values returned by each visitor method.
Source§

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

Get this visitor’s underlying bytecode stream.
Source§

fn before_visit(&mut self)

A callback invoked before starting to decode an instruction. Read more
Source§

fn after_visit(&mut self)

A callback invoked after an instruction has been completely decoded. Read more

Auto Trait Implementations§

§

impl<B> Freeze for MaterializeOpsVisitor<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for MaterializeOpsVisitor<B>
where B: RefUnwindSafe,

§

impl<B> Send for MaterializeOpsVisitor<B>
where B: Send,

§

impl<B> Sync for MaterializeOpsVisitor<B>
where B: Sync,

§

impl<B> Unpin for MaterializeOpsVisitor<B>
where B: Unpin,

§

impl<B> UnwindSafe for MaterializeOpsVisitor<B>
where B: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.