| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 // Load the function from the global context. | 107 // Load the function from the global context. |
| 108 __ movq(prototype, Operand(prototype, Context::SlotOffset(index))); | 108 __ movq(prototype, Operand(prototype, Context::SlotOffset(index))); |
| 109 // Load the initial map. The global functions all have initial maps. | 109 // Load the initial map. The global functions all have initial maps. |
| 110 __ movq(prototype, | 110 __ movq(prototype, |
| 111 FieldOperand(prototype, JSFunction::kPrototypeOrInitialMapOffset)); | 111 FieldOperand(prototype, JSFunction::kPrototypeOrInitialMapOffset)); |
| 112 // Load the prototype from the initial map. | 112 // Load the prototype from the initial map. |
| 113 __ movq(prototype, FieldOperand(prototype, Map::kPrototypeOffset)); | 113 __ movq(prototype, FieldOperand(prototype, Map::kPrototypeOffset)); |
| 114 } | 114 } |
| 115 | 115 |
| 116 | 116 |
| 117 void StubCompiler::GenerateDirectLoadGlobalFunctionPrototype( |
| 118 MacroAssembler* masm, int index, Register prototype) { |
| 119 // Get the global function with the given index. |
| 120 JSFunction* function = JSFunction::cast(Top::global_context()->get(index)); |
| 121 // Load its initial map. The global functions all have initial maps. |
| 122 __ Move(prototype, Handle<Map>(function->initial_map())); |
| 123 // Load the prototype from the initial map. |
| 124 __ movq(prototype, FieldOperand(prototype, Map::kPrototypeOffset)); |
| 125 } |
| 126 |
| 127 |
| 117 // Load a fast property out of a holder object (src). In-object properties | 128 // Load a fast property out of a holder object (src). In-object properties |
| 118 // are loaded directly otherwise the property is loaded from the properties | 129 // are loaded directly otherwise the property is loaded from the properties |
| 119 // fixed array. | 130 // fixed array. |
| 120 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, | 131 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, |
| 121 Register dst, Register src, | 132 Register dst, Register src, |
| 122 JSObject* holder, int index) { | 133 JSObject* holder, int index) { |
| 123 // Adjust for the number of properties stored in the holder. | 134 // Adjust for the number of properties stored in the holder. |
| 124 index -= holder->map()->inobject_properties(); | 135 index -= holder->map()->inobject_properties(); |
| 125 if (index < 0) { | 136 if (index < 0) { |
| 126 // Get the property straight out of the holder. | 137 // Get the property straight out of the holder. |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 | 780 |
| 770 case STRING_CHECK: | 781 case STRING_CHECK: |
| 771 if (!function->IsBuiltin()) { | 782 if (!function->IsBuiltin()) { |
| 772 // Calling non-builtins with a value as receiver requires boxing. | 783 // Calling non-builtins with a value as receiver requires boxing. |
| 773 __ jmp(&miss); | 784 __ jmp(&miss); |
| 774 } else { | 785 } else { |
| 775 // Check that the object is a two-byte string or a symbol. | 786 // Check that the object is a two-byte string or a symbol. |
| 776 __ CmpObjectType(rdx, FIRST_NONSTRING_TYPE, rax); | 787 __ CmpObjectType(rdx, FIRST_NONSTRING_TYPE, rax); |
| 777 __ j(above_equal, &miss); | 788 __ j(above_equal, &miss); |
| 778 // Check that the maps starting from the prototype haven't changed. | 789 // Check that the maps starting from the prototype haven't changed. |
| 779 GenerateLoadGlobalFunctionPrototype(masm(), | 790 GenerateDirectLoadGlobalFunctionPrototype( |
| 780 Context::STRING_FUNCTION_INDEX, | 791 masm(), Context::STRING_FUNCTION_INDEX, rax); |
| 781 rax); | |
| 782 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, | 792 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, |
| 783 rbx, rdx, name, &miss); | 793 rbx, rdx, name, &miss); |
| 784 } | 794 } |
| 785 break; | 795 break; |
| 786 | 796 |
| 787 case NUMBER_CHECK: { | 797 case NUMBER_CHECK: { |
| 788 if (!function->IsBuiltin()) { | 798 if (!function->IsBuiltin()) { |
| 789 // Calling non-builtins with a value as receiver requires boxing. | 799 // Calling non-builtins with a value as receiver requires boxing. |
| 790 __ jmp(&miss); | 800 __ jmp(&miss); |
| 791 } else { | 801 } else { |
| 792 Label fast; | 802 Label fast; |
| 793 // Check that the object is a smi or a heap number. | 803 // Check that the object is a smi or a heap number. |
| 794 __ JumpIfSmi(rdx, &fast); | 804 __ JumpIfSmi(rdx, &fast); |
| 795 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rax); | 805 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rax); |
| 796 __ j(not_equal, &miss); | 806 __ j(not_equal, &miss); |
| 797 __ bind(&fast); | 807 __ bind(&fast); |
| 798 // Check that the maps starting from the prototype haven't changed. | 808 // Check that the maps starting from the prototype haven't changed. |
| 799 GenerateLoadGlobalFunctionPrototype(masm(), | 809 GenerateDirectLoadGlobalFunctionPrototype( |
| 800 Context::NUMBER_FUNCTION_INDEX, | 810 masm(), Context::NUMBER_FUNCTION_INDEX, rax); |
| 801 rax); | |
| 802 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, | 811 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, |
| 803 rbx, rdx, name, &miss); | 812 rbx, rdx, name, &miss); |
| 804 } | 813 } |
| 805 break; | 814 break; |
| 806 } | 815 } |
| 807 | 816 |
| 808 case BOOLEAN_CHECK: { | 817 case BOOLEAN_CHECK: { |
| 809 if (!function->IsBuiltin()) { | 818 if (!function->IsBuiltin()) { |
| 810 // Calling non-builtins with a value as receiver requires boxing. | 819 // Calling non-builtins with a value as receiver requires boxing. |
| 811 __ jmp(&miss); | 820 __ jmp(&miss); |
| 812 } else { | 821 } else { |
| 813 Label fast; | 822 Label fast; |
| 814 // Check that the object is a boolean. | 823 // Check that the object is a boolean. |
| 815 __ CompareRoot(rdx, Heap::kTrueValueRootIndex); | 824 __ CompareRoot(rdx, Heap::kTrueValueRootIndex); |
| 816 __ j(equal, &fast); | 825 __ j(equal, &fast); |
| 817 __ CompareRoot(rdx, Heap::kFalseValueRootIndex); | 826 __ CompareRoot(rdx, Heap::kFalseValueRootIndex); |
| 818 __ j(not_equal, &miss); | 827 __ j(not_equal, &miss); |
| 819 __ bind(&fast); | 828 __ bind(&fast); |
| 820 // Check that the maps starting from the prototype haven't changed. | 829 // Check that the maps starting from the prototype haven't changed. |
| 821 GenerateLoadGlobalFunctionPrototype(masm(), | 830 GenerateDirectLoadGlobalFunctionPrototype( |
| 822 Context::BOOLEAN_FUNCTION_INDEX, | 831 masm(), Context::BOOLEAN_FUNCTION_INDEX, rax); |
| 823 rax); | |
| 824 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, | 832 CheckPrototypes(JSObject::cast(object->GetPrototype()), rax, holder, |
| 825 rbx, rdx, name, &miss); | 833 rbx, rdx, name, &miss); |
| 826 } | 834 } |
| 827 break; | 835 break; |
| 828 } | 836 } |
| 829 | 837 |
| 830 default: | 838 default: |
| 831 UNREACHABLE(); | 839 UNREACHABLE(); |
| 832 } | 840 } |
| 833 | 841 |
| (...skipping 1483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 // Return the generated code. | 2325 // Return the generated code. |
| 2318 return GetCode(); | 2326 return GetCode(); |
| 2319 } | 2327 } |
| 2320 | 2328 |
| 2321 | 2329 |
| 2322 #undef __ | 2330 #undef __ |
| 2323 | 2331 |
| 2324 } } // namespace v8::internal | 2332 } } // namespace v8::internal |
| 2325 | 2333 |
| 2326 #endif // V8_TARGET_ARCH_X64 | 2334 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |