| author | |
| committer | |
| log | e36e9323f4c4ce66013ba4774ff0145fc9cad34d |
| tree | c50e24a04d072b93125c95d0ff99cac564bd036b |
| parent | 1667e831cf8099271d97c9391fe4400622e6f96f |
5 files changed, 40 insertions(+), 13 deletions(-)
src/arch/x86_64/CodeGen.zig+40-3| ... | ... | @@ -10147,9 +10147,46 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void { |
| 10147 | 10147 | fn airUnionInit(self: *Self, inst: Air.Inst.Index) !void { |
| 10148 | 10148 | const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; |
| 10149 | 10149 | const extra = self.air.extraData(Air.UnionInit, ty_pl.payload).data; |
| 10150 | _ = extra; | |
| 10151 | return self.fail("TODO implement airUnionInit for x86_64", .{}); | |
| 10152 | //return self.finishAir(inst, result, .{ extra.init, .none, .none }); | |
| 10150 | const result: MCValue = result: { | |
| 10151 | const union_ty = self.air.typeOfIndex(inst); | |
| 10152 | const layout = union_ty.unionGetLayout(self.target.*); | |
| 10153 | ||
| 10154 | const src_ty = self.air.typeOf(extra.init); | |
| 10155 | const src_mcv = try self.resolveInst(extra.init); | |
| 10156 | if (layout.tag_size == 0) { | |
| 10157 | if (self.reuseOperand(inst, extra.init, 0, src_mcv)) break :result src_mcv; | |
| 10158 | ||
| 10159 | const dst_mcv = try self.allocRegOrMem(inst, true); | |
| 10160 | try self.genCopy(src_ty, dst_mcv, src_mcv); | |
| 10161 | break :result dst_mcv; | |
| 10162 | } | |
| 10163 | ||
| 10164 | const dst_mcv = try self.allocRegOrMem(inst, false); | |
| 10165 | ||
| 10166 | const union_obj = union_ty.cast(Type.Payload.Union).?.data; | |
| 10167 | const field_name = union_obj.fields.keys()[extra.field_index]; | |
| 10168 | const tag_ty = union_ty.unionTagTypeSafety().?; | |
| 10169 | const field_index = @intCast(u32, tag_ty.enumFieldIndex(field_name).?); | |
| 10170 | var tag_pl = Value.Payload.U32{ .base = .{ .tag = .enum_field_index }, .data = field_index }; | |
| 10171 | const tag_val = Value.initPayload(&tag_pl.base); | |
| 10172 | var tag_int_pl: Value.Payload.U64 = undefined; | |
| 10173 | const tag_int_val = tag_val.enumToInt(tag_ty, &tag_int_pl); | |
| 10174 | const tag_int = tag_int_val.toUnsignedInt(self.target.*); | |
| 10175 | const tag_off = if (layout.tag_align < layout.payload_align) | |
| 10176 | @intCast(i32, layout.payload_size) | |
| 10177 | else | |
| 10178 | 0; | |
| 10179 | try self.genCopy(tag_ty, dst_mcv.address().offset(tag_off).deref(), .{ .immediate = tag_int }); | |
| 10180 | ||
| 10181 | const pl_off = if (layout.tag_align < layout.payload_align) | |
| 10182 | 0 | |
| 10183 | else | |
| 10184 | @intCast(i32, layout.tag_size); | |
| 10185 | try self.genCopy(src_ty, dst_mcv.address().offset(pl_off).deref(), src_mcv); | |
| 10186 | ||
| 10187 | break :result dst_mcv; | |
| 10188 | }; | |
| 10189 | return self.finishAir(inst, result, .{ extra.init, .none, .none }); | |
| 10153 | 10190 | } |
| 10154 | 10191 | |
| 10155 | 10192 | fn airPrefetch(self: *Self, inst: Air.Inst.Index) !void { |
test/behavior/bugs/13366.zig-1| ... | ... | @@ -14,7 +14,6 @@ const Block = struct { |
| 14 | 14 | |
| 15 | 15 | test { |
| 16 | 16 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 17 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 18 | 17 | if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO |
| 19 | 18 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 20 | 19 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
test/behavior/struct.zig-1| ... | ... | @@ -1352,7 +1352,6 @@ test "struct field init value is size of the struct" { |
| 1352 | 1352 | } |
| 1353 | 1353 | |
| 1354 | 1354 | test "under-aligned struct field" { |
| 1355 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1356 | 1355 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1357 | 1356 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1358 | 1357 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
test/behavior/tuple.zig-1| ... | ... | @@ -367,7 +367,6 @@ test "branching inside tuple literal" { |
| 367 | 367 | test "tuple initialized with a runtime known value" { |
| 368 | 368 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 369 | 369 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 370 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | |
| 371 | 370 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 372 | 371 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 373 | 372 |
test/behavior/union.zig-7| ... | ... | @@ -821,7 +821,6 @@ test "return union init with void payload" { |
| 821 | 821 | } |
| 822 | 822 | |
| 823 | 823 | test "@unionInit stored to a const" { |
| 824 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 825 | 824 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 826 | 825 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 827 | 826 | 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" { |
| 994 | 993 | } |
| 995 | 994 | |
| 996 | 995 | test "cast from anonymous struct to union" { |
| 997 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 998 | 996 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 999 | 997 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1000 | 998 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1028,7 +1026,6 @@ test "cast from anonymous struct to union" { |
| 1028 | 1026 | } |
| 1029 | 1027 | |
| 1030 | 1028 | test "cast from pointer to anonymous struct to pointer to union" { |
| 1031 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1032 | 1029 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1033 | 1030 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1034 | 1031 | 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 |
| 1199 | 1196 | test "union with no result loc initiated with a runtime value" { |
| 1200 | 1197 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1201 | 1198 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1202 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1203 | 1199 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1204 | 1200 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1205 | 1201 | |
| ... | ... | @@ -1217,7 +1213,6 @@ test "union with no result loc initiated with a runtime value" { |
| 1217 | 1213 | test "union with a large struct field" { |
| 1218 | 1214 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1219 | 1215 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1220 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1221 | 1216 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1222 | 1217 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1223 | 1218 | |
| ... | ... | @@ -1288,7 +1283,6 @@ test "extern union most-aligned field is smaller" { |
| 1288 | 1283 | } |
| 1289 | 1284 | |
| 1290 | 1285 | test "return an extern union from C calling convention" { |
| 1291 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1292 | 1286 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1293 | 1287 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1294 | 1288 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1397,7 +1391,6 @@ test "union and enum field order doesn't match" { |
| 1397 | 1391 | } |
| 1398 | 1392 | |
| 1399 | 1393 | test "@unionInit uses tag value instead of field index" { |
| 1400 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 1401 | 1394 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1402 | 1395 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1403 | 1396 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |