| Index: src/compiler/simplified-operator-unittest.cc
|
| diff --git a/src/compiler/simplified-operator-unittest.cc b/src/compiler/simplified-operator-unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e6e7accbf72d39ab4c5d5f81ba02e4746d27a9eb
|
| --- /dev/null
|
| +++ b/src/compiler/simplified-operator-unittest.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright 2014 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "src/compiler/simplified-operator.h"
|
| +
|
| +#include "src/compiler/operator-properties-inl.h"
|
| +#include "src/test/test-utils.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace compiler {
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Pure operators.
|
| +
|
| +
|
| +namespace {
|
| +
|
| +struct PureOperator {
|
| + const Operator* (SimplifiedOperatorBuilder::*constructor)() const;
|
| + IrOpcode::Value opcode;
|
| + Operator::Properties properties;
|
| + int value_input_count;
|
| +};
|
| +
|
| +
|
| +std::ostream& operator<<(std::ostream& os, const PureOperator& pop) {
|
| + return os << IrOpcode::Mnemonic(pop.opcode);
|
| +}
|
| +
|
| +
|
| +const PureOperator kPureOperators[] = {
|
| +#define PURE(Name, properties, input_count) \
|
| + { \
|
| + &SimplifiedOperatorBuilder::Name, IrOpcode::k##Name, \
|
| + Operator::kPure | properties, input_count \
|
| + }
|
| + PURE(BooleanNot, Operator::kNoProperties, 1),
|
| + PURE(NumberEqual, Operator::kCommutative, 2),
|
| + PURE(NumberLessThan, Operator::kNoProperties, 2),
|
| + PURE(NumberLessThanOrEqual, Operator::kNoProperties, 2),
|
| + PURE(NumberAdd, Operator::kCommutative, 2),
|
| + PURE(NumberSubtract, Operator::kNoProperties, 2),
|
| + PURE(NumberMultiply, Operator::kCommutative, 2),
|
| + PURE(NumberDivide, Operator::kNoProperties, 2),
|
| + PURE(NumberModulus, Operator::kNoProperties, 2),
|
| + PURE(NumberToInt32, Operator::kNoProperties, 1),
|
| + PURE(NumberToUint32, Operator::kNoProperties, 1),
|
| + PURE(StringEqual, Operator::kCommutative, 2),
|
| + PURE(StringLessThan, Operator::kNoProperties, 2),
|
| + PURE(StringLessThanOrEqual, Operator::kNoProperties, 2),
|
| + PURE(StringAdd, Operator::kNoProperties, 2),
|
| + PURE(ChangeTaggedToInt32, Operator::kNoProperties, 1),
|
| + PURE(ChangeTaggedToUint32, Operator::kNoProperties, 1),
|
| + PURE(ChangeTaggedToFloat64, Operator::kNoProperties, 1),
|
| + PURE(ChangeInt32ToTagged, Operator::kNoProperties, 1),
|
| + PURE(ChangeUint32ToTagged, Operator::kNoProperties, 1),
|
| + PURE(ChangeFloat64ToTagged, Operator::kNoProperties, 1),
|
| + PURE(ChangeBoolToBit, Operator::kNoProperties, 1),
|
| + PURE(ChangeBitToBool, Operator::kNoProperties, 1)
|
| +#undef PURE
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +
|
| +class SimplifiedPureOperatorTest
|
| + : public TestWithZone,
|
| + public ::testing::WithParamInterface<PureOperator> {};
|
| +
|
| +
|
| +TEST_P(SimplifiedPureOperatorTest, InstancesAreGloballyShared) {
|
| + const PureOperator& pop = GetParam();
|
| + SimplifiedOperatorBuilder simplified1(zone());
|
| + SimplifiedOperatorBuilder simplified2(zone());
|
| + EXPECT_EQ((simplified1.*pop.constructor)(), (simplified2.*pop.constructor)());
|
| +}
|
| +
|
| +
|
| +TEST_P(SimplifiedPureOperatorTest, NumberOfInputsAndOutputs) {
|
| + SimplifiedOperatorBuilder simplified(zone());
|
| + const PureOperator& pop = GetParam();
|
| + const Operator* op = (simplified.*pop.constructor)();
|
| +
|
| + EXPECT_EQ(pop.value_input_count, OperatorProperties::GetValueInputCount(op));
|
| + EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op));
|
| + EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
|
| + EXPECT_EQ(pop.value_input_count, OperatorProperties::GetTotalInputCount(op));
|
| +
|
| + EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op));
|
| + EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op));
|
| + EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
|
| +}
|
| +
|
| +
|
| +TEST_P(SimplifiedPureOperatorTest, OpcodeIsCorrect) {
|
| + SimplifiedOperatorBuilder simplified(zone());
|
| + const PureOperator& pop = GetParam();
|
| + const Operator* op = (simplified.*pop.constructor)();
|
| + EXPECT_EQ(pop.opcode, op->opcode());
|
| +}
|
| +
|
| +
|
| +TEST_P(SimplifiedPureOperatorTest, Properties) {
|
| + SimplifiedOperatorBuilder simplified(zone());
|
| + const PureOperator& pop = GetParam();
|
| + const Operator* op = (simplified.*pop.constructor)();
|
| + EXPECT_EQ(pop.properties, op->properties() & pop.properties);
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest,
|
| + ::testing::ValuesIn(kPureOperators));
|
| +
|
| +} // namespace compiler
|
| +} // namespace internal
|
| +} // namespace v8
|
|
|