Emit a WebAssembly store.
(&mut self, arg: &MemArg, kind: StoreKind)
| 1391 | |
| 1392 | /// Emit a WebAssembly store. |
| 1393 | pub fn emit_wasm_store(&mut self, arg: &MemArg, kind: StoreKind) -> Result<()> { |
| 1394 | let memory_index = MemoryIndex::from_u32(arg.memory); |
| 1395 | let heap = self.env.resolve_heap(memory_index); |
| 1396 | let src = self.context.pop_to_reg(self.masm, None)?; |
| 1397 | |
| 1398 | let maybe_addr = match kind { |
| 1399 | StoreKind::Atomic(size) => { |
| 1400 | self.emit_compute_heap_address_align_checked(&heap, &arg, size)? |
| 1401 | } |
| 1402 | StoreKind::Operand(size) | StoreKind::VectorLane(LaneSelector { size, .. }) => { |
| 1403 | self.emit_compute_heap_address(&heap, &arg, size)? |
| 1404 | } |
| 1405 | }; |
| 1406 | |
| 1407 | if let Some(addr) = maybe_addr { |
| 1408 | self.masm |
| 1409 | .wasm_store(src.reg, self.masm.address_at_reg(addr, 0)?, kind)?; |
| 1410 | |
| 1411 | self.context.free_reg(addr); |
| 1412 | } |
| 1413 | self.context.free_reg(src); |
| 1414 | |
| 1415 | Ok(()) |
| 1416 | } |
| 1417 | |
| 1418 | /// Loads the address of the table element at a given index. Returns the |
| 1419 | /// address of the table element using the provided register as base. |
no test coverage detected