| ... | ... | @@ -4461,10 +4461,12 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4461 | 4461 | if (dest_ty.isAbiInt()) { |
| 4462 | 4462 | const dest_cty = try f.typeToCType(dest_ty, .complete); |
| 4463 | 4463 | const dest_info = dest_ty.intInfo(target); |
| 4464 | | var wrap_ty_pl = Type.Payload.Bits{ .base = .{ .tag = switch (dest_info.signedness) { |
| 4464 | var info_ty_pl = Type.Payload.Bits{ .base = .{ .tag = switch (dest_info.signedness) { |
| 4465 | 4465 | .unsigned => .int_unsigned, |
| 4466 | 4466 | .signed => .int_signed, |
| 4467 | 4467 | } }, .data = dest_info.bits }; |
| 4468 | var wrap_cty: ?CType = null; |
| 4469 | var need_bitcasts = false; |
| 4468 | 4470 | |
| 4469 | 4471 | try f.writeCValue(writer, local, .Other); |
| 4470 | 4472 | if (dest_cty.castTag(.array)) |pl| { |
| ... | ... | @@ -4472,14 +4474,31 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4472 | 4474 | .Little => pl.data.len - 1, |
| 4473 | 4475 | .Big => 0, |
| 4474 | 4476 | }}); |
| 4475 | | wrap_ty_pl.data -= 1; |
| 4476 | | wrap_ty_pl.data %= @intCast(u16, f.byteSize(f.indexToCType(pl.data.elem_type)) * 8); |
| 4477 | | wrap_ty_pl.data += 1; |
| 4477 | const elem_cty = f.indexToCType(pl.data.elem_type); |
| 4478 | wrap_cty = elem_cty.toSignedness(dest_info.signedness); |
| 4479 | need_bitcasts = wrap_cty.?.tag() == .zig_i128; |
| 4480 | info_ty_pl.data -= 1; |
| 4481 | info_ty_pl.data %= @intCast(u16, f.byteSize(elem_cty) * 8); |
| 4482 | info_ty_pl.data += 1; |
| 4478 | 4483 | } |
| 4479 | | const wrap_ty = Type.initPayload(&wrap_ty_pl.base); |
| 4480 | | try writer.writeAll(" = zig_wrap_"); |
| 4481 | | try f.object.dg.renderTypeForBuiltinFnName(writer, wrap_ty); |
| 4484 | try writer.writeAll(" = "); |
| 4485 | if (need_bitcasts) { |
| 4486 | try writer.writeAll("zig_bitcast_"); |
| 4487 | try f.object.dg.renderCTypeForBuiltinFnName(writer, wrap_cty.?.toUnsigned()); |
| 4488 | try writer.writeByte('('); |
| 4489 | } |
| 4490 | try writer.writeAll("zig_wrap_"); |
| 4491 | const info_ty = Type.initPayload(&info_ty_pl.base); |
| 4492 | if (wrap_cty) |cty| |
| 4493 | try f.object.dg.renderCTypeForBuiltinFnName(writer, cty) |
| 4494 | else |
| 4495 | try f.object.dg.renderTypeForBuiltinFnName(writer, info_ty); |
| 4482 | 4496 | try writer.writeByte('('); |
| 4497 | if (need_bitcasts) { |
| 4498 | try writer.writeAll("zig_bitcast_"); |
| 4499 | try f.object.dg.renderCTypeForBuiltinFnName(writer, wrap_cty.?); |
| 4500 | try writer.writeByte('('); |
| 4501 | } |
| 4483 | 4502 | try f.writeCValue(writer, local, .Other); |
| 4484 | 4503 | if (dest_cty.castTag(.array)) |pl| { |
| 4485 | 4504 | try writer.print("[{d}]", .{switch (target.cpu.arch.endian()) { |
| ... | ... | @@ -4487,7 +4506,9 @@ fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4487 | 4506 | .Big => 0, |
| 4488 | 4507 | }}); |
| 4489 | 4508 | } |
| 4490 | | try f.object.dg.renderBuiltinInfo(writer, wrap_ty, .bits); |
| 4509 | if (need_bitcasts) try writer.writeByte(')'); |
| 4510 | try f.object.dg.renderBuiltinInfo(writer, info_ty, .bits); |
| 4511 | if (need_bitcasts) try writer.writeByte(')'); |
| 4491 | 4512 | try writer.writeAll(");\n"); |
| 4492 | 4513 | } |
| 4493 | 4514 | |