Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| skip-if: wasmCompileMode() != "ion"
// A minimal test for the formation of load-effective-address instructions on
// x86_64. The formation of LEAs is done at the MIR level, so this test
// verifies formation on all targets.
//
// Test inspired by simd/pmaddubsw-x64-ion-codegen.js.
const isX64 = getBuildConfiguration("x64") && !getBuildConfiguration("simulator");
if (hasDisassembler() && isX64) {
let t = `
(module
(memory (export "mem") 1)
(func (export "writeArr32")
(param $b i32) (param $ix i32) (param $data i32)
(local $ea1 i32)
(local $ea2 i32)
(local $ea3 i32)
(local $ea4 i32)
(local $ea5 i32)
;; base(non-constant) + (index << const)
(local.set $ea1
(i32.add (local.get $b) (i32.shl (local.get $ix) (i32.const 2))
))
(i32.store (local.get $ea1) (local.get $data))
;; (index << const) + base(non-constant)
(local.set $ea2
(i32.add (i32.shl (local.get $ix) (i32.const 3)) (local.get $b)
))
(i32.store (local.get $ea2) (local.get $data))
;; base(constant) + (index << const)
(local.set $ea3
(i32.add (i32.const 0x1337) (i32.shl (local.get $ix) (i32.const 1))
))
(i32.store (local.get $ea3) (local.get $data))
;; (index << const) + base(constant)
(local.set $ea4
(i32.add (i32.shl (local.get $ix) (i32.const 2)) (i32.const 0x4771)
))
(i32.store (local.get $ea4) (local.get $data))
)
)`;
let i = new WebAssembly.Instance(
new WebAssembly.Module(wasmTextToBinary(t)));
const output = wasmDis(i.exports.writeArr32, {tier:"ion", asString:true});
// Find exactly four " lea " bits of text in the output.
const re = /\blea\b/g;
assertEq(re.exec(output) != null, true);
assertEq(re.exec(output) != null, true);
assertEq(re.exec(output) != null, true);
assertEq(re.exec(output) != null, true);
assertEq(re.exec(output) == null, true);
}