| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 | 351 |
| 352 | 352 |
| 353 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { | 353 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { |
| 354 return DoGenerateCode(this); | 354 return DoGenerateCode(this); |
| 355 } | 355 } |
| 356 | 356 |
| 357 | 357 |
| 358 template <> | 358 template <> |
| 359 HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() { | 359 HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() { |
| 360 Zone* zone = this->zone(); | 360 Zone* zone = this->zone(); |
| 361 Factory* factory = isolate()->factory(); | |
| 362 HValue* undefined = graph()->GetConstantUndefined(); | 361 HValue* undefined = graph()->GetConstantUndefined(); |
| 363 | 362 |
| 364 HInstruction* boilerplate = | 363 HInstruction* boilerplate = |
| 365 AddInstruction(new(zone) HLoadKeyed(GetParameter(0), | 364 AddInstruction(new(zone) HLoadKeyed(GetParameter(0), |
| 366 GetParameter(1), | 365 GetParameter(1), |
| 367 NULL, | 366 NULL, |
| 368 FAST_ELEMENTS)); | 367 FAST_ELEMENTS)); |
| 369 | 368 |
| 370 IfBuilder checker(this); | 369 IfBuilder checker(this); |
| 371 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(boilerplate, undefined); | 370 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(boilerplate, undefined); |
| 372 checker.And(); | 371 checker.And(); |
| 373 | 372 |
| 374 int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize; | 373 int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize; |
| 375 HValue* boilerplate_size = | 374 HValue* boilerplate_size = |
| 376 AddInstruction(new(zone) HInstanceSize(boilerplate)); | 375 AddInstruction(new(zone) HInstanceSize(boilerplate)); |
| 377 HValue* size_in_words = | 376 HValue* size_in_words = |
| 378 AddInstruction(new(zone) HConstant(size >> kPointerSizeLog2, | 377 AddInstruction(new(zone) HConstant(size >> kPointerSizeLog2, |
| 379 Representation::Integer32())); | 378 Representation::Integer32())); |
| 380 checker.IfCompare(boilerplate_size, size_in_words, Token::EQ); | 379 checker.IfCompare(boilerplate_size, size_in_words, Token::EQ); |
| 381 checker.Then(); | 380 checker.Then(); |
| 382 | 381 |
| 383 HValue* size_in_bytes = | 382 HValue* size_in_bytes = |
| 384 AddInstruction(new(zone) HConstant(size, Representation::Integer32())); | 383 AddInstruction(new(zone) HConstant(size, Representation::Integer32())); |
| 385 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE; | 384 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE; |
| 386 if (FLAG_pretenure_literals) { | 385 if (FLAG_pretenure_literals) { |
| 387 flags = static_cast<HAllocate::Flags>( | 386 flags = static_cast<HAllocate::Flags>( |
| 388 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); | 387 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); |
| 389 } | 388 } |
| 390 HInstruction* object = | 389 |
| 391 AddInstruction(new(zone) HAllocate(context(), | 390 HInstruction* object = AddInstruction(new(zone) |
| 392 size_in_bytes, | 391 HAllocate(context(), size_in_bytes, HType::JSObject(), flags)); |
| 393 HType::JSObject(), | |
| 394 flags)); | |
| 395 | 392 |
| 396 for (int i = 0; i < size; i += kPointerSize) { | 393 for (int i = 0; i < size; i += kPointerSize) { |
| 397 HInstruction* value = | 394 HObjectAccess access = HObjectAccess::ForJSObjectOffset(i); |
| 398 AddInstruction(new(zone) HLoadNamedField( | 395 AddStore(object, access, AddLoad(boilerplate, access)); |
| 399 boilerplate, true, Representation::Tagged(), i)); | |
| 400 AddInstruction(new(zone) HStoreNamedField(object, | |
| 401 factory->empty_string(), | |
| 402 value, true, | |
| 403 Representation::Tagged(), i)); | |
| 404 } | 396 } |
| 405 | 397 |
| 406 checker.ElseDeopt(); | 398 checker.ElseDeopt(); |
| 407 return object; | 399 return object; |
| 408 } | 400 } |
| 409 | 401 |
| 410 | 402 |
| 411 Handle<Code> FastCloneShallowObjectStub::GenerateCode() { | 403 Handle<Code> FastCloneShallowObjectStub::GenerateCode() { |
| 412 return DoGenerateCode(this); | 404 return DoGenerateCode(this); |
| 413 } | 405 } |
| 414 | 406 |
| 415 | 407 |
| 416 template <> | 408 template <> |
| 417 HValue* CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() { | 409 HValue* CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() { |
| 418 HInstruction* load = BuildUncheckedMonomorphicElementAccess( | 410 HInstruction* load = BuildUncheckedMonomorphicElementAccess( |
| 419 GetParameter(0), GetParameter(1), NULL, NULL, | 411 GetParameter(0), GetParameter(1), NULL, NULL, |
| 420 casted_stub()->is_js_array(), casted_stub()->elements_kind(), | 412 casted_stub()->is_js_array(), casted_stub()->elements_kind(), |
| 421 false, NEVER_RETURN_HOLE, STANDARD_STORE, Representation::Tagged()); | 413 false, NEVER_RETURN_HOLE, STANDARD_STORE, Representation::Tagged()); |
| 422 return load; | 414 return load; |
| 423 } | 415 } |
| 424 | 416 |
| 425 | 417 |
| 426 Handle<Code> KeyedLoadFastElementStub::GenerateCode() { | 418 Handle<Code> KeyedLoadFastElementStub::GenerateCode() { |
| 427 return DoGenerateCode(this); | 419 return DoGenerateCode(this); |
| 428 } | 420 } |
| 429 | 421 |
| 430 | 422 |
| 431 template<> | 423 template<> |
| 432 HValue* CodeStubGraphBuilder<LoadFieldStub>::BuildCodeStub() { | 424 HValue* CodeStubGraphBuilder<LoadFieldStub>::BuildCodeStub() { |
| 433 Representation representation = casted_stub()->representation(); | 425 HObjectAccess access = casted_stub()->is_inobject() ? |
| 434 HInstruction* load = AddInstruction(DoBuildLoadNamedField( | 426 HObjectAccess::ForJSObjectOffset(casted_stub()->offset()) : |
| 435 GetParameter(0), casted_stub()->is_inobject(), | 427 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset()); |
| 436 representation, casted_stub()->offset())); | 428 return AddInstruction(BuildLoadNamedField(GetParameter(0), access, |
| 437 return load; | 429 casted_stub()->representation())); |
| 438 } | 430 } |
| 439 | 431 |
| 440 | 432 |
| 441 Handle<Code> LoadFieldStub::GenerateCode() { | 433 Handle<Code> LoadFieldStub::GenerateCode() { |
| 442 return DoGenerateCode(this); | 434 return DoGenerateCode(this); |
| 443 } | 435 } |
| 444 | 436 |
| 445 | 437 |
| 446 template<> | 438 template<> |
| 447 HValue* CodeStubGraphBuilder<KeyedLoadFieldStub>::BuildCodeStub() { | 439 HValue* CodeStubGraphBuilder<KeyedLoadFieldStub>::BuildCodeStub() { |
| 448 Representation representation = casted_stub()->representation(); | 440 HObjectAccess access = casted_stub()->is_inobject() ? |
| 449 HInstruction* load = AddInstruction(DoBuildLoadNamedField( | 441 HObjectAccess::ForJSObjectOffset(casted_stub()->offset()) : |
| 450 GetParameter(0), casted_stub()->is_inobject(), | 442 HObjectAccess::ForBackingStoreOffset(casted_stub()->offset()); |
| 451 representation, casted_stub()->offset())); | 443 return AddInstruction(BuildLoadNamedField(GetParameter(0), access, |
| 452 return load; | 444 casted_stub()->representation())); |
| 453 } | 445 } |
| 454 | 446 |
| 455 | 447 |
| 456 Handle<Code> KeyedLoadFieldStub::GenerateCode() { | 448 Handle<Code> KeyedLoadFieldStub::GenerateCode() { |
| 457 return DoGenerateCode(this); | 449 return DoGenerateCode(this); |
| 458 } | 450 } |
| 459 | 451 |
| 460 | 452 |
| 461 template <> | 453 template <> |
| 462 HValue* CodeStubGraphBuilder<KeyedStoreFastElementStub>::BuildCodeStub() { | 454 HValue* CodeStubGraphBuilder<KeyedStoreFastElementStub>::BuildCodeStub() { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 480 Zone* zone = this->zone(); | 472 Zone* zone = this->zone(); |
| 481 | 473 |
| 482 HValue* js_array = GetParameter(0); | 474 HValue* js_array = GetParameter(0); |
| 483 HValue* map = GetParameter(1); | 475 HValue* map = GetParameter(1); |
| 484 | 476 |
| 485 info()->MarkAsSavesCallerDoubles(); | 477 info()->MarkAsSavesCallerDoubles(); |
| 486 | 478 |
| 487 AddInstruction(new(zone) HTrapAllocationMemento(js_array)); | 479 AddInstruction(new(zone) HTrapAllocationMemento(js_array)); |
| 488 | 480 |
| 489 HInstruction* array_length = | 481 HInstruction* array_length = |
| 490 AddInstruction(HLoadNamedField::NewArrayLength( | 482 AddLoad(js_array, HObjectAccess::ForArrayLength()); |
| 491 zone, js_array, js_array, HType::Smi())); | 483 array_length->set_type(HType::Smi()); |
| 492 | 484 |
| 493 ElementsKind to_kind = casted_stub()->to_kind(); | 485 ElementsKind to_kind = casted_stub()->to_kind(); |
| 494 BuildNewSpaceArrayCheck(array_length, to_kind); | 486 BuildNewSpaceArrayCheck(array_length, to_kind); |
| 495 | 487 |
| 496 IfBuilder if_builder(this); | 488 IfBuilder if_builder(this); |
| 497 | 489 |
| 498 if_builder.IfCompare(array_length, graph()->GetConstant0(), Token::EQ); | 490 if_builder.IfCompare(array_length, graph()->GetConstant0(), Token::EQ); |
| 499 if_builder.Then(); | 491 if_builder.Then(); |
| 500 | 492 |
| 501 // Nothing to do, just change the map. | 493 // Nothing to do, just change the map. |
| 502 | 494 |
| 503 if_builder.Else(); | 495 if_builder.Else(); |
| 504 | 496 |
| 505 HInstruction* elements = AddLoadElements(js_array); | 497 HInstruction* elements = AddLoadElements(js_array); |
| 506 | 498 |
| 507 HInstruction* elements_length = | 499 HInstruction* elements_length = |
| 508 AddInstruction(new(zone) HFixedArrayBaseLength(elements)); | 500 AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
| 509 | 501 |
| 510 HValue* new_elements = | 502 HValue* new_elements = |
| 511 BuildAllocateAndInitializeElements(context(), to_kind, elements_length); | 503 BuildAllocateAndInitializeElements(context(), to_kind, elements_length); |
| 512 | 504 |
| 513 BuildCopyElements(context(), elements, | 505 BuildCopyElements(context(), elements, |
| 514 casted_stub()->from_kind(), new_elements, | 506 casted_stub()->from_kind(), new_elements, |
| 515 to_kind, array_length, elements_length); | 507 to_kind, array_length, elements_length); |
| 516 | 508 |
| 517 Factory* factory = isolate()->factory(); | 509 AddStore(js_array, HObjectAccess::ForElementsPointer(), new_elements); |
| 518 | |
| 519 AddInstruction(new(zone) HStoreNamedField(js_array, | |
| 520 factory->elements_field_string(), | |
| 521 new_elements, true, | |
| 522 Representation::Tagged(), | |
| 523 JSArray::kElementsOffset)); | |
| 524 | 510 |
| 525 if_builder.End(); | 511 if_builder.End(); |
| 526 | 512 |
| 527 AddInstruction(new(zone) HStoreNamedField(js_array, factory->length_string(), | 513 AddStore(js_array, HObjectAccess::ForMap(), map); |
| 528 map, true, | 514 |
| 529 Representation::Tagged(), | |
| 530 JSArray::kMapOffset)); | |
| 531 return js_array; | 515 return js_array; |
| 532 } | 516 } |
| 533 | 517 |
| 534 | 518 |
| 535 Handle<Code> TransitionElementsKindStub::GenerateCode() { | 519 Handle<Code> TransitionElementsKindStub::GenerateCode() { |
| 536 return DoGenerateCode(this); | 520 return DoGenerateCode(this); |
| 537 } | 521 } |
| 538 | 522 |
| 539 | 523 |
| 540 template <> | 524 template <> |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 ? graph()->GetConstantSmi1() | 678 ? graph()->GetConstantSmi1() |
| 695 : graph()->GetConstantUndefined(); | 679 : graph()->GetConstantUndefined(); |
| 696 } | 680 } |
| 697 | 681 |
| 698 | 682 |
| 699 Handle<Code> CompareNilICStub::GenerateCode() { | 683 Handle<Code> CompareNilICStub::GenerateCode() { |
| 700 return DoGenerateCode(this); | 684 return DoGenerateCode(this); |
| 701 } | 685 } |
| 702 | 686 |
| 703 } } // namespace v8::internal | 687 } } // namespace v8::internal |
| OLD | NEW |