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