| ... | ... | @@ -3771,7 +3771,7 @@ pub fn doNotOptimizeAway(val: anytype) void { |
| 3771 | 3771 | .Bool => doNotOptimizeAway(@boolToInt(val)), |
| 3772 | 3772 | .Int => { |
| 3773 | 3773 | const bits = t.Int.bits; |
| 3774 | | if (bits <= max_gp_register_bits) { |
| 3774 | if (bits <= max_gp_register_bits and builtin.zig_backend != .stage2_c) { |
| 3775 | 3775 | const val2 = @as( |
| 3776 | 3776 | std.meta.Int(t.Int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, bits))), |
| 3777 | 3777 | val, |
| ... | ... | @@ -3783,18 +3783,24 @@ pub fn doNotOptimizeAway(val: anytype) void { |
| 3783 | 3783 | } else doNotOptimizeAway(&val); |
| 3784 | 3784 | }, |
| 3785 | 3785 | .Float => { |
| 3786 | | if (t.Float.bits == 32 or t.Float.bits == 64) { |
| 3786 | if ((t.Float.bits == 32 or t.Float.bits == 64) and builtin.zig_backend != .stage2_c) { |
| 3787 | 3787 | asm volatile ("" |
| 3788 | 3788 | : |
| 3789 | 3789 | : [val] "rm" (val), |
| 3790 | 3790 | ); |
| 3791 | 3791 | } else doNotOptimizeAway(&val); |
| 3792 | 3792 | }, |
| 3793 | | .Pointer => asm volatile ("" |
| 3794 | | : |
| 3795 | | : [val] "m" (val), |
| 3796 | | : "memory" |
| 3797 | | ), |
| 3793 | .Pointer => { |
| 3794 | if (builtin.zig_backend == .stage2_c) { |
| 3795 | doNotOptimizeAwayC(val); |
| 3796 | } else { |
| 3797 | asm volatile ("" |
| 3798 | : |
| 3799 | : [val] "m" (val), |
| 3800 | : "memory" |
| 3801 | ); |
| 3802 | } |
| 3803 | }, |
| 3798 | 3804 | .Array => { |
| 3799 | 3805 | if (t.Array.len * @sizeOf(t.Array.child) <= 64) { |
| 3800 | 3806 | for (val) |v| doNotOptimizeAway(v); |
| ... | ... | @@ -3804,6 +3810,16 @@ pub fn doNotOptimizeAway(val: anytype) void { |
| 3804 | 3810 | } |
| 3805 | 3811 | } |
| 3806 | 3812 | |
| 3813 | /// .stage2_c doesn't support asm blocks yet, so use volatile stores instead |
| 3814 | var deopt_target: if (builtin.zig_backend == .stage2_c) u8 else void = undefined; |
| 3815 | fn doNotOptimizeAwayC(ptr: anytype) void { |
| 3816 | const dest = @ptrCast(*volatile u8, &deopt_target); |
| 3817 | for (asBytes(ptr)) |b| { |
| 3818 | dest.* = b; |
| 3819 | } |
| 3820 | dest.* = 0; |
| 3821 | } |
| 3822 | |
| 3807 | 3823 | test "doNotOptimizeAway" { |
| 3808 | 3824 | comptime doNotOptimizeAway("test"); |
| 3809 | 3825 | |