| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_IC_H_ | 5 #ifndef V8_IC_H_ |
| 6 #define V8_IC_H_ | 6 #define V8_IC_H_ |
| 7 | 7 |
| 8 #include "src/ic/ic-state.h" | 8 #include "src/ic/ic-state.h" |
| 9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 | 253 |
| 254 class CallIC : public IC { | 254 class CallIC : public IC { |
| 255 public: | 255 public: |
| 256 CallIC(Isolate* isolate, CallICNexus* nexus) | 256 CallIC(Isolate* isolate, CallICNexus* nexus) |
| 257 : IC(EXTRA_CALL_FRAME, isolate, nexus) { | 257 : IC(EXTRA_CALL_FRAME, isolate, nexus) { |
| 258 DCHECK(nexus != NULL); | 258 DCHECK(nexus != NULL); |
| 259 } | 259 } |
| 260 | 260 |
| 261 void HandleMiss(Handle<Object> function); | 261 void HandleMiss(Handle<Object> function); |
| 262 | 262 |
| 263 // Code generator routines. | |
| 264 static Handle<Code> initialize_stub_in_optimized_code( | |
| 265 Isolate* isolate, int argc, ConvertReceiverMode mode, | |
| 266 TailCallMode tail_call_mode); | |
| 267 | |
| 268 static void Clear(Isolate* isolate, Code* host, CallICNexus* nexus); | 263 static void Clear(Isolate* isolate, Code* host, CallICNexus* nexus); |
| 269 }; | 264 }; |
| 270 | 265 |
| 271 | 266 |
| 272 class LoadIC : public IC { | 267 class LoadIC : public IC { |
| 273 public: | 268 public: |
| 274 LoadIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) | 269 LoadIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) |
| 275 : IC(depth, isolate, nexus) { | 270 : IC(depth, isolate, nexus) { |
| 276 DCHECK(nexus != NULL); | 271 DCHECK(nexus != NULL); |
| 277 DCHECK(IsLoadStub()); | 272 DCHECK(IsLoadStub()); |
| 278 } | 273 } |
| 279 | 274 |
| 280 bool ShouldThrowReferenceError() const { | 275 bool ShouldThrowReferenceError() const { |
| 281 return kind() == Code::LOAD_GLOBAL_IC && | 276 return kind() == Code::LOAD_GLOBAL_IC && |
| 282 LoadGlobalICState::GetTypeofMode(extra_ic_state()) == | 277 LoadGlobalICState::GetTypeofMode(extra_ic_state()) == |
| 283 NOT_INSIDE_TYPEOF; | 278 NOT_INSIDE_TYPEOF; |
| 284 } | 279 } |
| 285 | 280 |
| 286 // Code generator routines. | 281 // Code generator routines. |
| 287 | 282 |
| 288 static void GenerateMiss(MacroAssembler* masm); | 283 static void GenerateMiss(MacroAssembler* masm); |
| 289 static void GenerateRuntimeGetProperty(MacroAssembler* masm); | 284 static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
| 290 static void GenerateNormal(MacroAssembler* masm); | 285 static void GenerateNormal(MacroAssembler* masm); |
| 291 | 286 |
| 292 static Handle<Code> initialize_stub_in_optimized_code(Isolate* isolate); | |
| 293 | |
| 294 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, | 287 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, |
| 295 Handle<Name> name); | 288 Handle<Name> name); |
| 296 | 289 |
| 297 static void Clear(Isolate* isolate, Code* host, LoadICNexus* nexus); | 290 static void Clear(Isolate* isolate, Code* host, LoadICNexus* nexus); |
| 298 | 291 |
| 299 protected: | 292 protected: |
| 300 virtual Handle<Code> slow_stub() const { | 293 virtual Handle<Code> slow_stub() const { |
| 301 return isolate()->builtins()->LoadIC_Slow(); | 294 return isolate()->builtins()->LoadIC_Slow(); |
| 302 } | 295 } |
| 303 | 296 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 314 Handle<Object> SimpleFieldLoad(FieldIndex index); | 307 Handle<Object> SimpleFieldLoad(FieldIndex index); |
| 315 | 308 |
| 316 friend class IC; | 309 friend class IC; |
| 317 }; | 310 }; |
| 318 | 311 |
| 319 class LoadGlobalIC : public LoadIC { | 312 class LoadGlobalIC : public LoadIC { |
| 320 public: | 313 public: |
| 321 LoadGlobalIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) | 314 LoadGlobalIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) |
| 322 : LoadIC(depth, isolate, nexus) {} | 315 : LoadIC(depth, isolate, nexus) {} |
| 323 | 316 |
| 324 static Handle<Code> initialize_stub_in_optimized_code( | |
| 325 Isolate* isolate, ExtraICState extra_state); | |
| 326 | |
| 327 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Name> name); | 317 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Name> name); |
| 328 | 318 |
| 329 static void Clear(Isolate* isolate, Code* host, LoadGlobalICNexus* nexus); | 319 static void Clear(Isolate* isolate, Code* host, LoadGlobalICNexus* nexus); |
| 330 | 320 |
| 331 protected: | 321 protected: |
| 332 Handle<Code> slow_stub() const override { | 322 Handle<Code> slow_stub() const override { |
| 333 if (LoadGlobalICState::GetTypeofMode(extra_ic_state()) == | 323 if (LoadGlobalICState::GetTypeofMode(extra_ic_state()) == |
| 334 NOT_INSIDE_TYPEOF) { | 324 NOT_INSIDE_TYPEOF) { |
| 335 return isolate()->builtins()->LoadGlobalIC_SlowNotInsideTypeof(); | 325 return isolate()->builtins()->LoadGlobalIC_SlowNotInsideTypeof(); |
| 336 } else { | 326 } else { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 348 } | 338 } |
| 349 | 339 |
| 350 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, | 340 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, |
| 351 Handle<Object> key); | 341 Handle<Object> key); |
| 352 | 342 |
| 353 // Code generator routines. | 343 // Code generator routines. |
| 354 static void GenerateMiss(MacroAssembler* masm); | 344 static void GenerateMiss(MacroAssembler* masm); |
| 355 static void GenerateRuntimeGetProperty(MacroAssembler* masm); | 345 static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
| 356 static void GenerateMegamorphic(MacroAssembler* masm); | 346 static void GenerateMegamorphic(MacroAssembler* masm); |
| 357 | 347 |
| 358 static Handle<Code> initialize_stub_in_optimized_code(Isolate* isolate); | |
| 359 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, | 348 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, |
| 360 ExtraICState extra_state); | 349 ExtraICState extra_state); |
| 361 | 350 |
| 362 static void Clear(Isolate* isolate, Code* host, KeyedLoadICNexus* nexus); | 351 static void Clear(Isolate* isolate, Code* host, KeyedLoadICNexus* nexus); |
| 363 | 352 |
| 364 protected: | 353 protected: |
| 365 // receiver is HeapObject because it could be a String or a JSObject | 354 // receiver is HeapObject because it could be a String or a JSObject |
| 366 void UpdateLoadElement(Handle<HeapObject> receiver); | 355 void UpdateLoadElement(Handle<HeapObject> receiver); |
| 367 | 356 |
| 368 private: | 357 private: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 379 | 368 |
| 380 LanguageMode language_mode() const { | 369 LanguageMode language_mode() const { |
| 381 return StoreICState::GetLanguageMode(extra_ic_state()); | 370 return StoreICState::GetLanguageMode(extra_ic_state()); |
| 382 } | 371 } |
| 383 | 372 |
| 384 // Code generators for stub routines. Only called once at startup. | 373 // Code generators for stub routines. Only called once at startup. |
| 385 static void GenerateSlow(MacroAssembler* masm); | 374 static void GenerateSlow(MacroAssembler* masm); |
| 386 static void GenerateMiss(MacroAssembler* masm); | 375 static void GenerateMiss(MacroAssembler* masm); |
| 387 static void GenerateNormal(MacroAssembler* masm); | 376 static void GenerateNormal(MacroAssembler* masm); |
| 388 | 377 |
| 389 static Handle<Code> initialize_stub_in_optimized_code( | |
| 390 Isolate* isolate, LanguageMode language_mode); | |
| 391 | |
| 392 MUST_USE_RESULT MaybeHandle<Object> Store( | 378 MUST_USE_RESULT MaybeHandle<Object> Store( |
| 393 Handle<Object> object, Handle<Name> name, Handle<Object> value, | 379 Handle<Object> object, Handle<Name> name, Handle<Object> value, |
| 394 JSReceiver::StoreFromKeyed store_mode = | 380 JSReceiver::StoreFromKeyed store_mode = |
| 395 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); | 381 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
| 396 | 382 |
| 397 bool LookupForWrite(LookupIterator* it, Handle<Object> value, | 383 bool LookupForWrite(LookupIterator* it, Handle<Object> value, |
| 398 JSReceiver::StoreFromKeyed store_mode); | 384 JSReceiver::StoreFromKeyed store_mode); |
| 399 | 385 |
| 400 static void Clear(Isolate* isolate, Code* host, StoreICNexus* nexus); | 386 static void Clear(Isolate* isolate, Code* host, StoreICNexus* nexus); |
| 401 | 387 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, | 431 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, |
| 446 Handle<Object> name, | 432 Handle<Object> name, |
| 447 Handle<Object> value); | 433 Handle<Object> value); |
| 448 | 434 |
| 449 // Code generators for stub routines. Only called once at startup. | 435 // Code generators for stub routines. Only called once at startup. |
| 450 static void GenerateMiss(MacroAssembler* masm); | 436 static void GenerateMiss(MacroAssembler* masm); |
| 451 static void GenerateSlow(MacroAssembler* masm); | 437 static void GenerateSlow(MacroAssembler* masm); |
| 452 static void GenerateMegamorphic(MacroAssembler* masm, | 438 static void GenerateMegamorphic(MacroAssembler* masm, |
| 453 LanguageMode language_mode); | 439 LanguageMode language_mode); |
| 454 | 440 |
| 455 static Handle<Code> initialize_stub_in_optimized_code( | |
| 456 Isolate* isolate, LanguageMode language_mode); | |
| 457 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, | 441 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, |
| 458 ExtraICState extra_state); | 442 ExtraICState extra_state); |
| 459 | 443 |
| 460 static void Clear(Isolate* isolate, Code* host, KeyedStoreICNexus* nexus); | 444 static void Clear(Isolate* isolate, Code* host, KeyedStoreICNexus* nexus); |
| 461 | 445 |
| 462 protected: | 446 protected: |
| 463 void UpdateStoreElement(Handle<Map> receiver_map, | 447 void UpdateStoreElement(Handle<Map> receiver_map, |
| 464 KeyedAccessStoreMode store_mode); | 448 KeyedAccessStoreMode store_mode); |
| 465 | 449 |
| 466 private: | 450 private: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 486 public: | 470 public: |
| 487 CompareIC(Isolate* isolate, Token::Value op) | 471 CompareIC(Isolate* isolate, Token::Value op) |
| 488 : IC(EXTRA_CALL_FRAME, isolate), op_(op) {} | 472 : IC(EXTRA_CALL_FRAME, isolate), op_(op) {} |
| 489 | 473 |
| 490 // Update the inline cache for the given operands. | 474 // Update the inline cache for the given operands. |
| 491 Code* UpdateCaches(Handle<Object> x, Handle<Object> y); | 475 Code* UpdateCaches(Handle<Object> x, Handle<Object> y); |
| 492 | 476 |
| 493 // Helper function for computing the condition for a compare operation. | 477 // Helper function for computing the condition for a compare operation. |
| 494 static Condition ComputeCondition(Token::Value op); | 478 static Condition ComputeCondition(Token::Value op); |
| 495 | 479 |
| 496 // Factory method for getting an uninitialized compare stub. | |
| 497 static Handle<Code> GetUninitialized(Isolate* isolate, Token::Value op); | |
| 498 | |
| 499 private: | 480 private: |
| 500 static bool HasInlinedSmiCode(Address address); | 481 static bool HasInlinedSmiCode(Address address); |
| 501 | 482 |
| 502 bool strict() const { return op_ == Token::EQ_STRICT; } | 483 bool strict() const { return op_ == Token::EQ_STRICT; } |
| 503 Condition GetCondition() const { return ComputeCondition(op_); } | 484 Condition GetCondition() const { return ComputeCondition(op_); } |
| 504 | 485 |
| 505 static Code* GetRawUninitialized(Isolate* isolate, Token::Value op); | 486 static Code* GetRawUninitialized(Isolate* isolate, Token::Value op); |
| 506 | 487 |
| 507 static void Clear(Isolate* isolate, Address address, Code* target, | 488 static void Clear(Isolate* isolate, Address address, Code* target, |
| 508 Address constant_pool); | 489 Address constant_pool); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 523 | 504 |
| 524 // Helper for BinaryOpIC and CompareIC. | 505 // Helper for BinaryOpIC and CompareIC. |
| 525 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; | 506 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; |
| 526 void PatchInlinedSmiCode(Isolate* isolate, Address address, | 507 void PatchInlinedSmiCode(Isolate* isolate, Address address, |
| 527 InlinedSmiCheck check); | 508 InlinedSmiCheck check); |
| 528 | 509 |
| 529 } // namespace internal | 510 } // namespace internal |
| 530 } // namespace v8 | 511 } // namespace v8 |
| 531 | 512 |
| 532 #endif // V8_IC_H_ | 513 #endif // V8_IC_H_ |
| OLD | NEW |