aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Verigo <paul.verigo@gmail.com>2025-02-27 15:12:18 +0100
committerPavel Verigo <paul.verigo@gmail.com>2025-03-24 15:00:00 +0100
commit15bc2ab0a868fed31780d73451db4d1c69e7b489 (patch)
tree87243ddf2237691ec558bd1543231fd90f7aa72c
parenta429d04ba9cb1205d88211b7b39cbd68113b7178 (diff)
downloadzig-15bc2ab0a868fed31780d73451db4d1c69e7b489.tar.gz
zig-15bc2ab0a868fed31780d73451db4d1c69e7b489.zip
stage2-wasm: clz fix
-rw-r--r--src/arch/wasm/CodeGen.zig14
-rw-r--r--test/behavior/math.zig1
2 files changed, 12 insertions, 3 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig
index a0de387dfd..dbd650ab01 100644
--- a/src/arch/wasm/CodeGen.zig
+++ b/src/arch/wasm/CodeGen.zig
@@ -6272,11 +6272,21 @@ fn airClz(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
switch (wasm_bits) {
32 => {
- try cg.emitWValue(operand);
+ if (int_info.signedness == .signed) {
+ const mask = ~@as(u32, 0) >> @intCast(32 - int_info.bits);
+ _ = try cg.binOp(operand, .{ .imm32 = mask }, ty, .@"and");
+ } else {
+ try cg.emitWValue(operand);
+ }
try cg.addTag(.i32_clz);
},
64 => {
- try cg.emitWValue(operand);
+ if (int_info.signedness == .signed) {
+ const mask = ~@as(u64, 0) >> @intCast(64 - int_info.bits);
+ _ = try cg.binOp(operand, .{ .imm64 = mask }, ty, .@"and");
+ } else {
+ try cg.emitWValue(operand);
+ }
try cg.addTag(.i64_clz);
try cg.addTag(.i32_wrap_i64);
},
diff --git a/test/behavior/math.zig b/test/behavior/math.zig
index 76c55c2549..9c9ee012a8 100644
--- a/test/behavior/math.zig
+++ b/test/behavior/math.zig
@@ -65,7 +65,6 @@ test "@clz" {
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
- if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;