| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/js-operator.h" | 5 #include "src/compiler/js-operator.h" |
| 6 #include "src/compiler/opcodes.h" | 6 #include "src/compiler/opcodes.h" |
| 7 #include "src/compiler/operator.h" | 7 #include "src/compiler/operator.h" |
| 8 #include "src/compiler/operator-properties.h" | 8 #include "src/compiler/operator-properties.h" |
| 9 #include "test/unittests/test-utils.h" | 9 #include "test/unittests/test-utils.h" |
| 10 | 10 |
| 11 namespace v8 { | 11 namespace v8 { |
| 12 namespace internal { | 12 namespace internal { |
| 13 namespace compiler { | 13 namespace compiler { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 const LanguageMode kLanguageModes[] = {SLOPPY, STRICT, STRONG}; | 17 |
| 18 const LanguageMode kLanguageModes[] = { |
| 19 LanguageMode::SLOPPY, LanguageMode::STRICT, LanguageMode::STRONG}; |
| 20 |
| 21 |
| 22 const LanguageMode kLanguageModesForStrength[] = {LanguageMode::SLOPPY, |
| 23 LanguageMode::STRONG}; |
| 18 | 24 |
| 19 | 25 |
| 20 #if GTEST_HAS_COMBINE | 26 #if GTEST_HAS_COMBINE |
| 21 | 27 |
| 22 template <typename T> | 28 template <typename T> |
| 23 class JSOperatorTestWithLanguageModeAndParam | 29 class JSOperatorTestWithLanguageModeAndParam |
| 24 : public TestWithZone, | 30 : public TestWithZone, |
| 25 public ::testing::WithParamInterface<::testing::tuple<LanguageMode, T>> { | 31 public ::testing::WithParamInterface<::testing::tuple<LanguageMode, T>> { |
| 26 protected: | 32 protected: |
| 27 LanguageMode language_mode() const { | 33 LanguageMode language_mode() const { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 const Operator* op = (javascript.*sop.constructor)(); | 154 const Operator* op = (javascript.*sop.constructor)(); |
| 149 EXPECT_EQ(sop.properties, op->properties()); | 155 EXPECT_EQ(sop.properties, op->properties()); |
| 150 } | 156 } |
| 151 | 157 |
| 152 | 158 |
| 153 INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest, | 159 INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest, |
| 154 ::testing::ValuesIn(kSharedOperators)); | 160 ::testing::ValuesIn(kSharedOperators)); |
| 155 | 161 |
| 156 | 162 |
| 157 // ----------------------------------------------------------------------------- | 163 // ----------------------------------------------------------------------------- |
| 158 // Shared operators with language mode. | 164 // Shared operators with strength. |
| 159 | |
| 160 | 165 |
| 161 #if GTEST_HAS_COMBINE | 166 #if GTEST_HAS_COMBINE |
| 162 | 167 |
| 163 namespace { | 168 namespace { |
| 164 | 169 |
| 165 struct SharedOperatorWithLanguageMode { | 170 struct SharedOperatorWithStrength { |
| 166 const Operator* (JSOperatorBuilder::*constructor)(LanguageMode); | 171 const Operator* (JSOperatorBuilder::*constructor)(Strength); |
| 167 IrOpcode::Value opcode; | 172 IrOpcode::Value opcode; |
| 168 Operator::Properties properties; | 173 Operator::Properties properties; |
| 169 int value_input_count; | 174 int value_input_count; |
| 170 int frame_state_input_count; | 175 int frame_state_input_count; |
| 171 int effect_input_count; | 176 int effect_input_count; |
| 172 int control_input_count; | 177 int control_input_count; |
| 173 int value_output_count; | 178 int value_output_count; |
| 174 int effect_output_count; | 179 int effect_output_count; |
| 175 int control_output_count; | 180 int control_output_count; |
| 176 }; | 181 }; |
| 177 | 182 |
| 178 | 183 |
| 179 const SharedOperatorWithLanguageMode kSharedOperatorsWithLanguageMode[] = { | 184 const SharedOperatorWithStrength kSharedOperatorsWithStrength[] = { |
| 180 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ | 185 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ |
| 181 effect_input_count, control_input_count, value_output_count, \ | 186 effect_input_count, control_input_count, value_output_count, \ |
| 182 effect_output_count, control_output_count) \ | 187 effect_output_count, control_output_count) \ |
| 183 { \ | 188 { \ |
| 184 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ | 189 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ |
| 185 value_input_count, frame_state_input_count, effect_input_count, \ | 190 value_input_count, frame_state_input_count, effect_input_count, \ |
| 186 control_input_count, value_output_count, effect_output_count, \ | 191 control_input_count, value_output_count, effect_output_count, \ |
| 187 control_output_count \ | 192 control_output_count \ |
| 188 } | 193 } |
| 189 SHARED(LessThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 194 SHARED(LessThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 190 SHARED(GreaterThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 195 SHARED(GreaterThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 191 SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 196 SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 192 SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 197 SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 193 SHARED(BitwiseOr, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 198 SHARED(BitwiseOr, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 194 SHARED(BitwiseXor, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 199 SHARED(BitwiseXor, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 195 SHARED(BitwiseAnd, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 200 SHARED(BitwiseAnd, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 196 SHARED(ShiftLeft, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 201 SHARED(ShiftLeft, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 197 SHARED(ShiftRight, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 202 SHARED(ShiftRight, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 198 SHARED(ShiftRightLogical, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 203 SHARED(ShiftRightLogical, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 199 SHARED(Add, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 204 SHARED(Add, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 200 SHARED(Subtract, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 205 SHARED(Subtract, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 201 SHARED(Multiply, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 206 SHARED(Multiply, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 202 SHARED(Divide, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 207 SHARED(Divide, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 203 SHARED(Modulus, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | 208 SHARED(Modulus, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2) |
| 204 SHARED(StoreProperty, Operator::kNoProperties, 3, 2, 1, 1, 0, 1, 2), | |
| 205 #undef SHARED | 209 #undef SHARED |
| 206 }; | 210 }; |
| 207 | 211 |
| 212 |
| 213 std::ostream& operator<<(std::ostream& os, |
| 214 const SharedOperatorWithStrength& sop) { |
| 215 return os << IrOpcode::Mnemonic(sop.opcode); |
| 216 } |
| 217 |
| 218 } // namespace |
| 219 |
| 220 |
| 221 class JSSharedOperatorWithStrengthTest |
| 222 : public JSOperatorTestWithLanguageModeAndParam< |
| 223 SharedOperatorWithStrength> {}; |
| 224 |
| 225 |
| 226 TEST_P(JSSharedOperatorWithStrengthTest, InstancesAreGloballyShared) { |
| 227 const SharedOperatorWithStrength& sop = GetParam(); |
| 228 JSOperatorBuilder javascript1(zone()); |
| 229 JSOperatorBuilder javascript2(zone()); |
| 230 EXPECT_EQ((javascript1.*sop.constructor)(strength(language_mode())), |
| 231 (javascript2.*sop.constructor)(strength(language_mode()))); |
| 232 } |
| 233 |
| 234 |
| 235 TEST_P(JSSharedOperatorWithStrengthTest, NumberOfInputsAndOutputs) { |
| 236 JSOperatorBuilder javascript(zone()); |
| 237 const SharedOperatorWithStrength& sop = GetParam(); |
| 238 const Operator* op = (javascript.*sop.constructor)(strength(language_mode())); |
| 239 |
| 240 const int context_input_count = 1; |
| 241 EXPECT_EQ(sop.value_input_count, op->ValueInputCount()); |
| 242 EXPECT_EQ(context_input_count, OperatorProperties::GetContextInputCount(op)); |
| 243 EXPECT_EQ(sop.frame_state_input_count, |
| 244 OperatorProperties::GetFrameStateInputCount(op)); |
| 245 EXPECT_EQ(sop.effect_input_count, op->EffectInputCount()); |
| 246 EXPECT_EQ(sop.control_input_count, op->ControlInputCount()); |
| 247 EXPECT_EQ(sop.value_input_count + context_input_count + |
| 248 sop.frame_state_input_count + sop.effect_input_count + |
| 249 sop.control_input_count, |
| 250 OperatorProperties::GetTotalInputCount(op)); |
| 251 |
| 252 EXPECT_EQ(sop.value_output_count, op->ValueOutputCount()); |
| 253 EXPECT_EQ(sop.effect_output_count, op->EffectOutputCount()); |
| 254 EXPECT_EQ(sop.control_output_count, op->ControlOutputCount()); |
| 255 } |
| 256 |
| 257 |
| 258 TEST_P(JSSharedOperatorWithStrengthTest, OpcodeIsCorrect) { |
| 259 JSOperatorBuilder javascript(zone()); |
| 260 const SharedOperatorWithStrength& sop = GetParam(); |
| 261 const Operator* op = (javascript.*sop.constructor)(strength(language_mode())); |
| 262 EXPECT_EQ(sop.opcode, op->opcode()); |
| 263 } |
| 264 |
| 265 |
| 266 TEST_P(JSSharedOperatorWithStrengthTest, Parameter) { |
| 267 JSOperatorBuilder javascript(zone()); |
| 268 const SharedOperatorWithStrength& sop = GetParam(); |
| 269 const Operator* op = (javascript.*sop.constructor)(strength(language_mode())); |
| 270 EXPECT_EQ(strength(language_mode()), OpParameter<Strength>(op)); |
| 271 } |
| 272 |
| 273 |
| 274 TEST_P(JSSharedOperatorWithStrengthTest, Properties) { |
| 275 JSOperatorBuilder javascript(zone()); |
| 276 const SharedOperatorWithStrength& sop = GetParam(); |
| 277 const Operator* op = (javascript.*sop.constructor)(strength(language_mode())); |
| 278 EXPECT_EQ(sop.properties, op->properties()); |
| 279 } |
| 280 |
| 281 |
| 282 INSTANTIATE_TEST_CASE_P( |
| 283 JSOperatorTest, JSSharedOperatorWithStrengthTest, |
| 284 ::testing::Combine(::testing::ValuesIn(kLanguageModesForStrength), |
| 285 ::testing::ValuesIn(kSharedOperatorsWithStrength))); |
| 286 |
| 287 |
| 288 // ----------------------------------------------------------------------------- |
| 289 // Shared operators with language mode. |
| 290 |
| 291 namespace { |
| 292 |
| 293 struct SharedOperatorWithLanguageMode { |
| 294 const Operator* (JSOperatorBuilder::*constructor)(LanguageMode); |
| 295 IrOpcode::Value opcode; |
| 296 Operator::Properties properties; |
| 297 int value_input_count; |
| 298 int frame_state_input_count; |
| 299 int effect_input_count; |
| 300 int control_input_count; |
| 301 int value_output_count; |
| 302 int effect_output_count; |
| 303 int control_output_count; |
| 304 }; |
| 305 |
| 306 |
| 307 const SharedOperatorWithLanguageMode kSharedOperatorsWithLanguageMode[] = { |
| 308 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ |
| 309 effect_input_count, control_input_count, value_output_count, \ |
| 310 effect_output_count, control_output_count) \ |
| 311 { \ |
| 312 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ |
| 313 value_input_count, frame_state_input_count, effect_input_count, \ |
| 314 control_input_count, value_output_count, effect_output_count, \ |
| 315 control_output_count \ |
| 316 } |
| 317 SHARED(StoreProperty, Operator::kNoProperties, 3, 2, 1, 1, 0, 1, 2) |
| 318 #undef SHARED |
| 319 }; |
| 320 |
| 208 | 321 |
| 209 std::ostream& operator<<(std::ostream& os, | 322 std::ostream& operator<<(std::ostream& os, |
| 210 const SharedOperatorWithLanguageMode& sop) { | 323 const SharedOperatorWithLanguageMode& sop) { |
| 211 return os << IrOpcode::Mnemonic(sop.opcode); | 324 return os << IrOpcode::Mnemonic(sop.opcode); |
| 212 } | 325 } |
| 213 | 326 |
| 214 } // namespace | 327 } // namespace |
| 215 | 328 |
| 216 | 329 |
| 217 class JSSharedOperatorWithLanguageModeTest | 330 class JSSharedOperatorWithLanguageModeTest |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 const Operator* op = (javascript.*sop.constructor)(language_mode()); | 386 const Operator* op = (javascript.*sop.constructor)(language_mode()); |
| 274 EXPECT_EQ(sop.properties, op->properties()); | 387 EXPECT_EQ(sop.properties, op->properties()); |
| 275 } | 388 } |
| 276 | 389 |
| 277 | 390 |
| 278 INSTANTIATE_TEST_CASE_P( | 391 INSTANTIATE_TEST_CASE_P( |
| 279 JSOperatorTest, JSSharedOperatorWithLanguageModeTest, | 392 JSOperatorTest, JSSharedOperatorWithLanguageModeTest, |
| 280 ::testing::Combine(::testing::ValuesIn(kLanguageModes), | 393 ::testing::Combine(::testing::ValuesIn(kLanguageModes), |
| 281 ::testing::ValuesIn(kSharedOperatorsWithLanguageMode))); | 394 ::testing::ValuesIn(kSharedOperatorsWithLanguageMode))); |
| 282 | 395 |
| 396 |
| 283 #endif // GTEST_HAS_COMBINE | 397 #endif // GTEST_HAS_COMBINE |
| 284 | 398 |
| 285 } // namespace compiler | 399 } // namespace compiler |
| 286 } // namespace internal | 400 } // namespace internal |
| 287 } // namespace v8 | 401 } // namespace v8 |
| OLD | NEW |