authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-16 12:35:16+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-16 15:47:44+01:00
log1a84c23d69c7e26ba1916c1f9f0e6002ff40d116
tree4d166d31ad511aafb260eb296bfee73d11242f78
parent77e5b042a084e227515e68d8baca5258c2019eaf

stage2 AArch64: Simplify and correct invocations of genInlineMemcpy

Previously, the invocations used movk instead of movz

1 files changed, 9 insertions(+), 24 deletions(-)

src/arch/aarch64/CodeGen.zig+9-24
......@@ -1792,14 +1792,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
17921792 });
17931793
17941794 // mov len, #elem_size
1795 const len_imm = math.cast(u16, elem_size) catch return self.fail("TODO load: larger stack offsets", .{});
1796 _ = try self.addInst(.{
1797 .tag = .movk,
1798 .data = .{ .r_imm16_sh = .{
1799 .rd = len_reg,
1800 .imm16 = len_imm,
1801 } },
1802 });
1795 try self.genSetReg(Type.usize, len_reg, .{ .immediate = elem_size });
18031796
18041797 // memcpy(src, dst, len)
18051798 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);
......@@ -1831,9 +1824,9 @@ fn genInlineMemcpy(
18311824 count: Register,
18321825 tmp: Register,
18331826) !void {
1834 // movk count, #0
1827 // movz count, #0
18351828 _ = try self.addInst(.{
1836 .tag = .movk,
1829 .tag = .movz,
18371830 .data = .{ .r_imm16_sh = .{
18381831 .rd = count,
18391832 .imm16 = 0,
......@@ -2973,6 +2966,7 @@ fn setRegOrMem(self: *Self, ty: Type, loc: MCValue, val: MCValue) !void {
29732966}
29742967
29752968fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerError!void {
2969 const abi_size = ty.abiSize(self.target.*);
29762970 switch (mcv) {
29772971 .dead => unreachable,
29782972 .ptr_stack_offset => unreachable,
......@@ -3002,7 +2996,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30022996 return self.fail("TODO implement set stack variable from embedded_in_code", .{});
30032997 },
30042998 .register => |reg| {
3005 const abi_size = ty.abiSize(self.target.*);
30062999 const adj_off = stack_offset + abi_size;
30073000
30083001 switch (abi_size) {
......@@ -3046,7 +3039,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30463039
30473040 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
30483041 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
3049 if (ty.abiSize(self.target.*) <= ptr_bytes) {
3042 if (abi_size <= ptr_bytes) {
30503043 const reg = try self.copyToTmpRegister(ty, mcv);
30513044 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
30523045 } else {
......@@ -3062,7 +3055,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30623055 const tmp_reg = regs[4];
30633056
30643057 // sub src_reg, fp, #off
3065 const adj_src_offset = off + @intCast(u32, ty.abiSize(self.target.*));
3058 const adj_src_offset = off + abi_size;
30663059 const src_offset = math.cast(u12, adj_src_offset) catch return self.fail("TODO load: larger stack offsets", .{});
30673060 _ = try self.addInst(.{
30683061 .tag = .sub_immediate,
......@@ -3074,7 +3067,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30743067 });
30753068
30763069 // sub dst_reg, fp, #stack_offset
3077 const adj_dst_off = stack_offset + @intCast(u32, ty.abiSize(self.target.*));
3070 const adj_dst_off = stack_offset + abi_size;
30783071 const dst_offset = math.cast(u12, adj_dst_off) catch return self.fail("TODO load: larger stack offsets", .{});
30793072 _ = try self.addInst(.{
30803073 .tag = .sub_immediate,
......@@ -3085,16 +3078,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30853078 } },
30863079 });
30873080
3088 // mov len, #elem_size
3089 const elem_size = @intCast(u32, ty.abiSize(self.target.*));
3090 const len_imm = math.cast(u16, elem_size) catch return self.fail("TODO load: larger stack offsets", .{});
3091 _ = try self.addInst(.{
3092 .tag = .movk,
3093 .data = .{ .r_imm16_sh = .{
3094 .rd = len_reg,
3095 .imm16 = len_imm,
3096 } },
3097 });
3081 // mov len, #abi_size
3082 try self.genSetReg(Type.usize, len_reg, .{ .immediate = abi_size });
30983083
30993084 // memcpy(src, dst, len)
31003085 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);