authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-07-29 00:55:00+02:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-08-05 20:30:47+02:00
log423bef4dfc635a3ca0144cac95384984857a8519
tree87a9a8c00fe6500f90f9bab720d51ae11393987e
parent18440cb239755c983f672b4902147c12e819e029
signaturelock-open Commit is signed but in an unrecognized format.

stage2 AArch64: Fix struct_field_val for register_with_overflow

Now mirrors the behavior of the native ARM backend

1 files changed, 18 insertions(+), 20 deletions(-)

src/arch/aarch64/CodeGen.zig+18-20
...@@ -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();
30303021
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 });
30383028
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}),