[wasm] Implement integer log2 in jiterpreter (#84068)
authorKatelyn Gadd <kg@luminance.org>
Wed, 29 Mar 2023 15:12:02 +0000 (08:12 -0700)
committerGitHub <noreply@github.com>
Wed, 29 Mar 2023 15:12:02 +0000 (08:12 -0700)
src/mono/mono/mini/interp/jiterpreter.c
src/mono/wasm/runtime/jiterpreter-trace-generator.ts

index aa4bc41aedf0f72015da4fcf3de78c213b5c23e9..ca88b7607966b08116a86f1df2476cce12c92f58 100644 (file)
@@ -702,9 +702,11 @@ jiterp_should_abort_trace (InterpInst *ins, gboolean *inside_branch_block)
                case MINT_CLZ_I4:
                case MINT_CTZ_I4:
                case MINT_POPCNT_I4:
+               case MINT_LOG2_I4:
                case MINT_CLZ_I8:
                case MINT_CTZ_I8:
                case MINT_POPCNT_I8:
+               case MINT_LOG2_I8:
                        return TRACE_CONTINUE;
 
                case MINT_BR:
index 28914ecc92ae171ee7ca65deddb91f5887ef4188..1f59a6ca37322a6a0f662a81060fd6a731b380c9 100644 (file)
@@ -1075,6 +1075,28 @@ export function generate_wasm_body (
                 builder.callImport("cmpxchg_i64");
                 break;
 
+            case MintOpcode.MINT_LOG2_I4:
+            case MintOpcode.MINT_LOG2_I8: {
+                const isI64 = (opcode === MintOpcode.MINT_LOG2_I8);
+
+                builder.local("pLocals");
+
+                append_ldloc(builder, getArgU16(ip, 2), isI64 ? WasmOpcode.i64_load : WasmOpcode.i32_load);
+                if (isI64)
+                    builder.i52_const(1);
+                else
+                    builder.i32_const(1);
+                builder.appendU8(isI64 ? WasmOpcode.i64_or : WasmOpcode.i32_or);
+                builder.appendU8(isI64 ? WasmOpcode.i64_clz : WasmOpcode.i32_clz);
+                if (isI64)
+                    builder.appendU8(WasmOpcode.i32_wrap_i64);
+                builder.i32_const(isI64 ? 63 : 31);
+                builder.appendU8(WasmOpcode.i32_xor);
+
+                append_stloc_tail(builder, getArgU16(ip, 1), WasmOpcode.i32_store);
+                break;
+            }
+
             case MintOpcode.MINT_FMA:
             case MintOpcode.MINT_FMAF: {
                 const isF32 = (opcode === MintOpcode.MINT_FMAF),