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/compiler/machine-operator.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator-properties-inl.h" 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "testing/gtest-support.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if GTEST_HAS_COMBINE 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(bmeurer): Find a new home for these. 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline std::ostream& operator<<(std::ostream& os, const MachineType& type) { 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OStringStream ost; 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ost << type; 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << ost.c_str(); 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline std::ostream& operator<<(std::ostream& os, 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const WriteBarrierKind& write_barrier_kind) { 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OStringStream ost; 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ost << write_barrier_kind; 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << ost.c_str(); 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename T> 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MachineOperatorTestWithParam 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public ::testing::TestWithParam< ::testing::tuple<MachineType, T> > { 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineType type() const { return ::testing::get<0>(B::GetParam()); } 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const T& GetParam() const { return ::testing::get<1>(B::GetParam()); } 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef ::testing::TestWithParam< ::testing::tuple<MachineType, T> > B; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace { 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst MachineType kMachineReps[] = {kRepWord32, kRepWord64}; 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst MachineType kMachineTypes[] = { 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMachFloat32, kMachFloat64, kMachInt8, kMachUint8, kMachInt16, 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMachUint16, kMachInt32, kMachUint32, kMachInt64, kMachUint64, 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMachPtr, kMachAnyTagged, kRepBit, kRepWord8, kRepWord16, 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kRepWord32, kRepWord64, kRepFloat32, kRepFloat64, kRepTagged}; 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load operator. 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef MachineOperatorTestWithParam<LoadRepresentation> 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineLoadOperatorTest; 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, InstancesAreGloballyShared) { 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine1(type()); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine2(type()); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine1.Load(GetParam()), machine2.Load(GetParam())); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, NumberOfInputsAndOutputs) { 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* op = machine.Load(GetParam()); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(2, OperatorProperties::GetValueInputCount(op)); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op)); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op)); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(3, OperatorProperties::GetTotalInputCount(op)); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op)); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, OpcodeIsCorrect) { 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(IrOpcode::kLoad, machine.Load(GetParam())->opcode()); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, ParameterIsCorrect) { 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(GetParam(), 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OpParameter<LoadRepresentation>(machine.Load(GetParam()))); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(MachineOperatorTest, MachineLoadOperatorTest, 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::Combine(::testing::ValuesIn(kMachineReps), 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::ValuesIn(kMachineTypes))); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Store operator. 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MachineStoreOperatorTest 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public MachineOperatorTestWithParam< 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::tuple<MachineType, WriteBarrierKind> > { 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreRepresentation GetParam() const { 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return StoreRepresentation( 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::get<0>(MachineOperatorTestWithParam< 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::tuple<MachineType, WriteBarrierKind> >::GetParam()), 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::get<1>(MachineOperatorTestWithParam< 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::tuple<MachineType, WriteBarrierKind> >::GetParam())); 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, InstancesAreGloballyShared) { 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine1(type()); 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine2(type()); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine1.Store(GetParam()), machine2.Store(GetParam())); 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, NumberOfInputsAndOutputs) { 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* op = machine.Store(GetParam()); 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(3, OperatorProperties::GetValueInputCount(op)); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op)); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetControlInputCount(op)); 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op)); 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op)); 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, OpcodeIsCorrect) { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(IrOpcode::kStore, machine.Store(GetParam())->opcode()); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, ParameterIsCorrect) { 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(GetParam(), 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OpParameter<StoreRepresentation>(machine.Store(GetParam()))); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P( 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorTest, MachineStoreOperatorTest, 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::Combine( 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::ValuesIn(kMachineReps), 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::Combine(::testing::ValuesIn(kMachineTypes), 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::Values(kNoWriteBarrier, 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kFullWriteBarrier)))); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Pure operators. 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace { 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct PureOperator { 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* (MachineOperatorBuilder::*constructor)(); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IrOpcode::Value opcode; 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int value_input_count; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int value_output_count; 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstd::ostream& operator<<(std::ostream& os, const PureOperator& pop) { 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << IrOpcode::Mnemonic(pop.opcode); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst PureOperator kPureOperators[] = { 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define PURE(Name, input_count, output_count) \ 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { \ 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &MachineOperatorBuilder::Name, IrOpcode::k##Name, input_count, \ 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch output_count \ 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word32And, 2, 1), PURE(Word32Or, 2, 1), 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word32Xor, 2, 1), PURE(Word32Shl, 2, 1), 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word32Shr, 2, 1), PURE(Word32Sar, 2, 1), 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word32Ror, 2, 1), PURE(Word32Equal, 2, 1), 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word64And, 2, 1), PURE(Word64Or, 2, 1), 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word64Xor, 2, 1), PURE(Word64Shl, 2, 1), 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word64Shr, 2, 1), PURE(Word64Sar, 2, 1), 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Word64Ror, 2, 1), PURE(Word64Equal, 2, 1), 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32Add, 2, 1), PURE(Int32AddWithOverflow, 2, 2), 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32Sub, 2, 1), PURE(Int32SubWithOverflow, 2, 2), 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32Mul, 2, 1), PURE(Int32Div, 2, 1), 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32UDiv, 2, 1), PURE(Int32Mod, 2, 1), 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32UMod, 2, 1), PURE(Int32LessThan, 2, 1), 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int32LessThanOrEqual, 2, 1), PURE(Uint32LessThan, 2, 1), 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Uint32LessThanOrEqual, 2, 1), PURE(Int64Add, 2, 1), 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int64Sub, 2, 1), PURE(Int64Mul, 2, 1), 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int64Div, 2, 1), PURE(Int64UDiv, 2, 1), 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int64Mod, 2, 1), PURE(Int64UMod, 2, 1), 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Int64LessThan, 2, 1), PURE(Int64LessThanOrEqual, 2, 1), 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(ChangeFloat32ToFloat64, 1, 1), PURE(ChangeFloat64ToInt32, 1, 1), 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(ChangeFloat64ToUint32, 1, 1), PURE(ChangeInt32ToInt64, 1, 1), 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(ChangeUint32ToFloat64, 1, 1), PURE(ChangeUint32ToUint64, 1, 1), 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(TruncateFloat64ToFloat32, 1, 1), PURE(TruncateFloat64ToInt32, 1, 1), 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(TruncateInt64ToInt32, 1, 1), PURE(Float64Add, 2, 1), 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Float64Sub, 2, 1), PURE(Float64Mul, 2, 1), 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Float64Div, 2, 1), PURE(Float64Mod, 2, 1), 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Float64Sqrt, 1, 1), PURE(Float64Equal, 2, 1), 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PURE(Float64LessThan, 2, 1), PURE(Float64LessThanOrEqual, 2, 1) 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef PURE 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef MachineOperatorTestWithParam<PureOperator> MachinePureOperatorTest; 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, InstancesAreGloballyShared) { 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PureOperator& pop = GetParam(); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine1(type()); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine2(type()); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ((machine1.*pop.constructor)(), (machine2.*pop.constructor)()); 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, NumberOfInputsAndOutputs) { 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PureOperator& pop = GetParam(); 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* op = (machine.*pop.constructor)(); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(pop.value_input_count, OperatorProperties::GetValueInputCount(op)); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op)); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op)); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(pop.value_input_count, OperatorProperties::GetTotalInputCount(op)); 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(pop.value_output_count, 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OperatorProperties::GetValueOutputCount(op)); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, MarkedAsPure) { 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PureOperator& pop = GetParam(); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* op = (machine.*pop.constructor)(); 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_TRUE(op->HasProperty(Operator::kPure)); 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, OpcodeIsCorrect) { 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(type()); 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PureOperator& pop = GetParam(); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Operator* op = (machine.*pop.constructor)(); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(pop.opcode, op->opcode()); 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P( 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorTest, MachinePureOperatorTest, 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::Combine(::testing::ValuesIn(kMachineReps), 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ::testing::ValuesIn(kPureOperators))); 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // GTEST_HAS_COMBINE 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Pseudo operators. 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(MachineOperatorTest, PseudoOperatorsWhenWordSizeIs32Bit) { 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(kRepWord32); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32And(), machine.WordAnd()); 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Or(), machine.WordOr()); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Xor(), machine.WordXor()); 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Shl(), machine.WordShl()); 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Shr(), machine.WordShr()); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Sar(), machine.WordSar()); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Ror(), machine.WordRor()); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word32Equal(), machine.WordEqual()); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32Add(), machine.IntAdd()); 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32Sub(), machine.IntSub()); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32Mul(), machine.IntMul()); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32Div(), machine.IntDiv()); 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32UDiv(), machine.IntUDiv()); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32Mod(), machine.IntMod()); 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32UMod(), machine.IntUMod()); 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32LessThan(), machine.IntLessThan()); 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int32LessThanOrEqual(), machine.IntLessThanOrEqual()); 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(MachineOperatorTest, PseudoOperatorsWhenWordSizeIs64Bit) { 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MachineOperatorBuilder machine(kRepWord64); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64And(), machine.WordAnd()); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Or(), machine.WordOr()); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Xor(), machine.WordXor()); 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Shl(), machine.WordShl()); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Shr(), machine.WordShr()); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Sar(), machine.WordSar()); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Ror(), machine.WordRor()); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Word64Equal(), machine.WordEqual()); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64Add(), machine.IntAdd()); 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64Sub(), machine.IntSub()); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64Mul(), machine.IntMul()); 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64Div(), machine.IntDiv()); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64UDiv(), machine.IntUDiv()); 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64Mod(), machine.IntMod()); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64UMod(), machine.IntUMod()); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64LessThan(), machine.IntLessThan()); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXPECT_EQ(machine.Int64LessThanOrEqual(), machine.IntLessThanOrEqual()); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 326