Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !hasDisassembler() || wasmCompileMode() != "ion" || !getBuildConfiguration("arm64"); include:codegen-arm64-test.js
// Test that storing an i32.const 0 uses wzr/xzr directly rather than
// materialising zero into a general-purpose register first (bug 1710087).
// i32 scalar stores with zero constant
codegenTestARM64_adhoc(
`(module
(memory 1)
(func (export "f") (param i32)
(i32.store (local.get 0) (i32.const 0))))`,
'f',
'str wzr, \\[x\\d+, x0\\]');
codegenTestARM64_adhoc(
`(module
(memory 1)
(func (export "f") (param i32)
(i32.store8 (local.get 0) (i32.const 0))))`,
'f',
'strb wzr, \\[x\\d+, x0\\]');
codegenTestARM64_adhoc(
`(module
(memory 1)
(func (export "f") (param i32)
(i32.store16 (local.get 0) (i32.const 0))))`,
'f',
'strh wzr, \\[x\\d+, x0\\]');
if (wasmSimdEnabled()) {
// i32x4.replace_lane with zero scalar: wzr, no prior mov to materialise zero
codegenTestARM64_adhoc(
`(module
(func (export "f") (param v128) (result v128)
(i32x4.replace_lane 1 (local.get 0) (i32.const 0))))`,
'f',
'mov v0.s\\[1\\], wzr');
}
// anyref/funcref null stores use xzr directly
codegenTestARM64_adhoc(
`(module
(type $s (struct (field (mut anyref))))
(func (export "f") (param (ref $s))
(struct.set $s 0 (local.get 0) (ref.null any))))`,
'f',
'str xzr, \\[',
{no_prefix: true, no_suffix: true});
codegenTestARM64_adhoc(
`(module
(type $s (struct (field (mut funcref))))
(func (export "f") (param (ref $s))
(struct.set $s 0 (local.get 0) (ref.null func))))`,
'f',
'str xzr, \\[',
{no_prefix: true, no_suffix: true});
codegenTestARM64_adhoc(
`(module
(type $a (array (mut anyref)))
(func (export "f") (param (ref $a)) (param i32)
(array.set $a (local.get 0) (local.get 1) (ref.null any))))`,
'f',
'str xzr, \\[',
{no_prefix: true, no_suffix: true});