| //@ requireOptions("--useBBQJIT=1") |
| // Copyright 2022 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| load("wasm-module-builder.js"); |
| |
| let builder = new WasmModuleBuilder(); |
| let fcts = [ |
| builder.addFunction('i64_shr_u_dynamic', |
| makeSig([kWasmI64, kWasmI64], [kWasmI64])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| kExprLocalGet, 1, |
| kExprI64ShrU, |
| ]), |
| builder.addFunction('i64_shr_u_by_negative_48', |
| makeSig([kWasmI64], [kWasmI64])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| ...wasmI64Const(-48), |
| kExprI64ShrU, |
| ]), |
| builder.addFunction('i64_shr_s_dynamic', |
| makeSig([kWasmI64, kWasmI64], [kWasmI64])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| kExprLocalGet, 1, |
| kExprI64ShrS, |
| ]), |
| builder.addFunction('i64_shr_s_by_negative_48', |
| makeSig([kWasmI64], [kWasmI64])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| ...wasmI64Const(-48), |
| kExprI64ShrS, |
| ]), |
| builder.addFunction('i32_shr_u_dynamic', |
| makeSig([kWasmI32, kWasmI32], [kWasmI32])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| kExprLocalGet, 1, |
| kExprI32ShrU, |
| ]), |
| builder.addFunction('i32_shr_u_by_negative_22', |
| makeSig([kWasmI32], [kWasmI32])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| ...wasmI32Const(-22), |
| kExprI32ShrU, |
| ]), |
| builder.addFunction('i32_shr_s_dynamic', |
| makeSig([kWasmI32, kWasmI32], [kWasmI32])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| kExprLocalGet, 1, |
| kExprI32ShrS, |
| ]), |
| builder.addFunction('i32_shr_s_by_negative_22', |
| makeSig([kWasmI32], [kWasmI32])) |
| .exportFunc().addBody([ |
| kExprLocalGet, 0, |
| ...wasmI32Const(-22), |
| kExprI32ShrS, |
| ]), |
| ]; |
| |
| let instance = builder.instantiate(); |
| let wasm = instance.exports; |
| |
| let testFct = () => { |
| // i64.shr_u |
| assertEquals(0n, wasm.i64_shr_u_dynamic(0n, 0n)); |
| assertEquals(1n, wasm.i64_shr_u_dynamic(3n, 1n)); |
| assertEquals(-1n, wasm.i64_shr_u_dynamic(-1n, 64n)); |
| assertEquals(-1n, wasm.i64_shr_u_dynamic(-1n, -64n)); |
| assertEquals(1n, wasm.i64_shr_u_dynamic(-1n, 63n)); |
| assertEquals(1n, wasm.i64_shr_u_dynamic(-1n, -1n)); |
| assertEquals(BigInt(2 ** 32 - 1), wasm.i64_shr_u_dynamic(-1n, -32n)); |
| assertEquals(8n, wasm.i64_shr_u_dynamic(16n, 65n)); |
| assertEquals(8n, wasm.i64_shr_u_dynamic(16n, -127n)); |
| |
| assertEquals(0n, wasm.i64_shr_u_by_negative_48(123n)); |
| assertEquals(BigInt(2 ** 48 - 1), wasm.i64_shr_u_by_negative_48(-1n)); |
| assertEquals(4n, wasm.i64_shr_u_by_negative_48(BigInt(2 ** 18))) |
| |
| // i64.shr_s |
| assertEquals(0n, wasm.i64_shr_s_dynamic(0n, 0n)); |
| assertEquals(1n, wasm.i64_shr_s_dynamic(3n, 1n)); |
| assertEquals(-1n, wasm.i64_shr_s_dynamic(-1n, 64n)); |
| assertEquals(-1n, wasm.i64_shr_s_dynamic(-1n, -64n)); |
| assertEquals(-1n, wasm.i64_shr_s_dynamic(-8n, 63n)); |
| assertEquals(-4n, wasm.i64_shr_s_dynamic(-8n, -63n)); |
| assertEquals(-1n, wasm.i64_shr_s_dynamic(-16n, -2n)); |
| |
| assertEquals(0n, wasm.i64_shr_s_by_negative_48(123n)); |
| assertEquals(-BigInt(2 ** 16), |
| wasm.i64_shr_s_by_negative_48(-BigInt(2 ** 32))); |
| |
| // i32.shr_u |
| assertEquals(0, wasm.i32_shr_u_dynamic(0, 0)); |
| assertEquals(1, wasm.i32_shr_u_dynamic(3, 1)); |
| assertEquals(-1, wasm.i32_shr_u_dynamic(-1, 32)); |
| assertEquals(-1, wasm.i32_shr_u_dynamic(-1, -32)); |
| assertEquals((1 << 17) - 1, wasm.i32_shr_u_dynamic(-1, 15)); |
| |
| assertEquals(123, wasm.i32_shr_u_by_negative_22((123 << 10) + 456)); |
| assertEquals((1 << 22) - 123, wasm.i32_shr_u_by_negative_22(-123 << 10)); |
| |
| // i32.shr_s |
| assertEquals(0, wasm.i32_shr_s_dynamic(0, 0)); |
| assertEquals(1, wasm.i32_shr_s_dynamic(3, 1)); |
| assertEquals(-1, wasm.i32_shr_s_dynamic(-1, 32)); |
| assertEquals(-1, wasm.i32_shr_s_dynamic(-1, -32)); |
| assertEquals(-123, wasm.i32_shr_s_dynamic(-123 << 15, 15)); |
| |
| assertEquals(123, wasm.i32_shr_s_by_negative_22((123 << 10) + 456)); |
| assertEquals(-123, wasm.i32_shr_s_by_negative_22((-123 << 10) + 456)); |
| }; |
| |
| for (let i = 0; i < wasmTestLoopCount; i++) testFct(); |