| 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 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/base/lazy-instance.h" | 9 #include "src/base/lazy-instance.h" |
| 10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 V(TypeOf, Operator::kPure, 1, 1) \ | 256 V(TypeOf, Operator::kPure, 1, 1) \ |
| 257 V(InstanceOf, Operator::kNoProperties, 2, 1) \ | 257 V(InstanceOf, Operator::kNoProperties, 2, 1) \ |
| 258 V(StackCheck, Operator::kNoProperties, 0, 0) \ | 258 V(StackCheck, Operator::kNoProperties, 0, 0) \ |
| 259 V(CreateFunctionContext, Operator::kNoProperties, 1, 1) \ | 259 V(CreateFunctionContext, Operator::kNoProperties, 1, 1) \ |
| 260 V(CreateWithContext, Operator::kNoProperties, 2, 1) \ | 260 V(CreateWithContext, Operator::kNoProperties, 2, 1) \ |
| 261 V(CreateBlockContext, Operator::kNoProperties, 2, 1) \ | 261 V(CreateBlockContext, Operator::kNoProperties, 2, 1) \ |
| 262 V(CreateModuleContext, Operator::kNoProperties, 2, 1) \ | 262 V(CreateModuleContext, Operator::kNoProperties, 2, 1) \ |
| 263 V(CreateScriptContext, Operator::kNoProperties, 2, 1) | 263 V(CreateScriptContext, Operator::kNoProperties, 2, 1) |
| 264 | 264 |
| 265 | 265 |
| 266 #define CACHED_OP_LIST_WITH_LANGUAGE_MODE(V) \ | 266 #define CACHED_OP_LIST_WITH_LANGUAGE_MODE(V) \ |
| 267 V(LessThan, Operator::kNoProperties, 2, 1) \ | 267 V(LessThan, Operator::kNoProperties, 2, 1) \ |
| 268 V(GreaterThan, Operator::kNoProperties, 2, 1) \ | 268 V(GreaterThan, Operator::kNoProperties, 2, 1) \ |
| 269 V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ | 269 V(LessThanOrEqual, Operator::kNoProperties, 2, 1) \ |
| 270 V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ | 270 V(GreaterThanOrEqual, Operator::kNoProperties, 2, 1) \ |
| 271 V(BitwiseOr, Operator::kNoProperties, 2, 1) \ | 271 V(BitwiseOr, Operator::kNoProperties, 2, 1) \ |
| 272 V(BitwiseXor, Operator::kNoProperties, 2, 1) \ | 272 V(BitwiseXor, Operator::kNoProperties, 2, 1) \ |
| 273 V(BitwiseAnd, Operator::kNoProperties, 2, 1) \ | 273 V(BitwiseAnd, Operator::kNoProperties, 2, 1) \ |
| 274 V(ShiftLeft, Operator::kNoProperties, 2, 1) \ | 274 V(ShiftLeft, Operator::kNoProperties, 2, 1) \ |
| 275 V(ShiftRight, Operator::kNoProperties, 2, 1) \ | 275 V(ShiftRight, Operator::kNoProperties, 2, 1) \ |
| 276 V(ShiftRightLogical, Operator::kNoProperties, 2, 1) \ | 276 V(ShiftRightLogical, Operator::kNoProperties, 2, 1) \ |
| 277 V(Add, Operator::kNoProperties, 2, 1) \ | 277 V(Add, Operator::kNoProperties, 2, 1) \ |
| 278 V(Subtract, Operator::kNoProperties, 2, 1) \ | 278 V(Subtract, Operator::kNoProperties, 2, 1) \ |
| 279 V(Multiply, Operator::kNoProperties, 2, 1) \ | 279 V(Multiply, Operator::kNoProperties, 2, 1) \ |
| 280 V(Divide, Operator::kNoProperties, 2, 1) \ | 280 V(Divide, Operator::kNoProperties, 2, 1) \ |
| 281 V(Modulus, Operator::kNoProperties, 2, 1) | 281 V(Modulus, Operator::kNoProperties, 2, 1) \ |
| 282 V(StoreProperty, Operator::kNoProperties, 3, 0) |
| 282 | 283 |
| 283 | 284 |
| 284 struct JSOperatorGlobalCache final { | 285 struct JSOperatorGlobalCache final { |
| 285 #define CACHED(Name, properties, value_input_count, value_output_count) \ | 286 #define CACHED(Name, properties, value_input_count, value_output_count) \ |
| 286 struct Name##Operator final : public Operator { \ | 287 struct Name##Operator final : public Operator { \ |
| 287 Name##Operator() \ | 288 Name##Operator() \ |
| 288 : Operator(IrOpcode::kJS##Name, properties, "JS" #Name, \ | 289 : Operator(IrOpcode::kJS##Name, properties, "JS" #Name, \ |
| 289 value_input_count, Operator::ZeroIfPure(properties), \ | 290 value_input_count, Operator::ZeroIfPure(properties), \ |
| 290 Operator::ZeroIfEliminatable(properties), \ | 291 Operator::ZeroIfEliminatable(properties), \ |
| 291 value_output_count, Operator::ZeroIfPure(properties), \ | 292 value_output_count, Operator::ZeroIfPure(properties), \ |
| (...skipping 14 matching lines...) Expand all Loading... |
| 306 Operator::ZeroIfPure(properties), \ | 307 Operator::ZeroIfPure(properties), \ |
| 307 Operator::ZeroIfEliminatable(properties), value_output_count, \ | 308 Operator::ZeroIfEliminatable(properties), value_output_count, \ |
| 308 Operator::ZeroIfPure(properties), \ | 309 Operator::ZeroIfPure(properties), \ |
| 309 Operator::ZeroIfNoThrow(properties), kLanguageMode) {} \ | 310 Operator::ZeroIfNoThrow(properties), kLanguageMode) {} \ |
| 310 }; \ | 311 }; \ |
| 311 Name##Operator<SLOPPY> k##Name##SloppyOperator; \ | 312 Name##Operator<SLOPPY> k##Name##SloppyOperator; \ |
| 312 Name##Operator<STRICT> k##Name##StrictOperator; \ | 313 Name##Operator<STRICT> k##Name##StrictOperator; \ |
| 313 Name##Operator<STRONG> k##Name##StrongOperator; | 314 Name##Operator<STRONG> k##Name##StrongOperator; |
| 314 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_LANGUAGE_MODE) | 315 CACHED_OP_LIST_WITH_LANGUAGE_MODE(CACHED_WITH_LANGUAGE_MODE) |
| 315 #undef CACHED_WITH_LANGUAGE_MODE | 316 #undef CACHED_WITH_LANGUAGE_MODE |
| 316 | |
| 317 | |
| 318 template <LanguageMode kLanguageMode> | |
| 319 struct StorePropertyOperator final : public Operator1<LanguageMode> { | |
| 320 StorePropertyOperator() | |
| 321 : Operator1<LanguageMode>(IrOpcode::kJSStoreProperty, | |
| 322 Operator::kNoProperties, "JSStoreProperty", 3, | |
| 323 1, 1, 0, 1, 2, kLanguageMode) {} | |
| 324 }; | |
| 325 StorePropertyOperator<SLOPPY> kStorePropertySloppyOperator; | |
| 326 StorePropertyOperator<STRICT> kStorePropertyStrictOperator; | |
| 327 }; | 317 }; |
| 328 | 318 |
| 329 | 319 |
| 330 static base::LazyInstance<JSOperatorGlobalCache>::type kCache = | 320 static base::LazyInstance<JSOperatorGlobalCache>::type kCache = |
| 331 LAZY_INSTANCE_INITIALIZER; | 321 LAZY_INSTANCE_INITIALIZER; |
| 332 | 322 |
| 333 | 323 |
| 334 JSOperatorBuilder::JSOperatorBuilder(Zone* zone) | 324 JSOperatorBuilder::JSOperatorBuilder(Zone* zone) |
| 335 : cache_(kCache.Get()), zone_(zone) {} | 325 : cache_(kCache.Get()), zone_(zone) {} |
| 336 | 326 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 const VectorSlotPair& feedback) { | 403 const VectorSlotPair& feedback) { |
| 414 LoadPropertyParameters parameters(feedback); | 404 LoadPropertyParameters parameters(feedback); |
| 415 return new (zone()) Operator1<LoadPropertyParameters>( // -- | 405 return new (zone()) Operator1<LoadPropertyParameters>( // -- |
| 416 IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode | 406 IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode |
| 417 "JSLoadProperty", // name | 407 "JSLoadProperty", // name |
| 418 2, 1, 1, 1, 1, 2, // counts | 408 2, 1, 1, 1, 1, 2, // counts |
| 419 parameters); // parameter | 409 parameters); // parameter |
| 420 } | 410 } |
| 421 | 411 |
| 422 | 412 |
| 423 const Operator* JSOperatorBuilder::StoreProperty(LanguageMode language_mode) { | |
| 424 if (is_strict(language_mode)) { | |
| 425 return &cache_.kStorePropertyStrictOperator; | |
| 426 } else { | |
| 427 return &cache_.kStorePropertySloppyOperator; | |
| 428 } | |
| 429 UNREACHABLE(); | |
| 430 return nullptr; | |
| 431 } | |
| 432 | |
| 433 | |
| 434 const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode, | 413 const Operator* JSOperatorBuilder::StoreNamed(LanguageMode language_mode, |
| 435 const Unique<Name>& name, | 414 const Unique<Name>& name, |
| 436 PropertyICMode store_ic) { | 415 PropertyICMode store_ic) { |
| 437 StoreNamedParameters parameters(language_mode, name, store_ic); | 416 StoreNamedParameters parameters(language_mode, name, store_ic); |
| 438 return new (zone()) Operator1<StoreNamedParameters>( // -- | 417 return new (zone()) Operator1<StoreNamedParameters>( // -- |
| 439 IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode | 418 IrOpcode::kJSStoreNamed, Operator::kNoProperties, // opcode |
| 440 "JSStoreNamed", // name | 419 "JSStoreNamed", // name |
| 441 2, 1, 1, 0, 1, 2, // counts | 420 2, 1, 1, 0, 1, 2, // counts |
| 442 parameters); // parameter | 421 parameters); // parameter |
| 443 } | 422 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 return new (zone()) Operator1<Unique<String>>( // -- | 470 return new (zone()) Operator1<Unique<String>>( // -- |
| 492 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode | 471 IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode |
| 493 "JSCreateCatchContext", // name | 472 "JSCreateCatchContext", // name |
| 494 2, 1, 1, 1, 1, 2, // counts | 473 2, 1, 1, 1, 1, 2, // counts |
| 495 name); // parameter | 474 name); // parameter |
| 496 } | 475 } |
| 497 | 476 |
| 498 } // namespace compiler | 477 } // namespace compiler |
| 499 } // namespace internal | 478 } // namespace internal |
| 500 } // namespace v8 | 479 } // namespace v8 |
| OLD | NEW |