| author | |
| committer | |
| log | 7e7d1df4daedecf32d97ad21c85e23bcaac29e7a |
| tree | b95d1d1a087b0517cfa708080510ee8d6644bf2b |
| parent | 7b52dbbf83ec89b9337e2be7328480e83489dc0d |
| signature | Commit is signed but in an unrecognized format. |
5 files changed, 120 insertions(+), 67 deletions(-)
src-self-hosted/Module.zig+55-15| ... | ... | @@ -2352,6 +2352,7 @@ fn analyzeInst(self: *Module, scope: *Scope, old_inst: *zir.Inst) InnerError!*In |
| 2352 | 2352 | .fntype => return self.analyzeInstFnType(scope, old_inst.castTag(.fntype).?), |
| 2353 | 2353 | .intcast => return self.analyzeInstIntCast(scope, old_inst.castTag(.intcast).?), |
| 2354 | 2354 | .bitcast => return self.analyzeInstBitCast(scope, old_inst.castTag(.bitcast).?), |
| 2355 | .floatcast => return self.analyzeInstFloatCast(scope, old_inst.castTag(.floatcast).?), | |
| 2355 | 2356 | .elemptr => return self.analyzeInstElemPtr(scope, old_inst.castTag(.elemptr).?), |
| 2356 | 2357 | .add => return self.analyzeInstAdd(scope, old_inst.castTag(.add).?), |
| 2357 | 2358 | .sub => return self.analyzeInstSub(scope, old_inst.castTag(.sub).?), |
| ... | ... | @@ -2796,16 +2797,16 @@ fn analyzeInstFieldPtr(self: *Module, scope: *Scope, fieldptr: *zir.Inst.FieldPt |
| 2796 | 2797 | } |
| 2797 | 2798 | } |
| 2798 | 2799 | |
| 2799 | fn analyzeInstIntCast(self: *Module, scope: *Scope, intcast: *zir.Inst.IntCast) InnerError!*Inst { | |
| 2800 | const dest_type = try self.resolveType(scope, intcast.positionals.dest_type); | |
| 2801 | const new_inst = try self.resolveInst(scope, intcast.positionals.value); | |
| 2800 | fn analyzeInstIntCast(self: *Module, scope: *Scope, inst: *zir.Inst.IntCast) InnerError!*Inst { | |
| 2801 | const dest_type = try self.resolveType(scope, inst.positionals.dest_type); | |
| 2802 | const operand = try self.resolveInst(scope, inst.positionals.operand); | |
| 2802 | 2803 | |
| 2803 | 2804 | const dest_is_comptime_int = switch (dest_type.zigTypeTag()) { |
| 2804 | 2805 | .ComptimeInt => true, |
| 2805 | 2806 | .Int => false, |
| 2806 | 2807 | else => return self.fail( |
| 2807 | 2808 | scope, |
| 2808 | intcast.positionals.dest_type.src, | |
| 2809 | inst.positionals.dest_type.src, | |
| 2809 | 2810 | "expected integer type, found '{}'", |
| 2810 | 2811 | .{ |
| 2811 | 2812 | dest_type, |
| ... | ... | @@ -2813,21 +2814,23 @@ fn analyzeInstIntCast(self: *Module, scope: *Scope, intcast: *zir.Inst.IntCast) |
| 2813 | 2814 | ), |
| 2814 | 2815 | }; |
| 2815 | 2816 | |
| 2816 | switch (new_inst.ty.zigTypeTag()) { | |
| 2817 | switch (operand.ty.zigTypeTag()) { | |
| 2817 | 2818 | .ComptimeInt, .Int => {}, |
| 2818 | 2819 | else => return self.fail( |
| 2819 | 2820 | scope, |
| 2820 | intcast.positionals.value.src, | |
| 2821 | inst.positionals.operand.src, | |
| 2821 | 2822 | "expected integer type, found '{}'", |
| 2822 | .{new_inst.ty}, | |
| 2823 | .{operand.ty}, | |
| 2823 | 2824 | ), |
| 2824 | 2825 | } |
| 2825 | 2826 | |
| 2826 | if (dest_is_comptime_int or new_inst.value() != null) { | |
| 2827 | return self.coerce(scope, dest_type, new_inst); | |
| 2827 | if (operand.value() != null) { | |
| 2828 | return self.coerce(scope, dest_type, operand); | |
| 2829 | } else if (dest_is_comptime_int) { | |
| 2830 | return self.fail(scope, inst.base.src, "unable to cast runtime value to 'comptime_int'", .{}); | |
| 2828 | 2831 | } |
| 2829 | 2832 | |
| 2830 | return self.fail(scope, intcast.base.src, "TODO implement analyze widen or shorten int", .{}); | |
| 2833 | return self.fail(scope, inst.base.src, "TODO implement analyze widen or shorten int", .{}); | |
| 2831 | 2834 | } |
| 2832 | 2835 | |
| 2833 | 2836 | fn analyzeInstBitCast(self: *Module, scope: *Scope, inst: *zir.Inst.BitCast) InnerError!*Inst { |
| ... | ... | @@ -2836,6 +2839,42 @@ fn analyzeInstBitCast(self: *Module, scope: *Scope, inst: *zir.Inst.BitCast) Inn |
| 2836 | 2839 | return self.bitcast(scope, dest_type, operand); |
| 2837 | 2840 | } |
| 2838 | 2841 | |
| 2842 | fn analyzeInstFloatCast(self: *Module, scope: *Scope, inst: *zir.Inst.FloatCast) InnerError!*Inst { | |
| 2843 | const dest_type = try self.resolveType(scope, inst.positionals.dest_type); | |
| 2844 | const operand = try self.resolveInst(scope, inst.positionals.operand); | |
| 2845 | ||
| 2846 | const dest_is_comptime_float = switch (dest_type.zigTypeTag()) { | |
| 2847 | .ComptimeFloat => true, | |
| 2848 | .Float => false, | |
| 2849 | else => return self.fail( | |
| 2850 | scope, | |
| 2851 | inst.positionals.dest_type.src, | |
| 2852 | "expected float type, found '{}'", | |
| 2853 | .{ | |
| 2854 | dest_type, | |
| 2855 | }, | |
| 2856 | ), | |
| 2857 | }; | |
| 2858 | ||
| 2859 | switch (operand.ty.zigTypeTag()) { | |
| 2860 | .ComptimeFloat, .Float, .ComptimeInt => {}, | |
| 2861 | else => return self.fail( | |
| 2862 | scope, | |
| 2863 | inst.positionals.operand.src, | |
| 2864 | "expected float type, found '{}'", | |
| 2865 | .{operand.ty}, | |
| 2866 | ), | |
| 2867 | } | |
| 2868 | ||
| 2869 | if (operand.value() != null) { | |
| 2870 | return self.coerce(scope, dest_type, operand); | |
| 2871 | } else if (dest_is_comptime_float) { | |
| 2872 | return self.fail(scope, inst.base.src, "unable to cast runtime value to 'comptime_float'", .{}); | |
| 2873 | } | |
| 2874 | ||
| 2875 | return self.fail(scope, inst.base.src, "TODO implement analyze widen or shorten float", .{}); | |
| 2876 | } | |
| 2877 | ||
| 2839 | 2878 | fn analyzeInstElemPtr(self: *Module, scope: *Scope, inst: *zir.Inst.ElemPtr) InnerError!*Inst { |
| 2840 | 2879 | const array_ptr = try self.resolveInst(scope, inst.positionals.array_ptr); |
| 2841 | 2880 | const uncasted_index = try self.resolveInst(scope, inst.positionals.index); |
| ... | ... | @@ -3411,11 +3450,12 @@ fn coerce(self: *Module, scope: *Scope, dest_type: Type, inst: *Inst) !*Inst { |
| 3411 | 3450 | |
| 3412 | 3451 | const src_info = inst.ty.intInfo(self.target()); |
| 3413 | 3452 | const dst_info = dest_type.intInfo(self.target()); |
| 3414 | if (src_info.signed == dst_info.signed and dst_info.bits >= src_info.bits) { | |
| 3453 | if ((src_info.signed == dst_info.signed and dst_info.bits >= src_info.bits) or | |
| 3454 | // small enough unsigned ints can get casted to large enough signed ints | |
| 3455 | (src_info.signed and !dst_info.signed and dst_info.bits > src_info.bits)) | |
| 3456 | { | |
| 3415 | 3457 | const b = try self.requireRuntimeBlock(scope, inst.src); |
| 3416 | return self.addNewInstArgs(b, inst.src, dest_type, Inst.WidenOrShorten, .{ .operand = inst }); | |
| 3417 | } else { | |
| 3418 | return self.fail(scope, inst.src, "TODO implement more int widening {} to {}", .{ inst.ty, dest_type }); | |
| 3458 | return self.addUnOp(b, inst.src, dest_type, .intcast, inst); | |
| 3419 | 3459 | } |
| 3420 | 3460 | } |
| 3421 | 3461 | |
| ... | ... | @@ -3427,7 +3467,7 @@ fn coerce(self: *Module, scope: *Scope, dest_type: Type, inst: *Inst) !*Inst { |
| 3427 | 3467 | const dst_bits = dest_type.floatBits(self.target()); |
| 3428 | 3468 | if (dst_bits >= src_bits) { |
| 3429 | 3469 | const b = try self.requireRuntimeBlock(scope, inst.src); |
| 3430 | return self.addNewInstArgs(b, inst.src, dest_type, Inst.WidenOrShorten, .{ .operand = inst }); | |
| 3470 | return self.addUnOp(b, inst.src, dest_type, .floatcast, inst); | |
| 3431 | 3471 | } |
| 3432 | 3472 | } |
| 3433 | 3473 |
src-self-hosted/codegen.zig+13-3| ... | ... | @@ -459,16 +459,26 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 459 | 459 | .sub => return self.genSub(inst.castTag(.sub).?), |
| 460 | 460 | .unreach => return MCValue{ .unreach = {} }, |
| 461 | 461 | .not => return self.genNot(inst.castTag(.not).?), |
| 462 | .widenorshorten => return self.genWidenOrShorten(isnt.castTag(.widenorshorten).?), | |
| 462 | .floatcast => return self.genFloatCast(inst.castTag(.floatcast).?), | |
| 463 | .intcast => return self.genIntCast(inst.castTag(.intcast).?), | |
| 463 | 464 | } |
| 464 | 465 | } |
| 465 | 466 | |
| 466 | fn genWidenOrShorten(self: *Self, inst: *ir.Inst.WidenOrShorten) !MCValue { | |
| 467 | fn genFloatCast(self: *Self, inst: *ir.Inst.UnOp) !MCValue { | |
| 467 | 468 | // No side effects, so if it's unreferenced, do nothing. |
| 468 | 469 | if (inst.base.isUnused()) |
| 469 | 470 | return MCValue.dead; |
| 470 | 471 | switch (arch) { |
| 471 | else => return self.fail(inst.base.src, "TODO implement widen or shorten for {}", .{self.target.cpu.arch}), | |
| 472 | else => return self.fail(inst.base.src, "TODO implement floatCast for {}", .{self.target.cpu.arch}), | |
| 473 | } | |
| 474 | } | |
| 475 | ||
| 476 | fn genIntCast(self: *Self, inst: *ir.Inst.UnOp) !MCValue { | |
| 477 | // No side effects, so if it's unreferenced, do nothing. | |
| 478 | if (inst.base.isUnused()) | |
| 479 | return MCValue.dead; | |
| 480 | switch (arch) { | |
| 481 | else => return self.fail(inst.base.src, "TODO implement intCast for {}", .{self.target.cpu.arch}), | |
| 472 | 482 | } |
| 473 | 483 | } |
| 474 | 484 |
src-self-hosted/ir.zig+4-11| ... | ... | @@ -71,7 +71,8 @@ pub const Inst = struct { |
| 71 | 71 | sub, |
| 72 | 72 | unreach, |
| 73 | 73 | not, |
| 74 | widenorshorten, | |
| 74 | floatcast, | |
| 75 | intcast, | |
| 75 | 76 | |
| 76 | 77 | /// There is one-to-one correspondence between tag and type for now, |
| 77 | 78 | /// but this will not always be the case. For example, binary operations |
| ... | ... | @@ -90,6 +91,8 @@ pub const Inst = struct { |
| 90 | 91 | .isnonnull, |
| 91 | 92 | .isnull, |
| 92 | 93 | .ptrtoint, |
| 94 | .floatcast, | |
| 95 | .intcast, | |
| 93 | 96 | => UnOp, |
| 94 | 97 | |
| 95 | 98 | .add, |
| ... | ... | @@ -109,7 +112,6 @@ pub const Inst = struct { |
| 109 | 112 | .call => Call, |
| 110 | 113 | .condbr => CondBr, |
| 111 | 114 | .constant => Constant, |
| 112 | .widenorshorten => WidenOrShorten, | |
| 113 | 115 | }; |
| 114 | 116 | } |
| 115 | 117 | |
| ... | ... | @@ -376,15 +378,6 @@ pub const Inst = struct { |
| 376 | 378 | return null; |
| 377 | 379 | } |
| 378 | 380 | }; |
| 379 | ||
| 380 | pub const WidenOrShorten = struct { | |
| 381 | pub const base_tag = Tag.widenorshorten; | |
| 382 | ||
| 383 | base: Inst, | |
| 384 | args: struct { | |
| 385 | operand: *Inst, | |
| 386 | }, | |
| 387 | }; | |
| 388 | 381 | }; |
| 389 | 382 | |
| 390 | 383 | pub const Body = struct { |
src-self-hosted/value.zig+7-17| ... | ... | @@ -80,7 +80,6 @@ pub const Value = extern union { |
| 80 | 80 | elem_ptr, |
| 81 | 81 | bytes, |
| 82 | 82 | repeated, // the value is a value repeated some number of times |
| 83 | float, | |
| 84 | 83 | float_16, |
| 85 | 84 | float_32, |
| 86 | 85 | float_64, |
| ... | ... | @@ -221,7 +220,7 @@ pub const Value = extern union { |
| 221 | 220 | .float_16 => return self.copyPayloadShallow(allocator, Payload.Float_16), |
| 222 | 221 | .float_32 => return self.copyPayloadShallow(allocator, Payload.Float_32), |
| 223 | 222 | .float_64 => return self.copyPayloadShallow(allocator, Payload.Float_64), |
| 224 | .float_128, .float => return self.copyPayloadShallow(allocator, Payload.Float_128), | |
| 223 | .float_128 => return self.copyPayloadShallow(allocator, Payload.Float_128), | |
| 225 | 224 | } |
| 226 | 225 | } |
| 227 | 226 | |
| ... | ... | @@ -312,7 +311,7 @@ pub const Value = extern union { |
| 312 | 311 | .float_16 => return out_stream.print("{}", .{val.cast(Payload.Float_16).?.val}), |
| 313 | 312 | .float_32 => return out_stream.print("{}", .{val.cast(Payload.Float_32).?.val}), |
| 314 | 313 | .float_64 => return out_stream.print("{}", .{val.cast(Payload.Float_64).?.val}), |
| 315 | .float_128, .float => return out_stream.print("{}", .{val.cast(Payload.Float_128).?.val}), | |
| 314 | .float_128 => return out_stream.print("{}", .{val.cast(Payload.Float_128).?.val}), | |
| 316 | 315 | }; |
| 317 | 316 | } |
| 318 | 317 | |
| ... | ... | @@ -393,7 +392,6 @@ pub const Value = extern union { |
| 393 | 392 | .elem_ptr, |
| 394 | 393 | .bytes, |
| 395 | 394 | .repeated, |
| 396 | .float, | |
| 397 | 395 | .float_16, |
| 398 | 396 | .float_32, |
| 399 | 397 | .float_64, |
| ... | ... | @@ -453,7 +451,6 @@ pub const Value = extern union { |
| 453 | 451 | .bytes, |
| 454 | 452 | .undef, |
| 455 | 453 | .repeated, |
| 456 | .float, | |
| 457 | 454 | .float_16, |
| 458 | 455 | .float_32, |
| 459 | 456 | .float_64, |
| ... | ... | @@ -525,7 +522,6 @@ pub const Value = extern union { |
| 525 | 522 | .bytes, |
| 526 | 523 | .undef, |
| 527 | 524 | .repeated, |
| 528 | .float, | |
| 529 | 525 | .float_16, |
| 530 | 526 | .float_32, |
| 531 | 527 | .float_64, |
| ... | ... | @@ -560,7 +556,7 @@ pub const Value = extern union { |
| 560 | 556 | .float_16 => self.cast(Payload.Float_16).?.val, |
| 561 | 557 | .float_32 => self.cast(Payload.Float_32).?.val, |
| 562 | 558 | .float_64 => self.cast(Payload.Float_64).?.val, |
| 563 | .float_128, .float => self.cast(Payload.Float_128).?.val, | |
| 559 | .float_128 => self.cast(Payload.Float_128).?.val, | |
| 564 | 560 | |
| 565 | 561 | .zero, .the_one_possible_value => 0, |
| 566 | 562 | .int_u64 => @intToFloat(f128, self.cast(Payload.Int_u64).?.int), |
| ... | ... | @@ -624,7 +620,6 @@ pub const Value = extern union { |
| 624 | 620 | .bytes, |
| 625 | 621 | .undef, |
| 626 | 622 | .repeated, |
| 627 | .float, | |
| 628 | 623 | .float_16, |
| 629 | 624 | .float_32, |
| 630 | 625 | .float_64, |
| ... | ... | @@ -701,7 +696,6 @@ pub const Value = extern union { |
| 701 | 696 | .elem_ptr, |
| 702 | 697 | .bytes, |
| 703 | 698 | .repeated, |
| 704 | .float, | |
| 705 | 699 | .float_16, |
| 706 | 700 | .float_32, |
| 707 | 701 | .float_64, |
| ... | ... | @@ -830,8 +824,8 @@ pub const Value = extern union { |
| 830 | 824 | .float_16 => @rem(self.cast(Payload.Float_16).?.val, 1) != 0, |
| 831 | 825 | .float_32 => @rem(self.cast(Payload.Float_32).?.val, 1) != 0, |
| 832 | 826 | .float_64 => @rem(self.cast(Payload.Float_64).?.val, 1) != 0, |
| 833 | // .float_128, .float => @rem(self.cast(Payload.Float_128).?.val, 1) != 0, | |
| 834 | .float_128, .float => @panic("TODO lld: error: undefined symbol: fmodl"), | |
| 827 | // .float_128 => @rem(self.cast(Payload.Float_128).?.val, 1) != 0, | |
| 828 | .float_128 => @panic("TODO lld: error: undefined symbol: fmodl"), | |
| 835 | 829 | }; |
| 836 | 830 | } |
| 837 | 831 | |
| ... | ... | @@ -902,7 +896,7 @@ pub const Value = extern union { |
| 902 | 896 | .float_16 => std.math.order(lhs.cast(Payload.Float_16).?.val, 0), |
| 903 | 897 | .float_32 => std.math.order(lhs.cast(Payload.Float_32).?.val, 0), |
| 904 | 898 | .float_64 => std.math.order(lhs.cast(Payload.Float_64).?.val, 0), |
| 905 | .float_128, .float => std.math.order(lhs.cast(Payload.Float_128).?.val, 0), | |
| 899 | .float_128 => std.math.order(lhs.cast(Payload.Float_128).?.val, 0), | |
| 906 | 900 | }; |
| 907 | 901 | } |
| 908 | 902 | |
| ... | ... | @@ -923,7 +917,7 @@ pub const Value = extern union { |
| 923 | 917 | .float_16 => return std.math.order(lhs.cast(Payload.Float_16).?.val, rhs.cast(Payload.Float_16).?.val), |
| 924 | 918 | .float_32 => return std.math.order(lhs.cast(Payload.Float_32).?.val, rhs.cast(Payload.Float_32).?.val), |
| 925 | 919 | .float_64 => return std.math.order(lhs.cast(Payload.Float_64).?.val, rhs.cast(Payload.Float_64).?.val), |
| 926 | .float_128, .float => return std.math.order(lhs.cast(Payload.Float_128).?.val, rhs.cast(Payload.Float_128).?.val), | |
| 920 | .float_128 => return std.math.order(lhs.cast(Payload.Float_128).?.val, rhs.cast(Payload.Float_128).?.val), | |
| 927 | 921 | else => unreachable, |
| 928 | 922 | }; |
| 929 | 923 | } |
| ... | ... | @@ -1012,7 +1006,6 @@ pub const Value = extern union { |
| 1012 | 1006 | .bytes, |
| 1013 | 1007 | .undef, |
| 1014 | 1008 | .repeated, |
| 1015 | .float, | |
| 1016 | 1009 | .float_16, |
| 1017 | 1010 | .float_32, |
| 1018 | 1011 | .float_64, |
| ... | ... | @@ -1088,7 +1081,6 @@ pub const Value = extern union { |
| 1088 | 1081 | .elem_ptr, |
| 1089 | 1082 | .ref_val, |
| 1090 | 1083 | .decl_ref, |
| 1091 | .float, | |
| 1092 | 1084 | .float_16, |
| 1093 | 1085 | .float_32, |
| 1094 | 1086 | .float_64, |
| ... | ... | @@ -1179,7 +1171,6 @@ pub const Value = extern union { |
| 1179 | 1171 | .elem_ptr, |
| 1180 | 1172 | .bytes, |
| 1181 | 1173 | .repeated, |
| 1182 | .float, | |
| 1183 | 1174 | .float_16, |
| 1184 | 1175 | .float_32, |
| 1185 | 1176 | .float_64, |
| ... | ... | @@ -1196,7 +1187,6 @@ pub const Value = extern union { |
| 1196 | 1187 | return switch (self.tag()) { |
| 1197 | 1188 | .undef => unreachable, |
| 1198 | 1189 | |
| 1199 | .float, | |
| 1200 | 1190 | .float_16, |
| 1201 | 1191 | .float_32, |
| 1202 | 1192 | .float_64, |
src-self-hosted/zir.zig+41-21| ... | ... | @@ -76,6 +76,7 @@ pub const Inst = struct { |
| 76 | 76 | primitive, |
| 77 | 77 | intcast, |
| 78 | 78 | bitcast, |
| 79 | floatcast, | |
| 79 | 80 | elemptr, |
| 80 | 81 | add, |
| 81 | 82 | sub, |
| ... | ... | @@ -137,6 +138,7 @@ pub const Inst = struct { |
| 137 | 138 | .fntype => FnType, |
| 138 | 139 | .intcast => IntCast, |
| 139 | 140 | .bitcast => BitCast, |
| 141 | .floatcast => FloatCast, | |
| 140 | 142 | .elemptr => ElemPtr, |
| 141 | 143 | .condbr => CondBr, |
| 142 | 144 | }; |
| ... | ... | @@ -169,6 +171,7 @@ pub const Inst = struct { |
| 169 | 171 | .primitive, |
| 170 | 172 | .intcast, |
| 171 | 173 | .bitcast, |
| 174 | .floatcast, | |
| 172 | 175 | .elemptr, |
| 173 | 176 | .add, |
| 174 | 177 | .sub, |
| ... | ... | @@ -556,6 +559,18 @@ pub const Inst = struct { |
| 556 | 559 | }; |
| 557 | 560 | }; |
| 558 | 561 | |
| 562 | pub const FloatCast = struct { | |
| 563 | pub const base_tag = Tag.floatcast; | |
| 564 | pub const builtin_name = "@floatCast"; | |
| 565 | base: Inst, | |
| 566 | ||
| 567 | positionals: struct { | |
| 568 | dest_type: *Inst, | |
| 569 | operand: *Inst, | |
| 570 | }, | |
| 571 | kw_args: struct {}, | |
| 572 | }; | |
| 573 | ||
| 559 | 574 | pub const IntCast = struct { |
| 560 | 575 | pub const base_tag = Tag.intcast; |
| 561 | 576 | pub const builtin_name = "@intCast"; |
| ... | ... | @@ -563,7 +578,7 @@ pub const Inst = struct { |
| 563 | 578 | |
| 564 | 579 | positionals: struct { |
| 565 | 580 | dest_type: *Inst, |
| 566 | value: *Inst, | |
| 581 | operand: *Inst, | |
| 567 | 582 | }, |
| 568 | 583 | kw_args: struct {}, |
| 569 | 584 | }; |
| ... | ... | @@ -1620,6 +1635,28 @@ const EmitZIR = struct { |
| 1620 | 1635 | return &new_inst.base; |
| 1621 | 1636 | } |
| 1622 | 1637 | |
| 1638 | fn emitCast( | |
| 1639 | self: *EmitZIR, | |
| 1640 | src: usize, | |
| 1641 | new_body: ZirBody, | |
| 1642 | old_inst: *ir.Inst.UnOp, | |
| 1643 | comptime I: type, | |
| 1644 | ) Allocator.Error!*Inst { | |
| 1645 | const new_inst = try self.arena.allocator.create(I); | |
| 1646 | new_inst.* = .{ | |
| 1647 | .base = .{ | |
| 1648 | .src = src, | |
| 1649 | .tag = I.base_tag, | |
| 1650 | }, | |
| 1651 | .positionals = .{ | |
| 1652 | .dest_type = (try self.emitType(src, old_inst.base.ty)).inst, | |
| 1653 | .operand = try self.resolveInst(new_body, old_inst.operand), | |
| 1654 | }, | |
| 1655 | .kw_args = .{}, | |
| 1656 | }; | |
| 1657 | return &new_inst.base; | |
| 1658 | } | |
| 1659 | ||
| 1623 | 1660 | fn emitBody( |
| 1624 | 1661 | self: *EmitZIR, |
| 1625 | 1662 | body: ir.Body, |
| ... | ... | @@ -1654,22 +1691,9 @@ const EmitZIR = struct { |
| 1654 | 1691 | .cmp_gt => try self.emitBinOp(inst.src, new_body, inst.castTag(.cmp_gt).?, .cmp_gt), |
| 1655 | 1692 | .cmp_neq => try self.emitBinOp(inst.src, new_body, inst.castTag(.cmp_neq).?, .cmp_neq), |
| 1656 | 1693 | |
| 1657 | .bitcast => blk: { | |
| 1658 | const old_inst = inst.castTag(.bitcast).?; | |
| 1659 | const new_inst = try self.arena.allocator.create(Inst.BitCast); | |
| 1660 | new_inst.* = .{ | |
| 1661 | .base = .{ | |
| 1662 | .src = inst.src, | |
| 1663 | .tag = Inst.BitCast.base_tag, | |
| 1664 | }, | |
| 1665 | .positionals = .{ | |
| 1666 | .dest_type = (try self.emitType(inst.src, inst.ty)).inst, | |
| 1667 | .operand = try self.resolveInst(new_body, old_inst.operand), | |
| 1668 | }, | |
| 1669 | .kw_args = .{}, | |
| 1670 | }; | |
| 1671 | break :blk &new_inst.base; | |
| 1672 | }, | |
| 1694 | .bitcast => try self.emitCast(inst.src, new_body, inst.castTag(.bitcast).?, Inst.BitCast), | |
| 1695 | .intcast => try self.emitCast(inst.src, new_body, inst.castTag(.intcast).?, Inst.IntCast), | |
| 1696 | .floatcast => try self.emitCast(inst.src, new_body, inst.castTag(.floatcast).?, Inst.FloatCast), | |
| 1673 | 1697 | |
| 1674 | 1698 | .block => blk: { |
| 1675 | 1699 | const old_inst = inst.castTag(.block).?; |
| ... | ... | @@ -1822,10 +1846,6 @@ const EmitZIR = struct { |
| 1822 | 1846 | }; |
| 1823 | 1847 | break :blk &new_inst.base; |
| 1824 | 1848 | }, |
| 1825 | .widenorshorten => blk: { | |
| 1826 | const old_inst = inst.cast(ir.Inst.WidenOrShorten).?; | |
| 1827 | break :blk try self.resolveInst(new_body, old_inst.args.operand); | |
| 1828 | }, | |
| 1829 | 1849 | }; |
| 1830 | 1850 | try instructions.append(new_inst); |
| 1831 | 1851 | try inst_table.put(inst, new_inst); |