// Copyright 2017 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

let kMinHeapSize = 4096;

(function TestLeftRight() {
  function Module(stdlib, foreign, heap) {
    "use asm";
    var HEAP32 = new stdlib.Int32Array(heap);
    function f(i) {
      i = i | 0;
      return HEAP32[i << 2 >> 2] | 0;
    }
    return { f:f }
  }
  var buffer = new ArrayBuffer(kMinHeapSize);
  var module = new Module(this, {}, buffer);
  assertTrue(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42] = 23;
  assertEquals(23, module.f(42));
})();

(function TestRightRight() {
  function Module(stdlib, foreign, heap) {
    "use asm";
    var HEAP32 = new stdlib.Int32Array(heap);
    function f(i) {
      i = i | 0;
      return HEAP32[i >> 2 >> 2] | 0;
    }
    return { f:f }
  }
  var buffer = new ArrayBuffer(kMinHeapSize);
  var module = new Module(this, {}, buffer)
  assertTrue(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42 >> 4] = 23;
  assertEquals(23, module.f(42));
})();

(function TestRightLeft() {
  function Module(stdlib, foreign, heap) {
    "use asm";
    var HEAP32 = new stdlib.Int32Array(heap);
    function f(i) {
      i = i | 0;
      return HEAP32[i >> 2 << 2] | 0;
    }
    return { f:f }
  }
  var buffer = new ArrayBuffer(kMinHeapSize);
  var module = new Module(this, {}, buffer)
  assertFalse(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42 & 0xfc] = 23;
  assertEquals(23, module.f(42));
})();

(function TestRightButNotImmediate() {
  function Module(stdlib, foreign, heap) {
    "use asm";
    var HEAP32 = new stdlib.Int32Array(heap);
    function f(i) {
      i = i | 0;
      return HEAP32[i >> 2 + 1] | 0;
    }
    return { f:f }
  }
  var buffer = new ArrayBuffer(kMinHeapSize);
  var module = new Module(this, {}, buffer)
  assertFalse(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42 >> 3] = 23;
  assertEquals(23, module.f(42));
})();

(function TestLeftOnly() {
  function Module(stdlib, foreign, heap) {
    "use asm";
    var HEAP32 = new stdlib.Int32Array(heap);
    function f(i) {
      i = i | 0;
      return HEAP32[i << 2] | 0;
    }
    return { f:f }
  }
  var buffer = new ArrayBuffer(kMinHeapSize);
  var module = new Module(this, {}, buffer)
  assertFalse(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42 << 2] = 23;
  assertEquals(23, module.f(42));
})();
