pub struct Assembler { /* private fields */ }Expand description
PVM program assembler.
Implementations§
Source§impl Assembler
impl Assembler
pub fn new() -> Self
Sourcepub fn add_jump_entry(&mut self) -> usize
pub fn add_jump_entry(&mut self) -> usize
Add a jump table entry pointing to the current code offset. Returns the jump table index.
Sourcepub fn add_jump_entry_at(&mut self, offset: u32) -> usize
pub fn add_jump_entry_at(&mut self, offset: u32) -> usize
Add a jump table entry pointing to a specific code offset.
Sourcepub fn current_offset(&self) -> u32
pub fn current_offset(&self) -> u32
Get the current code offset.
Sourcepub fn fallthrough(&mut self) -> &mut Self
pub fn fallthrough(&mut self) -> &mut Self
Opcode 1: Fallthrough (nop, continue to next instruction)
Sourcepub fn load_imm_64(&mut self, rd: Reg, imm: u64) -> &mut Self
pub fn load_imm_64(&mut self, rd: Reg, imm: u64) -> &mut Self
Opcode 20: load_imm_64 (load 64-bit immediate into register)
Sourcepub fn jump(&mut self, target: u32) -> &mut Self
pub fn jump(&mut self, target: u32) -> &mut Self
Opcode 40: jump (unconditional jump to offset)
Sourcepub fn jump_ind(&mut self, rd: Reg, imm: u32) -> &mut Self
pub fn jump_ind(&mut self, rd: Reg, imm: u32) -> &mut Self
Opcode 50: jump_ind (indirect jump through register + immediate)
Sourcepub fn load_imm(&mut self, rd: Reg, imm: i32) -> &mut Self
pub fn load_imm(&mut self, rd: Reg, imm: i32) -> &mut Self
Opcode 51: load_imm (load sign-extended immediate into register)
Sourcepub fn load_u8(&mut self, rd: Reg, addr: u32) -> &mut Self
pub fn load_u8(&mut self, rd: Reg, addr: u32) -> &mut Self
Opcode 52: load_u8 (load u8 from address in immediate)
Sourcepub fn load_u64(&mut self, rd: Reg, addr: u32) -> &mut Self
pub fn load_u64(&mut self, rd: Reg, addr: u32) -> &mut Self
Opcode 58: load_u64 (load u64 from address in immediate)
Sourcepub fn store_u8(&mut self, rd: Reg, addr: u32) -> &mut Self
pub fn store_u8(&mut self, rd: Reg, addr: u32) -> &mut Self
Opcode 59: store_u8 (store u8 from register to address)
Sourcepub fn store_u64(&mut self, rd: Reg, addr: u32) -> &mut Self
pub fn store_u64(&mut self, rd: Reg, addr: u32) -> &mut Self
Opcode 62: store_u64 (store u64 from register to address)
Sourcepub fn load_imm_jump(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
pub fn load_imm_jump(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
Opcode 80: load_imm_jump (load immediate into register and jump)
Sourcepub fn branch_eq_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
pub fn branch_eq_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
Opcode 81: branch_eq_imm (branch if register == immediate)
Sourcepub fn branch_ne_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
pub fn branch_ne_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
Opcode 82: branch_ne_imm (branch if register != immediate)
Sourcepub fn branch_lt_u_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
pub fn branch_lt_u_imm(&mut self, rd: Reg, imm: i32, target: u32) -> &mut Self
Opcode 83: branch_lt_u_imm (branch if register < unsigned immediate)
Sourcepub fn load_ind_u8(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn load_ind_u8(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 124: load_ind_u8 (load u8 from [rA + imm] into rD)
Sourcepub fn load_ind_u32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn load_ind_u32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 128: load_ind_u32 (load u32 from [rA + imm] into rD)
Sourcepub fn load_ind_u64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn load_ind_u64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 130: load_ind_u64 (load u64 from [rA + imm] into rD)
Sourcepub fn store_ind_u8(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn store_ind_u8(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 120: store_ind_u8 (store u8 from rD to [rA + imm])
Sourcepub fn store_ind_u32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn store_ind_u32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 122: store_ind_u32 (store u32 from rD to [rA + imm])
Sourcepub fn store_ind_u64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn store_ind_u64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 123: store_ind_u64 (store u64 from rD to [rA + imm])
Sourcepub fn add_imm_32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn add_imm_32(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 131: add_imm_32 (rD = rA + imm, 32-bit)
Sourcepub fn add_imm_64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
pub fn add_imm_64(&mut self, rd: Reg, ra: Reg, imm: i32) -> &mut Self
Opcode 149: add_imm_64 (rD = rA + imm, 64-bit)
Sourcepub fn add_64(&mut self, rd: Reg, ra: Reg, rb: Reg) -> &mut Self
pub fn add_64(&mut self, rd: Reg, ra: Reg, rb: Reg) -> &mut Self
Opcode 200: add_64 (rD = rA + rB)