authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-13 21:58:03-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:28-05:00
log9a77743cc71008d7186614212e542eb2d930af57
treee4cbed6b07e7e8bd25efde7700ad9fd07ddcd384
parentb86a8b4a5b862ce5a6a1c7ca5a755b90c16693db

cbe: add doNotOptimizeAwayC to handle not having __asm support in msvc


1 files changed, 23 insertions(+), 7 deletions(-)

lib/std/mem.zig+23-7
...@@ -3771,7 +3771,7 @@ pub fn doNotOptimizeAway(val: anytype) void {...@@ -3771,7 +3771,7 @@ pub fn doNotOptimizeAway(val: anytype) void {
3771 .Bool => doNotOptimizeAway(@boolToInt(val)),3771 .Bool => doNotOptimizeAway(@boolToInt(val)),
3772 .Int => {3772 .Int => {
3773 const bits = t.Int.bits;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 const val2 = @as(3775 const val2 = @as(
3776 std.meta.Int(t.Int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, bits))),3776 std.meta.Int(t.Int.signedness, @max(8, std.math.ceilPowerOfTwoAssert(u16, bits))),
3777 val,3777 val,
...@@ -3783,18 +3783,24 @@ pub fn doNotOptimizeAway(val: anytype) void {...@@ -3783,18 +3783,24 @@ pub fn doNotOptimizeAway(val: anytype) void {
3783 } else doNotOptimizeAway(&val);3783 } else doNotOptimizeAway(&val);
3784 },3784 },
3785 .Float => {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 asm volatile (""3787 asm volatile (""
3788 :3788 :
3789 : [val] "rm" (val),3789 : [val] "rm" (val),
3790 );3790 );
3791 } else doNotOptimizeAway(&val);3791 } else doNotOptimizeAway(&val);
3792 },3792 },
3793 .Pointer => asm volatile (""3793 .Pointer => {
3794 :3794 if (builtin.zig_backend == .stage2_c) {
3795 : [val] "m" (val),3795 doNotOptimizeAwayC(val);
3796 : "memory"3796 } else {
3797 ),3797 asm volatile (""
3798 :
3799 : [val] "m" (val),
3800 : "memory"
3801 );
3802 }
3803 },
3798 .Array => {3804 .Array => {
3799 if (t.Array.len * @sizeOf(t.Array.child) <= 64) {3805 if (t.Array.len * @sizeOf(t.Array.child) <= 64) {
3800 for (val) |v| doNotOptimizeAway(v);3806 for (val) |v| doNotOptimizeAway(v);
...@@ -3804,6 +3810,16 @@ pub fn doNotOptimizeAway(val: anytype) void {...@@ -3804,6 +3810,16 @@ pub fn doNotOptimizeAway(val: anytype) void {
3804 }3810 }
3805}3811}
38063812
3813/// .stage2_c doesn't support asm blocks yet, so use volatile stores instead
3814var deopt_target: if (builtin.zig_backend == .stage2_c) u8 else void = undefined;
3815fn 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
3807test "doNotOptimizeAway" {3823test "doNotOptimizeAway" {
3808 comptime doNotOptimizeAway("test");3824 comptime doNotOptimizeAway("test");
38093825