| ... | ... | @@ -2375,7 +2375,47 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 2375 | 2375 | return self.fail("TODO larger stack offsets", .{}); |
| 2376 | 2376 | return self.genStore(reg, .sp, i13, simm13, abi_size); |
| 2377 | 2377 | }, |
| 2378 | | .memory, .stack_offset => return self.fail("TODO implement memcpy", .{}), |
| 2378 | .memory, .stack_offset => { |
| 2379 | switch (mcv) { |
| 2380 | .stack_offset => |off| { |
| 2381 | if (stack_offset == off) |
| 2382 | return; // Copy stack variable to itself; nothing to do. |
| 2383 | }, |
| 2384 | else => {}, |
| 2385 | } |
| 2386 | |
| 2387 | if (abi_size <= 8) { |
| 2388 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 2389 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| 2390 | } else { |
| 2391 | var ptr_ty_payload: Type.Payload.ElemType = .{ |
| 2392 | .base = .{ .tag = .single_mut_pointer }, |
| 2393 | .data = ty, |
| 2394 | }; |
| 2395 | const ptr_ty = Type.initPayload(&ptr_ty_payload.base); |
| 2396 | |
| 2397 | const regs = try self.register_manager.allocRegs(4, .{ null, null, null, null }); |
| 2398 | const regs_locks = self.register_manager.lockRegsAssumeUnused(4, regs); |
| 2399 | defer for (regs_locks) |reg| { |
| 2400 | self.register_manager.unlockReg(reg); |
| 2401 | }; |
| 2402 | |
| 2403 | const src_reg = regs[0]; |
| 2404 | const dst_reg = regs[1]; |
| 2405 | const len_reg = regs[2]; |
| 2406 | const tmp_reg = regs[3]; |
| 2407 | |
| 2408 | switch (mcv) { |
| 2409 | .stack_offset => |off| try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off }), |
| 2410 | .memory => |addr| try self.genSetReg(Type.usize, src_reg, .{ .immediate = addr }), |
| 2411 | else => unreachable, |
| 2412 | } |
| 2413 | |
| 2414 | try self.genSetReg(ptr_ty, dst_reg, .{ .ptr_stack_offset = stack_offset }); |
| 2415 | try self.genSetReg(Type.usize, len_reg, .{ .immediate = abi_size }); |
| 2416 | try self.genInlineMemcpy(src_reg, dst_reg, len_reg, tmp_reg); |
| 2417 | } |
| 2418 | }, |
| 2379 | 2419 | } |
| 2380 | 2420 | } |
| 2381 | 2421 | |