// Copyright 2015 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/opcodes.h" #include "testing/gtest/include/gtest/gtest.h" namespace v8 { namespace internal { namespace compiler { namespace { bool IsCommonOpcode(IrOpcode::Value opcode) { switch (opcode) { #define OPCODE(Opcode) \ case IrOpcode::k##Opcode: \ return true; COMMON_OP_LIST(OPCODE) CONTROL_OP_LIST(OPCODE) #undef OPCODE default: return false; } } bool IsControlOpcode(IrOpcode::Value opcode) { switch (opcode) { #define OPCODE(Opcode) \ case IrOpcode::k##Opcode: \ return true; CONTROL_OP_LIST(OPCODE) #undef OPCODE default: return false; } } bool IsJsOpcode(IrOpcode::Value opcode) { switch (opcode) { #define OPCODE(Opcode) \ case IrOpcode::k##Opcode: \ return true; JS_OP_LIST(OPCODE) #undef OPCODE default: return false; } } bool IsConstantOpcode(IrOpcode::Value opcode) { switch (opcode) { #define OPCODE(Opcode) \ case IrOpcode::k##Opcode: \ return true; CONSTANT_OP_LIST(OPCODE) #undef OPCODE default: return false; } } bool IsComparisonOpcode(IrOpcode::Value opcode) { switch (opcode) { #define OPCODE(Opcode) \ case IrOpcode::k##Opcode: \ return true; JS_COMPARE_BINOP_LIST(OPCODE) SIMPLIFIED_COMPARE_BINOP_LIST(OPCODE) MACHINE_COMPARE_BINOP_LIST(OPCODE) #undef OPCODE default: return false; } } const IrOpcode::Value kInvalidOpcode = static_cast<IrOpcode::Value>(123456789); } // namespace TEST(IrOpcodeTest, IsCommonOpcode) { EXPECT_FALSE(IrOpcode::IsCommonOpcode(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_EQ(IsCommonOpcode(IrOpcode::k##Opcode), \ IrOpcode::IsCommonOpcode(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } TEST(IrOpcodeTest, IsControlOpcode) { EXPECT_FALSE(IrOpcode::IsControlOpcode(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_EQ(IsControlOpcode(IrOpcode::k##Opcode), \ IrOpcode::IsControlOpcode(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } TEST(IrOpcodeTest, IsJsOpcode) { EXPECT_FALSE(IrOpcode::IsJsOpcode(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_EQ(IsJsOpcode(IrOpcode::k##Opcode), \ IrOpcode::IsJsOpcode(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } TEST(IrOpcodeTest, IsConstantOpcode) { EXPECT_FALSE(IrOpcode::IsConstantOpcode(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_EQ(IsConstantOpcode(IrOpcode::k##Opcode), \ IrOpcode::IsConstantOpcode(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } TEST(IrOpcodeTest, IsComparisonOpcode) { EXPECT_FALSE(IrOpcode::IsComparisonOpcode(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_EQ(IsComparisonOpcode(IrOpcode::k##Opcode), \ IrOpcode::IsComparisonOpcode(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } TEST(IrOpcodeTest, Mnemonic) { EXPECT_STREQ("UnknownOpcode", IrOpcode::Mnemonic(kInvalidOpcode)); #define OPCODE(Opcode) \ EXPECT_STREQ(#Opcode, IrOpcode::Mnemonic(IrOpcode::k##Opcode)); ALL_OP_LIST(OPCODE) #undef OPCODE } } // namespace compiler } // namespace internal } // namespace v8