// |jit-test| --wasm-compiler=optimizing; --spectre-mitigations=off; skip-if: !hasDisassembler() || wasmCompileMode() != "ion" || !getBuildConfiguration("x86") || getBuildConfiguration("simulator") || getJitCompilerOptions()["ion.check-range-analysis"]; include:codegen-x86-test.js

// Spectre mitigation is disabled above to make the generated code simpler to
// match; ion.check-range-analysis makes a hash of the code and makes testing
// pointless.

// White-box testing of bounds check elimination on 32-bit systems.
//
// This is probably fairly brittle, but BCE (on 64-bit platforms) regressed (bug
// 1735207) without us noticing, so it's not like we can do without these tests.
//
// See also bce-x64-ion-codegen.js.

// Make sure the check for the second load is removed: the two load instructions
// should appear back-to-back in the output.
codegenTestX86_adhoc(
`(module
   (memory 1)
   (func (export "f") (param i32) (result i32)
     (local i32)
     (local.set 1 (i32.add (local.get 0) (i32.const 4)))
     (i32.load (local.get 1))
     drop
     (i32.load (local.get 1))))`,
    'f', `
(movl 0x04\\(%r..\\), %e..\ncmp %e.., %e..|cmpl 0x04\\(%r..\\), %e..)
jnb 0x00000000000000..
movl \\(%r..,%r..,1\\), %e..
movl \\(%r..,%r..,1\\), %eax`,
    {no_prefix:true});

// Make sure constant indices below the heap minimum do not require a bounds check.
// The first movl from *rsi below loads the heap base from Tls, an x86-ism.
codegenTestX86_adhoc(
`(module
   (memory 1)
   (func (export "f") (result i32)
     (i32.load (i32.const 16))))`,
    'f', `
movl \\(%rsi\\), %e..
movl 0x10\\(%r..\\), %eax`);

// Ditto, even at the very limit of the known heap, extending into the guard
// page.  This is an OOB access, of course, but it needs no explicit bounds
// check.
codegenTestX86_adhoc(
`(module
   (memory 1)
   (func (export "f") (result i32)
     (i32.load (i32.const 65535))))`,
    'f',
`
movl \\(%rsi\\), %e..
movl 0xFFFF\\(%r..\\), %eax`);
