Move a stack value to the given register.
(
&self,
src: &Val,
dst: Reg,
masm: &mut M,
)
| 308 | |
| 309 | /// Move a stack value to the given register. |
| 310 | pub fn move_val_to_reg<M: MacroAssembler>( |
| 311 | &self, |
| 312 | src: &Val, |
| 313 | dst: Reg, |
| 314 | masm: &mut M, |
| 315 | ) -> Result<()> { |
| 316 | let size: OperandSize = src.ty().try_into()?; |
| 317 | match src { |
| 318 | Val::Reg(tr) => masm.mov(writable!(dst), RegImm::reg(tr.reg), size), |
| 319 | Val::I32(imm) => masm.mov(writable!(dst), RegImm::i32(*imm), size), |
| 320 | Val::I64(imm) => masm.mov(writable!(dst), RegImm::i64(*imm), size), |
| 321 | Val::F32(imm) => masm.mov(writable!(dst), RegImm::f32(imm.bits()), size), |
| 322 | Val::F64(imm) => masm.mov(writable!(dst), RegImm::f64(imm.bits()), size), |
| 323 | Val::V128(imm) => masm.mov(writable!(dst), RegImm::v128(*imm), size), |
| 324 | Val::Local(local) => { |
| 325 | let slot = self.frame.get_wasm_local(local.index); |
| 326 | let addr = masm.local_address(&slot)?; |
| 327 | masm.load(addr, writable!(dst), size) |
| 328 | } |
| 329 | Val::Memory(mem) => { |
| 330 | let addr = masm.address_from_sp(mem.slot.offset)?; |
| 331 | masm.load(addr, writable!(dst), size) |
| 332 | } |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | /// Prepares arguments for emitting a unary operation. |
| 337 | /// |
no test coverage detected