| ... | ... | @@ -1469,7 +1469,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1469 | 1469 | return true; |
| 1470 | 1470 | } |
| 1471 | 1471 | |
| 1472 | | fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) !void { |
| 1472 | fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!void { |
| 1473 | 1473 | const elem_ty = ptr_ty.elemType(); |
| 1474 | 1474 | switch (ptr) { |
| 1475 | 1475 | .none => unreachable, |
| ... | ... | @@ -1486,11 +1486,25 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1486 | 1486 | .embedded_in_code => { |
| 1487 | 1487 | return self.fail("TODO implement loading from MCValue.embedded_in_code", .{}); |
| 1488 | 1488 | }, |
| 1489 | | .register => { |
| 1490 | | return self.fail("TODO implement loading from MCValue.register", .{}); |
| 1489 | .register => |reg| { |
| 1490 | switch (arch) { |
| 1491 | .arm, .armeb => switch (dst_mcv) { |
| 1492 | .dead => unreachable, |
| 1493 | .undef => unreachable, |
| 1494 | .compare_flags_signed, .compare_flags_unsigned => unreachable, |
| 1495 | .embedded_in_code => unreachable, |
| 1496 | .register => |dst_reg| { |
| 1497 | writeInt(u32, try self.code.addManyAsArray(4), Instruction.ldr(.al, dst_reg, reg, .{ .offset = Instruction.Offset.none }).toU32()); |
| 1498 | }, |
| 1499 | else => return self.fail("TODO load from register into {}", .{dst_mcv}), |
| 1500 | }, |
| 1501 | else => return self.fail("TODO implement loading from MCValue.register for {}", .{arch}), |
| 1502 | } |
| 1491 | 1503 | }, |
| 1492 | | .memory => { |
| 1493 | | return self.fail("TODO implement loading from MCValue.memory", .{}); |
| 1504 | .memory => |addr| { |
| 1505 | const reg = try self.register_manager.allocReg(null, &.{}); |
| 1506 | try self.genSetReg(ptr_ty, reg, .{ .memory = addr }); |
| 1507 | try self.load(dst_mcv, .{ .register = reg }, ptr_ty); |
| 1494 | 1508 | }, |
| 1495 | 1509 | .stack_offset => { |
| 1496 | 1510 | return self.fail("TODO implement loading from MCValue.stack_offset", .{}); |
| ... | ... | @@ -3884,15 +3898,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 3884 | 3898 | else => return self.fail("TODO implement memset", .{}), |
| 3885 | 3899 | } |
| 3886 | 3900 | }, |
| 3887 | | .compare_flags_unsigned => |op| { |
| 3888 | | _ = op; |
| 3889 | | return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{}); |
| 3890 | | }, |
| 3891 | | .compare_flags_signed => |op| { |
| 3892 | | _ = op; |
| 3893 | | return self.fail("TODO implement set stack variable with compare flags value (signed)", .{}); |
| 3894 | | }, |
| 3895 | | .immediate => { |
| 3901 | .compare_flags_unsigned, |
| 3902 | .compare_flags_signed, |
| 3903 | .immediate, |
| 3904 | => { |
| 3896 | 3905 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 3897 | 3906 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| 3898 | 3907 | }, |
| ... | ... | @@ -4060,15 +4069,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 4060 | 4069 | else => return self.fail("TODO implement memset", .{}), |
| 4061 | 4070 | } |
| 4062 | 4071 | }, |
| 4063 | | .compare_flags_unsigned => |op| { |
| 4064 | | _ = op; |
| 4065 | | return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{}); |
| 4066 | | }, |
| 4067 | | .compare_flags_signed => |op| { |
| 4068 | | _ = op; |
| 4069 | | return self.fail("TODO implement set stack variable with compare flags value (signed)", .{}); |
| 4070 | | }, |
| 4071 | | .immediate => { |
| 4072 | .compare_flags_unsigned, |
| 4073 | .compare_flags_signed, |
| 4074 | .immediate, |
| 4075 | => { |
| 4072 | 4076 | const reg = try self.copyToTmpRegister(ty, mcv); |
| 4073 | 4077 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| 4074 | 4078 | }, |