authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-24 17:01:00+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-24 17:02:29+01:00
log608025456b164aae69c7e794b1419e6b03a5cb79
treef311619d456863565ca26b43442b465295b72b66
parent9d2ff7ed161ff0880818002fb75391be336b44ac

x64: account for signed ints in struct_field_val when struct fits in a register


1 files changed, 16 insertions(+), 0 deletions(-)

src/arch/x86_64/CodeGen.zig+16
...@@ -2899,6 +2899,22 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -2899,6 +2899,22 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
2899 const tmp_reg = try self.copyToTmpRegister(Type.usize, .{ .immediate = mask });2899 const tmp_reg = try self.copyToTmpRegister(Type.usize, .{ .immediate = mask });
2900 try self.genBinMathOpMir(.@"and", Type.usize, dst_mcv, .{ .register = tmp_reg });2900 try self.genBinMathOpMir(.@"and", Type.usize, dst_mcv, .{ .register = tmp_reg });
29012901
2902 const signedness: std.builtin.Signedness = blk: {
2903 if (struct_field_ty.zigTypeTag() != .Int) break :blk .unsigned;
2904 break :blk struct_field_ty.intInfo(self.target.*).signedness;
2905 };
2906 const field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));
2907 if (signedness == .signed and field_size < 8) {
2908 _ = try self.addInst(.{
2909 .tag = .mov_sign_extend,
2910 .ops = (Mir.Ops{
2911 .reg1 = dst_mcv.register,
2912 .reg2 = registerAlias(dst_mcv.register, field_size),
2913 }).encode(),
2914 .data = undefined,
2915 });
2916 }
2917
2902 break :result dst_mcv;2918 break :result dst_mcv;
2903 },2919 },
2904 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),2920 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),