1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/codegen-tester.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/value-helper.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TURBOFAN_TARGET
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal::compiler;
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef RawMachineAssembler::Label MLabel;
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic IrOpcode::Value int32cmp_opcodes[] = {
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IrOpcode::kWord32Equal, IrOpcode::kInt32LessThan,
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IrOpcode::kInt32LessThanOrEqual, IrOpcode::kUint32LessThan,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IrOpcode::kUint32LessThanOrEqual};
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineWord32EqualZero_1) {
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with x == 0
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachInt32);
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1033;
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 825118;
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Word32Equal(p0, m.Int32Constant(0)), &blocka, &blockb);
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t a = *i;
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = a == 0 ? eq_constant : ne_constant;
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineWord32EqualZero_chain) {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with a chain of x == 0 == 0 == 0 ...
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1133;
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 815118;
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int k = 0; k < 6; k++) {
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m(kMachInt32);
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* p0 = m.Parameter(0);
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MLabel blocka, blockb;
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* cond = p0;
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < k; j++) {
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      cond = m.Word32Equal(cond, m.Int32Constant(0));
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Branch(cond, &blocka, &blockb);
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(eq_constant));
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(ne_constant));
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t a = *i;
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expect = (k & 1) == 1 ? (a == 0 ? eq_constant : ne_constant)
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    : (a == 0 ? ne_constant : eq_constant);
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expect, m.Call(a));
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32LessThanZero_1) {
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with x < 0
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachInt32);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1433;
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 845118;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32LessThan(p0, m.Int32Constant(0)), &blocka, &blockb);
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t a = *i;
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = a < 0 ? eq_constant : ne_constant;
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineUint32LessThan100_1) {
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with x < 100
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachUint32);
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = 1471;
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 88845718;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Uint32LessThan(p0, m.Int32Constant(100)), &blocka, &blockb);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_UINT32_INPUTS(i) {
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t a = *i;
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = a < 100 ? eq_constant : ne_constant;
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineUint32LessThanOrEqual100_1) {
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with x <= 100
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachUint32);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = 1479;
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 77845719;
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Uint32LessThanOrEqual(p0, m.Int32Constant(100)), &blocka, &blockb);
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_UINT32_INPUTS(i) {
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t a = *i;
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = a <= 100 ? eq_constant : ne_constant;
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineZeroLessThanInt32_1) {
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with 0 < x
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachInt32);
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -2033;
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 225118;
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32LessThan(m.Int32Constant(0), p0), &blocka, &blockb);
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t a = *i;
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = 0 < a ? eq_constant : ne_constant;
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32GreaterThanZero_1) {
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with x > 0
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachInt32);
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1073;
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 825178;
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Int32GreaterThan(p0, m.Int32Constant(0)), &blocka, &blockb);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t a = *i;
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t expect = a > 0 ? eq_constant : ne_constant;
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(expect, m.Call(a));
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineWord32EqualP) {
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Test combining a branch with an Word32Equal.
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32);
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1035;
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 825018;
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p0 = m.Parameter(0);
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* p1 = m.Parameter(1);
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MLabel blocka, blockb;
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Branch(m.Word32Equal(p0, p1), &blocka, &blockb);
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blocka);
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(eq_constant));
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Bind(&blockb);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.Return(m.Int32Constant(ne_constant));
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FOR_INT32_INPUTS(i) {
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(j) {
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t a = *i;
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t b = *j;
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t expect = a == b ? eq_constant : ne_constant;
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(expect, m.Call(a, b));
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineWord32EqualI) {
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1135;
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 925718;
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int left = 0; left < 2; left++) {
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m(kMachInt32);
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t a = *i;
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* p0 = m.Int32Constant(a);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* p1 = m.Parameter(0);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      MLabel blocka, blockb;
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (left == 1) m.Branch(m.Word32Equal(p0, p1), &blocka, &blockb);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (left == 0) m.Branch(m.Word32Equal(p1, p0), &blocka, &blockb);
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(eq_constant));
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(ne_constant));
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t b = *j;
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expect = a == b ? eq_constant : ne_constant;
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expect, m.Call(b));
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpP) {
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1235;
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 725018;
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int op = 0; op < 2; op++) {
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* p0 = m.Parameter(0);
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* p1 = m.Parameter(1);
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MLabel blocka, blockb;
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == 0) m.Branch(m.Int32LessThan(p0, p1), &blocka, &blockb);
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == 1) m.Branch(m.Int32LessThanOrEqual(p0, p1), &blocka, &blockb);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blocka);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(eq_constant));
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Bind(&blockb);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.Return(m.Int32Constant(ne_constant));
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t a = *i;
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t b = *j;
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expect = 0;
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (op == 0) expect = a < b ? eq_constant : ne_constant;
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (op == 1) expect = a <= b ? eq_constant : ne_constant;
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expect, m.Call(a, b));
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpI) {
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1175;
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 927711;
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int op = 0; op < 2; op++) {
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FOR_INT32_INPUTS(i) {
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m(kMachInt32);
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int32_t a = *i;
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* p0 = m.Int32Constant(a);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* p1 = m.Parameter(0);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      MLabel blocka, blockb;
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (op == 0) m.Branch(m.Int32LessThan(p0, p1), &blocka, &blockb);
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (op == 1) m.Branch(m.Int32LessThanOrEqual(p0, p1), &blocka, &blockb);
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(eq_constant));
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(ne_constant));
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FOR_INT32_INPUTS(j) {
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t b = *j;
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        int32_t expect = 0;
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (op == 0) expect = a < b ? eq_constant : ne_constant;
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (op == 1) expect = a <= b ? eq_constant : ne_constant;
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK_EQ(expect, m.Call(b));
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Now come the sophisticated tests for many input shape combinations.
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Materializes a boolean (1 or 0) from a comparison.
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CmpMaterializeBoolGen : public BinopGen<int32_t> {
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareWrapper w;
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool invert;
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CmpMaterializeBoolGen(IrOpcode::Value opcode, bool i)
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : w(opcode), invert(i) {}
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void gen(RawMachineAssemblerTester<int32_t>* m, Node* a, Node* b) {
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* cond = w.MakeNode(m, a, b);
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (invert) cond = m->Word32Equal(cond, m->Int32Constant(0));
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m->Return(cond);
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int32_t expected(int32_t a, int32_t b) {
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (invert) return !w.Int32Compare(a, b) ? 1 : 0;
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return w.Int32Compare(a, b) ? 1 : 0;
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Generates a branch and return one of two values from a comparison.
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CmpBranchGen : public BinopGen<int32_t> {
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareWrapper w;
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool invert;
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool true_first;
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant;
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant;
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CmpBranchGen(IrOpcode::Value opcode, bool i, bool t, int32_t eq, int32_t ne)
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : w(opcode), invert(i), true_first(t), eq_constant(eq), ne_constant(ne) {}
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void gen(RawMachineAssemblerTester<int32_t>* m, Node* a, Node* b) {
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MLabel blocka, blockb;
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Node* cond = w.MakeNode(m, a, b);
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (invert) cond = m->Word32Equal(cond, m->Int32Constant(0));
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m->Branch(cond, &blocka, &blockb);
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (true_first) {
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Bind(&blocka);
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Return(m->Int32Constant(eq_constant));
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Bind(&blockb);
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Return(m->Int32Constant(ne_constant));
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Bind(&blockb);
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Return(m->Int32Constant(ne_constant));
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Bind(&blocka);
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m->Return(m->Int32Constant(eq_constant));
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int32_t expected(int32_t a, int32_t b) {
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (invert) return !w.Int32Compare(a, b) ? eq_constant : ne_constant;
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return w.Int32Compare(a, b) ? eq_constant : ne_constant;
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_materialized) {
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(int32cmp_opcodes); i++) {
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpMaterializeBoolGen gen(int32cmp_opcodes[i], false);
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_inverted_materialized) {
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t i = 0; i < arraysize(int32cmp_opcodes); i++) {
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpMaterializeBoolGen gen(int32cmp_opcodes[i], true);
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_branch_true) {
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < static_cast<int>(arraysize(int32cmp_opcodes)); i++) {
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpBranchGen gen(int32cmp_opcodes[i], false, false, 995 + i, -1011 - i);
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_branch_false) {
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < static_cast<int>(arraysize(int32cmp_opcodes)); i++) {
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpBranchGen gen(int32cmp_opcodes[i], false, true, 795 + i, -2011 - i);
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_inverse_branch_true) {
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < static_cast<int>(arraysize(int32cmp_opcodes)); i++) {
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpBranchGen gen(int32cmp_opcodes[i], true, false, 695 + i, -3011 - i);
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineInt32CmpAllInputShapes_inverse_branch_false) {
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < static_cast<int>(arraysize(int32cmp_opcodes)); i++) {
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CmpBranchGen gen(int32cmp_opcodes[i], true, true, 595 + i, -4011 - i);
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Int32BinopInputShapeTester tester(&gen);
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    tester.TestAllInputShapes();
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(BranchCombineFloat64Compares) {
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double inf = V8_INFINITY;
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double nan = v8::base::OS::nan_value();
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double inputs[] = {0.0, 1.0, -1.0, -inf, inf, nan};
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t eq_constant = -1733;
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ne_constant = 915118;
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_a = 0.0;
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double input_b = 0.0;
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CompareWrapper cmps[] = {CompareWrapper(IrOpcode::kFloat64Equal),
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           CompareWrapper(IrOpcode::kFloat64LessThan),
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           CompareWrapper(IrOpcode::kFloat64LessThanOrEqual)};
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t c = 0; c < arraysize(cmps); c++) {
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CompareWrapper cmp = cmps[c];
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int invert = 0; invert < 2; invert++) {
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RawMachineAssemblerTester<int32_t> m;
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      MLabel blocka, blockb;
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Node* cond = cmp.MakeNode(&m, a, b);
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (invert) cond = m.Word32Equal(cond, m.Int32Constant(0));
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Branch(cond, &blocka, &blockb);
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blocka);
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(eq_constant));
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Bind(&blockb);
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      m.Return(m.Int32Constant(ne_constant));
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (size_t i = 0; i < arraysize(inputs); i++) {
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        for (size_t j = 0; j < arraysize(inputs); j += 2) {
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          input_a = inputs[i];
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          input_b = inputs[i];
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_t expected =
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              invert ? (cmp.Float64Compare(input_a, input_b) ? ne_constant
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                             : eq_constant)
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     : (cmp.Float64Compare(input_a, input_b) ? eq_constant
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                             : ne_constant);
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK_EQ(expected, m.Call());
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_TURBOFAN_TARGET
463