| ... | @@ -3016,29 +3016,27 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -3016,29 +3016,27 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| 3016 | break :result MCValue{ .memory = addr + struct_field_offset }; | 3016 | break :result MCValue{ .memory = addr + struct_field_offset }; |
| 3017 | }, | 3017 | }, |
| 3018 | .register_with_overflow => |rwo| { | 3018 | .register_with_overflow => |rwo| { |
| 3019 | switch (index) { | 3019 | const reg_lock = self.register_manager.lockRegAssumeUnused(rwo.reg); |
| 3020 | 0 => { | 3020 | defer self.register_manager.unlockReg(reg_lock); |
| 3021 | // get wrapped value: return register | | |
| 3022 | break :result MCValue{ .register = rwo.reg }; | | |
| 3023 | }, | | |
| 3024 | 1 => { | | |
| 3025 | // TODO return special MCValue condition flags | | |
| 3026 | // get overflow bit: set register to C flag | | |
| 3027 | // resp. V flag | | |
| 3028 | const raw_dest_reg = try self.register_manager.allocReg(null, gp); | | |
| 3029 | const dest_reg = raw_dest_reg.to32(); | | |
| 3030 | | 3021 | |
| 3031 | _ = try self.addInst(.{ | 3022 | const field: MCValue = switch (index) { |
| 3032 | .tag = .cset, | 3023 | // get wrapped value: return register |
| 3033 | .data = .{ .r_cond = .{ | 3024 | 0 => MCValue{ .register = rwo.reg }, |
| 3034 | .rd = dest_reg, | 3025 | |
| 3035 | .cond = rwo.flag, | 3026 | // get overflow bit: return C or V flag |
| 3036 | } }, | 3027 | 1 => MCValue{ .condition_flags = rwo.flag }, |
| 3037 | }); | | |
| 3038 | | 3028 | |
| 3039 | break :result MCValue{ .register = dest_reg }; | | |
| 3040 | }, | | |
| 3041 | else => unreachable, | 3029 | else => unreachable, |
| | 3030 | }; |
| | 3031 | |
| | 3032 | if (self.reuseOperand(inst, operand, 0, field)) { |
| | 3033 | break :result field; |
| | 3034 | } else { |
| | 3035 | // Copy to new register |
| | 3036 | const dest_reg = try self.register_manager.allocReg(null, gp); |
| | 3037 | try self.genSetReg(struct_ty.structFieldType(index), dest_reg, field); |
| | 3038 | |
| | 3039 | break :result MCValue{ .register = dest_reg }; |
| 3042 | } | 3040 | } |
| 3043 | }, | 3041 | }, |
| 3044 | else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}), | 3042 | else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}), |