1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction Module(stdlib, foreign, heap) {
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  "use asm";
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  var MEM16 = new stdlib.Int16Array(heap);
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function load(i) {
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    i = i|0;
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    i = MEM16[i >> 1] | 0;
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return i;
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function loadm1() {
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return MEM16[-1] | 0;
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function store(i, v) {
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    i = i|0;
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    v = v|0;
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MEM16[i >> 1] = v;
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  function storem1(v) {
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    v = v|0;
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MEM16[-1] = v;
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return {load: load, loadm1: loadm1, store: store, storem1: storem1};
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar m = Module(this, {}, new ArrayBuffer(2));
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierm.store(-1000, 4);
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierassertEquals(0, m.load(-1000));
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierassertEquals(0, m.loadm1());
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierm.storem1(1);
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierassertEquals(0, m.loadm1());
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierm.store(0, 32767);
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfor (var i = 1; i < 64; ++i) {
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  m.store(i * 2 * 32 * 1024, i);
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierassertEquals(32767, m.load(0));
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfor (var i = 1; i < 64; ++i) {
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  assertEquals(0, m.load(i * 2 * 32 * 1024));
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
43