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 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 __ movp(rcx, FieldOperand(rcx, DescriptorArray::kEnumCacheBridgeCacheOffset)); | 1113 __ movp(rcx, FieldOperand(rcx, DescriptorArray::kEnumCacheBridgeCacheOffset)); |
1114 | 1114 |
1115 // Set up the four remaining stack slots. | 1115 // Set up the four remaining stack slots. |
1116 __ Push(rax); // Map. | 1116 __ Push(rax); // Map. |
1117 __ Push(rcx); // Enumeration cache. | 1117 __ Push(rcx); // Enumeration cache. |
1118 __ Push(rdx); // Number of valid entries for the map in the enum cache. | 1118 __ Push(rdx); // Number of valid entries for the map in the enum cache. |
1119 __ Push(Smi::FromInt(0)); // Initial index. | 1119 __ Push(Smi::FromInt(0)); // Initial index. |
1120 __ jmp(&loop); | 1120 __ jmp(&loop); |
1121 | 1121 |
1122 __ bind(&no_descriptors); | 1122 __ bind(&no_descriptors); |
1123 __ addq(rsp, Immediate(kPointerSize)); | 1123 __ addp(rsp, Immediate(kPointerSize)); |
1124 __ jmp(&exit); | 1124 __ jmp(&exit); |
1125 | 1125 |
1126 // We got a fixed array in register rax. Iterate through that. | 1126 // We got a fixed array in register rax. Iterate through that. |
1127 Label non_proxy; | 1127 Label non_proxy; |
1128 __ bind(&fixed_array); | 1128 __ bind(&fixed_array); |
1129 | 1129 |
1130 Handle<Object> feedback = Handle<Object>( | 1130 Handle<Object> feedback = Handle<Object>( |
1131 Smi::FromInt(TypeFeedbackInfo::kForInFastCaseMarker), | 1131 Smi::FromInt(TypeFeedbackInfo::kForInFastCaseMarker), |
1132 isolate()); | 1132 isolate()); |
1133 StoreFeedbackVectorSlot(slot, feedback); | 1133 StoreFeedbackVectorSlot(slot, feedback); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 // Generate code for going to the next element by incrementing the | 1205 // Generate code for going to the next element by incrementing the |
1206 // index (smi) stored on top of the stack. | 1206 // index (smi) stored on top of the stack. |
1207 __ bind(loop_statement.continue_label()); | 1207 __ bind(loop_statement.continue_label()); |
1208 __ SmiAddConstant(Operand(rsp, 0 * kPointerSize), Smi::FromInt(1)); | 1208 __ SmiAddConstant(Operand(rsp, 0 * kPointerSize), Smi::FromInt(1)); |
1209 | 1209 |
1210 EmitBackEdgeBookkeeping(stmt, &loop); | 1210 EmitBackEdgeBookkeeping(stmt, &loop); |
1211 __ jmp(&loop); | 1211 __ jmp(&loop); |
1212 | 1212 |
1213 // Remove the pointers stored on the stack. | 1213 // Remove the pointers stored on the stack. |
1214 __ bind(loop_statement.break_label()); | 1214 __ bind(loop_statement.break_label()); |
1215 __ addq(rsp, Immediate(5 * kPointerSize)); | 1215 __ addp(rsp, Immediate(5 * kPointerSize)); |
1216 | 1216 |
1217 // Exit and decrement the loop depth. | 1217 // Exit and decrement the loop depth. |
1218 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); | 1218 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); |
1219 __ bind(&exit); | 1219 __ bind(&exit); |
1220 decrement_loop_depth(); | 1220 decrement_loop_depth(); |
1221 } | 1221 } |
1222 | 1222 |
1223 | 1223 |
1224 void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { | 1224 void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { |
1225 Comment cmnt(masm_, "[ ForOfStatement"); | 1225 Comment cmnt(masm_, "[ ForOfStatement"); |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1827 // Store the subexpression value in the array's elements. | 1827 // Store the subexpression value in the array's elements. |
1828 __ Move(rcx, Smi::FromInt(i)); | 1828 __ Move(rcx, Smi::FromInt(i)); |
1829 StoreArrayLiteralElementStub stub; | 1829 StoreArrayLiteralElementStub stub; |
1830 __ CallStub(&stub); | 1830 __ CallStub(&stub); |
1831 } | 1831 } |
1832 | 1832 |
1833 PrepareForBailoutForId(expr->GetIdForElement(i), NO_REGISTERS); | 1833 PrepareForBailoutForId(expr->GetIdForElement(i), NO_REGISTERS); |
1834 } | 1834 } |
1835 | 1835 |
1836 if (result_saved) { | 1836 if (result_saved) { |
1837 __ addq(rsp, Immediate(kPointerSize)); // literal index | 1837 __ addp(rsp, Immediate(kPointerSize)); // literal index |
1838 context()->PlugTOS(); | 1838 context()->PlugTOS(); |
1839 } else { | 1839 } else { |
1840 context()->Plug(rax); | 1840 context()->Plug(rax); |
1841 } | 1841 } |
1842 } | 1842 } |
1843 | 1843 |
1844 | 1844 |
1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1846 ASSERT(expr->target()->IsValidLeftHandSide()); | 1846 ASSERT(expr->target()->IsValidLeftHandSide()); |
1847 | 1847 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2131 __ Push(FieldOperand(rbx, JSGeneratorObject::kReceiverOffset)); | 2131 __ Push(FieldOperand(rbx, JSGeneratorObject::kReceiverOffset)); |
2132 | 2132 |
2133 // Push holes for arguments to generator function. | 2133 // Push holes for arguments to generator function. |
2134 __ movp(rdx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 2134 __ movp(rdx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
2135 __ movsxlq(rdx, | 2135 __ movsxlq(rdx, |
2136 FieldOperand(rdx, | 2136 FieldOperand(rdx, |
2137 SharedFunctionInfo::kFormalParameterCountOffset)); | 2137 SharedFunctionInfo::kFormalParameterCountOffset)); |
2138 __ LoadRoot(rcx, Heap::kTheHoleValueRootIndex); | 2138 __ LoadRoot(rcx, Heap::kTheHoleValueRootIndex); |
2139 Label push_argument_holes, push_frame; | 2139 Label push_argument_holes, push_frame; |
2140 __ bind(&push_argument_holes); | 2140 __ bind(&push_argument_holes); |
2141 __ subq(rdx, Immediate(1)); | 2141 __ subp(rdx, Immediate(1)); |
2142 __ j(carry, &push_frame); | 2142 __ j(carry, &push_frame); |
2143 __ Push(rcx); | 2143 __ Push(rcx); |
2144 __ jmp(&push_argument_holes); | 2144 __ jmp(&push_argument_holes); |
2145 | 2145 |
2146 // Enter a new JavaScript frame, and initialize its slots as they were when | 2146 // Enter a new JavaScript frame, and initialize its slots as they were when |
2147 // the generator was suspended. | 2147 // the generator was suspended. |
2148 Label resume_frame; | 2148 Label resume_frame; |
2149 __ bind(&push_frame); | 2149 __ bind(&push_frame); |
2150 __ call(&resume_frame); | 2150 __ call(&resume_frame); |
2151 __ jmp(&done); | 2151 __ jmp(&done); |
(...skipping 10 matching lines...) Expand all Loading... |
2162 | 2162 |
2163 // If we are sending a value and there is no operand stack, we can jump back | 2163 // If we are sending a value and there is no operand stack, we can jump back |
2164 // in directly. | 2164 // in directly. |
2165 if (resume_mode == JSGeneratorObject::NEXT) { | 2165 if (resume_mode == JSGeneratorObject::NEXT) { |
2166 Label slow_resume; | 2166 Label slow_resume; |
2167 __ cmpq(rdx, Immediate(0)); | 2167 __ cmpq(rdx, Immediate(0)); |
2168 __ j(not_zero, &slow_resume); | 2168 __ j(not_zero, &slow_resume); |
2169 __ movp(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 2169 __ movp(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
2170 __ SmiToInteger64(rcx, | 2170 __ SmiToInteger64(rcx, |
2171 FieldOperand(rbx, JSGeneratorObject::kContinuationOffset)); | 2171 FieldOperand(rbx, JSGeneratorObject::kContinuationOffset)); |
2172 __ addq(rdx, rcx); | 2172 __ addp(rdx, rcx); |
2173 __ Move(FieldOperand(rbx, JSGeneratorObject::kContinuationOffset), | 2173 __ Move(FieldOperand(rbx, JSGeneratorObject::kContinuationOffset), |
2174 Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); | 2174 Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); |
2175 __ jmp(rdx); | 2175 __ jmp(rdx); |
2176 __ bind(&slow_resume); | 2176 __ bind(&slow_resume); |
2177 } | 2177 } |
2178 | 2178 |
2179 // Otherwise, we push holes for the operand stack and call the runtime to fix | 2179 // Otherwise, we push holes for the operand stack and call the runtime to fix |
2180 // up the stack and the handlers. | 2180 // up the stack and the handlers. |
2181 Label push_operand_holes, call_resume; | 2181 Label push_operand_holes, call_resume; |
2182 __ bind(&push_operand_holes); | 2182 __ bind(&push_operand_holes); |
2183 __ subq(rdx, Immediate(1)); | 2183 __ subp(rdx, Immediate(1)); |
2184 __ j(carry, &call_resume); | 2184 __ j(carry, &call_resume); |
2185 __ Push(rcx); | 2185 __ Push(rcx); |
2186 __ jmp(&push_operand_holes); | 2186 __ jmp(&push_operand_holes); |
2187 __ bind(&call_resume); | 2187 __ bind(&call_resume); |
2188 __ Push(rbx); | 2188 __ Push(rbx); |
2189 __ Push(result_register()); | 2189 __ Push(result_register()); |
2190 __ Push(Smi::FromInt(resume_mode)); | 2190 __ Push(Smi::FromInt(resume_mode)); |
2191 __ CallRuntime(Runtime::kResumeJSGeneratorObject, 3); | 2191 __ CallRuntime(Runtime::kResumeJSGeneratorObject, 3); |
2192 // Not reached: the runtime call returns elsewhere. | 2192 // Not reached: the runtime call returns elsewhere. |
2193 __ Abort(kGeneratorFailedToResume); | 2193 __ Abort(kGeneratorFailedToResume); |
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2995 | 2995 |
2996 // Skip loop if no descriptors are valid. | 2996 // Skip loop if no descriptors are valid. |
2997 __ NumberOfOwnDescriptors(rcx, rbx); | 2997 __ NumberOfOwnDescriptors(rcx, rbx); |
2998 __ cmpq(rcx, Immediate(0)); | 2998 __ cmpq(rcx, Immediate(0)); |
2999 __ j(equal, &done); | 2999 __ j(equal, &done); |
3000 | 3000 |
3001 __ LoadInstanceDescriptors(rbx, r8); | 3001 __ LoadInstanceDescriptors(rbx, r8); |
3002 // rbx: descriptor array. | 3002 // rbx: descriptor array. |
3003 // rcx: valid entries in the descriptor array. | 3003 // rcx: valid entries in the descriptor array. |
3004 // Calculate the end of the descriptor array. | 3004 // Calculate the end of the descriptor array. |
3005 __ imul(rcx, rcx, Immediate(DescriptorArray::kDescriptorSize)); | 3005 __ imulp(rcx, rcx, Immediate(DescriptorArray::kDescriptorSize)); |
3006 SmiIndex index = masm_->SmiToIndex(rdx, rcx, kPointerSizeLog2); | 3006 SmiIndex index = masm_->SmiToIndex(rdx, rcx, kPointerSizeLog2); |
3007 __ lea(rcx, | 3007 __ lea(rcx, |
3008 Operand( | 3008 Operand( |
3009 r8, index.reg, index.scale, DescriptorArray::kFirstOffset)); | 3009 r8, index.reg, index.scale, DescriptorArray::kFirstOffset)); |
3010 // Calculate location of the first key name. | 3010 // Calculate location of the first key name. |
3011 __ addq(r8, Immediate(DescriptorArray::kFirstOffset)); | 3011 __ addp(r8, Immediate(DescriptorArray::kFirstOffset)); |
3012 // Loop through all the keys in the descriptor array. If one of these is the | 3012 // Loop through all the keys in the descriptor array. If one of these is the |
3013 // internalized string "valueOf" the result is false. | 3013 // internalized string "valueOf" the result is false. |
3014 __ jmp(&entry); | 3014 __ jmp(&entry); |
3015 __ bind(&loop); | 3015 __ bind(&loop); |
3016 __ movp(rdx, FieldOperand(r8, 0)); | 3016 __ movp(rdx, FieldOperand(r8, 0)); |
3017 __ Cmp(rdx, isolate()->factory()->value_of_string()); | 3017 __ Cmp(rdx, isolate()->factory()->value_of_string()); |
3018 __ j(equal, if_false); | 3018 __ j(equal, if_false); |
3019 __ addq(r8, Immediate(DescriptorArray::kDescriptorSize * kPointerSize)); | 3019 __ addp(r8, Immediate(DescriptorArray::kDescriptorSize * kPointerSize)); |
3020 __ bind(&entry); | 3020 __ bind(&entry); |
3021 __ cmpq(r8, rcx); | 3021 __ cmpq(r8, rcx); |
3022 __ j(not_equal, &loop); | 3022 __ j(not_equal, &loop); |
3023 | 3023 |
3024 __ bind(&done); | 3024 __ bind(&done); |
3025 | 3025 |
3026 // Set the bit in the map to indicate that there is no local valueOf field. | 3026 // Set the bit in the map to indicate that there is no local valueOf field. |
3027 __ or_(FieldOperand(rbx, Map::kBitField2Offset), | 3027 __ or_(FieldOperand(rbx, Map::kBitField2Offset), |
3028 Immediate(1 << Map::kStringWrapperSafeForDefaultValueOf)); | 3028 Immediate(1 << Map::kStringWrapperSafeForDefaultValueOf)); |
3029 | 3029 |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3851 | 3851 |
3852 Register array_length = rdi; | 3852 Register array_length = rdi; |
3853 Register result_pos = no_reg; // Will be rdi. | 3853 Register result_pos = no_reg; // Will be rdi. |
3854 | 3854 |
3855 Operand separator_operand = Operand(rsp, 2 * kPointerSize); | 3855 Operand separator_operand = Operand(rsp, 2 * kPointerSize); |
3856 Operand result_operand = Operand(rsp, 1 * kPointerSize); | 3856 Operand result_operand = Operand(rsp, 1 * kPointerSize); |
3857 Operand array_length_operand = Operand(rsp, 0 * kPointerSize); | 3857 Operand array_length_operand = Operand(rsp, 0 * kPointerSize); |
3858 // Separator operand is already pushed. Make room for the two | 3858 // Separator operand is already pushed. Make room for the two |
3859 // other stack fields, and clear the direction flag in anticipation | 3859 // other stack fields, and clear the direction flag in anticipation |
3860 // of calling CopyBytes. | 3860 // of calling CopyBytes. |
3861 __ subq(rsp, Immediate(2 * kPointerSize)); | 3861 __ subp(rsp, Immediate(2 * kPointerSize)); |
3862 __ cld(); | 3862 __ cld(); |
3863 // Check that the array is a JSArray | 3863 // Check that the array is a JSArray |
3864 __ JumpIfSmi(array, &bailout); | 3864 __ JumpIfSmi(array, &bailout); |
3865 __ CmpObjectType(array, JS_ARRAY_TYPE, scratch); | 3865 __ CmpObjectType(array, JS_ARRAY_TYPE, scratch); |
3866 __ j(not_equal, &bailout); | 3866 __ j(not_equal, &bailout); |
3867 | 3867 |
3868 // Check that the array has fast elements. | 3868 // Check that the array has fast elements. |
3869 __ CheckFastElements(scratch, &bailout); | 3869 __ CheckFastElements(scratch, &bailout); |
3870 | 3870 |
3871 // Array has fast elements, so its length must be a smi. | 3871 // Array has fast elements, so its length must be a smi. |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4099 FieldOperand(string, SeqOneByteString::kHeaderSize)); | 4099 FieldOperand(string, SeqOneByteString::kHeaderSize)); |
4100 __ CopyBytes(result_pos, string, string_length); | 4100 __ CopyBytes(result_pos, string, string_length); |
4101 __ incq(index); | 4101 __ incq(index); |
4102 __ j(not_equal, &loop_3); // Loop while (index < 0). | 4102 __ j(not_equal, &loop_3); // Loop while (index < 0). |
4103 | 4103 |
4104 __ bind(&done); | 4104 __ bind(&done); |
4105 __ movp(rax, result_operand); | 4105 __ movp(rax, result_operand); |
4106 | 4106 |
4107 __ bind(&return_result); | 4107 __ bind(&return_result); |
4108 // Drop temp values from the stack, and restore context register. | 4108 // Drop temp values from the stack, and restore context register. |
4109 __ addq(rsp, Immediate(3 * kPointerSize)); | 4109 __ addp(rsp, Immediate(3 * kPointerSize)); |
4110 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 4110 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
4111 context()->Plug(rax); | 4111 context()->Plug(rax); |
4112 } | 4112 } |
4113 | 4113 |
4114 | 4114 |
4115 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { | 4115 void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
4116 Handle<String> name = expr->name(); | 4116 Handle<String> name = expr->name(); |
4117 if (name->length() > 0 && name->Get(0) == '_') { | 4117 if (name->length() > 0 && name->Get(0) == '_') { |
4118 Comment cmnt(masm_, "[ InlineRuntimeCall"); | 4118 Comment cmnt(masm_, "[ InlineRuntimeCall"); |
4119 EmitInlineRuntimeCall(expr); | 4119 EmitInlineRuntimeCall(expr); |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4730 // ---------------------------------------------------------------------------- | 4730 // ---------------------------------------------------------------------------- |
4731 // Non-local control flow support. | 4731 // Non-local control flow support. |
4732 | 4732 |
4733 | 4733 |
4734 void FullCodeGenerator::EnterFinallyBlock() { | 4734 void FullCodeGenerator::EnterFinallyBlock() { |
4735 ASSERT(!result_register().is(rdx)); | 4735 ASSERT(!result_register().is(rdx)); |
4736 ASSERT(!result_register().is(rcx)); | 4736 ASSERT(!result_register().is(rcx)); |
4737 // Cook return address on top of stack (smi encoded Code* delta) | 4737 // Cook return address on top of stack (smi encoded Code* delta) |
4738 __ PopReturnAddressTo(rdx); | 4738 __ PopReturnAddressTo(rdx); |
4739 __ Move(rcx, masm_->CodeObject()); | 4739 __ Move(rcx, masm_->CodeObject()); |
4740 __ subq(rdx, rcx); | 4740 __ subp(rdx, rcx); |
4741 __ Integer32ToSmi(rdx, rdx); | 4741 __ Integer32ToSmi(rdx, rdx); |
4742 __ Push(rdx); | 4742 __ Push(rdx); |
4743 | 4743 |
4744 // Store result register while executing finally block. | 4744 // Store result register while executing finally block. |
4745 __ Push(result_register()); | 4745 __ Push(result_register()); |
4746 | 4746 |
4747 // Store pending message while executing finally block. | 4747 // Store pending message while executing finally block. |
4748 ExternalReference pending_message_obj = | 4748 ExternalReference pending_message_obj = |
4749 ExternalReference::address_of_pending_message_obj(isolate()); | 4749 ExternalReference::address_of_pending_message_obj(isolate()); |
4750 __ Load(rdx, pending_message_obj); | 4750 __ Load(rdx, pending_message_obj); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4783 ExternalReference::address_of_pending_message_obj(isolate()); | 4783 ExternalReference::address_of_pending_message_obj(isolate()); |
4784 __ Store(pending_message_obj, rdx); | 4784 __ Store(pending_message_obj, rdx); |
4785 | 4785 |
4786 // Restore result register from stack. | 4786 // Restore result register from stack. |
4787 __ Pop(result_register()); | 4787 __ Pop(result_register()); |
4788 | 4788 |
4789 // Uncook return address. | 4789 // Uncook return address. |
4790 __ Pop(rdx); | 4790 __ Pop(rdx); |
4791 __ SmiToInteger32(rdx, rdx); | 4791 __ SmiToInteger32(rdx, rdx); |
4792 __ Move(rcx, masm_->CodeObject()); | 4792 __ Move(rcx, masm_->CodeObject()); |
4793 __ addq(rdx, rcx); | 4793 __ addp(rdx, rcx); |
4794 __ jmp(rdx); | 4794 __ jmp(rdx); |
4795 } | 4795 } |
4796 | 4796 |
4797 | 4797 |
4798 #undef __ | 4798 #undef __ |
4799 | 4799 |
4800 #define __ ACCESS_MASM(masm()) | 4800 #define __ ACCESS_MASM(masm()) |
4801 | 4801 |
4802 FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit( | 4802 FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit( |
4803 int* stack_depth, | 4803 int* stack_depth, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4900 ASSERT_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 4900 ASSERT_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
4901 Assembler::target_address_at(call_target_address, | 4901 Assembler::target_address_at(call_target_address, |
4902 unoptimized_code)); | 4902 unoptimized_code)); |
4903 return OSR_AFTER_STACK_CHECK; | 4903 return OSR_AFTER_STACK_CHECK; |
4904 } | 4904 } |
4905 | 4905 |
4906 | 4906 |
4907 } } // namespace v8::internal | 4907 } } // namespace v8::internal |
4908 | 4908 |
4909 #endif // V8_TARGET_ARCH_X64 | 4909 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |