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...@@ -1792,14 +1792,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
1792 });1792 });
17931793
1794 // mov len, #elem_size1794 // mov len, #elem_size
1795 const len_imm = math.cast(u16, elem_size) catch return self.fail("TODO load: larger stack offsets", .{});1795 try self.genSetReg(Type.usize, len_reg, .{ .immediate = elem_size });
1796 _ = try self.addInst(.{
1797 .tag = .movk,
1798 .data = .{ .r_imm16_sh = .{
1799 .rd = len_reg,
1800 .imm16 = len_imm,
1801 } },
1802 });
18031796
1804 // memcpy(src, dst, len)1797 // memcpy(src, dst, len)
1805 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);1798 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);
...@@ -1831,9 +1824,9 @@ fn genInlineMemcpy(...@@ -1831,9 +1824,9 @@ fn genInlineMemcpy(
1831 count: Register,1824 count: Register,
1832 tmp: Register,1825 tmp: Register,
1833) !void {1826) !void {
1834 // movk count, #01827 // movz count, #0
1835 _ = try self.addInst(.{1828 _ = try self.addInst(.{
1836 .tag = .movk,1829 .tag = .movz,
1837 .data = .{ .r_imm16_sh = .{1830 .data = .{ .r_imm16_sh = .{
1838 .rd = count,1831 .rd = count,
1839 .imm16 = 0,1832 .imm16 = 0,
...@@ -2973,6 +2966,7 @@ fn setRegOrMem(self: *Self, ty: Type, loc: MCValue, val: MCValue) !void {...@@ -2973,6 +2966,7 @@ fn setRegOrMem(self: *Self, ty: Type, loc: MCValue, val: MCValue) !void {
2973}2966}
29742967
2975fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerError!void {2968fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerError!void {
2969 const abi_size = ty.abiSize(self.target.*);
2976 switch (mcv) {2970 switch (mcv) {
2977 .dead => unreachable,2971 .dead => unreachable,
2978 .ptr_stack_offset => unreachable,2972 .ptr_stack_offset => unreachable,
...@@ -3002,7 +2996,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3002,7 +2996,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
3002 return self.fail("TODO implement set stack variable from embedded_in_code", .{});2996 return self.fail("TODO implement set stack variable from embedded_in_code", .{});
3003 },2997 },
3004 .register => |reg| {2998 .register => |reg| {
3005 const abi_size = ty.abiSize(self.target.*);
3006 const adj_off = stack_offset + abi_size;2999 const adj_off = stack_offset + abi_size;
30073000
3008 switch (abi_size) {3001 switch (abi_size) {
...@@ -3046,7 +3039,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3046,7 +3039,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
30463039
3047 const ptr_bits = self.target.cpu.arch.ptrBitWidth();3040 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
3048 const ptr_bytes: u64 = @divExact(ptr_bits, 8);3041 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
3049 if (ty.abiSize(self.target.*) <= ptr_bytes) {3042 if (abi_size <= ptr_bytes) {
3050 const reg = try self.copyToTmpRegister(ty, mcv);3043 const reg = try self.copyToTmpRegister(ty, mcv);
3051 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });3044 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
3052 } else {3045 } else {
...@@ -3062,7 +3055,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3062,7 +3055,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
3062 const tmp_reg = regs[4];3055 const tmp_reg = regs[4];
30633056
3064 // sub src_reg, fp, #off3057 // 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;
3066 const src_offset = math.cast(u12, adj_src_offset) catch return self.fail("TODO load: larger stack offsets", .{});3059 const src_offset = math.cast(u12, adj_src_offset) catch return self.fail("TODO load: larger stack offsets", .{});
3067 _ = try self.addInst(.{3060 _ = try self.addInst(.{
3068 .tag = .sub_immediate,3061 .tag = .sub_immediate,
...@@ -3074,7 +3067,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3074,7 +3067,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
3074 });3067 });
30753068
3076 // sub dst_reg, fp, #stack_offset3069 // 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;
3078 const dst_offset = math.cast(u12, adj_dst_off) catch return self.fail("TODO load: larger stack offsets", .{});3071 const dst_offset = math.cast(u12, adj_dst_off) catch return self.fail("TODO load: larger stack offsets", .{});
3079 _ = try self.addInst(.{3072 _ = try self.addInst(.{
3080 .tag = .sub_immediate,3073 .tag = .sub_immediate,
...@@ -3085,16 +3078,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3085,16 +3078,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
3085 } },3078 } },
3086 });3079 });
30873080
3088 // mov len, #elem_size3081 // mov len, #abi_size
3089 const elem_size = @intCast(u32, ty.abiSize(self.target.*));3082 try self.genSetReg(Type.usize, len_reg, .{ .immediate = abi_size });
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 });
30983083
3099 // memcpy(src, dst, len)3084 // memcpy(src, dst, len)
3100 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);3085 try self.genInlineMemcpy(src_reg, dst_reg, len_reg, count_reg, tmp_reg);