| ... | @@ -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 }); |
| 2901 | | 2901 | |
| | 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}), |