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

(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(1024);
  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(1024);
  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(1024);
  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(1024);
  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(1024);
  var module = new Module(this, {}, buffer)
  assertFalse(%IsAsmWasmCode(Module));
  new Int32Array(buffer)[42 << 2] = 23;
  assertEquals(23, module.f(42));
})();