// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

constants() {
  Expect.equals(0x80000000, 0x80000000 | 0);
  Expect.equals(0x80000001, 0x80000000 | 1);
  Expect.equals(0x80000000, 0x80000000 | 0x80000000);
  Expect.equals(0xFFFFFFFF, 0xFFFF0000 | 0xFFFF);
  Expect.equals(0x80000000, 0x80000000 & 0xFFFFFFFF);
  Expect.equals(0x80000000, 0x80000000 & 0x80000000);
  Expect.equals(0x80000000, 0x80000000 & 0xF0000000);
  Expect.equals(0x80000000, 0xFFFFFFFF & 0x80000000);
  Expect.equals(0x80000000, 0x80000000 ^ 0);
  Expect.equals(0xFFFFFFFF, 0x80000000 ^ 0x7FFFFFFF);
  Expect.equals(0xFFFFFFFF, 0x7FFFFFFF ^ 0x80000000);
  Expect.equals(0xF0000000, 0x70000000 ^ 0x80000000);
  Expect.equals(0x80000000, 1 << 31);
  Expect.equals(0xFFFFFFF0, 0xFFFFFFF << 4);
  Expect.equals(0x7FFFFFFF, 0xFFFFFFFF >> 1);
  Expect.equals(0xFFFFFFFC,
                ((((((0xFFFFFFF << 4) // 0xFFFFFFF0
                                >> 1) // 0x7FFFFFF8
                                | 0x80000000) // 0xFFFFFFF8
                                >> 2) // 0x3FFFFFFE
                                ^ 0x40000000) // 0x7FFFFFFE
                                << 1));
}

foo(i) {
  if (i != 0) {
    y--;
    foo(i - 1);
    y++;
  }
}

var y;

// id returns [x] in a way that should be difficult to predict statically.
id(x) {
  y = x;
  foo(10);
  return y;
}

interceptors() {
  Expect.equals(0x80000000, id(0x80000000) | id(0));
  Expect.equals(0x80000001, id(0x80000000) | id(1));
  Expect.equals(0x80000000, id(0x80000000) | id(0x80000000));
  Expect.equals(0xFFFFFFFF, id(0xFFFF0000) | id(0xFFFF));
  Expect.equals(0x80000000, id(0x80000000) & id(0xFFFFFFFF));
  Expect.equals(0x80000000, id(0x80000000) & id(0x80000000));
  Expect.equals(0x80000000, id(0x80000000) & id(0xF0000000));
  Expect.equals(0x80000000, id(0xFFFFFFFF) & id(0x80000000));
  Expect.equals(0x80000000, id(0x80000000) ^ id(0));
  Expect.equals(0xFFFFFFFF, id(0x80000000) ^ id(0x7FFFFFFF));
  Expect.equals(0xFFFFFFFF, id(0x7FFFFFFF) ^ id(0x80000000));
  Expect.equals(0xF0000000, id(0x70000000) ^ id(0x80000000));
  Expect.equals(0x80000000, id(1) << id(31));
  Expect.equals(0xFFFFFFF0, id(0xFFFFFFF) << id(4));
  Expect.equals(0x7FFFFFFF, id(0xFFFFFFFF) >> id(1));
  Expect.equals(0xFFFFFFFC,
                ((((((id(0xFFFFFFF) << 4) // 0xFFFFFFF0
                                    >> 1) // 0x7FFFFFF8
                                    | 0x80000000) // 0xFFFFFFF8
                                    >> 2) // 0x3FFFFFFE
                                    ^ 0x40000000) // 0x7FFFFFFE
                                    << 1));
}

speculative() {
  var a = id(0x80000000);
  var b = id(0);
  var c = id(1);
  var d = id(0xFFFF0000);
  var e = id(0xFFFF);
  var f = id(0xFFFFFFFF);
  var g = id(0xF0000000);
  var h = id(0x7FFFFFFF);
  var j = id(0x70000000);
  var k = id(31);
  var l = id(4);
  var m = id(0xFFFFFFF);
  for (int i = 0; i < 1; i++) {
    Expect.equals(0x80000000, a | b);
    Expect.equals(0x80000001, a | c);
    Expect.equals(0x80000000, a | a);
    Expect.equals(0xFFFFFFFF, d | e);
    Expect.equals(0x80000000, a & f);
    Expect.equals(0x80000000, a & a);
    Expect.equals(0x80000000, a & g);
    Expect.equals(0x80000000, f & a);
    Expect.equals(0x80000000, a ^ b);
    Expect.equals(0xFFFFFFFF, a ^ h);
    Expect.equals(0xFFFFFFFF, h ^ a);
    Expect.equals(0xF0000000, j ^ a);
    Expect.equals(0x80000000, c << k);
    Expect.equals(0xFFFFFFF0, m << l);
    Expect.equals(0x7FFFFFFF, f >> c);
    Expect.equals(0xFFFFFFFC,
                  ((((((m << 4) // 0xFFFFFFF0
                          >> 1) // 0x7FFFFFF8
                          | 0x80000000) // 0xFFFFFFF8
                          >> 2) // 0x3FFFFFFE
                          ^ 0x40000000) // 0x7FFFFFFE
                          << 1));
  }
}

// Due to bad precedence rules this example was broken in Dart2Js.
precedence() {
  Expect.equals(0x80000000, -1 & 0x80000000);
  Expect.equals(0x80000000, id(-1) & 0x80000000);
  Expect.equals(0x80000000, ~(~(0x80000000)));
  Expect.equals(0x80000000, ~(~(id(0x80000000))));
}

main() {
  constants();
  interceptors();
  speculative();
  precedence();
}
