1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/compiler/opcodes.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7 
8 namespace v8 {
9 namespace internal {
10 namespace compiler {
11 
12 namespace {
13 
IsCommonOpcode(IrOpcode::Value opcode)14 bool IsCommonOpcode(IrOpcode::Value opcode) {
15   switch (opcode) {
16 #define OPCODE(Opcode)      \
17   case IrOpcode::k##Opcode: \
18     return true;
19     COMMON_OP_LIST(OPCODE)
20     CONTROL_OP_LIST(OPCODE)
21 #undef OPCODE
22     default:
23       return false;
24   }
25 }
26 
27 
IsControlOpcode(IrOpcode::Value opcode)28 bool IsControlOpcode(IrOpcode::Value opcode) {
29   switch (opcode) {
30 #define OPCODE(Opcode)      \
31   case IrOpcode::k##Opcode: \
32     return true;
33     CONTROL_OP_LIST(OPCODE)
34 #undef OPCODE
35     default:
36       return false;
37   }
38 }
39 
40 
IsJsOpcode(IrOpcode::Value opcode)41 bool IsJsOpcode(IrOpcode::Value opcode) {
42   switch (opcode) {
43 #define OPCODE(Opcode)      \
44   case IrOpcode::k##Opcode: \
45     return true;
46     JS_OP_LIST(OPCODE)
47 #undef OPCODE
48     default:
49       return false;
50   }
51 }
52 
53 
IsConstantOpcode(IrOpcode::Value opcode)54 bool IsConstantOpcode(IrOpcode::Value opcode) {
55   switch (opcode) {
56 #define OPCODE(Opcode)      \
57   case IrOpcode::k##Opcode: \
58     return true;
59     CONSTANT_OP_LIST(OPCODE)
60 #undef OPCODE
61     default:
62       return false;
63   }
64 }
65 
66 
IsComparisonOpcode(IrOpcode::Value opcode)67 bool IsComparisonOpcode(IrOpcode::Value opcode) {
68   switch (opcode) {
69 #define OPCODE(Opcode)      \
70   case IrOpcode::k##Opcode: \
71     return true;
72     JS_COMPARE_BINOP_LIST(OPCODE)
73     SIMPLIFIED_COMPARE_BINOP_LIST(OPCODE)
74     MACHINE_COMPARE_BINOP_LIST(OPCODE)
75 #undef OPCODE
76     default:
77       return false;
78   }
79 }
80 
81 
82 const IrOpcode::Value kInvalidOpcode = static_cast<IrOpcode::Value>(123456789);
83 
84 }  // namespace
85 
86 
TEST(IrOpcodeTest,IsCommonOpcode)87 TEST(IrOpcodeTest, IsCommonOpcode) {
88   EXPECT_FALSE(IrOpcode::IsCommonOpcode(kInvalidOpcode));
89 #define OPCODE(Opcode)                           \
90   EXPECT_EQ(IsCommonOpcode(IrOpcode::k##Opcode), \
91             IrOpcode::IsCommonOpcode(IrOpcode::k##Opcode));
92   ALL_OP_LIST(OPCODE)
93 #undef OPCODE
94 }
95 
96 
TEST(IrOpcodeTest,IsControlOpcode)97 TEST(IrOpcodeTest, IsControlOpcode) {
98   EXPECT_FALSE(IrOpcode::IsControlOpcode(kInvalidOpcode));
99 #define OPCODE(Opcode)                            \
100   EXPECT_EQ(IsControlOpcode(IrOpcode::k##Opcode), \
101             IrOpcode::IsControlOpcode(IrOpcode::k##Opcode));
102   ALL_OP_LIST(OPCODE)
103 #undef OPCODE
104 }
105 
106 
TEST(IrOpcodeTest,IsJsOpcode)107 TEST(IrOpcodeTest, IsJsOpcode) {
108   EXPECT_FALSE(IrOpcode::IsJsOpcode(kInvalidOpcode));
109 #define OPCODE(Opcode)                       \
110   EXPECT_EQ(IsJsOpcode(IrOpcode::k##Opcode), \
111             IrOpcode::IsJsOpcode(IrOpcode::k##Opcode));
112   ALL_OP_LIST(OPCODE)
113 #undef OPCODE
114 }
115 
116 
TEST(IrOpcodeTest,IsConstantOpcode)117 TEST(IrOpcodeTest, IsConstantOpcode) {
118   EXPECT_FALSE(IrOpcode::IsConstantOpcode(kInvalidOpcode));
119 #define OPCODE(Opcode)                             \
120   EXPECT_EQ(IsConstantOpcode(IrOpcode::k##Opcode), \
121             IrOpcode::IsConstantOpcode(IrOpcode::k##Opcode));
122   ALL_OP_LIST(OPCODE)
123 #undef OPCODE
124 }
125 
126 
TEST(IrOpcodeTest,IsComparisonOpcode)127 TEST(IrOpcodeTest, IsComparisonOpcode) {
128   EXPECT_FALSE(IrOpcode::IsComparisonOpcode(kInvalidOpcode));
129 #define OPCODE(Opcode)                               \
130   EXPECT_EQ(IsComparisonOpcode(IrOpcode::k##Opcode), \
131             IrOpcode::IsComparisonOpcode(IrOpcode::k##Opcode));
132   ALL_OP_LIST(OPCODE)
133 #undef OPCODE
134 }
135 
136 
TEST(IrOpcodeTest,Mnemonic)137 TEST(IrOpcodeTest, Mnemonic) {
138   EXPECT_STREQ("UnknownOpcode", IrOpcode::Mnemonic(kInvalidOpcode));
139 #define OPCODE(Opcode) \
140   EXPECT_STREQ(#Opcode, IrOpcode::Mnemonic(IrOpcode::k##Opcode));
141   ALL_OP_LIST(OPCODE)
142 #undef OPCODE
143 }
144 
145 }  // namespace compiler
146 }  // namespace internal
147 }  // namespace v8
148