authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-14 22:43:46+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-16 23:30:54+07:00
log26116211eccddbe47afde4cbe0795c257cc882b8
tree950dafe4e6bfe1fa263a1e480bc0019062fb4c77
parent7822426ff2a7c23bf8090d6a1f77e54fca8d62c8

stage2: sparc64: Implement inline memcpy for genSetStack


1 files changed, 41 insertions(+), 1 deletions(-)

src/arch/sparc64/CodeGen.zig+41-1
...@@ -2375,7 +2375,47 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -2375,7 +2375,47 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
2375 return self.fail("TODO larger stack offsets", .{});2375 return self.fail("TODO larger stack offsets", .{});
2376 return self.genStore(reg, .sp, i13, simm13, abi_size);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}
23812421