mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 14:23:09 +00:00
x86_64: implement union_init
This commit is contained in:
parent
1667e831cf
commit
e36e9323f4
@ -10147,9 +10147,46 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
|
|||||||
fn airUnionInit(self: *Self, inst: Air.Inst.Index) !void {
|
fn airUnionInit(self: *Self, inst: Air.Inst.Index) !void {
|
||||||
const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
|
const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
|
||||||
const extra = self.air.extraData(Air.UnionInit, ty_pl.payload).data;
|
const extra = self.air.extraData(Air.UnionInit, ty_pl.payload).data;
|
||||||
_ = extra;
|
const result: MCValue = result: {
|
||||||
return self.fail("TODO implement airUnionInit for x86_64", .{});
|
const union_ty = self.air.typeOfIndex(inst);
|
||||||
//return self.finishAir(inst, result, .{ extra.init, .none, .none });
|
const layout = union_ty.unionGetLayout(self.target.*);
|
||||||
|
|
||||||
|
const src_ty = self.air.typeOf(extra.init);
|
||||||
|
const src_mcv = try self.resolveInst(extra.init);
|
||||||
|
if (layout.tag_size == 0) {
|
||||||
|
if (self.reuseOperand(inst, extra.init, 0, src_mcv)) break :result src_mcv;
|
||||||
|
|
||||||
|
const dst_mcv = try self.allocRegOrMem(inst, true);
|
||||||
|
try self.genCopy(src_ty, dst_mcv, src_mcv);
|
||||||
|
break :result dst_mcv;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dst_mcv = try self.allocRegOrMem(inst, false);
|
||||||
|
|
||||||
|
const union_obj = union_ty.cast(Type.Payload.Union).?.data;
|
||||||
|
const field_name = union_obj.fields.keys()[extra.field_index];
|
||||||
|
const tag_ty = union_ty.unionTagTypeSafety().?;
|
||||||
|
const field_index = @intCast(u32, tag_ty.enumFieldIndex(field_name).?);
|
||||||
|
var tag_pl = Value.Payload.U32{ .base = .{ .tag = .enum_field_index }, .data = field_index };
|
||||||
|
const tag_val = Value.initPayload(&tag_pl.base);
|
||||||
|
var tag_int_pl: Value.Payload.U64 = undefined;
|
||||||
|
const tag_int_val = tag_val.enumToInt(tag_ty, &tag_int_pl);
|
||||||
|
const tag_int = tag_int_val.toUnsignedInt(self.target.*);
|
||||||
|
const tag_off = if (layout.tag_align < layout.payload_align)
|
||||||
|
@intCast(i32, layout.payload_size)
|
||||||
|
else
|
||||||
|
0;
|
||||||
|
try self.genCopy(tag_ty, dst_mcv.address().offset(tag_off).deref(), .{ .immediate = tag_int });
|
||||||
|
|
||||||
|
const pl_off = if (layout.tag_align < layout.payload_align)
|
||||||
|
0
|
||||||
|
else
|
||||||
|
@intCast(i32, layout.tag_size);
|
||||||
|
try self.genCopy(src_ty, dst_mcv.address().offset(pl_off).deref(), src_mcv);
|
||||||
|
|
||||||
|
break :result dst_mcv;
|
||||||
|
};
|
||||||
|
return self.finishAir(inst, result, .{ extra.init, .none, .none });
|
||||||
}
|
}
|
||||||
|
|
||||||
fn airPrefetch(self: *Self, inst: Air.Inst.Index) !void {
|
fn airPrefetch(self: *Self, inst: Air.Inst.Index) !void {
|
||||||
|
|||||||
@ -14,7 +14,6 @@ const Block = struct {
|
|||||||
|
|
||||||
test {
|
test {
|
||||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
|
|||||||
@ -1352,7 +1352,6 @@ test "struct field init value is size of the struct" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "under-aligned struct field" {
|
test "under-aligned struct field" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
|
|||||||
@ -367,7 +367,6 @@ test "branching inside tuple literal" {
|
|||||||
test "tuple initialized with a runtime known value" {
|
test "tuple initialized with a runtime known value" {
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||||
|
|
||||||
|
|||||||
@ -821,7 +821,6 @@ test "return union init with void payload" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "@unionInit stored to a const" {
|
test "@unionInit stored to a const" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||||
@ -994,7 +993,6 @@ test "function call result coerces from tagged union to the tag" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "cast from anonymous struct to union" {
|
test "cast from anonymous struct to union" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||||
@ -1028,7 +1026,6 @@ test "cast from anonymous struct to union" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "cast from pointer to anonymous struct to pointer to union" {
|
test "cast from pointer to anonymous struct to pointer to union" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||||
@ -1199,7 +1196,6 @@ test "global variable struct contains union initialized to non-most-aligned fiel
|
|||||||
test "union with no result loc initiated with a runtime value" {
|
test "union with no result loc initiated with a runtime value" {
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||||
|
|
||||||
@ -1217,7 +1213,6 @@ test "union with no result loc initiated with a runtime value" {
|
|||||||
test "union with a large struct field" {
|
test "union with a large struct field" {
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||||
|
|
||||||
@ -1288,7 +1283,6 @@ test "extern union most-aligned field is smaller" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "return an extern union from C calling convention" {
|
test "return an extern union from C calling convention" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
@ -1397,7 +1391,6 @@ test "union and enum field order doesn't match" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "@unionInit uses tag value instead of field index" {
|
test "@unionInit uses tag value instead of field index" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user