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