authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-07 18:30:59+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-07 19:33:43+02:00
log03068ce6a67d2cf83954606dc96329b85bd4be1a
treec77dc2b1edcfec298db9cae0d16b2f65be36ac92
parenta8bce8f14b5a2a3a6b5e069f3b434fd9430d9a8e

x64: clean up store helper


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

src/arch/x86_64/CodeGen.zig+9-42
......@@ -2730,15 +2730,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
27302730 // movabs does not support indirect register addressing
27312731 // so we need an extra register and an extra mov.
27322732 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
2733 _ = try self.addInst(.{
2734 .tag = .mov,
2735 .ops = Mir.Inst.Ops.encode(.{
2736 .reg1 = reg.to64(),
2737 .reg2 = tmp_reg.to64(),
2738 .flags = 0b10,
2739 }),
2740 .data = .{ .imm = 0 },
2741 });
2733 return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
27422734 },
27432735 else => {
27442736 return self.fail("TODO implement set pointee with immediate of ABI size {d}", .{abi_size});
......@@ -2835,6 +2827,8 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
28352827 .data = .{ .imm = 0 },
28362828 });
28372829
2830 const new_ptr = MCValue{ .register = addr_reg.to64() };
2831
28382832 switch (value) {
28392833 .immediate => |imm| {
28402834 if (abi_size > 8) {
......@@ -2873,16 +2867,8 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
28732867 .data = .{ .payload = payload },
28742868 });
28752869 },
2876 .register => |reg| {
2877 _ = try self.addInst(.{
2878 .tag = .mov,
2879 .ops = Mir.Inst.Ops.encode(.{
2880 .reg1 = addr_reg.to64(),
2881 .reg2 = reg,
2882 .flags = 0b10,
2883 }),
2884 .data = .{ .imm = 0 },
2885 });
2870 .register => {
2871 return self.store(new_ptr, value, ptr_ty, value_ty);
28862872 },
28872873 .got_load,
28882874 .direct_load,
......@@ -2904,37 +2890,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
29042890 }),
29052891 .data = .{ .imm = 0 },
29062892 });
2907 _ = try self.addInst(.{
2908 .tag = .mov,
2909 .ops = Mir.Inst.Ops.encode(.{
2910 .reg1 = addr_reg.to64(),
2911 .reg2 = tmp_reg,
2912 .flags = 0b10,
2913 }),
2914 .data = .{ .imm = 0 },
2915 });
2916 return;
2893 return self.store(new_ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
29172894 }
29182895
2919 try self.genInlineMemcpy(.{ .register = addr_reg.to64() }, value, .{ .immediate = abi_size }, .{});
2896 try self.genInlineMemcpy(new_ptr, value, .{ .immediate = abi_size }, .{});
29202897 },
29212898 .stack_offset => {
29222899 if (abi_size <= 8) {
2923 // TODO this should really be a recursive call
29242900 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
2925 _ = try self.addInst(.{
2926 .tag = .mov,
2927 .ops = Mir.Inst.Ops.encode(.{
2928 .reg1 = addr_reg.to64(),
2929 .reg2 = tmp_reg,
2930 .flags = 0b10,
2931 }),
2932 .data = .{ .imm = 0 },
2933 });
2934 return;
2901 return self.store(new_ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
29352902 }
29362903
2937 try self.genInlineMemcpy(.{ .register = addr_reg.to64() }, value, .{ .immediate = abi_size }, .{});
2904 try self.genInlineMemcpy(new_ptr, value, .{ .immediate = abi_size }, .{});
29382905 },
29392906 else => return self.fail("TODO implement storing {} to MCValue.memory", .{value}),
29402907 }