| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 458 |
| 459 // Signal that we don't inline smi code before these stubs in the | 459 // Signal that we don't inline smi code before these stubs in the |
| 460 // optimizing code generator. | 460 // optimizing code generator. |
| 461 if (code->kind() == Code::TYPE_RECORDING_BINARY_OP_IC || | 461 if (code->kind() == Code::TYPE_RECORDING_BINARY_OP_IC || |
| 462 code->kind() == Code::COMPARE_IC) { | 462 code->kind() == Code::COMPARE_IC) { |
| 463 __ nop(); | 463 __ nop(); |
| 464 } | 464 } |
| 465 } | 465 } |
| 466 | 466 |
| 467 | 467 |
| 468 void LCodeGen::CallRuntime(Runtime::Function* function, | 468 void LCodeGen::CallRuntime(const Runtime::Function* function, |
| 469 int num_arguments, | 469 int num_arguments, |
| 470 LInstruction* instr) { | 470 LInstruction* instr) { |
| 471 ASSERT(instr != NULL); | 471 ASSERT(instr != NULL); |
| 472 ASSERT(instr->HasPointerMap()); | 472 ASSERT(instr->HasPointerMap()); |
| 473 LPointerMap* pointers = instr->pointer_map(); | 473 LPointerMap* pointers = instr->pointer_map(); |
| 474 RecordPosition(pointers->position()); | 474 RecordPosition(pointers->position()); |
| 475 | 475 |
| 476 __ CallRuntime(function, num_arguments); | 476 __ CallRuntime(function, num_arguments); |
| 477 RegisterLazyDeoptimization(instr); | 477 RegisterLazyDeoptimization(instr); |
| 478 } | 478 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 __ j(cc, &jump_table_.last().label); | 546 __ j(cc, &jump_table_.last().label); |
| 547 } | 547 } |
| 548 } | 548 } |
| 549 | 549 |
| 550 | 550 |
| 551 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 551 void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { |
| 552 int length = deoptimizations_.length(); | 552 int length = deoptimizations_.length(); |
| 553 if (length == 0) return; | 553 if (length == 0) return; |
| 554 ASSERT(FLAG_deopt); | 554 ASSERT(FLAG_deopt); |
| 555 Handle<DeoptimizationInputData> data = | 555 Handle<DeoptimizationInputData> data = |
| 556 Factory::NewDeoptimizationInputData(length, TENURED); | 556 factory()->NewDeoptimizationInputData(length, TENURED); |
| 557 | 557 |
| 558 Handle<ByteArray> translations = translations_.CreateByteArray(); | 558 Handle<ByteArray> translations = translations_.CreateByteArray(); |
| 559 data->SetTranslationByteArray(*translations); | 559 data->SetTranslationByteArray(*translations); |
| 560 data->SetInlinedFunctionCount(Smi::FromInt(inlined_function_count_)); | 560 data->SetInlinedFunctionCount(Smi::FromInt(inlined_function_count_)); |
| 561 | 561 |
| 562 Handle<FixedArray> literals = | 562 Handle<FixedArray> literals = |
| 563 Factory::NewFixedArray(deoptimization_literals_.length(), TENURED); | 563 factory()->NewFixedArray(deoptimization_literals_.length(), TENURED); |
| 564 for (int i = 0; i < deoptimization_literals_.length(); i++) { | 564 for (int i = 0; i < deoptimization_literals_.length(); i++) { |
| 565 literals->set(i, *deoptimization_literals_[i]); | 565 literals->set(i, *deoptimization_literals_[i]); |
| 566 } | 566 } |
| 567 data->SetLiteralArray(*literals); | 567 data->SetLiteralArray(*literals); |
| 568 | 568 |
| 569 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id())); | 569 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id())); |
| 570 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); | 570 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); |
| 571 | 571 |
| 572 // Populate the deoptimization entries. | 572 // Populate the deoptimization entries. |
| 573 for (int i = 0; i < length; i++) { | 573 for (int i = 0; i < length; i++) { |
| (...skipping 1329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1903 __ JumpIfSmi(object, &false_result); | 1903 __ JumpIfSmi(object, &false_result); |
| 1904 | 1904 |
| 1905 // This is the inlined call site instanceof cache. The two occurences of the | 1905 // This is the inlined call site instanceof cache. The two occurences of the |
| 1906 // hole value will be patched to the last map/result pair generated by the | 1906 // hole value will be patched to the last map/result pair generated by the |
| 1907 // instanceof stub. | 1907 // instanceof stub. |
| 1908 NearLabel cache_miss; | 1908 NearLabel cache_miss; |
| 1909 // Use a temp register to avoid memory operands with variable lengths. | 1909 // Use a temp register to avoid memory operands with variable lengths. |
| 1910 Register map = ToRegister(instr->TempAt(0)); | 1910 Register map = ToRegister(instr->TempAt(0)); |
| 1911 __ movq(map, FieldOperand(object, HeapObject::kMapOffset)); | 1911 __ movq(map, FieldOperand(object, HeapObject::kMapOffset)); |
| 1912 __ bind(deferred->map_check()); // Label for calculating code patching. | 1912 __ bind(deferred->map_check()); // Label for calculating code patching. |
| 1913 __ Move(kScratchRegister, Factory::the_hole_value()); | 1913 __ Move(kScratchRegister, factory()->the_hole_value()); |
| 1914 __ cmpq(map, kScratchRegister); // Patched to cached map. | 1914 __ cmpq(map, kScratchRegister); // Patched to cached map. |
| 1915 __ j(not_equal, &cache_miss); | 1915 __ j(not_equal, &cache_miss); |
| 1916 // Patched to load either true or false. | 1916 // Patched to load either true or false. |
| 1917 __ LoadRoot(ToRegister(instr->result()), Heap::kTheHoleValueRootIndex); | 1917 __ LoadRoot(ToRegister(instr->result()), Heap::kTheHoleValueRootIndex); |
| 1918 #ifdef DEBUG | 1918 #ifdef DEBUG |
| 1919 // Check that the code size between patch label and patch sites is invariant. | 1919 // Check that the code size between patch label and patch sites is invariant. |
| 1920 Label end_of_patched_code; | 1920 Label end_of_patched_code; |
| 1921 __ bind(&end_of_patched_code); | 1921 __ bind(&end_of_patched_code); |
| 1922 ASSERT(true); | 1922 ASSERT(true); |
| 1923 #endif | 1923 #endif |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2092 __ movq(result, FieldOperand(result, instr->hydrogen()->offset())); | 2092 __ movq(result, FieldOperand(result, instr->hydrogen()->offset())); |
| 2093 } | 2093 } |
| 2094 } | 2094 } |
| 2095 | 2095 |
| 2096 | 2096 |
| 2097 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 2097 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
| 2098 ASSERT(ToRegister(instr->object()).is(rax)); | 2098 ASSERT(ToRegister(instr->object()).is(rax)); |
| 2099 ASSERT(ToRegister(instr->result()).is(rax)); | 2099 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2100 | 2100 |
| 2101 __ Move(rcx, instr->name()); | 2101 __ Move(rcx, instr->name()); |
| 2102 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); | 2102 Handle<Code> ic(isolate()->builtins()->builtin(Builtins::LoadIC_Initialize)); |
| 2103 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2103 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2104 } | 2104 } |
| 2105 | 2105 |
| 2106 | 2106 |
| 2107 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { | 2107 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
| 2108 Register function = ToRegister(instr->function()); | 2108 Register function = ToRegister(instr->function()); |
| 2109 Register result = ToRegister(instr->result()); | 2109 Register result = ToRegister(instr->result()); |
| 2110 | 2110 |
| 2111 // Check that the function really is a function. | 2111 // Check that the function really is a function. |
| 2112 __ CmpObjectType(function, JS_FUNCTION_TYPE, result); | 2112 __ CmpObjectType(function, JS_FUNCTION_TYPE, result); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2218 | 2218 |
| 2219 // Load the result. | 2219 // Load the result. |
| 2220 __ movzxbq(result, Operand(external_elements, key, times_1, 0)); | 2220 __ movzxbq(result, Operand(external_elements, key, times_1, 0)); |
| 2221 } | 2221 } |
| 2222 | 2222 |
| 2223 | 2223 |
| 2224 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { | 2224 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { |
| 2225 ASSERT(ToRegister(instr->object()).is(rdx)); | 2225 ASSERT(ToRegister(instr->object()).is(rdx)); |
| 2226 ASSERT(ToRegister(instr->key()).is(rax)); | 2226 ASSERT(ToRegister(instr->key()).is(rax)); |
| 2227 | 2227 |
| 2228 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 2228 Handle<Code> ic(isolate()->builtins()->builtin( |
| 2229 Builtins::KeyedLoadIC_Initialize)); |
| 2229 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2230 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2230 } | 2231 } |
| 2231 | 2232 |
| 2232 | 2233 |
| 2233 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { | 2234 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { |
| 2234 Register result = ToRegister(instr->result()); | 2235 Register result = ToRegister(instr->result()); |
| 2235 | 2236 |
| 2236 // Check for arguments adapter frame. | 2237 // Check for arguments adapter frame. |
| 2237 NearLabel done, adapted; | 2238 NearLabel done, adapted; |
| 2238 __ movq(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 2239 __ movq(result, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2717 UNREACHABLE(); | 2718 UNREACHABLE(); |
| 2718 } | 2719 } |
| 2719 } | 2720 } |
| 2720 | 2721 |
| 2721 | 2722 |
| 2722 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { | 2723 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { |
| 2723 ASSERT(ToRegister(instr->key()).is(rcx)); | 2724 ASSERT(ToRegister(instr->key()).is(rcx)); |
| 2724 ASSERT(ToRegister(instr->result()).is(rax)); | 2725 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2725 | 2726 |
| 2726 int arity = instr->arity(); | 2727 int arity = instr->arity(); |
| 2727 Handle<Code> ic = StubCache::ComputeKeyedCallInitialize(arity, NOT_IN_LOOP); | 2728 Handle<Code> ic = isolate()->stub_cache()->ComputeKeyedCallInitialize( |
| 2729 arity, NOT_IN_LOOP); |
| 2728 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2730 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2729 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2731 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 2730 } | 2732 } |
| 2731 | 2733 |
| 2732 | 2734 |
| 2733 void LCodeGen::DoCallNamed(LCallNamed* instr) { | 2735 void LCodeGen::DoCallNamed(LCallNamed* instr) { |
| 2734 ASSERT(ToRegister(instr->result()).is(rax)); | 2736 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2735 | 2737 |
| 2736 int arity = instr->arity(); | 2738 int arity = instr->arity(); |
| 2737 Handle<Code> ic = StubCache::ComputeCallInitialize(arity, NOT_IN_LOOP); | 2739 Handle<Code> ic = isolate()->stub_cache()->ComputeCallInitialize( |
| 2740 arity, NOT_IN_LOOP); |
| 2738 __ Move(rcx, instr->name()); | 2741 __ Move(rcx, instr->name()); |
| 2739 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2742 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2740 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2743 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 2741 } | 2744 } |
| 2742 | 2745 |
| 2743 | 2746 |
| 2744 void LCodeGen::DoCallFunction(LCallFunction* instr) { | 2747 void LCodeGen::DoCallFunction(LCallFunction* instr) { |
| 2745 ASSERT(ToRegister(instr->result()).is(rax)); | 2748 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2746 | 2749 |
| 2747 int arity = instr->arity(); | 2750 int arity = instr->arity(); |
| 2748 CallFunctionStub stub(arity, NOT_IN_LOOP, RECEIVER_MIGHT_BE_VALUE); | 2751 CallFunctionStub stub(arity, NOT_IN_LOOP, RECEIVER_MIGHT_BE_VALUE); |
| 2749 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 2752 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 2750 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2753 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 2751 __ Drop(1); | 2754 __ Drop(1); |
| 2752 } | 2755 } |
| 2753 | 2756 |
| 2754 | 2757 |
| 2755 void LCodeGen::DoCallGlobal(LCallGlobal* instr) { | 2758 void LCodeGen::DoCallGlobal(LCallGlobal* instr) { |
| 2756 ASSERT(ToRegister(instr->result()).is(rax)); | 2759 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2757 int arity = instr->arity(); | 2760 int arity = instr->arity(); |
| 2758 Handle<Code> ic = StubCache::ComputeCallInitialize(arity, NOT_IN_LOOP); | 2761 Handle<Code> ic = isolate()->stub_cache()->ComputeCallInitialize( |
| 2762 arity, NOT_IN_LOOP); |
| 2759 __ Move(rcx, instr->name()); | 2763 __ Move(rcx, instr->name()); |
| 2760 CallCode(ic, RelocInfo::CODE_TARGET_CONTEXT, instr); | 2764 CallCode(ic, RelocInfo::CODE_TARGET_CONTEXT, instr); |
| 2761 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2765 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 2762 } | 2766 } |
| 2763 | 2767 |
| 2764 | 2768 |
| 2765 void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { | 2769 void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
| 2766 ASSERT(ToRegister(instr->result()).is(rax)); | 2770 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2767 __ Move(rdi, instr->target()); | 2771 __ Move(rdi, instr->target()); |
| 2768 CallKnownFunction(instr->target(), instr->arity(), instr); | 2772 CallKnownFunction(instr->target(), instr->arity(), instr); |
| 2769 } | 2773 } |
| 2770 | 2774 |
| 2771 | 2775 |
| 2772 void LCodeGen::DoCallNew(LCallNew* instr) { | 2776 void LCodeGen::DoCallNew(LCallNew* instr) { |
| 2773 ASSERT(ToRegister(instr->InputAt(0)).is(rdi)); | 2777 ASSERT(ToRegister(instr->InputAt(0)).is(rdi)); |
| 2774 ASSERT(ToRegister(instr->result()).is(rax)); | 2778 ASSERT(ToRegister(instr->result()).is(rax)); |
| 2775 | 2779 |
| 2776 Handle<Code> builtin(Builtins::builtin(Builtins::JSConstructCall)); | 2780 Handle<Code> builtin(isolate()->builtins()->builtin( |
| 2781 Builtins::JSConstructCall)); |
| 2777 __ Set(rax, instr->arity()); | 2782 __ Set(rax, instr->arity()); |
| 2778 CallCode(builtin, RelocInfo::CONSTRUCT_CALL, instr); | 2783 CallCode(builtin, RelocInfo::CONSTRUCT_CALL, instr); |
| 2779 } | 2784 } |
| 2780 | 2785 |
| 2781 | 2786 |
| 2782 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { | 2787 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { |
| 2783 CallRuntime(instr->function(), instr->arity(), instr); | 2788 CallRuntime(instr->function(), instr->arity(), instr); |
| 2784 } | 2789 } |
| 2785 | 2790 |
| 2786 | 2791 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2812 } | 2817 } |
| 2813 } | 2818 } |
| 2814 } | 2819 } |
| 2815 | 2820 |
| 2816 | 2821 |
| 2817 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 2822 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 2818 ASSERT(ToRegister(instr->object()).is(rdx)); | 2823 ASSERT(ToRegister(instr->object()).is(rdx)); |
| 2819 ASSERT(ToRegister(instr->value()).is(rax)); | 2824 ASSERT(ToRegister(instr->value()).is(rax)); |
| 2820 | 2825 |
| 2821 __ Move(rcx, instr->hydrogen()->name()); | 2826 __ Move(rcx, instr->hydrogen()->name()); |
| 2822 Handle<Code> ic(Builtins::builtin( | 2827 Handle<Code> ic(isolate()->builtins()->builtin( |
| 2823 info_->is_strict() ? Builtins::StoreIC_Initialize_Strict | 2828 info_->is_strict() ? Builtins::StoreIC_Initialize_Strict |
| 2824 : Builtins::StoreIC_Initialize)); | 2829 : Builtins::StoreIC_Initialize)); |
| 2825 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2830 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2826 } | 2831 } |
| 2827 | 2832 |
| 2828 | 2833 |
| 2829 void LCodeGen::DoStorePixelArrayElement(LStorePixelArrayElement* instr) { | 2834 void LCodeGen::DoStorePixelArrayElement(LStorePixelArrayElement* instr) { |
| 2830 Register external_pointer = ToRegister(instr->external_pointer()); | 2835 Register external_pointer = ToRegister(instr->external_pointer()); |
| 2831 Register key = ToRegister(instr->key()); | 2836 Register key = ToRegister(instr->key()); |
| 2832 Register value = ToRegister(instr->value()); | 2837 Register value = ToRegister(instr->value()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2883 __ RecordWrite(elements, key, value); | 2888 __ RecordWrite(elements, key, value); |
| 2884 } | 2889 } |
| 2885 } | 2890 } |
| 2886 | 2891 |
| 2887 | 2892 |
| 2888 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 2893 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 2889 ASSERT(ToRegister(instr->object()).is(rdx)); | 2894 ASSERT(ToRegister(instr->object()).is(rdx)); |
| 2890 ASSERT(ToRegister(instr->key()).is(rcx)); | 2895 ASSERT(ToRegister(instr->key()).is(rcx)); |
| 2891 ASSERT(ToRegister(instr->value()).is(rax)); | 2896 ASSERT(ToRegister(instr->value()).is(rax)); |
| 2892 | 2897 |
| 2893 Handle<Code> ic(Builtins::builtin( | 2898 Handle<Code> ic(isolate()->builtins()->builtin( |
| 2894 info_->is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict | 2899 info_->is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict |
| 2895 : Builtins::KeyedStoreIC_Initialize)); | 2900 : Builtins::KeyedStoreIC_Initialize)); |
| 2896 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2901 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2897 } | 2902 } |
| 2898 | 2903 |
| 2899 | 2904 |
| 2900 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { | 2905 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { |
| 2901 class DeferredStringCharCodeAt: public LDeferredCode { | 2906 class DeferredStringCharCodeAt: public LDeferredCode { |
| 2902 public: | 2907 public: |
| 2903 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) | 2908 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3392 LOperand* input = instr->InputAt(0); | 3397 LOperand* input = instr->InputAt(0); |
| 3393 ASSERT(input->IsRegister()); | 3398 ASSERT(input->IsRegister()); |
| 3394 Register reg = ToRegister(input); | 3399 Register reg = ToRegister(input); |
| 3395 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), | 3400 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), |
| 3396 instr->hydrogen()->map()); | 3401 instr->hydrogen()->map()); |
| 3397 DeoptimizeIf(not_equal, instr->environment()); | 3402 DeoptimizeIf(not_equal, instr->environment()); |
| 3398 } | 3403 } |
| 3399 | 3404 |
| 3400 | 3405 |
| 3401 void LCodeGen::LoadHeapObject(Register result, Handle<HeapObject> object) { | 3406 void LCodeGen::LoadHeapObject(Register result, Handle<HeapObject> object) { |
| 3402 if (Heap::InNewSpace(*object)) { | 3407 if (heap()->InNewSpace(*object)) { |
| 3403 Handle<JSGlobalPropertyCell> cell = | 3408 Handle<JSGlobalPropertyCell> cell = |
| 3404 Factory::NewJSGlobalPropertyCell(object); | 3409 factory()->NewJSGlobalPropertyCell(object); |
| 3405 __ movq(result, cell, RelocInfo::GLOBAL_PROPERTY_CELL); | 3410 __ movq(result, cell, RelocInfo::GLOBAL_PROPERTY_CELL); |
| 3406 __ movq(result, Operand(result, 0)); | 3411 __ movq(result, Operand(result, 0)); |
| 3407 } else { | 3412 } else { |
| 3408 __ Move(result, object); | 3413 __ Move(result, object); |
| 3409 } | 3414 } |
| 3410 } | 3415 } |
| 3411 | 3416 |
| 3412 | 3417 |
| 3413 void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { | 3418 void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
| 3414 Register reg = ToRegister(instr->TempAt(0)); | 3419 Register reg = ToRegister(instr->TempAt(0)); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3623 | 3628 |
| 3624 EmitBranch(true_block, false_block, final_branch_condition); | 3629 EmitBranch(true_block, false_block, final_branch_condition); |
| 3625 } | 3630 } |
| 3626 | 3631 |
| 3627 | 3632 |
| 3628 Condition LCodeGen::EmitTypeofIs(Label* true_label, | 3633 Condition LCodeGen::EmitTypeofIs(Label* true_label, |
| 3629 Label* false_label, | 3634 Label* false_label, |
| 3630 Register input, | 3635 Register input, |
| 3631 Handle<String> type_name) { | 3636 Handle<String> type_name) { |
| 3632 Condition final_branch_condition = no_condition; | 3637 Condition final_branch_condition = no_condition; |
| 3633 if (type_name->Equals(Heap::number_symbol())) { | 3638 if (type_name->Equals(heap()->number_symbol())) { |
| 3634 __ JumpIfSmi(input, true_label); | 3639 __ JumpIfSmi(input, true_label); |
| 3635 __ CompareRoot(FieldOperand(input, HeapObject::kMapOffset), | 3640 __ CompareRoot(FieldOperand(input, HeapObject::kMapOffset), |
| 3636 Heap::kHeapNumberMapRootIndex); | 3641 Heap::kHeapNumberMapRootIndex); |
| 3637 | 3642 |
| 3638 final_branch_condition = equal; | 3643 final_branch_condition = equal; |
| 3639 | 3644 |
| 3640 } else if (type_name->Equals(Heap::string_symbol())) { | 3645 } else if (type_name->Equals(heap()->string_symbol())) { |
| 3641 __ JumpIfSmi(input, false_label); | 3646 __ JumpIfSmi(input, false_label); |
| 3642 __ CmpObjectType(input, FIRST_NONSTRING_TYPE, input); | 3647 __ CmpObjectType(input, FIRST_NONSTRING_TYPE, input); |
| 3643 __ j(above_equal, false_label); | 3648 __ j(above_equal, false_label); |
| 3644 __ testb(FieldOperand(input, Map::kBitFieldOffset), | 3649 __ testb(FieldOperand(input, Map::kBitFieldOffset), |
| 3645 Immediate(1 << Map::kIsUndetectable)); | 3650 Immediate(1 << Map::kIsUndetectable)); |
| 3646 final_branch_condition = zero; | 3651 final_branch_condition = zero; |
| 3647 | 3652 |
| 3648 } else if (type_name->Equals(Heap::boolean_symbol())) { | 3653 } else if (type_name->Equals(heap()->boolean_symbol())) { |
| 3649 __ CompareRoot(input, Heap::kTrueValueRootIndex); | 3654 __ CompareRoot(input, Heap::kTrueValueRootIndex); |
| 3650 __ j(equal, true_label); | 3655 __ j(equal, true_label); |
| 3651 __ CompareRoot(input, Heap::kFalseValueRootIndex); | 3656 __ CompareRoot(input, Heap::kFalseValueRootIndex); |
| 3652 final_branch_condition = equal; | 3657 final_branch_condition = equal; |
| 3653 | 3658 |
| 3654 } else if (type_name->Equals(Heap::undefined_symbol())) { | 3659 } else if (type_name->Equals(heap()->undefined_symbol())) { |
| 3655 __ CompareRoot(input, Heap::kUndefinedValueRootIndex); | 3660 __ CompareRoot(input, Heap::kUndefinedValueRootIndex); |
| 3656 __ j(equal, true_label); | 3661 __ j(equal, true_label); |
| 3657 __ JumpIfSmi(input, false_label); | 3662 __ JumpIfSmi(input, false_label); |
| 3658 // Check for undetectable objects => true. | 3663 // Check for undetectable objects => true. |
| 3659 __ movq(input, FieldOperand(input, HeapObject::kMapOffset)); | 3664 __ movq(input, FieldOperand(input, HeapObject::kMapOffset)); |
| 3660 __ testb(FieldOperand(input, Map::kBitFieldOffset), | 3665 __ testb(FieldOperand(input, Map::kBitFieldOffset), |
| 3661 Immediate(1 << Map::kIsUndetectable)); | 3666 Immediate(1 << Map::kIsUndetectable)); |
| 3662 final_branch_condition = not_zero; | 3667 final_branch_condition = not_zero; |
| 3663 | 3668 |
| 3664 } else if (type_name->Equals(Heap::function_symbol())) { | 3669 } else if (type_name->Equals(heap()->function_symbol())) { |
| 3665 __ JumpIfSmi(input, false_label); | 3670 __ JumpIfSmi(input, false_label); |
| 3666 __ CmpObjectType(input, FIRST_FUNCTION_CLASS_TYPE, input); | 3671 __ CmpObjectType(input, FIRST_FUNCTION_CLASS_TYPE, input); |
| 3667 final_branch_condition = above_equal; | 3672 final_branch_condition = above_equal; |
| 3668 | 3673 |
| 3669 } else if (type_name->Equals(Heap::object_symbol())) { | 3674 } else if (type_name->Equals(heap()->object_symbol())) { |
| 3670 __ JumpIfSmi(input, false_label); | 3675 __ JumpIfSmi(input, false_label); |
| 3671 __ CompareRoot(input, Heap::kNullValueRootIndex); | 3676 __ CompareRoot(input, Heap::kNullValueRootIndex); |
| 3672 __ j(equal, true_label); | 3677 __ j(equal, true_label); |
| 3673 __ CmpObjectType(input, FIRST_JS_OBJECT_TYPE, input); | 3678 __ CmpObjectType(input, FIRST_JS_OBJECT_TYPE, input); |
| 3674 __ j(below, false_label); | 3679 __ j(below, false_label); |
| 3675 __ CmpInstanceType(input, FIRST_FUNCTION_CLASS_TYPE); | 3680 __ CmpInstanceType(input, FIRST_FUNCTION_CLASS_TYPE); |
| 3676 __ j(above_equal, false_label); | 3681 __ j(above_equal, false_label); |
| 3677 // Check for undetectable objects => false. | 3682 // Check for undetectable objects => false. |
| 3678 __ testb(FieldOperand(input, Map::kBitFieldOffset), | 3683 __ testb(FieldOperand(input, Map::kBitFieldOffset), |
| 3679 Immediate(1 << Map::kIsUndetectable)); | 3684 Immediate(1 << Map::kIsUndetectable)); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3807 RegisterEnvironmentForDeoptimization(environment); | 3812 RegisterEnvironmentForDeoptimization(environment); |
| 3808 ASSERT(osr_pc_offset_ == -1); | 3813 ASSERT(osr_pc_offset_ == -1); |
| 3809 osr_pc_offset_ = masm()->pc_offset(); | 3814 osr_pc_offset_ = masm()->pc_offset(); |
| 3810 } | 3815 } |
| 3811 | 3816 |
| 3812 #undef __ | 3817 #undef __ |
| 3813 | 3818 |
| 3814 } } // namespace v8::internal | 3819 } } // namespace v8::internal |
| 3815 | 3820 |
| 3816 #endif // V8_TARGET_ARCH_X64 | 3821 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |