aboutsummaryrefslogtreecommitdiff
path: root/src/arch/arm
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-08 21:04:38 +0100
committerGitHub <noreply@github.com>2022-02-08 21:04:38 +0100
commitc256603eaef162e7df004d3508bbd4f2ec3470eb (patch)
tree60fd2c37a73f090facfacb89e72e394be37d07ed /src/arch/arm
parent37fea3e3ddc1f7d266d95789c3b1005291bcb96b (diff)
parent8fe9d2f9867101fc8d6a91c6e10c6f3b644ce6a8 (diff)
downloadzig-c256603eaef162e7df004d3508bbd4f2ec3470eb.tar.gz
zig-c256603eaef162e7df004d3508bbd4f2ec3470eb.zip
Merge pull request #10839 from joachimschmidt557/stage2-arm
stage2 ARM: genTypedValue for all integer types
Diffstat (limited to 'src/arch/arm')
-rw-r--r--src/arch/arm/CodeGen.zig35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig
index fb473ef412..2116717cd1 100644
--- a/src/arch/arm/CodeGen.zig
+++ b/src/arch/arm/CodeGen.zig
@@ -1703,9 +1703,18 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
const struct_field_ty = struct_ty.structFieldType(index);
const struct_field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));
+ const adjusted_field_offset = struct_size - struct_field_offset - struct_field_size;
+
switch (mcv) {
+ .dead, .unreach => unreachable,
+ .stack_argument_offset => |off| {
+ break :result MCValue{ .stack_argument_offset = off + adjusted_field_offset };
+ },
.stack_offset => |off| {
- break :result MCValue{ .stack_offset = off + struct_size - struct_field_offset - struct_field_size };
+ break :result MCValue{ .stack_offset = off + adjusted_field_offset };
+ },
+ .memory => |addr| {
+ break :result MCValue{ .memory = addr + adjusted_field_offset };
},
else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
}
@@ -3180,7 +3189,6 @@ fn setRegOrMem(self: *Self, ty: Type, loc: MCValue, val: MCValue) !void {
fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerError!void {
switch (mcv) {
.dead => unreachable,
- .ptr_stack_offset => unreachable,
.ptr_embedded_in_code => unreachable,
.unreach, .none => return, // Nothing to do.
.undef => {
@@ -3194,6 +3202,10 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
else => return self.fail("TODO implement memset", .{}),
}
},
+ .ptr_stack_offset => {
+ const reg = try self.copyToTmpRegister(ty, mcv);
+ return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
+ },
.compare_flags_unsigned,
.compare_flags_signed,
.immediate,
@@ -3858,9 +3870,7 @@ fn lowerDeclRef(self: *Self, tv: TypedValue, decl: *Module.Decl) InnerError!MCVa
const got_addr = got.p_vaddr + decl.link.elf.offset_table_index * ptr_bytes;
return MCValue{ .memory = got_addr };
} else if (self.bin_file.cast(link.File.MachO)) |_| {
- // TODO I'm hacking my way through here by repurposing .memory for storing
- // index to the GOT target symbol index.
- return MCValue{ .memory = decl.link.macho.local_sym_index };
+ unreachable; // unsupported architecture for MachO
} else if (self.bin_file.cast(link.File.Coff)) |coff_file| {
const got_addr = coff_file.offset_table_virtual_address + decl.link.coff.offset_table_index * ptr_bytes;
return MCValue{ .memory = got_addr };
@@ -3929,10 +3939,19 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
},
.Int => {
const info = typed_value.ty.intInfo(self.target.*);
- if (info.bits > ptr_bits or info.signedness == .signed) {
- return self.fail("TODO const int bigger than ptr and signed int", .{});
+ if (info.bits <= ptr_bits) {
+ const unsigned = switch (info.signedness) {
+ .signed => blk: {
+ const signed = @intCast(i32, typed_value.val.toSignedInt());
+ break :blk @bitCast(u32, signed);
+ },
+ .unsigned => @intCast(u32, typed_value.val.toUnsignedInt()),
+ };
+
+ return MCValue{ .immediate = unsigned };
+ } else {
+ return self.lowerUnnamedConst(typed_value);
}
- return MCValue{ .immediate = @intCast(u32, typed_value.val.toUnsignedInt()) };
},
.Bool => {
return MCValue{ .immediate = @boolToInt(typed_value.val.toBool()) };