1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved. Use of this
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// source code is governed by a BSD-style license that can be found in the
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <cmath>
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <functional>
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <limits>
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/utils/random-number-generator.h"
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/codegen.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/codegen-tester.h"
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/cctest/compiler/graph-builder-tester.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/value-helper.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::base;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32Add) {
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1));
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(add);
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(1, m.Call());
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Ctz) {
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Word32Ctz().IsSupported()) {
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // We can only test the operator if it exists on the testing platform.
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.AddNode(m.machine()->Word32Ctz().op(), m.Parameter(0)));
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(32, m.Call(uint32_t(0x00000000)));
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(31, m.Call(uint32_t(0x80000000)));
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(30, m.Call(uint32_t(0x40000000)));
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(29, m.Call(uint32_t(0x20000000)));
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(28, m.Call(uint32_t(0x10000000)));
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(27, m.Call(uint32_t(0xa8000000)));
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(26, m.Call(uint32_t(0xf4000000)));
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(25, m.Call(uint32_t(0x62000000)));
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(24, m.Call(uint32_t(0x91000000)));
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(23, m.Call(uint32_t(0xcd800000)));
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(22, m.Call(uint32_t(0x09400000)));
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(21, m.Call(uint32_t(0xaf200000)));
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(20, m.Call(uint32_t(0xac100000)));
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(19, m.Call(uint32_t(0xe0b80000)));
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint32_t(0x9ce40000)));
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(17, m.Call(uint32_t(0xc7920000)));
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(16, m.Call(uint32_t(0xb8f10000)));
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(15, m.Call(uint32_t(0x3b9f8000)));
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(14, m.Call(uint32_t(0xdb4c4000)));
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(13, m.Call(uint32_t(0xe9a32000)));
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(12, m.Call(uint32_t(0xfca61000)));
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(uint32_t(0x6c8a7800)));
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(10, m.Call(uint32_t(0x8ce5a400)));
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint32_t(0xcb7d0200)));
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(8, m.Call(uint32_t(0xcb4dc100)));
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(7, m.Call(uint32_t(0xdfbec580)));
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(6, m.Call(uint32_t(0x27a9db40)));
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(5, m.Call(uint32_t(0xde3bcb20)));
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(4, m.Call(uint32_t(0xd7e8a610)));
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(3, m.Call(uint32_t(0x9afdbc88)));
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call(uint32_t(0x9afdbc84)));
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint32_t(0x9afdbc82)));
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint32_t(0x9afdbc81)));
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Clz) {
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Word32Clz(m.Parameter(0)));
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint32_t(0x80001000)));
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint32_t(0x40000500)));
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call(uint32_t(0x20000300)));
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(3, m.Call(uint32_t(0x10000003)));
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(4, m.Call(uint32_t(0x08050000)));
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(5, m.Call(uint32_t(0x04006000)));
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(6, m.Call(uint32_t(0x02000000)));
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(7, m.Call(uint32_t(0x010000a0)));
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(8, m.Call(uint32_t(0x00800c00)));
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint32_t(0x00400000)));
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(10, m.Call(uint32_t(0x0020000d)));
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(uint32_t(0x00100f00)));
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(12, m.Call(uint32_t(0x00080000)));
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(13, m.Call(uint32_t(0x00041000)));
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(14, m.Call(uint32_t(0x00020020)));
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(15, m.Call(uint32_t(0x00010300)));
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(16, m.Call(uint32_t(0x00008040)));
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(17, m.Call(uint32_t(0x00004005)));
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint32_t(0x00002050)));
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(19, m.Call(uint32_t(0x00001700)));
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(20, m.Call(uint32_t(0x00000870)));
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(21, m.Call(uint32_t(0x00000405)));
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(22, m.Call(uint32_t(0x00000203)));
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(23, m.Call(uint32_t(0x00000101)));
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(24, m.Call(uint32_t(0x00000089)));
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(25, m.Call(uint32_t(0x00000041)));
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(26, m.Call(uint32_t(0x00000022)));
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(27, m.Call(uint32_t(0x00000013)));
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(28, m.Call(uint32_t(0x00000008)));
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(29, m.Call(uint32_t(0x00000004)));
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(30, m.Call(uint32_t(0x00000002)));
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(31, m.Call(uint32_t(0x00000001)));
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(32, m.Call(uint32_t(0x00000000)));
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord32Popcnt) {
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Word32Popcnt().IsSupported()) {
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // We can only test the operator if it exists on the testing platform.
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.AddNode(m.machine()->Word32Popcnt().op(), m.Parameter(0)));
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint32_t(0x00000000)));
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint32_t(0x00000001)));
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint32_t(0x80000000)));
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(32, m.Call(uint32_t(0xffffffff)));
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(6, m.Call(uint32_t(0x000dc100)));
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint32_t(0xe00dc100)));
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(uint32_t(0xe00dc103)));
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint32_t(0x000dc107)));
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Clz) {
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64());
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Word64Clz(m.Parameter(0)));
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint64_t(0x8000100000000000)));
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint64_t(0x4000050000000000)));
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call(uint64_t(0x2000030000000000)));
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(3, m.Call(uint64_t(0x1000000300000000)));
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(4, m.Call(uint64_t(0x0805000000000000)));
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(5, m.Call(uint64_t(0x0400600000000000)));
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(6, m.Call(uint64_t(0x0200000000000000)));
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(7, m.Call(uint64_t(0x010000a000000000)));
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(8, m.Call(uint64_t(0x00800c0000000000)));
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint64_t(0x0040000000000000)));
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(10, m.Call(uint64_t(0x0020000d00000000)));
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(uint64_t(0x00100f0000000000)));
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(12, m.Call(uint64_t(0x0008000000000000)));
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(13, m.Call(uint64_t(0x0004100000000000)));
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(14, m.Call(uint64_t(0x0002002000000000)));
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(15, m.Call(uint64_t(0x0001030000000000)));
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(16, m.Call(uint64_t(0x0000804000000000)));
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(17, m.Call(uint64_t(0x0000400500000000)));
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint64_t(0x0000205000000000)));
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(19, m.Call(uint64_t(0x0000170000000000)));
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(20, m.Call(uint64_t(0x0000087000000000)));
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(21, m.Call(uint64_t(0x0000040500000000)));
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(22, m.Call(uint64_t(0x0000020300000000)));
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(23, m.Call(uint64_t(0x0000010100000000)));
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(24, m.Call(uint64_t(0x0000008900000000)));
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(25, m.Call(uint64_t(0x0000004100000000)));
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(26, m.Call(uint64_t(0x0000002200000000)));
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(27, m.Call(uint64_t(0x0000001300000000)));
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(28, m.Call(uint64_t(0x0000000800000000)));
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(29, m.Call(uint64_t(0x0000000400000000)));
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(30, m.Call(uint64_t(0x0000000200000000)));
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(31, m.Call(uint64_t(0x0000000100000000)));
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(32, m.Call(uint64_t(0x0000000080001000)));
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(33, m.Call(uint64_t(0x0000000040000500)));
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(34, m.Call(uint64_t(0x0000000020000300)));
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(35, m.Call(uint64_t(0x0000000010000003)));
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(36, m.Call(uint64_t(0x0000000008050000)));
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(37, m.Call(uint64_t(0x0000000004006000)));
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(38, m.Call(uint64_t(0x0000000002000000)));
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(39, m.Call(uint64_t(0x00000000010000a0)));
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(40, m.Call(uint64_t(0x0000000000800c00)));
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(41, m.Call(uint64_t(0x0000000000400000)));
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(42, m.Call(uint64_t(0x000000000020000d)));
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(43, m.Call(uint64_t(0x0000000000100f00)));
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(44, m.Call(uint64_t(0x0000000000080000)));
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(45, m.Call(uint64_t(0x0000000000041000)));
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(46, m.Call(uint64_t(0x0000000000020020)));
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(47, m.Call(uint64_t(0x0000000000010300)));
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(48, m.Call(uint64_t(0x0000000000008040)));
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(49, m.Call(uint64_t(0x0000000000004005)));
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(50, m.Call(uint64_t(0x0000000000002050)));
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(51, m.Call(uint64_t(0x0000000000001700)));
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(52, m.Call(uint64_t(0x0000000000000870)));
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(53, m.Call(uint64_t(0x0000000000000405)));
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(54, m.Call(uint64_t(0x0000000000000203)));
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(55, m.Call(uint64_t(0x0000000000000101)));
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(56, m.Call(uint64_t(0x0000000000000089)));
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(57, m.Call(uint64_t(0x0000000000000041)));
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(58, m.Call(uint64_t(0x0000000000000022)));
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(59, m.Call(uint64_t(0x0000000000000013)));
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(60, m.Call(uint64_t(0x0000000000000008)));
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(61, m.Call(uint64_t(0x0000000000000004)));
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(62, m.Call(uint64_t(0x0000000000000002)));
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(63, m.Call(uint64_t(0x0000000000000001)));
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000)));
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Ctz) {
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Uint64());
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Word64Ctz().IsSupported()) {
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.AddNode(m.machine()->Word64Ctz().op(), m.Parameter(0)));
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(64, m.Call(uint64_t(0x0000000000000000)));
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(63, m.Call(uint64_t(0x8000000000000000)));
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(62, m.Call(uint64_t(0x4000000000000000)));
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(61, m.Call(uint64_t(0x2000000000000000)));
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(60, m.Call(uint64_t(0x1000000000000000)));
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(59, m.Call(uint64_t(0xa800000000000000)));
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(58, m.Call(uint64_t(0xf400000000000000)));
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(57, m.Call(uint64_t(0x6200000000000000)));
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(56, m.Call(uint64_t(0x9100000000000000)));
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(55, m.Call(uint64_t(0xcd80000000000000)));
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(54, m.Call(uint64_t(0x0940000000000000)));
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(53, m.Call(uint64_t(0xaf20000000000000)));
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(52, m.Call(uint64_t(0xac10000000000000)));
229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(51, m.Call(uint64_t(0xe0b8000000000000)));
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(50, m.Call(uint64_t(0x9ce4000000000000)));
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(49, m.Call(uint64_t(0xc792000000000000)));
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(48, m.Call(uint64_t(0xb8f1000000000000)));
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(47, m.Call(uint64_t(0x3b9f800000000000)));
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(46, m.Call(uint64_t(0xdb4c400000000000)));
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(45, m.Call(uint64_t(0xe9a3200000000000)));
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(44, m.Call(uint64_t(0xfca6100000000000)));
237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(43, m.Call(uint64_t(0x6c8a780000000000)));
238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(42, m.Call(uint64_t(0x8ce5a40000000000)));
239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(41, m.Call(uint64_t(0xcb7d020000000000)));
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(40, m.Call(uint64_t(0xcb4dc10000000000)));
241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(39, m.Call(uint64_t(0xdfbec58000000000)));
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(38, m.Call(uint64_t(0x27a9db4000000000)));
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(37, m.Call(uint64_t(0xde3bcb2000000000)));
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(36, m.Call(uint64_t(0xd7e8a61000000000)));
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(35, m.Call(uint64_t(0x9afdbc8800000000)));
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(34, m.Call(uint64_t(0x9afdbc8400000000)));
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(33, m.Call(uint64_t(0x9afdbc8200000000)));
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(32, m.Call(uint64_t(0x9afdbc8100000000)));
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(31, m.Call(uint64_t(0x0000000080000000)));
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(30, m.Call(uint64_t(0x0000000040000000)));
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(29, m.Call(uint64_t(0x0000000020000000)));
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(28, m.Call(uint64_t(0x0000000010000000)));
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(27, m.Call(uint64_t(0x00000000a8000000)));
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(26, m.Call(uint64_t(0x00000000f4000000)));
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(25, m.Call(uint64_t(0x0000000062000000)));
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(24, m.Call(uint64_t(0x0000000091000000)));
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(23, m.Call(uint64_t(0x00000000cd800000)));
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(22, m.Call(uint64_t(0x0000000009400000)));
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(21, m.Call(uint64_t(0x00000000af200000)));
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(20, m.Call(uint64_t(0x00000000ac100000)));
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(19, m.Call(uint64_t(0x00000000e0b80000)));
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint64_t(0x000000009ce40000)));
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(17, m.Call(uint64_t(0x00000000c7920000)));
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(16, m.Call(uint64_t(0x00000000b8f10000)));
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(15, m.Call(uint64_t(0x000000003b9f8000)));
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(14, m.Call(uint64_t(0x00000000db4c4000)));
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(13, m.Call(uint64_t(0x00000000e9a32000)));
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(12, m.Call(uint64_t(0x00000000fca61000)));
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(uint64_t(0x000000006c8a7800)));
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(10, m.Call(uint64_t(0x000000008ce5a400)));
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(9, m.Call(uint64_t(0x00000000cb7d0200)));
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(8, m.Call(uint64_t(0x00000000cb4dc100)));
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(7, m.Call(uint64_t(0x00000000dfbec580)));
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(6, m.Call(uint64_t(0x0000000027a9db40)));
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(5, m.Call(uint64_t(0x00000000de3bcb20)));
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(4, m.Call(uint64_t(0x00000000d7e8a610)));
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(3, m.Call(uint64_t(0x000000009afdbc88)));
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call(uint64_t(0x000000009afdbc84)));
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint64_t(0x000000009afdbc82)));
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint64_t(0x000000009afdbc81)));
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64Popcnt) {
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Uint64());
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Word64Popcnt().IsSupported()) {
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.AddNode(m.machine()->Word64Popcnt().op(), m.Parameter(0)));
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(uint64_t(0x0000000000000000)));
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint64_t(0x0000000000000001)));
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(uint64_t(0x8000000000000000)));
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(64, m.Call(uint64_t(0xffffffffffffffff)));
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(12, m.Call(uint64_t(0x000dc100000dc100)));
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint64_t(0xe00dc100e00dc100)));
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(22, m.Call(uint64_t(0xe00dc103e00dc103)));
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(18, m.Call(uint64_t(0x000dc107000dc107)));
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_TARGET_ARCH_64_BIT
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) {
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (index) {
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 0:
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Parameter(0);
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 1:
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Parameter(1);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 2:
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Int32Constant(0);
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 3:
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Int32Constant(1);
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 4:
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Int32Constant(-1);
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 5:
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Int32Constant(0xff);
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 6:
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return m->Int32Constant(0x01234567);
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 7:
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Load(MachineType::Int32(), m->PointerConstant(NULL));
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return NULL;
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(CodeGenInt32Binop) {
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<void> m;
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const Operator* kOps[] = {
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Word32And(),      m.machine()->Word32Or(),
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Word32Xor(),      m.machine()->Word32Shl(),
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Word32Shr(),      m.machine()->Word32Sar(),
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Word32Equal(),    m.machine()->Int32Add(),
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Int32Sub(),       m.machine()->Int32Mul(),
337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32MulHigh(),   m.machine()->Int32Div(),
338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Uint32Div(),      m.machine()->Int32Mod(),
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Uint32Mod(),      m.machine()->Uint32MulHigh(),
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.machine()->Int32LessThan(),  m.machine()->Int32LessThanOrEqual(),
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual()};
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = 0; i < arraysize(kOps); ++i) {
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < 8; j++) {
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int k = 0; k < 8; k++) {
346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Int32());
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Node* a = Int32Input(&m, j);
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Node* b = Int32Input(&m, k);
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        m.Return(m.AddNode(kOps[i], a, b));
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        m.GenerateCode();
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(CodeGenNop) {
359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<void> m;
360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(0));
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.GenerateCode();
362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic Node* Int64Input(RawMachineAssemblerTester<int64_t>* m, int index) {
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (index) {
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 0:
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Parameter(0);
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 1:
371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Parameter(1);
372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 2:
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Int64Constant(0);
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 3:
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Int64Constant(1);
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 4:
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Int64Constant(-1);
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 5:
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Int64Constant(0xff);
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 6:
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Int64Constant(0x0123456789abcdefLL);
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 7:
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return m->Load(MachineType::Int64(), m->PointerConstant(NULL));
384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return NULL;
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(CodeGenInt64Binop) {
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<void> m;
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const Operator* kOps[] = {
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Word64And(), m.machine()->Word64Or(),
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Word64Xor(), m.machine()->Word64Shl(),
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Word64Shr(), m.machine()->Word64Sar(),
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Word64Equal(), m.machine()->Int64Add(),
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Int64Sub(), m.machine()->Int64Mul(), m.machine()->Int64Div(),
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Uint64Div(), m.machine()->Int64Mod(),
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Uint64Mod(), m.machine()->Int64LessThan(),
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Int64LessThanOrEqual(), m.machine()->Uint64LessThan(),
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.machine()->Uint64LessThanOrEqual()};
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kOps); ++i) {
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int j = 0; j < 8; j++) {
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (int k = 0; k < 8; k++) {
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        RawMachineAssemblerTester<int64_t> m(MachineType::Int64(),
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Int64());
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Node* a = Int64Input(&m, j);
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Node* b = Int64Input(&m, k);
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        m.Return(m.AddNode(kOps[i], a, b));
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.GenerateCode();
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowP) {
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t actual_val = -1;
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Int64BinopTester bt(&m);
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* add = m.Int64AddWithOverflow(bt.param0, bt.param1);
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, add);
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* ovf = m.Projection(1, add);
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(ovf);
428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int64_t expected_val;
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val);
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_ovf, bt.call(*i, *j));
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_val, actual_val);
434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowImm) {
440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t actual_val = -1, expected_val = 0;
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int64());
444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add = m.Int64AddWithOverflow(m.Int64Constant(*i), m.Parameter(0));
445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_INT64_INPUTS(j) {
450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val);
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_val, actual_val);
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int64());
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add = m.Int64AddWithOverflow(m.Parameter(0), m.Int64Constant(*i));
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_INT64_INPUTS(j) {
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val);
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_val, actual_val);
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m;
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add =
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int64AddWithOverflow(m.Int64Constant(*i), m.Int64Constant(*j));
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int expected_ovf = bits::SignedAddOverflow64(*i, *j, &expected_val);
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_ovf, m.Call());
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_val, actual_val);
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64AddWithOverflowInBranchP) {
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int constant = 911777;
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Int64BinopTester bt(&m);
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* add = m.Int64AddWithOverflow(bt.param0, bt.param1);
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* ovf = m.Projection(1, add);
491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(ovf, &blocka, &blockb);
492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Int64Constant(constant));
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, add);
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* truncated = m.TruncateInt64ToInt32(val);
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(truncated);
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int32_t expected = constant;
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int64_t result;
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!bits::SignedAddOverflow64(*i, *j, &result)) {
503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        expected = static_cast<int32_t>(result);
504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected, bt.call(*i, *j));
506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowP) {
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t actual_val = -1;
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Int64BinopTester bt(&m);
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* add = m.Int64SubWithOverflow(bt.param0, bt.param1);
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, add);
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* ovf = m.Projection(1, add);
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(ovf);
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int64_t expected_val;
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val);
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_ovf, bt.call(*i, *j));
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_val, actual_val);
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowImm) {
532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t actual_val = -1, expected_val = 0;
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int64());
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add = m.Int64SubWithOverflow(m.Int64Constant(*i), m.Parameter(0));
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_INT64_INPUTS(j) {
542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val);
543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_val, actual_val);
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int64());
549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add = m.Int64SubWithOverflow(m.Parameter(0), m.Int64Constant(*i));
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_INT64_INPUTS(j) {
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int expected_ovf = bits::SignedSubOverflow64(*j, *i, &expected_val);
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected_val, actual_val);
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m;
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* add =
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int64SubWithOverflow(m.Int64Constant(*i), m.Int64Constant(*j));
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* val = m.Projection(0, add);
565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* ovf = m.Projection(1, add);
566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord64, val);
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Return(ovf);
568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int expected_ovf = bits::SignedSubOverflow64(*i, *j, &expected_val);
569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_ovf, m.Call());
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected_val, actual_val);
571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunInt64SubWithOverflowInBranchP) {
577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int constant = 911999;
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Int64BinopTester bt(&m);
581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* sub = m.Int64SubWithOverflow(bt.param0, bt.param1);
582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* ovf = m.Projection(1, sub);
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(ovf, &blocka, &blockb);
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Int64Constant(constant));
586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, sub);
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* truncated = m.TruncateInt64ToInt32(val);
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(truncated);
590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT64_INPUTS(j) {
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int32_t expected = constant;
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int64_t result;
594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!bits::SignedSubOverflow64(*i, *j, &result)) {
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        expected = static_cast<int32_t>(result);
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected, static_cast<int32_t>(bt.call(*i, *j)));
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(titzer): add tests that run 64-bit integer operations.
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_TARGET_ARCH_64_BIT
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunGoto) {
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 99999;
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel next;
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&next);
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&next);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(constant));
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, m.Call());
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunGotoMultiple) {
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 9999977;
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel labels[10];
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(labels); i++) {
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Goto(&labels[i]);
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&labels[i]);
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(constant));
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, m.Call());
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunBranch) {
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 999777;
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(0 - constant));
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(constant));
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, m.Call());
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamond2) {
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 995666;
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(constant));
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, m.Call());
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoop) {
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 999555;
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, exit;
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &body, &exit);
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&exit);
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(constant));
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, m.Call());
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename R>
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node,
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            MachineRepresentation rep, Node* true_node,
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Node* false_node) {
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m->Branch(cond_node, &blocka, &blockb);
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m->Bind(&blocka);
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m->Goto(&end);
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m->Bind(&blockb);
694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m->Goto(&end);
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m->Bind(&end);
697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m->Phi(rep, true_node, false_node);
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m->Return(phi);
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiConst) {
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int false_val = 0xFF666;
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int true_val = 0x00DDD;
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_node = m.Int32Constant(true_val);
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.Int32Constant(false_val);
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32, true_node,
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  false_node);
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(false_val, m.Call(0));
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(true_val, m.Call(1));
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiNumber) {
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<Object*> m(MachineType::Int32());
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double false_val = -11.1;
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double true_val = 200.1;
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_node = m.NumberConstant(true_val);
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.NumberConstant(false_val);
721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node,
722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  false_node);
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.CheckNumber(false_val, m.Call(0));
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.CheckNumber(true_val, m.Call(1));
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiString) {
729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<Object*> m(MachineType::Int32());
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* false_val = "false";
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* true_val = "true";
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_node = m.StringConstant(true_val);
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.StringConstant(false_val);
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kTagged, true_node,
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  false_node);
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.CheckString(false_val, m.Call(0));
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.CheckString(true_val, m.Call(1));
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDiamondPhiParam) {
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BuildDiamondPhi(&m, m.Parameter(0), MachineRepresentation::kWord32,
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  m.Parameter(1), m.Parameter(2));
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t c1 = 0x260cb75a;
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t c2 = 0xcd3e9c8b;
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int result = m.Call(0, c1, c2);
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(c2, result);
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result = m.Call(1, c1, c2);
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(c1, result);
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiConst) {
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int true_val = 0x44000;
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int false_val = 0x00888;
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* cond_node = m.Int32Constant(0);
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_node = m.Int32Constant(true_val);
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.Int32Constant(false_val);
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = false_val; while(false) { x = true_val; } return x;
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel body, header, end;
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, true_node);
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(cond_node, &body, &end);
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(phi);
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(false_val, m.Call());
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiParam) {
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&blocka);
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi =
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Phi(MachineRepresentation::kWord32, m.Parameter(1), m.Parameter(2));
791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* cond =
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Phi(MachineRepresentation::kWord32, m.Parameter(0), m.Int32Constant(0));
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(cond, &blockb, &end);
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&blocka);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(phi);
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t c1 = 0xa81903b4;
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t c2 = 0x5a1207da;
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int result = m.Call(0, c1, c2);
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(c1, result);
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result = m.Call(1, c1, c2);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(c2, result);
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiInduction) {
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int false_val = 0x10777;
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = false_val; while(false) { x++; } return x;
816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.Int32Constant(false_val);
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node);
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Int32Constant(0), &body, &end);
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32Add(phi, m.Int32Constant(1));
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, add);
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(phi);
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(false_val, m.Call());
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement) {
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = 0; while(x ^ param) { x++; } return x;
842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero);
849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.WordXor(phi, bt.param0), &body, &end);
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(phi);
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(11, bt.call(11, 0));
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(110, bt.call(110, 0));
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(176, bt.call(176, 0));
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement2) {
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = 0; while(x < param) { x++; } return x;
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero);
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end);
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(phi);
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(11, bt.call(11, 0));
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(110, bt.call(110, 0));
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(176, bt.call(176, 0));
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, bt.call(-200, 0));
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrement3) {
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = 0; while(x < param) { x++; } return x;
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, zero, zero);
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end);
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(phi);
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(11, bt.call(11, 0));
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(110, bt.call(110, 0));
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(176, bt.call(176, 0));
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(200, bt.call(200, 0));
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopDecrement) {
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = param; while(x) { x--; } return x;
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi =
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Phi(MachineRepresentation::kWord32, bt.param0, m.Int32Constant(0));
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(phi, &body, &end);
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1)));
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(phi);
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, bt.call(11, 0));
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, bt.call(110, 0));
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, bt.call(197, 0));
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunLoopIncrementFloat32) {
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x;
951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* minus_3 = m.Float32Constant(-3.0f);
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* ten = m.Float32Constant(10.0f);
954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&header);
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&header);
958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kFloat32, minus_3, ten);
959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Float32LessThan(phi, ten), &body, &end);
960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&body);
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f)));
963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&header);
964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi)));
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(10, m.Call());
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopIncrementFloat64) {
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x;
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* minus_3 = m.Float64Constant(-3.0);
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ten = m.Float64Constant(10.0);
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kFloat64, minus_3, ten);
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Float64LessThan(phi, ten), &body, &end);
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5)));
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.ChangeFloat64ToInt32(phi));
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(10, m.Call());
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch1) {
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int constant = 11223344;
1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel block0, block1, def, end;
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel* case_labels[] = {&block0, &block1};
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t case_values[] = {0, 1};
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Switch(m.Int32Constant(0), &def, case_values, case_labels,
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           arraysize(case_labels));
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&block0);
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&block1);
1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&def);
1012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
1013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(constant));
1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(constant, m.Call());
1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch2) {
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, blockc;
1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel* case_labels[] = {&blocka, &blockb};
1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t case_values[] = {std::numeric_limits<int32_t>::min(),
1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           std::numeric_limits<int32_t>::max()};
1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Switch(m.Parameter(0), &blockc, case_values, case_labels,
1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           arraysize(case_labels));
1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(-1));
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(1));
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockc);
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(0));
1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max()));
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min()));
1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = -100; i < 100; i += 25) {
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(0, m.Call(i));
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch3) {
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, blockc;
1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel* case_labels[] = {&blocka, &blockb};
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0,
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           std::numeric_limits<int32_t>::min() + 1};
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Switch(m.Parameter(0), &blockc, case_values, case_labels,
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           arraysize(case_labels));
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(0));
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(1));
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockc);
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(2));
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0));
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1));
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = -100; i < 100; i += 25) {
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(2, m.Call(i));
1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunSwitch4) {
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const size_t kNumCases = 512;
1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const size_t kNumValues = kNumCases + 1;
1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t values[kNumValues];
1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.main_isolate()->random_number_generator()->NextBytes(values,
1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                         sizeof(values));
1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel end, def;
1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t case_values[kNumCases];
1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel* case_labels[kNumCases];
1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* results[kNumValues];
1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < kNumCases; ++i) {
1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case_values[i] = static_cast<int32_t>(i);
1082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case_labels[i] =
1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new (m.main_zone()->New(sizeof(RawMachineLabel))) RawMachineLabel;
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Switch(m.Parameter(0), &def, case_values, case_labels,
1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           arraysize(case_labels));
1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < kNumCases; ++i) {
1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Bind(case_labels[i]);
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    results[i] = m.Int32Constant(values[i]);
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Goto(&end);
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&def);
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  results[kNumCases] = m.Int32Constant(values[kNumCases]);
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int num_results = static_cast<int>(arraysize(results));
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi =
1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.AddNode(m.common()->Phi(MachineRepresentation::kWord32, num_results),
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                num_results, results);
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(phi);
1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < kNumValues; ++i) {
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(values[i], m.Call(static_cast<int>(i)));
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadInt32) {
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t p1 = 0;  // loads directly from this location.
1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.LoadFromPointer(&p1, MachineType::Int32()));
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    p1 = *i;
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(p1, m.Call());
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadInt32Offset) {
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t p1 = 0;  // loads directly from this location.
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t offsets[] = {-2000000, -100, -101, 1,          3,
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       7,        120,  2000, 2000000000, 0xff};
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(offsets); i++) {
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t offset = offsets[i];
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    byte* pointer = reinterpret_cast<byte*>(&p1) - offset;
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // generate load [#base + #index]
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.LoadFromPointer(pointer, MachineType::Int32(), offset));
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      p1 = *j;
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(p1, m.Call());
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunLoadStoreFloat32Offset) {
1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float p1 = 0.0f;  // loads directly from this location.
1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float p2 = 0.0f;  // and stores directly into this location.
1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) {
1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t magic = 0x2342aabb + *i * 3;
1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m;
1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t offset = *i;
1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte* from = reinterpret_cast<byte*>(&p1) - offset;
1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte* to = reinterpret_cast<byte*>(&p2) - offset;
1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // generate load [#base + #index]
1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* load = m.Load(MachineType::Float32(), m.PointerConstant(from),
1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.IntPtrConstant(offset));
1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Store(MachineRepresentation::kFloat32, m.PointerConstant(to),
1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            m.IntPtrConstant(offset), load, kNoWriteBarrier);
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Int32Constant(magic));
1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
1160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      p1 = *j;
1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      p2 = *j - 5;
1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(magic, m.Call());
1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(p1, p2);
1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStoreFloat64Offset) {
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double p1 = 0;  // loads directly from this location.
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double p2 = 0;  // and stores directly into this location.
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t magic = 0x2342aabb + *i * 3;
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t offset = *i;
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    byte* from = reinterpret_cast<byte*>(&p1) - offset;
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    byte* to = reinterpret_cast<byte*>(&p2) - offset;
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // generate load [#base + #index]
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* load = m.Load(MachineType::Float64(), m.PointerConstant(from),
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.IntPtrConstant(offset));
1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Store(MachineRepresentation::kFloat64, m.PointerConstant(to),
1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            m.IntPtrConstant(offset), load, kNoWriteBarrier);
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(magic));
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(j) {
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      p1 = *j;
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      p2 = *j - 5;
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(magic, m.Call());
1190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(p1, p2);
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddP) {
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(m.Int32Add(bt.param0, bt.param1));
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Use uint32_t because signed overflow is UB in C.
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int expected = static_cast<int32_t>(*i + *j);
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, bt.call(*i, *j));
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32EqualP) {
1213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    m.Return(m.Int32Add(m.Parameter(0),
1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        m.Word32Equal(m.Parameter(1), m.Parameter(2))));
1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k));
1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*i, *j, *k));
1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    m.Return(m.Int32Add(m.Word32Equal(m.Parameter(0), m.Parameter(1)),
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        m.Parameter(2)));
1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k));
1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*i, *j, *k));
1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32EqualImm) {
1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           MachineType::Int32());
1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.Return(m.Int32Add(m.Int32Constant(*i),
1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          m.Word32Equal(m.Parameter(0), m.Parameter(1))));
1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j == *k));
1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*j, *k));
1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           MachineType::Int32());
1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.Return(m.Int32Add(m.Word32Equal(m.Int32Constant(*i), m.Parameter(0)),
1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          m.Parameter(1)));
1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>((*i == *j) + bit_cast<uint32_t>(*k));
1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*j, *k));
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32NotEqualP) {
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    m.Return(m.Int32Add(m.Parameter(0),
1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        m.Word32NotEqual(m.Parameter(1), m.Parameter(2))));
1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k));
1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*i, *j, *k));
1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    m.Return(m.Int32Add(m.Word32NotEqual(m.Parameter(0), m.Parameter(1)),
1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        m.Parameter(2)));
1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k));
1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*i, *j, *k));
1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32AddAndWord32NotEqualImm) {
1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           MachineType::Int32());
1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.Return(m.Int32Add(m.Int32Constant(*i),
1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          m.Word32NotEqual(m.Parameter(0), m.Parameter(1))));
1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>(bit_cast<uint32_t>(*i) + (*j != *k));
1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*j, *k));
1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           MachineType::Int32());
1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.Return(m.Int32Add(m.Word32NotEqual(m.Int32Constant(*i), m.Parameter(0)),
1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          m.Parameter(1)));
1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // Use uint32_t because signed overflow is UB in C.
1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t const expected =
1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              bit_cast<int32_t>((*i != *j) + bit_cast<uint32_t>(*k));
1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(*j, *k));
1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
1350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32SarP) {
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Parameter(0),
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Sar(m.Parameter(1), m.Parameter(2))));
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = *i + (*j >> shift);
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32());
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)),
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i >> shift) + *k;
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32ShlP) {
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Parameter(0),
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shl(m.Parameter(1), m.Parameter(2))));
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = *i + (*j << shift);
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32());
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)),
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i << shift) + *k;
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddAndWord32ShrP) {
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Parameter(0),
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shr(m.Parameter(1), m.Parameter(2))));
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = *i + (*j >> shift);
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)),
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i >> shift) + *k;
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddInBranch) {
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int32_t constant = 987654321;
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)),
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i + *j) == 0 ? constant : 0 - constant;
1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)),
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i + *j) != 0 ? constant : 0 - constant;
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant;
1509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                m.Int32Constant(0)),
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant;
1526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0),
1540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        m.AddNode(shops[n], m.Parameter(1),
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  m.Parameter(2))),
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = ((*i + right) == 0) ? constant : 0 - constant;
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddInComparison) {
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)));
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i + *j) == 0;
1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1)));
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i + *j) == 0;
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i + *j) == 0;
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)),
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*j + *i) == 0;
1618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
1629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Add(m.Parameter(0),
1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))),
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Constant(0)));
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = (*i + right) == 0;
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubP) {
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Uint32BinopTester bt(&m);
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Sub(bt.param0, bt.param1));
1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_UINT32_INPUTS(i) {
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(j) {
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uint32_t expected = static_cast<int32_t>(*i - *j);
1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(expected, bt.call(*i, *j));
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubImm) {
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)));
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i - *j;
1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)));
1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *j - *i;
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32SarP) {
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Parameter(0),
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Sar(m.Parameter(1), m.Parameter(2))));
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = *i - (*j >> shift);
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32());
1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)),
1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i >> shift) - *k;
1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32ShlP) {
1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Parameter(0),
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shl(m.Parameter(1), m.Parameter(2))));
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = *i - (*j << shift);
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Uint32(), MachineType::Uint32());
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)),
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i << shift) - *k;
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubAndWord32ShrP) {
1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<uint32_t> m(
1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Parameter(0),
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shr(m.Parameter(1), m.Parameter(2))));
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          uint32_t expected = *i - (*j >> shift);
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<uint32_t> m(
1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)),
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Parameter(2)));
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          uint32_t expected = (*i >> shift) - *k;
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubInBranch) {
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int constant = 987654321;
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
1804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
1822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
1857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                m.Int32Constant(0)),
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0),
1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        m.AddNode(shops[n], m.Parameter(1),
1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  m.Parameter(2))),
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = ((*i - right) == 0) ? constant : 0 - constant;
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubInComparison) {
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)));
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i - *j) == 0;
1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1)));
1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i - *j) == 0;
1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i - *j) == 0;
1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)),
1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*j - *i) == 0;
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
1970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(
1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Sub(m.Parameter(0),
1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     m.AddNode(shops[n], m.Parameter(1), m.Parameter(2))),
1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Constant(0)));
1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = (*i - right) == 0;
1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulP) {
2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Mul(bt.param0, bt.param1));
2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected = static_cast<int32_t>(*i * *j);
2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Mul(bt.param0, bt.param1));
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i * *j;
2021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunInt32MulHighP) {
2029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RawMachineAssemblerTester<int32_t> m;
2030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Int32BinopTester bt(&m);
2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bt.AddReturn(m.Int32MulHigh(bt.param0, bt.param1));
2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  FOR_INT32_INPUTS(i) {
2033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(j) {
2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int32_t expected = static_cast<int32_t>(
2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          (static_cast<int64_t>(*i) * static_cast<int64_t>(*j)) >> 32);
2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_EQ(expected, bt.call(*i, *j));
2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulImm) {
2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0)));
2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i * *j;
2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i)));
2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *j * *i;
2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulAndInt32AddP) {
2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_INT32_INPUTS(i) {
2069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FOR_INT32_INPUTS(j) {
2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t p0 = *i;
2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t p1 = *j;
2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        m.Return(m.Int32Add(m.Int32Constant(p0),
2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            m.Int32Mul(m.Parameter(0), m.Int32Constant(p1))));
2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        FOR_INT32_INPUTS(k) {
2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int32_t p2 = *k;
2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int expected = p0 + static_cast<int32_t>(p1 * p2);
2078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          CHECK_EQ(expected, m.Call(p2));
2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
2081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
2082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  {
2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p0 = *i;
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p1 = *j;
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p2 = *k;
2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = p0 + static_cast<int32_t>(p1 * p2);
2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(p0, p1, p2));
2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Int32());
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(
2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2)));
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p0 = *i;
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p1 = *j;
2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p2 = *k;
2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = static_cast<int32_t>(p0 * p1) + p2;
2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(p0, p1, p2));
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m;
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopTester bt(&m);
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      bt.AddReturn(
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Add(m.Int32Constant(*i), m.Int32Mul(bt.param0, bt.param1)));
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p0 = *j;
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p1 = *k;
2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = *i + static_cast<int32_t>(p0 * p1);
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32MulAndInt32SubP) {
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Int32(), MachineType::Int32());
2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(
2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          uint32_t p0 = *i;
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p1 = *j;
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p2 = *k;
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = p0 - static_cast<uint32_t>(p1 * p2);
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(p0, p1, p2));
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m;
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Int32BinopTester bt(&m);
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      bt.AddReturn(
2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32Sub(m.Int32Constant(*i), m.Int32Mul(bt.param0, bt.param1)));
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p0 = *j;
2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t p1 = *k;
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // Use uint32_t because signed overflow is UB in C.
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = *i - static_cast<uint32_t>(p0 * p1);
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32MulHighP) {
2176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RawMachineAssemblerTester<int32_t> m;
2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Int32BinopTester bt(&m);
2178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bt.AddReturn(m.Uint32MulHigh(bt.param0, bt.param1));
2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  FOR_UINT32_INPUTS(i) {
2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FOR_UINT32_INPUTS(j) {
2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int32_t expected = bit_cast<int32_t>(static_cast<uint32_t>(
2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          (static_cast<uint64_t>(*i) * static_cast<uint64_t>(*j)) >> 32));
2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_EQ(expected, bt.call(bit_cast<int32_t>(*i), bit_cast<int32_t>(*j)));
2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32DivP) {
2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Div(bt.param0, bt.param1));
2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p0 = *i;
2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p1 = *j;
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) {
2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = static_cast<int32_t>(p0 / p1);
2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Add(bt.param0, m.Int32Div(bt.param0, bt.param1)));
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p0 = *i;
2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p1 = *j;
2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) {
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = static_cast<int32_t>(p0 + (p0 / p1));
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32DivP) {
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    bt.AddReturn(m.Uint32Div(bt.param0, bt.param1));
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p0 = *i;
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p1 = *j;
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0) {
2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          int32_t expected = bit_cast<int32_t>(p0 / p1);
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    bt.AddReturn(m.Int32Add(bt.param0, m.Uint32Div(bt.param0, bt.param1)));
2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p0 = *i;
2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p1 = *j;
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0) {
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          int32_t expected = bit_cast<int32_t>(p0 + (p0 / p1));
2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32ModP) {
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Mod(bt.param0, bt.param1));
2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p0 = *i;
2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p1 = *j;
2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) {
2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = static_cast<int32_t>(p0 % p1);
2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Add(bt.param0, m.Int32Mod(bt.param0, bt.param1)));
2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p0 = *i;
2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int p1 = *j;
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0 && (static_cast<uint32_t>(p0) != 0x80000000 || p1 != -1)) {
2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int expected = static_cast<int32_t>(p0 + (p0 % p1));
2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunUint32ModP) {
2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Uint32BinopTester bt(&m);
2295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    bt.AddReturn(m.Uint32Mod(bt.param0, bt.param1));
2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p0 = *i;
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p1 = *j;
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0) {
2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          uint32_t expected = static_cast<uint32_t>(p0 % p1);
2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Uint32BinopTester bt(&m);
2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    bt.AddReturn(m.Int32Add(bt.param0, m.Uint32Mod(bt.param0, bt.param1)));
2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p0 = *i;
2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t p1 = *j;
2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (p1 != 0) {
2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          uint32_t expected = static_cast<uint32_t>(p0 + (p0 % p1));
2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, bt.call(p0, p1));
2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndP) {
2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32And(bt.param0, bt.param1));
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t expected = *i & *j;
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32And(bt.param0, m.Word32Not(bt.param1)));
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t expected = *i & ~(*j);
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32And(m.Word32Not(bt.param0), bt.param1));
2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t expected = ~(*i) & *j;
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32ShlP) {
2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i << (*j & 0x1f);
2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i << (0x1f & *j);
2383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32ShrP) {
2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i >> (*j & 0x1f);
2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i >> (0x1f & *j);
2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndAndWord32SarP) {
2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = *i >> (*j & 0x1f);
2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t expected = *i >> (0x1f & *j);
2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndImm) {
2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0)));
2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i & *j;
2453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i & ~(*j);
2463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndInBranch) {
2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int constant = 987654321;
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
2475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
2493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
2511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
2528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(
2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Int32Constant(0)),
2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          &blocka, &blockb);
2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
2540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
2549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
2551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0),
2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         m.AddNode(shops[n], m.Parameter(1),
2554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   m.Parameter(2))),
2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = ((*i & right) == 0) ? constant : 0 - constant;
2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32AndInComparison) {
2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)));
2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i & *j) == 0;
2597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1)));
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i & *j) == 0;
2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i & *j) == 0;
2620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)),
2628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*j & *i) == 0;
2631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrP) {
2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Or(bt.param0, bt.param1));
2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i | *j;
2646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1)));
2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i | ~(*j);
2657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1));
2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = ~(*i) | *j;
2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrImm) {
2676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)));
2680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i | *j;
2682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i | ~(*j);
2692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrInBranch) {
2700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int constant = 987654321;
2701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
2725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
2733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
2743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
2757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                m.Int32Constant(0)),
2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0),
2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        m.AddNode(shops[n], m.Parameter(1),
2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  m.Parameter(2))),
2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
2793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
2796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
2797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
2801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
2803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = ((*i | right) == 0) ? constant : 0 - constant;
2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32OrInComparison) {
2817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)));
2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) == 0;
2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Int32BinopTester bt(&m);
2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1)));
2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = (*i | *j) == 0;
2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i | *j) == 0;
2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)),
2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)));
2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*j | *i) == 0;
2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32XorP) {
2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)));
2871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i ^ *j;
2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Xor(bt.param0, bt.param1));
2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        uint32_t expected = *i ^ *j;
2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1)));
2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = *i ^ ~(*j);
2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1));
2903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
2904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
2905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = ~(*i) ^ *j;
2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i ^ ~(*j);
2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32XorInBranch) {
2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const uint32_t constant = 987654321;
2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
2945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
2946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineLabel blocka, blockb;
2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(
2948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        &blocka, &blockb);
2950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
2951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(constant));
2952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
2953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Int32Constant(0 - constant));
2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, *j));
2958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
2967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
2968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
2980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
2981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
2982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(
2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Int32Constant(0)),
2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          &blocka, &blockb);
2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
2987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<void> m;
2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Operator* shops[] = {m.machine()->Word32Sar(),
2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shl(),
3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               m.machine()->Word32Shr()};
3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t n = 0; n < arraysize(shops); n++) {
3002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(
3003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          MachineType::Uint32(), MachineType::Int32(), MachineType::Uint32());
3004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineLabel blocka, blockb;
3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0),
3006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         m.AddNode(shops[n], m.Parameter(1),
3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   m.Parameter(2))),
3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             m.Int32Constant(0)),
3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               &blocka, &blockb);
3010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(constant));
3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(0 - constant));
3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(j) {
3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FOR_UINT32_SHIFTS(shift) {
3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t right;
3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            switch (shops[n]->opcode()) {
3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              default:
3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                UNREACHABLE();
3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Sar:
3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j >> shift;
3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
3024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shl:
3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = *j << shift;
3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
3027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              case IrOpcode::kWord32Shr:
3028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                right = static_cast<uint32_t>(*j) >> shift;
3029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                break;
3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int32_t expected = ((*i ^ right) == 0) ? constant : 0 - constant;
3032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            CHECK_EQ(expected, m.Call(*i, *j, shift));
3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
3034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShlP) {
3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)));
3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *j << shift;
3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Shl(bt.param0, bt.param1));
3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i << shift;
3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShlInComparison) {
3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Shl(bt.param0, bt.param1), m.Int32Constant(0)));
3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i << shift);
3075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32Shl(bt.param0, bt.param1)));
3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i << shift);
3087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Int32Constant(0),
3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))));
3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i << shift);
3099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)),
3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Int32Constant(0)));
3109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i << shift);
3111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShrP) {
3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)));
3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *j >> shift;
3125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*j));
3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Shr(bt.param0, bt.param1));
3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = *i >> shift;
3136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(0x00010000u, bt.call(0x80000000, 15));
3140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32ShrInComparison) {
3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Shr(bt.param0, bt.param1), m.Int32Constant(0)));
3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i >> shift);
3153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32Shr(bt.param0, bt.param1)));
3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i >> shift);
3165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Int32Constant(0),
3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))));
3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i >> shift);
3177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)),
3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Int32Constant(0)));
3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == (*i >> shift);
3189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32SarP) {
3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_SHIFTS(shift) {
3199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)));
3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = *j >> shift;
3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
3210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Sar(bt.param0, bt.param1));
3211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
3212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_SHIFTS(shift) {
3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = *i >> shift;
3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(bit_cast<int32_t>(0xFFFF0000), bt.call(0x80000000, 15));
3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32SarInComparison) {
3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Sar(bt.param0, bt.param1), m.Int32Constant(0)));
3228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_SHIFTS(shift) {
3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = 0 == (*i >> shift);
3231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopTester bt(&m);
3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32Sar(bt.param0, bt.param1)));
3240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_SHIFTS(shift) {
3242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = 0 == (*i >> shift);
3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_SHIFTS(shift) {
3249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Int32Constant(0),
3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))));
3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(i) {
3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = 0 == (*i >> shift);
3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*i));
3256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_SHIFTS(shift) {
3261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)),
3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Int32Constant(0)));
3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(i) {
3266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t expected = 0 == (*i >> shift);
3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*i));
3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32RorP) {
3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)));
3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expected = bits::RotateRight32(*j, shift);
3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call(*j));
3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(m.Word32Ror(bt.param0, bt.param1));
3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = bits::RotateRight32(*i, shift);
3292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32RorInComparison) {
3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Word32Ror(bt.param0, bt.param1), m.Int32Constant(0)));
3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == bits::RotateRight32(*i, shift);
3308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Uint32BinopTester bt(&m);
3315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bt.AddReturn(
3316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Word32Equal(m.Int32Constant(0), m.Word32Ror(bt.param0, bt.param1)));
3317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == bits::RotateRight32(*i, shift);
3320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, bt.call(*i, shift));
3321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Int32Constant(0),
3329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Word32Ror(m.Parameter(0), m.Int32Constant(shift))));
3330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == bits::RotateRight32(*i, shift);
3332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_SHIFTS(shift) {
3338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<uint32_t> m(MachineType::Uint32());
3339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(
3340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Word32Equal(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift)),
3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        m.Int32Constant(0)));
3342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(i) {
3343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        uint32_t expected = 0 == bits::RotateRight32(*i, shift);
3344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK_EQ(expected, m.Call(*i));
3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32NotP) {
3352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Word32Not(m.Parameter(0)));
3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int expected = ~(*i);
3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expected, m.Call(*i));
3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32NegP) {
3362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
3363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Neg(m.Parameter(0)));
3364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
3365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int expected = -*i;
3366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expected, m.Call(*i));
3367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32SarP) {
3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Int32(), MachineType::Uint32());
3375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Parameter(0),
3376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Word32Sar(m.Parameter(1), m.Parameter(2))));
3377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
3380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i == (*j >> shift));
3381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Int32(), MachineType::Uint32(), MachineType::Int32());
3389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)),
3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Parameter(2)));
3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_INT32_INPUTS(k) {
3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = ((*i >> shift) == *k);
3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
3396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32ShlP) {
3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Parameter(0),
3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Word32Shl(m.Parameter(1), m.Parameter(2))));
3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i == (*j << shift));
3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
3421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)),
3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Parameter(2)));
3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = ((*i << shift) == *k);
3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunWord32EqualAndWord32ShrP) {
3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Parameter(0),
3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Word32Shr(m.Parameter(1), m.Parameter(2))));
3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_INPUTS(j) {
3443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_SHIFTS(shift) {
3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = (*i == (*j >> shift));
3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, *j, shift));
3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(
3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::Uint32(), MachineType::Uint32(), MachineType::Uint32());
3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)),
3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           m.Parameter(2)));
3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(i) {
3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_UINT32_SHIFTS(shift) {
3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FOR_UINT32_INPUTS(k) {
3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected = ((*i >> shift) == *k);
3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call(*i, shift, *k));
3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadNodes) {
3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; true; i++) {
3469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(i == 5 ? MachineType::Int32()
3470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                : MachineType::None());
3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int constant = 0x55 + i;
3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    switch (i) {
3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 0:
3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Int32Constant(44);
3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 1:
3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.StringConstant("unused");
3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 2:
3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.NumberConstant(11.1);
3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 3:
3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.PointerConstant(&constant);
3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 4:
3486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        m.LoadFromPointer(&constant, MachineType::Int32());
3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 5:
3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        m.Parameter(0);
3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      default:
3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return;
3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(constant));
3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (i != 5) {
3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(constant, m.Call());
3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(constant, m.Call(0));
3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadInt32Binops) {
3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const Operator* kOps[] = {
3508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Word32And(),            m.machine()->Word32Or(),
3509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Word32Xor(),            m.machine()->Word32Shl(),
3510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Word32Shr(),            m.machine()->Word32Sar(),
3511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Word32Ror(),            m.machine()->Word32Equal(),
3512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32Add(),             m.machine()->Int32Sub(),
3513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32Mul(),             m.machine()->Int32MulHigh(),
3514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32Div(),             m.machine()->Uint32Div(),
3515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32Mod(),             m.machine()->Uint32Mod(),
3516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Uint32MulHigh(),        m.machine()->Int32LessThan(),
3517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Int32LessThanOrEqual(), m.machine()->Uint32LessThan(),
3518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      m.machine()->Uint32LessThanOrEqual()};
3519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = 0; i < arraysize(kOps); ++i) {
3521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
3522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         MachineType::Int32());
3523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int32_t constant = static_cast<int32_t>(0x55555 + i);
3524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.AddNode(kOps[i], m.Parameter(0), m.Parameter(1));
3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(constant));
3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(constant, m.Call(1, 1));
3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Type>
3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void RunLoadImmIndex(MachineType rep) {
3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int kNumElems = 3;
3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Type buffer[kNumElems];
3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // initialize the buffer with raw data.
3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  byte* raw = reinterpret_cast<byte*>(buffer);
3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < sizeof(buffer); i++) {
3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA);
3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test with various large and small offsets.
3544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int offset = -1; offset <= 200000; offset *= -5) {
3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < kNumElems; i++) {
3546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<Type> m;
3547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* base = m.PointerConstant(buffer - offset);
3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* index = m.Int32Constant((offset + i) * sizeof(buffer[0]));
3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Load(rep, base, index));
3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Type expected = buffer[i];
3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Type actual = m.Call();
3553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(expected == actual);
3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadImmIndex) {
3560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<int8_t>(MachineType::Int8());
3561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<uint8_t>(MachineType::Uint8());
3562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<int16_t>(MachineType::Int16());
3563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<uint16_t>(MachineType::Uint16());
3564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<int32_t>(MachineType::Int32());
3565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<uint32_t>(MachineType::Uint32());
3566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadImmIndex<int32_t*>(MachineType::AnyTagged());
3567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(titzer): test kRepBit loads
3569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(titzer): test MachineType::Float64() loads
3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(titzer): test various indexing modes.
3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename CType>
3575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void RunLoadStore(MachineType rep) {
3576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int kNumElems = 4;
3577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CType buffer[kNumElems];
3578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int32_t x = 0; x < kNumElems; x++) {
3580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t y = kNumElems - x - 1;
3581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // initialize the buffer with raw data.
3582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    byte* raw = reinterpret_cast<byte*>(buffer);
3583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t i = 0; i < sizeof(buffer); i++) {
3584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raw[i] = static_cast<byte>((i + sizeof(buffer)) ^ 0xAA);
3585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t OK = 0x29000 + x;
3589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* base = m.PointerConstant(buffer);
3590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* index0 = m.IntPtrConstant(x * sizeof(buffer[0]));
3591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* load = m.Load(rep, base, index0);
3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* index1 = m.IntPtrConstant(y * sizeof(buffer[0]));
3593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Store(rep.representation(), base, index1, load, kNoWriteBarrier);
3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(OK));
3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(buffer[x] != buffer[y]);
3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(OK, m.Call());
3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(buffer[x] == buffer[y]);
3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStore) {
3604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<int8_t>(MachineType::Int8());
3605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<uint8_t>(MachineType::Uint8());
3606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<int16_t>(MachineType::Int16());
3607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<uint16_t>(MachineType::Uint16());
3608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<int32_t>(MachineType::Int32());
3609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<uint32_t>(MachineType::Uint32());
3610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<void*>(MachineType::AnyTagged());
3611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<float>(MachineType::Float32());
3612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RunLoadStore<double>(MachineType::Float64());
3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Add) {
3617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(),
3618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Float32());
3619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1)));
3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *i + *j;
3624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*i, *j));
3625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Sub) {
3631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(),
3632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Float32());
3633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1)));
3634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *i - *j;
3638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*i, *j));
3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Mul) {
3645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(),
3646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Float32());
3647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1)));
3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *i * *j;
3652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*i, *j));
3653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Div) {
3659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(),
3660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                             MachineType::Float32());
3661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1)));
3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *i / *j;
3666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*i, *j));
3667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Add) {
3673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
3674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Float64());
3675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1)));
3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
3679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile double expected = *i + *j;
3680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, m.Call(*i, *j));
3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Sub) {
3687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
3688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Float64());
3689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1)));
3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(i) {
3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(j) {
3693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile double expected = *i - *j;
3694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, m.Call(*i, *j));
3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Mul) {
3701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
3702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Float64());
3703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1)));
3704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(i) {
3706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(j) {
3707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile double expected = *i * *j;
3708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, m.Call(*i, *j));
3709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Div) {
3715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
3716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Float64());
3717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1)));
3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
3721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile double expected = *i / *j;
3722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, m.Call(*i, *j));
3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Mod) {
3729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
3730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Float64());
3731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1)));
3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(modulo(*i, *j), m.Call(*i, *j)); }
3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunDeadFloat32Binops) {
3740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
3741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const Operator* ops[] = {m.machine()->Float32Add(), m.machine()->Float32Sub(),
3743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           m.machine()->Float32Mul(), m.machine()->Float32Div(),
3744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           NULL};
3745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; ops[i] != NULL; i++) {
3747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m;
3748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int constant = 0x53355 + i;
3749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.AddNode(ops[i], m.Float32Constant(0.1f), m.Float32Constant(1.11f));
3750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Int32Constant(constant));
3751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(constant, m.Call());
3752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunDeadFloat64Binops) {
3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(),
3760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           m.machine()->Float64Mul(), m.machine()->Float64Div(),
3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           m.machine()->Float64Mod(), NULL};
3762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; ops[i] != NULL; i++) {
3764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<int32_t> m;
3765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int constant = 0x53355 + i;
3766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.AddNode(ops[i], m.Float64Constant(0.1), m.Float64Constant(1.11));
3767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Int32Constant(constant));
3768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(constant, m.Call());
3769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32AddP) {
3774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
3775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Add(bt.param0, bt.param1));
3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
3780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
3781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      float expected = *pl + *pr;
3782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, bt.call(*pl, *pr));
3783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64AddP) {
3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Float64BinopTester bt(&m);
3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Add(bt.param0, bt.param1));
3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(pl) {
3795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(pr) {
3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl + *pr;
3797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloa32MaxP) {
3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
3806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32Max().IsSupported()) return;
3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Max(bt.param0, bt.param1));
3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
3811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
3812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl > *pr ? *pl : *pr;
3813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MaxP) {
3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
3822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64Max().IsSupported()) return;
3823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Max(bt.param0, bt.param1));
3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(pl) {
3827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(pr) {
3828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl > *pr ? *pl : *pr;
3829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32MinP) {
3836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
3837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
3838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32Min().IsSupported()) return;
3839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Min(bt.param0, bt.param1));
3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
3843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
3844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl < *pr ? *pl : *pr;
3845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MinP) {
3852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
3853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
3854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64Min().IsSupported()) return;
3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Min(bt.param0, bt.param1));
3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(pl) {
3859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(pr) {
3860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl < *pr ? *pl : *pr;
3861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubP) {
3868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RawMachineAssemblerTester<int32_t> m;
3869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
3870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Sub(bt.param0, bt.param1));
3872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
3874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
3875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      float expected = *pl - *pr;
3876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, bt.call(*pl, *pr));
3877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
3879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubImm1) {
3883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
3885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0)));
3886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *i - *j;
3889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*j));
3890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
3892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32SubImm2) {
3896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
3897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
3898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i)));
3899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(j) {
3901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      volatile float expected = *j - *i;
3902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, m.Call(*j));
3903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
3905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
3906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubImm1) {
3909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
3911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0)));
3912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i - *j, m.Call(*j)); }
3914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubImm2) {
3919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
3921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i)));
3922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j - *i, m.Call(*j)); }
3924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64SubP) {
3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Sub(bt.param0, bt.param1));
3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(pl) {
3935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(pr) {
3936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl - *pr;
3937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32MulP) {
3944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
3945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
3946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Mul(bt.param0, bt.param1));
3948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
3950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
3951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      float expected = *pl * *pr;
3952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, bt.call(*pl, *pr));
3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulP) {
3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
3960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Mul(bt.param0, bt.param1));
3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(pl) {
3965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(pr) {
3966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl * *pr;
3967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
3968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Add1) {
3974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(
3975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Float64(), MachineType::Float64(), MachineType::Float64());
3976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)),
3977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.Parameter(2)));
3978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
3981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_FLOAT64_INPUTS(k) {
3982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CheckDoubleEq((*i * *j) + *k, m.Call(*i, *j, *k));
3983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Add2) {
3990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(
3991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Float64(), MachineType::Float64(), MachineType::Float64());
3992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Add(m.Parameter(0),
3993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.Float64Mul(m.Parameter(1), m.Parameter(2))));
3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
3996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
3997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_FLOAT64_INPUTS(k) {
3998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CheckDoubleEq(*i + (*j * *k), m.Call(*i, *j, *k));
3999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
4000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Sub1) {
4006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(
4007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Float64(), MachineType::Float64(), MachineType::Float64());
4008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)),
4009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.Parameter(2)));
4010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
4012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
4013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_FLOAT64_INPUTS(k) {
4014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CheckDoubleEq((*i * *j) - *k, m.Call(*i, *j, *k));
4015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
4016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulAndFloat64Sub2) {
4022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(
4023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Float64(), MachineType::Float64(), MachineType::Float64());
4024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Sub(m.Parameter(0),
4025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.Float64Mul(m.Parameter(1), m.Parameter(2))));
4026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
4028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
4029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FOR_FLOAT64_INPUTS(k) {
4030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CheckDoubleEq(*i - (*j * *k), m.Call(*i, *j, *k));
4031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
4032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulImm1) {
4038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
4039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
4040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0)));
4041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i * *j, m.Call(*j)); }
4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64MulImm2) {
4048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
4049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
4050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i)));
4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j * *i, m.Call(*j)); }
4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32DivP) {
4058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
4059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float32BinopTester bt(&m);
4060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float32Div(bt.param0, bt.param1));
4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(pl) {
4064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT32_INPUTS(pr) {
4065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      float expected = *pl / *pr;
4066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckFloatEq(expected, bt.call(*pl, *pr));
4067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64DivP) {
4073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
4074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
4075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Div(bt.param0, bt.param1));
4077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(pl) {
4079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(pr) {
4080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = *pl / *pr;
4081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, bt.call(*pl, *pr));
4082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ModP) {
4088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
4089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Float64BinopTester bt(&m);
4090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bt.AddReturn(m.Float64Mod(bt.param0, bt.param1));
4092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
4094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_FLOAT64_INPUTS(j) {
4095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = modulo(*i, *j);
4096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double found = bt.call(*i, *j);
4097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, found);
4098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeInt32ToFloat64_A) {
4104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t magic = 0x986234;
4105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m;
4106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic)));
4107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CheckDoubleEq(static_cast<double>(magic), m.Call());
4108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeInt32ToFloat64_B) {
4112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Int32());
4113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeInt32ToFloat64(m.Parameter(0)));
4114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); }
4116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeUint32ToFloat64) {
4120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Uint32());
4121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeUint32ToFloat64(m.Parameter(0)));
4122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); }
4124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToInt32_A) {
4128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m;
4129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  double magic = 11.1;
4130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic)));
4131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(static_cast<int32_t>(magic), m.Call());
4132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToInt32_B) {
4136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Float64());
4137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeFloat64ToInt32(m.Parameter(0)));
4138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Note we don't check fractional inputs, or inputs outside the range of
4140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // int32, because these Convert operators really should be Change operators.
4141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); }
4142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int32_t n = 1; n < 31; ++n) {
4144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(1 << n, m.Call(static_cast<double>(1 << n)));
4145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
4146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int32_t n = 1; n < 31; ++n) {
4148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(3 << n, m.Call(static_cast<double>(3 << n)));
4149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
4150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunChangeFloat64ToUint32) {
4154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64());
4155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeFloat64ToUint32(m.Parameter(0)));
4156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
4158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_UINT32_INPUTS(i) { CHECK_EQ(*i, m.Call(static_cast<double>(*i))); }
4159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
4160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check various powers of 2.
4162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int32_t n = 1; n < 31; ++n) {
4163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    { CHECK_EQ(1u << n, m.Call(static_cast<double>(1u << n))); }
4164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    { CHECK_EQ(3u << n, m.Call(static_cast<double>(3u << n))); }
4166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
4167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Note we don't check fractional inputs, because these Convert operators
4168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // really should be Change operators.
4169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTruncateFloat64ToFloat32) {
4173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float64());
4174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0)));
4176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); }
4178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
4179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadChangeFloat64ToInt32) {
4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 0x88abcda4;
4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.ChangeFloat64ToInt32(m.Float64Constant(999.78));
4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDeadChangeInt32ToFloat64) {
4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 0x8834abcd;
4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.ChangeInt32ToFloat64(m.Int32Constant(magic - 6888));
4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoopPhiInduction2) {
4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int false_val = 0x10777;
4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x = false_val; while(false) { x++; } return x;
4205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.Int32Constant(false_val);
4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
4209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kWord32, false_node, false_node);
4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &body, &end);
4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32Add(phi, m.Int32Constant(1));
4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, add);
4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(phi);
4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(false_val, m.Call());
4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloatDiamond) {
4223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
4224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int magic = 99645;
4226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float buffer = 0.1f;
4227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float constant = 99.99f;
4228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
4230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* k1 = m.Float32Constant(constant);
4231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* k2 = m.Float32Constant(0 - constant);
4232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
4233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
4234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
4235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
4236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Goto(&end);
4237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&end);
4238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kFloat32, k2, k1);
4239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kFloat32, m.PointerConstant(&buffer),
4240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.IntPtrConstant(0), phi, kNoWriteBarrier);
4241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(magic));
4242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(magic, m.Call());
4244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(constant == buffer);
4245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleDiamond) {
4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 99645;
4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double buffer = 0.1;
4253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double constant = 99.99;
4254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
4256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* k1 = m.Float64Constant(constant);
4257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* k2 = m.Float64Constant(0 - constant);
4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kFloat64, k2, k1);
4265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&buffer),
4266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), phi, kNoWriteBarrier);
4267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(constant, buffer);
4271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunRefDiamond) {
4275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 99644;
4278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> rexpected =
4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CcTest::i_isolate()->factory()->InternalizeUtf8String("A");
4280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String* buffer;
4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* k1 = m.StringConstant("A");
4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* k2 = m.StringConstant("B");
4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kTagged, k2, k1);
4292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kTagged, m.PointerConstant(&buffer),
4293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), phi, kNoWriteBarrier);
4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(rexpected->SameValue(buffer));
4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleRefDiamond) {
4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 99648;
4305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double dbuffer = 0.1;
4306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double dconstant = 99.99;
4307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> rexpected =
4308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CcTest::i_isolate()->factory()->InternalizeUtf8String("AX");
4309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String* rbuffer;
4310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d1 = m.Float64Constant(dconstant);
4313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d2 = m.Float64Constant(0 - dconstant);
4314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* r1 = m.StringConstant("AX");
4315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* r2 = m.StringConstant("BX");
4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
4317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* dphi = m.Phi(MachineRepresentation::kFloat64, d2, d1);
4323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* rphi = m.Phi(MachineRepresentation::kTagged, r2, r1);
4324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&dbuffer),
4325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), dphi, kNoWriteBarrier);
4326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kTagged, m.PointerConstant(&rbuffer),
4327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), rphi, kNoWriteBarrier);
4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(dconstant, dbuffer);
4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(rexpected->SameValue(rbuffer));
4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleRefDoubleDiamond) {
4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int magic = 99649;
4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double dbuffer = 0.1;
4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double dconstant = 99.997;
4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> rexpected =
4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CcTest::i_isolate()->factory()->InternalizeUtf8String("AD");
4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String* rbuffer;
4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, mid, blockd, blocke, end;
4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d1 = m.Float64Constant(dconstant);
4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* d2 = m.Float64Constant(0 - dconstant);
4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* r1 = m.StringConstant("AD");
4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* r2 = m.StringConstant("BD");
4351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blocka, &blockb);
4352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&mid);
4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&mid);
4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&mid);
4357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* dphi1 = m.Phi(MachineRepresentation::kFloat64, d2, d1);
4358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* rphi1 = m.Phi(MachineRepresentation::kTagged, r2, r1);
4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32Constant(0), &blockd, &blocke);
4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockd);
4362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocke);
4364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* dphi2 = m.Phi(MachineRepresentation::kFloat64, d1, dphi1);
4367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* rphi2 = m.Phi(MachineRepresentation::kTagged, r1, rphi1);
4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&dbuffer),
4370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), dphi2, kNoWriteBarrier);
4371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kTagged, m.PointerConstant(&rbuffer),
4372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), rphi2, kNoWriteBarrier);
4373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(dconstant, dbuffer);
4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(rexpected->SameValue(rbuffer));
4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunDoubleLoopPhi) {
4382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, end;
4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int magic = 99773;
4386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double buffer = 0.99;
4387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double dconstant = 777.1;
4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* dk = m.Float64Constant(dconstant);
4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
4394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kFloat64, dk, dk);
4395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  phi->ReplaceInput(1, phi);
4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(zero, &body, &end);
4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Store(MachineRepresentation::kFloat64, m.PointerConstant(&buffer),
4401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          m.Int32Constant(0), phi, kNoWriteBarrier);
4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(magic));
4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(magic, m.Call());
4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunCountToTenAccRaw) {
4409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ten = m.Int32Constant(10);
4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* one = m.Int32Constant(1);
4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, body_cont, end;
4416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
4420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero);
4421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero);
4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&body);
4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* next_i = m.Int32Add(i, one);
4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* next_j = m.Int32Add(j, one);
4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont);
4428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body_cont);
4430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  i->ReplaceInput(1, next_i);
4431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  j->ReplaceInput(1, next_j);
4432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(ten);
4436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(10, m.Call());
4438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunCountToTenAccRaw2) {
4442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* zero = m.Int32Constant(0);
4445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ten = m.Int32Constant(10);
4446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* one = m.Int32Constant(1);
4447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel header, body, body_cont, end;
4449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&header);
4453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* i = m.Phi(MachineRepresentation::kWord32, zero, zero);
4454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* j = m.Phi(MachineRepresentation::kWord32, zero, zero);
4455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* k = m.Phi(MachineRepresentation::kWord32, zero, zero);
4456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&body);
4457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body);
4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* next_i = m.Int32Add(i, one);
4460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* next_j = m.Int32Add(j, one);
4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* next_k = m.Int32Add(j, one);
4462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Word32Equal(next_i, ten), &end, &body_cont);
4463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&body_cont);
4465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  i->ReplaceInput(1, next_i);
4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  j->ReplaceInput(1, next_j);
4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  k->ReplaceInput(1, next_k);
4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&header);
4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(ten);
4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(10, m.Call());
4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunAddTree) {
4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18};
4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* base = m.PointerConstant(inputs);
4482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 =
4483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(0 * sizeof(int32_t)));
4484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 =
4485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(1 * sizeof(int32_t)));
4486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 =
4487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(2 * sizeof(int32_t)));
4488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n3 =
4489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(3 * sizeof(int32_t)));
4490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n4 =
4491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(4 * sizeof(int32_t)));
4492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n5 =
4493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(5 * sizeof(int32_t)));
4494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n6 =
4495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(6 * sizeof(int32_t)));
4496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n7 =
4497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Load(MachineType::Int32(), base, m.Int32Constant(7 * sizeof(int32_t)));
4498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i1 = m.Int32Add(n0, n1);
4500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i2 = m.Int32Add(n2, n3);
4501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i3 = m.Int32Add(n4, n5);
4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i4 = m.Int32Add(n6, n7);
4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i5 = m.Int32Add(i1, i2);
4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i6 = m.Int32Add(i3, i4);
4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* i7 = m.Int32Add(i5, i6);
4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(i7);
4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(116, m.Call());
4512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kFloat64CompareHelperTestCases = 15;
4516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kFloat64CompareHelperNodeType = 4;
4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m,
4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                int test_case, int node_type, double x,
4520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                double y) {
4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static double buffer[2];
4522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  buffer[0] = x;
4523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  buffer[1] = y;
4524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases);
4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType);
4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(x < y);
4527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool load_a = node_type / 2 == 1;
4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool load_b = node_type % 2 == 1;
4529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* a =
4530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      load_a ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[0]))
4531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             : m->Float64Constant(x);
4532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* b =
4533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      load_b ? m->Load(MachineType::Float64(), m->PointerConstant(&buffer[1]))
4534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             : m->Float64Constant(y);
4535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* cmp = NULL;
4536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool expected = false;
4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (test_case) {
4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Equal tests.
4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 0:
4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64Equal(a, b);
4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 1:
4544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64Equal(a, a);
4545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // LessThan tests.
4548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 2:
4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThan(a, b);
4550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 3:
4553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThan(b, a);
4554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 4:
4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThan(a, a);
4558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // LessThanOrEqual tests.
4561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 5:
4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThanOrEqual(a, b);
4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 6:
4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThanOrEqual(b, a);
4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 7:
4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64LessThanOrEqual(a, a);
4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // NotEqual tests.
4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 8:
4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64NotEqual(a, b);
4576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 9:
4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64NotEqual(b, a);
4580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 10:
4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64NotEqual(a, a);
4584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // GreaterThan tests.
4587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 11:
4588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64GreaterThan(a, a);
4589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 12:
4592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64GreaterThan(a, b);
4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = false;
4594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // GreaterThanOrEqual tests.
4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 13:
4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64GreaterThanOrEqual(a, a);
4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case 14:
4601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cmp = m->Float64GreaterThanOrEqual(b, a);
4602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = true;
4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
4605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
4606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m->Return(cmp);
4608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return expected;
4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64Compare) {
4613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double inf = V8_INFINITY;
4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // All pairs (a1, a2) are of the form a1 < a2.
4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double inputs[] = {0.0,  1.0,  -1.0, 0.22, -1.22, 0.22,
4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     -inf, 0.22, 0.22, inf,  -inf,  inf};
4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int test = 0; test < kFloat64CompareHelperTestCases; test++) {
4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int node_type = 0; node_type < kFloat64CompareHelperNodeType;
4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         node_type++) {
4621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (size_t input = 0; input < arraysize(inputs); input += 2) {
4622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        RawMachineAssemblerTester<int32_t> m;
4623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected = Float64CompareHelper(&m, test, node_type, inputs[input],
4624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            inputs[input + 1]);
4625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, m.Call());
4626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64UnorderedCompare) {
4633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* operators[] = {m.machine()->Float64Equal(),
4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 m.machine()->Float64LessThan(),
4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 m.machine()->Float64LessThanOrEqual()};
4638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  double nan = std::numeric_limits<double>::quiet_NaN();
4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(i) {
4642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t o = 0; o < arraysize(operators); ++o) {
4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int j = 0; j < 2; j++) {
4644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        RawMachineAssemblerTester<int32_t> m;
4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Node* a = m.Float64Constant(*i);
4646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Node* b = m.Float64Constant(nan);
4647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (j == 1) std::swap(a, b);
4648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        m.Return(m.AddNode(operators[o], a, b));
4649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(0, m.Call());
4650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64Equal) {
4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_a = 0.0;
4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_b = 0.0;
4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* a = m.LoadFromPointer(&input_a, MachineType::Float64());
4662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* b = m.LoadFromPointer(&input_b, MachineType::Float64());
4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Float64Equal(a, b));
4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareWrapper cmp(IrOpcode::kFloat64Equal);
4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(pl) {
4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(pr) {
4668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      input_a = *pl;
4669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      input_b = *pr;
4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0;
4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, m.Call());
4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunFloat64LessThan) {
4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_a = 0.0;
4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_b = 0.0;
4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* a = m.LoadFromPointer(&input_a, MachineType::Float64());
4683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* b = m.LoadFromPointer(&input_b, MachineType::Float64());
4684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Float64LessThan(a, b));
4685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareWrapper cmp(IrOpcode::kFloat64LessThan);
4687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_FLOAT64_INPUTS(pl) {
4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_FLOAT64_INPUTS(pr) {
4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      input_a = *pl;
4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      input_b = *pr;
4691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0;
4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, m.Call());
4693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename IntType>
4699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic void LoadStoreTruncation(MachineType kRepresentation) {
4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  IntType input;
4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* a = m.LoadFromPointer(&input, kRepresentation);
4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ap1 = m.Int32Add(a, m.Int32Constant(1));
4705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&input, kRepresentation.representation(), ap1);
4706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(ap1);
4707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const IntType max = std::numeric_limits<IntType>::max();
4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const IntType min = std::numeric_limits<IntType>::min();
4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test upper bound.
4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  input = max;
4713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(max + 1, m.Call());
4714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(min, input);
4715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test lower bound.
4717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  input = min;
4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(static_cast<IntType>(max + 2), m.Call());
4719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(min + 1, input);
4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test all one byte values that are not one byte bounds.
4722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = -127; i < 127; i++) {
4723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    input = i;
4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int expected = i >= 0 ? i + 1 : max + (i - min) + 2;
4725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(static_cast<IntType>(expected), m.Call());
4726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(static_cast<IntType>(i + 1), input);
4727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunLoadStoreTruncation) {
4732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LoadStoreTruncation<int8_t>(MachineType::Int8());
4733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LoadStoreTruncation<int16_t>(MachineType::Int16());
4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void IntPtrCompare(intptr_t left, intptr_t right) {
4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int test = 0; test < 7; test++) {
4739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawMachineAssemblerTester<bool> m(MachineType::Pointer(),
4740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      MachineType::Pointer());
4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* p0 = m.Parameter(0);
4742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* p1 = m.Parameter(1);
4743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* res = NULL;
4744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool expected = false;
4745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    switch (test) {
4746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 0:
4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrLessThan(p0, p1);
4748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = true;
4749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 1:
4751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrLessThanOrEqual(p0, p1);
4752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = true;
4753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 2:
4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrEqual(p0, p1);
4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = false;
4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 3:
4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrGreaterThanOrEqual(p0, p1);
4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = false;
4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 4:
4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrGreaterThan(p0, p1);
4764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = false;
4765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 5:
4767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrEqual(p0, p0);
4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = true;
4769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case 6:
4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        res = m.IntPtrNotEqual(p0, p1);
4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected = true;
4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      default:
4775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        UNREACHABLE();
4776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
4777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(res);
4779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expected, m.Call(reinterpret_cast<int32_t*>(left),
4780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              reinterpret_cast<int32_t*>(right)));
4781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunIntPtrCompare) {
4786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  intptr_t min = std::numeric_limits<intptr_t>::min();
4787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  intptr_t max = std::numeric_limits<intptr_t>::max();
4788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // An ascending chain of intptr_t
4789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  intptr_t inputs[] = {min, min / 2, -1, 0, 1, max / 2, max};
4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(inputs) - 1; i++) {
4791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IntPtrCompare(inputs[i], inputs[i + 1]);
4792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTestIntPtrArithmetic) {
4797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kInputSize = 10;
4798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t inputs[kInputSize];
4799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t outputs[kInputSize];
4800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs[i] = i;
4802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    outputs[i] = -1;
4803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t*> m;
4805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* input = m.PointerConstant(&inputs[0]);
4806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* output = m.PointerConstant(&outputs[kInputSize - 1]);
4807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* elem_size = m.IntPtrConstant(sizeof(inputs[0]));
4808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Store(MachineRepresentation::kWord32, output,
4810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            m.Load(MachineType::Int32(), input), kNoWriteBarrier);
4811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    input = m.IntPtrAdd(input, elem_size);
4812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    output = m.IntPtrSub(output, elem_size);
4813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(input);
4815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(&inputs[kInputSize], m.Call());
4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(i, inputs[i]);
4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(kInputSize - i - 1, outputs[i]);
4819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunSpillLotsOfThings) {
4824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kInputSize = 1000;
4825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
4826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* accs[kInputSize];
4827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t outputs[kInputSize];
4828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* one = m.Int32Constant(1);
4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* acc = one;
4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    acc = m.Int32Add(acc, one);
4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    accs[i] = acc;
4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.StoreToPointer(&outputs[i], MachineRepresentation::kWord32, accs[i]);
4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(one);
4838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Call();
4839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(outputs[i], i + 2);
4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunSpillConstantsAndParameters) {
4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kInputSize = 1000;
4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int32_t kBase = 987;
4848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
4849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       MachineType::Int32());
4850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t outputs[kInputSize];
4851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* csts[kInputSize];
4852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* accs[kInputSize];
4853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* acc = m.Int32Constant(0);
4854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i));
4856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    acc = m.Int32Add(acc, csts[i]);
4859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    accs[i] = acc;
4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kInputSize; i++) {
4862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.StoreToPointer(&outputs[i], MachineRepresentation::kWord32, accs[i]);
4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1))));
4865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
4866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected = *i + *j;
4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int k = 0; k < kInputSize; k++) {
4869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected += kBase + k;
4870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, m.Call(*i, *j));
4872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = 0;
4873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int k = 0; k < kInputSize; k++) {
4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected += kBase + k;
4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected, outputs[k]);
4876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunNewSpaceConstantsInPhi) {
4883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<Object*> m(MachineType::Int32());
4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2);
4887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3);
4888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* true_node = m.HeapConstant(true_val);
4889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* false_node = m.HeapConstant(false_val);
4890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb, end;
4892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Parameter(0), &blocka, &blockb);
4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Goto(&end);
4897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&end);
4899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = m.Phi(MachineRepresentation::kTagged, true_node, false_node);
4900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(phi);
4901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(*false_val, m.Call(0));
4903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(*true_val, m.Call(1));
4904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowP) {
4908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t actual_val = -1;
4909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
4911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1);
4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* val = m.Projection(0, add);
4913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ovf = m.Projection(1, add);
4914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
4915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(ovf);
4916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
4917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected_val;
4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val);
4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_ovf, bt.call(*i, *j));
4921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_val, actual_val);
4922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowImm) {
4928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t actual_val = -1, expected_val = 0;
4929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
4931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0));
4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
4935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
4937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
4938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val);
4939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
4940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_val, actual_val);
4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
4944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
4945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i));
4946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
4947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
4948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
4949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
4951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val);
4952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_val, actual_val);
4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m;
4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add =
4959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j));
4960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
4961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
4962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val);
4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_ovf, m.Call());
4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_val, actual_val);
4967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32AddWithOverflowInBranchP) {
4973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 911777;
4974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
4975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1);
4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ovf = m.Projection(1, add);
4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(ovf, &blocka, &blockb);
4980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
4981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(m.Int32Constant(constant));
4982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
4983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* val = m.Projection(0, add);
4984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(val);
4985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
4986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
4987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected;
4988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (bits::SignedAddOverflow32(*i, *j, &expected)) expected = constant;
4989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, bt.call(*i, *j));
4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowP) {
4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t actual_val = -1;
4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1);
5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* val = m.Projection(0, add);
5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ovf = m.Projection(1, add);
5002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(ovf);
5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected_val;
5007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val);
5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_ovf, bt.call(*i, *j));
5009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_val, actual_val);
5010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowImm) {
5016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t actual_val = -1, expected_val = 0;
5017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
5018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
5019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0));
5021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
5022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
5023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
5024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
5025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
5026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val);
5027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
5028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_val, actual_val);
5029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
5030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
5032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i));
5034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
5035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
5036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int expected_ovf = bits::SignedSubOverflow32(*j, *i, &expected_val);
5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_ovf, m.Call(*j));
5041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expected_val, actual_val);
5042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
5043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m;
5046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* add =
5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j));
5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* val = m.Projection(0, add);
5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* ovf = m.Projection(1, add);
5050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.StoreToPointer(&actual_val, MachineRepresentation::kWord32, val);
5051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(ovf);
5052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val);
5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_ovf, m.Call());
5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected_val, actual_val);
5055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunInt32SubWithOverflowInBranchP) {
5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int constant = 911999;
5062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Int32BinopTester bt(&m);
5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1);
5066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* ovf = m.Projection(1, sub);
5067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(ovf, &blocka, &blockb);
5068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
5069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(m.Int32Constant(constant));
5070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* val = m.Projection(0, sub);
5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bt.AddReturn(val);
5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expected;
5076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (bits::SignedSubOverflow32(*i, *j, &expected)) expected = constant;
5077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expected, bt.call(*i, *j));
5078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunWord64EqualInBranchP) {
5084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t input;
5085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel blocka, blockb;
5086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int64_t> m;
5087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Is64()) return;
5088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* value = m.LoadFromPointer(&input, MachineType::Int64());
5089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb);
5090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blocka);
5091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(1));
5092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Bind(&blockb);
5093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(2));
5094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  input = V8_INT64_C(0);
5095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(1, m.Call());
5096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  input = V8_INT64_C(1);
5097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call());
5098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  input = V8_INT64_C(0x100000000);
5099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(2, m.Call());
5100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunChangeInt32ToInt64P) {
5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize < 8) return;
5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int64_t actual = -1;
5106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual, MachineRepresentation::kWord64,
5108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   m.ChangeInt32ToInt64(m.Parameter(0)));
5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(0));
5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int64_t expected = *i;
5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, m.Call(*i));
5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expected, actual);
5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunChangeUint32ToUint64P) {
5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize < 8) return;
5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int64_t actual = -1;
5121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Uint32());
5122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&actual, MachineRepresentation::kWord64,
5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   m.ChangeUint32ToUint64(m.Parameter(0)));
5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(0));
5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_UINT32_INPUTS(i) {
5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int64_t expected = static_cast<uint64_t>(*i);
5127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, m.Call(*i));
5128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expected, actual);
5129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTruncateInt64ToInt32P) {
5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize < 8) return;
5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int64_t expected = -1;
5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
5137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TruncateInt64ToInt32(
5138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.LoadFromPointer(&expected, MachineType::Int64())));
5139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_UINT32_INPUTS(i) {
5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_UINT32_INPUTS(j) {
5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected = (static_cast<uint64_t>(*j) << 32) | *i;
5142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<int32_t>(expected), m.Call());
5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(RunTruncateFloat64ToInt32P) {
5149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  struct {
5150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    double from;
5151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    double raw;
5152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } kValues[] = {{0, 0},
5153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {0.5, 0},
5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-0.5, 0},
5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {1.5, 1},
5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-1.5, -1},
5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {5.5, 5},
5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-5.0, -5},
5159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 {std::numeric_limits<double>::quiet_NaN(), 0},
5160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {std::numeric_limits<double>::infinity(), 0},
5161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 {-std::numeric_limits<double>::quiet_NaN(), 0},
5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-std::numeric_limits<double>::infinity(), 0},
5163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4.94065645841e-324, 0},
5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4.94065645841e-324, 0},
5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {0.9999999999999999, 0},
5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-0.9999999999999999, 0},
5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4294967296.0, 0},
5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4294967296.0, 0},
5169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {9223372036854775000.0, 4294966272.0},
5170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-9223372036854775000.0, -4294966272.0},
5171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4.5036e+15, 372629504},
5172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4.5036e+15, -372629504},
5173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {287524199.5377777, 0x11234567},
5174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-287524199.5377777, -0x11234567},
5175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {2300193596.302222, 2300193596.0},
5176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-2300193596.302222, -2300193596.0},
5177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4600387192.604444, 305419896},
5178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4600387192.604444, -305419896},
5179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4823855600872397.0, 1737075661},
5180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4823855600872397.0, -1737075661},
5181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4503603922337791.0, -1},
5182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4503603922337791.0, 1},
5183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4503601774854143.0, 2147483647},
5184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4503601774854143.0, -2147483647},
5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {9007207844675582.0, -2},
5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-9007207844675582.0, 2},
5187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {2.4178527921507624e+24, -536870912},
5188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-2.4178527921507624e+24, 536870912},
5189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {2.417853945072267e+24, -536870912},
5190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-2.417853945072267e+24, 536870912},
5191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4.8357055843015248e+24, -1073741824},
5192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4.8357055843015248e+24, 1073741824},
5193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {4.8357078901445341e+24, -1073741824},
5194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-4.8357078901445341e+24, 1073741824},
5195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {2147483647.0, 2147483647.0},
5196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-2147483648.0, -2147483648.0},
5197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {9.6714111686030497e+24, -2147483648.0},
5198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-9.6714111686030497e+24, -2147483648.0},
5199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {9.6714157802890681e+24, -2147483648.0},
5200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-9.6714157802890681e+24, -2147483648.0},
5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {1.9342813113834065e+25, 2147483648.0},
5202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-1.9342813113834065e+25, 2147483648.0},
5203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {3.868562622766813e+25, 0},
5204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-3.868562622766813e+25, 0},
5205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {1.7976931348623157e+308, 0},
5206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 {-1.7976931348623157e+308, 0}};
5207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input = -1.0;
5208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m;
5209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TruncateFloat64ToInt32(
5210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TruncationMode::kJavaScript,
5211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.LoadFromPointer(&input, MachineType::Float64())));
5212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(kValues); ++i) {
5213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    input = kValues[i].from;
5214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint64_t expected = static_cast<int64_t>(kValues[i].raw);
5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(static_cast<int>(expected), m.Call());
5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunChangeFloat32ToFloat64) {
5221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float32());
5222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0)));
5224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); }
5226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Constant) {
5230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
5231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BufferedRawMachineAssemblerTester<float> m;
5232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    m.Return(m.Float32Constant(*i));
5233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CheckFloatEq(*i, m.Call());
5234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ExtractLowWord32) {
5239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64());
5240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64ExtractLowWord32(m.Parameter(0)));
5241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
5242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i));
5243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(expected, m.Call(*i));
5244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64ExtractHighWord32) {
5249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64());
5250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64ExtractHighWord32(m.Parameter(0)));
5251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
5252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i) >> 32);
5253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(expected, m.Call(*i));
5254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64InsertLowWord32) {
5259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
5260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Int32());
5261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1)));
5262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  FOR_FLOAT64_INPUTS(i) {
5263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT32_INPUTS(j) {
5264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double expected = bit_cast<double>(
5265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) |
5266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          (static_cast<uint64_t>(bit_cast<uint32_t>(*j))));
5267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(expected, m.Call(*i, *j));
5268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64InsertHighWord32) {
5274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(),
5275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              MachineType::Uint32());
5276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1)));
5277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
5278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_UINT32_INPUTS(j) {
5279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) |
5280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          (static_cast<uint64_t>(*j) << 32);
5281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j));
5283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32Abs) {
5289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
5290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32Abs(m.Parameter(0)));
5291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); }
5292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64Abs) {
5296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Abs(m.Parameter(0)));
5298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); }
5299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double two_30 = 1 << 30;             // 2^30 is a smi boundary.
5303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double two_52 = two_30 * (1 << 22);  // 2^52 is a precision boundary.
5304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic double kValues[] = {0.1,
5305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           0.2,
5306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           0.49999999999999994,
5307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           0.5,
5308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           0.7,
5309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           1.0 - std::numeric_limits<double>::epsilon(),
5310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -0.1,
5311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -0.49999999999999994,
5312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -0.5,
5313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -0.7,
5314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           1.1,
5315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           1.0 + std::numeric_limits<double>::epsilon(),
5316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           1.5,
5317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           1.7,
5318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1,
5319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1 + std::numeric_limits<double>::epsilon(),
5320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1 - std::numeric_limits<double>::epsilon(),
5321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1.1,
5322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1.5,
5323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -1.7,
5324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           std::numeric_limits<double>::min(),
5325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -std::numeric_limits<double>::min(),
5326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           std::numeric_limits<double>::max(),
5327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -std::numeric_limits<double>::max(),
5328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           std::numeric_limits<double>::infinity(),
5329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -std::numeric_limits<double>::infinity(),
5330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30,
5331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 + 0.1,
5332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 + 0.5,
5333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 + 0.7,
5334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1,
5335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 + 0.1,
5336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 + 0.5,
5337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 + 0.7,
5338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30,
5339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 0.1,
5340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 0.5,
5341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 0.7,
5342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1,
5343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 + 0.1,
5344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 + 0.5,
5345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 + 0.7,
5346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52,
5347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 + 0.1,
5348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 + 0.5,
5349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 + 0.5,
5350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 + 0.7,
5351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 + 0.7,
5352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1,
5353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 + 0.1,
5354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 + 0.5,
5355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 + 0.7,
5356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52,
5357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 0.1,
5358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 0.5,
5359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 0.7,
5360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1,
5361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 + 0.1,
5362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 + 0.5,
5363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 + 0.7,
5364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30,
5365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 0.1,
5366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 0.5,
5367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 0.7,
5368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1,
5369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 - 0.1,
5370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 - 0.5,
5371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_30 - 1 - 0.7,
5372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30,
5373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 - 0.1,
5374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 - 0.5,
5375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 - 0.7,
5376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1,
5377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 - 0.1,
5378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 - 0.5,
5379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_30 + 1 - 0.7,
5380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52,
5381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 0.1,
5382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 0.5,
5383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 0.5,
5384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 0.7,
5385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 0.7,
5386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1,
5387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 - 0.1,
5388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 - 0.5,
5389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           two_52 - 1 - 0.7,
5390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52,
5391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 - 0.1,
5392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 - 0.5,
5393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 - 0.7,
5394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1,
5395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 - 0.1,
5396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 - 0.5,
5397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           -two_52 + 1 - 0.7};
5398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundDown) {
5401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
5402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32RoundDown().IsSupported()) return;
5403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32RoundDown(m.Parameter(0)));
5405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckFloatEq(floorf(*i), m.Call(*i)); }
5407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundDown1) {
5411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundDown().IsSupported()) return;
5413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64RoundDown(m.Parameter(0)));
5415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(floor(*i), m.Call(*i)); }
5417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundDown2) {
5421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundDown().IsSupported()) return;
5423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64Sub(m.Float64Constant(-0.0),
5424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0),
5425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                        m.Parameter(0)))));
5426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = 0; i < arraysize(kValues); ++i) {
5428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i]));
5429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundUp) {
5434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
5435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32RoundUp().IsSupported()) return;
5436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32RoundUp(m.Parameter(0)));
5437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckFloatEq(ceilf(*i), m.Call(*i)); }
5439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundUp) {
5443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundUp().IsSupported()) return;
5445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64RoundUp(m.Parameter(0)));
5446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(ceil(*i), m.Call(*i)); }
5448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundTiesEven) {
5452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
5453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32RoundTiesEven().IsSupported()) return;
5454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32RoundTiesEven(m.Parameter(0)));
5455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckFloatEq(nearbyint(*i), m.Call(*i)); }
5457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat64RoundTiesEven) {
5461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundTiesEven().IsSupported()) return;
5463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64RoundTiesEven(m.Parameter(0)));
5464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(nearbyint(*i), m.Call(*i)); }
5466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunFloat32RoundTruncate) {
5470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Float32());
5471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float32RoundTruncate().IsSupported()) return;
5472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float32RoundTruncate(m.Parameter(0)));
5474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) { CheckFloatEq(truncf(*i), m.Call(*i)); }
5476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunFloat64RoundTruncate) {
5480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundTruncate().IsSupported()) return;
5482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64RoundTruncate(m.Parameter(0)));
5483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (size_t i = 0; i < arraysize(kValues); ++i) {
5484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i]));
5485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierTEST(RunFloat64RoundTiesAway) {
5490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Float64());
5491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!m.machine()->Float64RoundTiesAway().IsSupported()) return;
5492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Float64RoundTiesAway(m.Parameter(0)));
5493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kValues); ++i) {
5494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(round(kValues[i]), m.Call(kValues[i]));
5495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !USE_SIMULATOR
5500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
5502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t const kMagicFoo0 = 0xdeadbeef;
5504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo0() { return kMagicFoo0; }
5507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo1(int32_t x) { return x; }
5510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo2(int32_t x, int32_t y) { return x - y; }
5513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint32_t foo8(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f,
5516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             int32_t g, int32_t h) {
5517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return a + b + c + d + e + f + g + h;
5518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
5521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction0) {
5524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* foo0_ptr = &foo0;
5525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
5526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* function = m.LoadFromPointer(&foo0_ptr, MachineType::Pointer());
5527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.CallCFunction0(MachineType::Int32(), function));
5528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(kMagicFoo0, m.Call());
5529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction1) {
5533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* foo1_ptr = &foo1;
5534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* function = m.LoadFromPointer(&foo1_ptr, MachineType::Pointer());
5536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.CallCFunction1(MachineType::Int32(), MachineType::Int32(),
5537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            function, m.Parameter(0)));
5538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) {
5539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t const expected = *i;
5540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(expected, m.Call(expected));
5541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction2) {
5546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* foo2_ptr = &foo2;
5547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32(),
5548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       MachineType::Int32());
5549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* function = m.LoadFromPointer(&foo2_ptr, MachineType::Pointer());
5550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.CallCFunction2(MachineType::Int32(), MachineType::Int32(),
5551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            MachineType::Int32(), function, m.Parameter(0),
5552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            m.Parameter(1)));
5553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) {
5554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t const x = *i;
5555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FOR_INT32_INPUTS(j) {
5556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int32_t const y = *j;
5557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(x - y, m.Call(x, y));
5558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCallCFunction8) {
5564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* foo8_ptr = &foo8;
5565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* function = m.LoadFromPointer(&foo8_ptr, MachineType::Pointer());
5567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* param = m.Parameter(0);
5568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.CallCFunction8(
5569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Int32(), MachineType::Int32(), MachineType::Int32(),
5570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Int32(), MachineType::Int32(), MachineType::Int32(),
5571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::Int32(), MachineType::Int32(), MachineType::Int32(),
5572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      function, param, param, param, param, param, param, param, param));
5573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) {
5574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t const x = *i;
5575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(x * 8, m.Call(x));
5576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // USE_SIMULATOR
5579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_64_BIT
5581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(titzer): run int64 tests on all platforms when supported.
5582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCheckedLoadInt64) {
5583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL};
5584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int64_t> m(MachineType::Int32());
5585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* base = m.PointerConstant(buffer);
5586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* index = m.Parameter(0);
5587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* length = m.Int32Constant(16);
5588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* load = m.AddNode(m.machine()->CheckedLoad(MachineType::Int64()), base,
5589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         index, length);
5590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(load);
5591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(buffer[0], m.Call(0));
5593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(buffer[1], m.Call(8));
5594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, m.Call(16));
5595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunCheckedStoreInt64) {
5599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int64_t write = 0x5566778899aabbLL;
5600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int64_t before = 0x33bbccddeeff0011LL;
5601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t buffer[] = {before, before};
5602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m(MachineType::Int32());
5603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* base = m.PointerConstant(buffer);
5604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* index = m.Parameter(0);
5605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* length = m.Int32Constant(16);
5606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* value = m.Int64Constant(write);
5607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* store =
5608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.AddNode(m.machine()->CheckedStore(MachineRepresentation::kWord64), base,
5609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                index, length, value);
5610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  USE(store);
5611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(11));
5612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(16));
5614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(before, buffer[0]);
5615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(before, buffer[1]);
5616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(0));
5618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(write, buffer[0]);
5619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(before, buffer[1]);
5620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(11, m.Call(8));
5622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(write, buffer[0]);
5623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(write, buffer[1]);
5624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastInt64ToFloat64) {
5628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t input = 1;
5629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  double output = 0.0;
5630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RawMachineAssemblerTester<int32_t> m;
5631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  m.StoreToPointer(
5632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &output, MachineRepresentation::kFloat64,
5633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.BitcastInt64ToFloat64(m.LoadFromPointer(&input, MachineType::Int64())));
5634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(11));
5635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
5636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    input = *i;
5637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(11, m.Call());
5638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    double expected = bit_cast<double>(input);
5639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(bit_cast<int64_t>(expected), bit_cast<int64_t>(output));
5640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastFloat64ToInt64) {
5645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64());
5646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.BitcastFloat64ToInt64(m.Parameter(0)));
5648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) { CHECK_EQ(bit_cast<int64_t>(*i), m.Call(*i)); }
5649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToInt64WithoutCheck) {
5653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32());
5654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TryTruncateFloat32ToInt64(m.Parameter(0)));
5655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
5657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    float input = static_cast<float>(*i);
5658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (input < static_cast<float>(INT64_MAX) &&
5659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        input >= static_cast<float>(INT64_MIN)) {
5660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<int64_t>(input), m.Call(input));
5661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToInt64WithCheck) {
5667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t success = 0;
5668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float32());
5669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* trunc = m.TryTruncateFloat32ToInt64(m.Parameter(0));
5670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, trunc);
5671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* check = m.Projection(1, trunc);
5672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&success, MachineRepresentation::kWord64, check);
5673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(val);
5674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
5676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (*i < static_cast<float>(INT64_MAX) &&
5677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *i >= static_cast<float>(INT64_MIN)) {
5678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i));
5679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_NE(0, success);
5680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
5681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Call(*i);
5682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(0, success);
5683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToInt64WithoutCheck) {
5689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64());
5690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TryTruncateFloat64ToInt64(m.Parameter(0)));
5691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) {
5693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    double input = static_cast<double>(*i);
5694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(static_cast<int64_t>(input), m.Call(input));
5695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToInt64WithCheck) {
5700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t success = 0;
5701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64());
5702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* trunc = m.TryTruncateFloat64ToInt64(m.Parameter(0));
5703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, trunc);
5704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* check = m.Projection(1, trunc);
5705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&success, MachineRepresentation::kWord64, check);
5706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(val);
5707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
5709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (*i < static_cast<double>(INT64_MAX) &&
5710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        *i >= static_cast<double>(INT64_MIN)) {
5711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Conversions within this range should succeed.
5712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i));
5713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_NE(0, success);
5714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
5715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Call(*i);
5716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(0, success);
5717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToUint64WithoutCheck) {
5723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32());
5724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TryTruncateFloat32ToUint64(m.Parameter(0)));
5725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_UINT64_INPUTS(i) {
5727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    float input = static_cast<float>(*i);
5728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // This condition on 'input' is required because
5729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // static_cast<float>(UINT64_MAX) results in a value outside uint64 range.
5730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (input < static_cast<float>(UINT64_MAX)) {
5731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<uint64_t>(input), m.Call(input));
5732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat32ToUint64WithCheck) {
5738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t success = 0;
5739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32());
5740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* trunc = m.TryTruncateFloat32ToUint64(m.Parameter(0));
5741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, trunc);
5742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* check = m.Projection(1, trunc);
5743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&success, MachineRepresentation::kWord64, check);
5744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(val);
5745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
5747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (*i < static_cast<float>(UINT64_MAX) && *i > -1.0) {
5748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Conversions within this range should succeed.
5749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i));
5750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_NE(0, success);
5751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
5752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Call(*i);
5753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(0, success);
5754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToUint64WithoutCheck) {
5760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64());
5761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.TruncateFloat64ToUint64(m.Parameter(0)));
5762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_UINT64_INPUTS(j) {
5764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    double input = static_cast<double>(*j);
5765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (input < static_cast<float>(UINT64_MAX)) {
5767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<uint64_t>(input), m.Call(input));
5768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunTryTruncateFloat64ToUint64WithCheck) {
5774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t success = 0;
5775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64());
5776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0));
5777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* val = m.Projection(0, trunc);
5778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* check = m.Projection(1, trunc);
5779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(&success, MachineRepresentation::kWord64, check);
5780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(val);
5781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT64_INPUTS(i) {
5783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (*i < 18446744073709551616.0 && *i > -1) {
5784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Conversions within this range should succeed.
5785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i));
5786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_NE(0, success);
5787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
5788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.Call(*i);
5789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(0, success);
5790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundInt64ToFloat32) {
5796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Int64());
5797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.RoundInt64ToFloat32(m.Parameter(0)));
5798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<float>(*i), m.Call(*i)); }
5799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundInt64ToFloat64) {
5803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Int64());
5804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.RoundInt64ToFloat64(m.Parameter(0)));
5805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT64_INPUTS(i) { CHECK_EQ(static_cast<double>(*i), m.Call(*i)); }
5806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundUint64ToFloat64) {
5810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct {
5811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint64_t input;
5812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint64_t expected;
5813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } values[] = {{0x0, 0x0},
5814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1, 0x3ff0000000000000},
5815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffff, 0x41efffffffe00000},
5816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1b09788b, 0x41bb09788b000000},
5817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4c5fce8, 0x419317f3a0000000},
5818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xcc0de5bf, 0x41e981bcb7e00000},
5819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x2, 0x4000000000000000},
5820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3, 0x4008000000000000},
5821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4, 0x4010000000000000},
5822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x5, 0x4014000000000000},
5823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8, 0x4020000000000000},
5824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x9, 0x4022000000000000},
5825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffffffffffff, 0x43f0000000000000},
5826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffffffffe, 0x43f0000000000000},
5827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffffffffd, 0x43f0000000000000},
5828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x100000000, 0x41f0000000000000},
5829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffff00000000, 0x43efffffffe00000},
5830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1b09788b00000000, 0x43bb09788b000000},
5831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4c5fce800000000, 0x439317f3a0000000},
5832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xcc0de5bf00000000, 0x43e981bcb7e00000},
5833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x200000000, 0x4200000000000000},
5834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x300000000, 0x4208000000000000},
5835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x400000000, 0x4210000000000000},
5836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x500000000, 0x4214000000000000},
5837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x800000000, 0x4220000000000000},
5838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x900000000, 0x4222000000000000},
5839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x273a798e187937a3, 0x43c39d3cc70c3c9c},
5840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xece3af835495a16b, 0x43ed9c75f06a92b4},
5841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xb668ecc11223344, 0x43a6cd1d98224467},
5842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x9e, 0x4063c00000000000},
5843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x43, 0x4050c00000000000},
5844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xaf73, 0x40e5ee6000000000},
5845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x116b, 0x40b16b0000000000},
5846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x658ecc, 0x415963b300000000},
5847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x2b3b4c, 0x41459da600000000},
5848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x88776655, 0x41e10eeccaa00000},
5849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x70000000, 0x41dc000000000000},
5850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7200000, 0x419c800000000000},
5851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffffff, 0x41dfffffffc00000},
5852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x56123761, 0x41d5848dd8400000},
5853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffff00, 0x41dfffffc0000000},
5854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x761c4761eeeeeeee, 0x43dd8711d87bbbbc},
5855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x80000000eeeeeeee, 0x43e00000001dddde},
5856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x88888888dddddddd, 0x43e11111111bbbbc},
5857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xa0000000dddddddd, 0x43e40000001bbbbc},
5858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xddddddddaaaaaaaa, 0x43ebbbbbbbb55555},
5859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xe0000000aaaaaaaa, 0x43ec000000155555},
5860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xeeeeeeeeeeeeeeee, 0x43edddddddddddde},
5861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffdeeeeeeee, 0x43efffffffbdddde},
5862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xf0000000dddddddd, 0x43ee0000001bbbbc},
5863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffffdddddddd, 0x435ffffff7777777},
5864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fffffaaaaaaaa, 0x434fffffd5555555},
5865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fffffaaaaaaaa, 0x433fffffaaaaaaaa},
5866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffff, 0x412ffffe00000000},
5867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ffff, 0x411ffffc00000000},
5868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ffff, 0x410ffff800000000},
5869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ffff, 0x40fffff000000000},
5870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffff, 0x40efffe000000000},
5871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fff, 0x40dfffc000000000},
5872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fff, 0x40cfff8000000000},
5873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fff, 0x40bfff0000000000},
5874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfff, 0x40affe0000000000},
5875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ff, 0x409ffc0000000000},
5876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ff, 0x408ff80000000000},
5877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ff, 0x407ff00000000000},
5878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fffffffffff, 0x42cfffffffffff80},
5879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fffffffffff, 0x42bfffffffffff00},
5880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffff, 0x42affffffffffe00},
5881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ffffffffff, 0x429ffffffffffc00},
5882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ffffffffff, 0x428ffffffffff800},
5883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ffffffffff, 0x427ffffffffff000},
5884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000008000000000, 0x43e0000010000000},
5885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000008000000001, 0x43e0000010000000},
5886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000000000000400, 0x43e0000000000000},
5887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000000000000401, 0x43e0000000000001}};
5888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<double> m(MachineType::Uint64());
5890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.RoundUint64ToFloat64(m.Parameter(0)));
5891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(values); i++) {
5893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(bit_cast<double>(values[i].expected), m.Call(values[i].input));
5894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunRoundUint64ToFloat32) {
5899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct {
5900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint64_t input;
5901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    uint32_t expected;
5902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } values[] = {{0x0, 0x0},
5903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1, 0x3f800000},
5904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffff, 0x4f800000},
5905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1b09788b, 0x4dd84bc4},
5906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4c5fce8, 0x4c98bf9d},
5907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xcc0de5bf, 0x4f4c0de6},
5908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x2, 0x40000000},
5909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3, 0x40400000},
5910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4, 0x40800000},
5911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x5, 0x40a00000},
5912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8, 0x41000000},
5913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x9, 0x41100000},
5914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffffffffffff, 0x5f800000},
5915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffffffffe, 0x5f800000},
5916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffffffffd, 0x5f800000},
5917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x0, 0x0},
5918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x100000000, 0x4f800000},
5919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffffffff00000000, 0x5f800000},
5920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1b09788b00000000, 0x5dd84bc4},
5921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x4c5fce800000000, 0x5c98bf9d},
5922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xcc0de5bf00000000, 0x5f4c0de6},
5923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x200000000, 0x50000000},
5924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x300000000, 0x50400000},
5925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x400000000, 0x50800000},
5926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x500000000, 0x50a00000},
5927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x800000000, 0x51000000},
5928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x900000000, 0x51100000},
5929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x273a798e187937a3, 0x5e1ce9e6},
5930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xece3af835495a16b, 0x5f6ce3b0},
5931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xb668ecc11223344, 0x5d3668ed},
5932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x9e, 0x431e0000},
5933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x43, 0x42860000},
5934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xaf73, 0x472f7300},
5935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x116b, 0x458b5800},
5936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x658ecc, 0x4acb1d98},
5937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x2b3b4c, 0x4a2ced30},
5938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x88776655, 0x4f087766},
5939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x70000000, 0x4ee00000},
5940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7200000, 0x4ce40000},
5941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffffff, 0x4f000000},
5942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x56123761, 0x4eac246f},
5943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffff00, 0x4efffffe},
5944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x761c4761eeeeeeee, 0x5eec388f},
5945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x80000000eeeeeeee, 0x5f000000},
5946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x88888888dddddddd, 0x5f088889},
5947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xa0000000dddddddd, 0x5f200000},
5948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xddddddddaaaaaaaa, 0x5f5dddde},
5949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xe0000000aaaaaaaa, 0x5f600000},
5950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xeeeeeeeeeeeeeeee, 0x5f6eeeef},
5951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffdeeeeeeee, 0x5f800000},
5952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xf0000000dddddddd, 0x5f700000},
5953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fffffdddddddd, 0x5b000000},
5954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fffffaaaaaaaa, 0x5a7fffff},
5955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fffffaaaaaaaa, 0x59fffffd},
5956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffff, 0x497ffff0},
5957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ffff, 0x48ffffe0},
5958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ffff, 0x487fffc0},
5959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ffff, 0x47ffff80},
5960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xffff, 0x477fff00},
5961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7fff, 0x46fffe00},
5962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fff, 0x467ffc00},
5963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fff, 0x45fff800},
5964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfff, 0x457ff000},
5965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ff, 0x44ffe000},
5966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ff, 0x447fc000},
5967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ff, 0x43ff8000},
5968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3fffffffffff, 0x56800000},
5969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1fffffffffff, 0x56000000},
5970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0xfffffffffff, 0x55800000},
5971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x7ffffffffff, 0x55000000},
5972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x3ffffffffff, 0x54800000},
5973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x1ffffffffff, 0x54000000},
5974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000008000000000, 0x5f000000},
5975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000008000000001, 0x5f000001},
5976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000000000000400, 0x5f000000},
5977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                {0x8000000000000401, 0x5f000000}};
5978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  BufferedRawMachineAssemblerTester<float> m(MachineType::Uint64());
5980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.RoundUint64ToFloat32(m.Parameter(0)));
5981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(values); i++) {
5983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input));
5984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
5989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastFloat32ToInt32) {
5992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float input = 32.25;
5993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
5994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.BitcastFloat32ToInt32(
5995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.LoadFromPointer(&input, MachineType::Float32())));
5996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_FLOAT32_INPUTS(i) {
5997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    input = *i;
5998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t expected = bit_cast<int32_t>(input);
5999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(expected, m.Call());
6000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunBitcastInt32ToFloat32) {
6005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t input = 1;
6006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float output = 0.0;
6007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> m;
6008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.StoreToPointer(
6009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &output, MachineRepresentation::kFloat32,
6010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      m.BitcastInt32ToFloat32(m.LoadFromPointer(&input, MachineType::Int32())));
6011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  m.Return(m.Int32Constant(11));
6012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOR_INT32_INPUTS(i) {
6013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    input = *i;
6014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(11, m.Call());
6015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    float expected = bit_cast<float>(input);
6016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(bit_cast<int32_t>(expected), bit_cast<int32_t>(output));
6017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(RunComputedCodeObject) {
6022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  GraphBuilderTester<int32_t> a;
6023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  a.Return(a.Int32Constant(33));
6024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  a.End();
6025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code_a = a.GetCode();
6026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  GraphBuilderTester<int32_t> b;
6028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  b.Return(b.Int32Constant(44));
6029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  b.End();
6030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> code_b = b.GetCode();
6031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineAssemblerTester<int32_t> r(MachineType::Int32());
6033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel tlabel;
6034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel flabel;
6035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RawMachineLabel merge;
6036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Branch(r.Parameter(0), &tlabel, &flabel);
6037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Bind(&tlabel);
6038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* fa = r.HeapConstant(code_a);
6039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Goto(&merge);
6040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Bind(&flabel);
6041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* fb = r.HeapConstant(code_b);
6042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Goto(&merge);
6043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Bind(&merge);
6044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb);
6045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(titzer): all this descriptor hackery is just to call the above
6047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // functions as code objects instead of direct addresses.
6048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CSignature0<int32_t> sig;
6049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallDescriptor* c = Linkage::GetSimplifiedCDescriptor(r.zone(), &sig);
6050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LinkageLocation ret[] = {c->GetReturnLocation(0)};
6051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Signature<LinkageLocation> loc(1, 0, ret);
6052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallDescriptor* desc = new (r.zone()) CallDescriptor(  // --
6053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CallDescriptor::kCallCodeObject,                   // kind
6054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::AnyTagged(),                          // target_type
6055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      c->GetInputLocation(0),                            // target_loc
6056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &sig,                                              // machine_sig
6057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &loc,                                              // location_sig
6058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0,                                                 // stack count
6059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Operator::kNoProperties,                           // properties
6060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      c->CalleeSavedRegisters(),                         // callee saved
6061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      c->CalleeSavedFPRegisters(),                       // callee saved FP
6062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CallDescriptor::kNoFlags,                          // flags
6063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "c-call-as-code");
6064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* call = r.AddNode(r.common()->Call(desc), phi);
6065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  r.Return(call);
6066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(33, r.Call(1));
6068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(44, r.Call(0));
6069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
6072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
6073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
6074