| 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 6286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6297 // Return and remove the on-stack parameter. | 6297 // Return and remove the on-stack parameter. |
| 6298 __ ret(1 * kPointerSize); | 6298 __ ret(1 * kPointerSize); |
| 6299 | 6299 |
| 6300 // Create a new closure through the slower runtime call. | 6300 // Create a new closure through the slower runtime call. |
| 6301 __ bind(&gc); | 6301 __ bind(&gc); |
| 6302 __ pop(rcx); // Temporarily remove return address. | 6302 __ pop(rcx); // Temporarily remove return address. |
| 6303 __ pop(rdx); | 6303 __ pop(rdx); |
| 6304 __ push(rsi); | 6304 __ push(rsi); |
| 6305 __ push(rdx); | 6305 __ push(rdx); |
| 6306 __ push(rcx); // Restore return address. | 6306 __ push(rcx); // Restore return address. |
| 6307 __ TailCallRuntime(ExternalReference(Runtime::kNewClosure), 2, 1); | 6307 __ TailCallRuntime(Runtime::kNewClosure, 2, 1); |
| 6308 } | 6308 } |
| 6309 | 6309 |
| 6310 | 6310 |
| 6311 void FastNewContextStub::Generate(MacroAssembler* masm) { | 6311 void FastNewContextStub::Generate(MacroAssembler* masm) { |
| 6312 // Try to allocate the context in new space. | 6312 // Try to allocate the context in new space. |
| 6313 Label gc; | 6313 Label gc; |
| 6314 int length = slots_ + Context::MIN_CONTEXT_SLOTS; | 6314 int length = slots_ + Context::MIN_CONTEXT_SLOTS; |
| 6315 __ AllocateInNewSpace((length * kPointerSize) + FixedArray::kHeaderSize, | 6315 __ AllocateInNewSpace((length * kPointerSize) + FixedArray::kHeaderSize, |
| 6316 rax, rbx, rcx, &gc, TAG_OBJECT); | 6316 rax, rbx, rcx, &gc, TAG_OBJECT); |
| 6317 | 6317 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 6339 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; i++) { | 6339 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; i++) { |
| 6340 __ movq(Operand(rax, Context::SlotOffset(i)), rbx); | 6340 __ movq(Operand(rax, Context::SlotOffset(i)), rbx); |
| 6341 } | 6341 } |
| 6342 | 6342 |
| 6343 // Return and remove the on-stack parameter. | 6343 // Return and remove the on-stack parameter. |
| 6344 __ movq(rsi, rax); | 6344 __ movq(rsi, rax); |
| 6345 __ ret(1 * kPointerSize); | 6345 __ ret(1 * kPointerSize); |
| 6346 | 6346 |
| 6347 // Need to collect. Call into runtime system. | 6347 // Need to collect. Call into runtime system. |
| 6348 __ bind(&gc); | 6348 __ bind(&gc); |
| 6349 __ TailCallRuntime(ExternalReference(Runtime::kNewContext), 1, 1); | 6349 __ TailCallRuntime(Runtime::kNewContext, 1, 1); |
| 6350 } | 6350 } |
| 6351 | 6351 |
| 6352 | 6352 |
| 6353 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { | 6353 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
| 6354 // Stack layout on entry: | 6354 // Stack layout on entry: |
| 6355 // | 6355 // |
| 6356 // [rsp + kPointerSize]: constant elements. | 6356 // [rsp + kPointerSize]: constant elements. |
| 6357 // [rsp + (2 * kPointerSize)]: literal index. | 6357 // [rsp + (2 * kPointerSize)]: literal index. |
| 6358 // [rsp + (3 * kPointerSize)]: literals array. | 6358 // [rsp + (3 * kPointerSize)]: literals array. |
| 6359 | 6359 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6395 for (int i = 0; i < elements_size; i += kPointerSize) { | 6395 for (int i = 0; i < elements_size; i += kPointerSize) { |
| 6396 __ movq(rbx, FieldOperand(rcx, i)); | 6396 __ movq(rbx, FieldOperand(rcx, i)); |
| 6397 __ movq(FieldOperand(rdx, i), rbx); | 6397 __ movq(FieldOperand(rdx, i), rbx); |
| 6398 } | 6398 } |
| 6399 } | 6399 } |
| 6400 | 6400 |
| 6401 // Return and remove the on-stack parameters. | 6401 // Return and remove the on-stack parameters. |
| 6402 __ ret(3 * kPointerSize); | 6402 __ ret(3 * kPointerSize); |
| 6403 | 6403 |
| 6404 __ bind(&slow_case); | 6404 __ bind(&slow_case); |
| 6405 ExternalReference runtime(Runtime::kCreateArrayLiteralShallow); | 6405 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); |
| 6406 __ TailCallRuntime(runtime, 3, 1); | |
| 6407 } | 6406 } |
| 6408 | 6407 |
| 6409 | 6408 |
| 6410 void ToBooleanStub::Generate(MacroAssembler* masm) { | 6409 void ToBooleanStub::Generate(MacroAssembler* masm) { |
| 6411 Label false_result, true_result, not_string; | 6410 Label false_result, true_result, not_string; |
| 6412 __ movq(rax, Operand(rsp, 1 * kPointerSize)); | 6411 __ movq(rax, Operand(rsp, 1 * kPointerSize)); |
| 6413 | 6412 |
| 6414 // 'null' => false. | 6413 // 'null' => false. |
| 6415 __ CompareRoot(rax, Heap::kNullValueRootIndex); | 6414 __ CompareRoot(rax, Heap::kNullValueRootIndex); |
| 6416 __ j(equal, &false_result); | 6415 __ j(equal, &false_result); |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6755 UNREACHABLE(); | 6754 UNREACHABLE(); |
| 6756 } | 6755 } |
| 6757 } | 6756 } |
| 6758 | 6757 |
| 6759 | 6758 |
| 6760 void RegExpExecStub::Generate(MacroAssembler* masm) { | 6759 void RegExpExecStub::Generate(MacroAssembler* masm) { |
| 6761 // Just jump directly to runtime if native RegExp is not selected at compile | 6760 // Just jump directly to runtime if native RegExp is not selected at compile |
| 6762 // time or if regexp entry in generated code is turned off runtime switch or | 6761 // time or if regexp entry in generated code is turned off runtime switch or |
| 6763 // at compilation. | 6762 // at compilation. |
| 6764 #ifndef V8_NATIVE_REGEXP | 6763 #ifndef V8_NATIVE_REGEXP |
| 6765 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 6764 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 6766 #else // V8_NATIVE_REGEXP | 6765 #else // V8_NATIVE_REGEXP |
| 6767 if (!FLAG_regexp_entry_native) { | 6766 if (!FLAG_regexp_entry_native) { |
| 6768 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 6767 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 6769 return; | 6768 return; |
| 6770 } | 6769 } |
| 6771 | 6770 |
| 6772 // Stack frame on entry. | 6771 // Stack frame on entry. |
| 6773 // esp[0]: return address | 6772 // esp[0]: return address |
| 6774 // esp[8]: last_match_info (expected JSArray) | 6773 // esp[8]: last_match_info (expected JSArray) |
| 6775 // esp[16]: previous index | 6774 // esp[16]: previous index |
| 6776 // esp[24]: subject string | 6775 // esp[24]: subject string |
| 6777 // esp[32]: JSRegExp object | 6776 // esp[32]: JSRegExp object |
| 6778 | 6777 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7102 rdi); | 7101 rdi); |
| 7103 __ jmp(&next_capture); | 7102 __ jmp(&next_capture); |
| 7104 __ bind(&done); | 7103 __ bind(&done); |
| 7105 | 7104 |
| 7106 // Return last match info. | 7105 // Return last match info. |
| 7107 __ movq(rax, Operand(rsp, kLastMatchInfoOffset)); | 7106 __ movq(rax, Operand(rsp, kLastMatchInfoOffset)); |
| 7108 __ ret(4 * kPointerSize); | 7107 __ ret(4 * kPointerSize); |
| 7109 | 7108 |
| 7110 // Do the runtime call to execute the regexp. | 7109 // Do the runtime call to execute the regexp. |
| 7111 __ bind(&runtime); | 7110 __ bind(&runtime); |
| 7112 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 7111 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 7113 #endif // V8_NATIVE_REGEXP | 7112 #endif // V8_NATIVE_REGEXP |
| 7114 } | 7113 } |
| 7115 | 7114 |
| 7116 | 7115 |
| 7117 void CompareStub::Generate(MacroAssembler* masm) { | 7116 void CompareStub::Generate(MacroAssembler* masm) { |
| 7118 Label call_builtin, done; | 7117 Label call_builtin, done; |
| 7119 | 7118 |
| 7120 // NOTICE! This code is only reached after a smi-fast-case check, so | 7119 // NOTICE! This code is only reached after a smi-fast-case check, so |
| 7121 // it is certain that at least one operand isn't a smi. | 7120 // it is certain that at least one operand isn't a smi. |
| 7122 | 7121 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7513 __ subq(rdx, Immediate(kPointerSize)); | 7512 __ subq(rdx, Immediate(kPointerSize)); |
| 7514 __ decq(rcx); | 7513 __ decq(rcx); |
| 7515 __ j(not_zero, &loop); | 7514 __ j(not_zero, &loop); |
| 7516 | 7515 |
| 7517 // Return and remove the on-stack parameters. | 7516 // Return and remove the on-stack parameters. |
| 7518 __ bind(&done); | 7517 __ bind(&done); |
| 7519 __ ret(3 * kPointerSize); | 7518 __ ret(3 * kPointerSize); |
| 7520 | 7519 |
| 7521 // Do the runtime call to allocate the arguments object. | 7520 // Do the runtime call to allocate the arguments object. |
| 7522 __ bind(&runtime); | 7521 __ bind(&runtime); |
| 7523 __ TailCallRuntime(ExternalReference(Runtime::kNewArgumentsFast), 3, 1); | 7522 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); |
| 7524 } | 7523 } |
| 7525 | 7524 |
| 7526 | 7525 |
| 7527 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { | 7526 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| 7528 // The key is in rdx and the parameter count is in rax. | 7527 // The key is in rdx and the parameter count is in rax. |
| 7529 | 7528 |
| 7530 // The displacement is used for skipping the frame pointer on the | 7529 // The displacement is used for skipping the frame pointer on the |
| 7531 // stack. It is the offset of the last parameter (if any) relative | 7530 // stack. It is the offset of the last parameter (if any) relative |
| 7532 // to the frame pointer. | 7531 // to the frame pointer. |
| 7533 static const int kDisplacement = 1 * kPointerSize; | 7532 static const int kDisplacement = 1 * kPointerSize; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7570 index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); | 7569 index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); |
| 7571 __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); | 7570 __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); |
| 7572 __ Ret(); | 7571 __ Ret(); |
| 7573 | 7572 |
| 7574 // Slow-case: Handle non-smi or out-of-bounds access to arguments | 7573 // Slow-case: Handle non-smi or out-of-bounds access to arguments |
| 7575 // by calling the runtime system. | 7574 // by calling the runtime system. |
| 7576 __ bind(&slow); | 7575 __ bind(&slow); |
| 7577 __ pop(rbx); // Return address. | 7576 __ pop(rbx); // Return address. |
| 7578 __ push(rdx); | 7577 __ push(rdx); |
| 7579 __ push(rbx); | 7578 __ push(rbx); |
| 7580 Runtime::Function* f = | 7579 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); |
| 7581 Runtime::FunctionForId(Runtime::kGetArgumentsProperty); | |
| 7582 __ TailCallRuntime(ExternalReference(f), 1, f->result_size); | |
| 7583 } | 7580 } |
| 7584 | 7581 |
| 7585 | 7582 |
| 7586 void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { | 7583 void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { |
| 7587 // Check if the calling frame is an arguments adaptor frame. | 7584 // Check if the calling frame is an arguments adaptor frame. |
| 7588 Label adaptor; | 7585 Label adaptor; |
| 7589 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 7586 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
| 7590 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), | 7587 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), |
| 7591 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 7588 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
| 7592 | 7589 |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8061 void StackCheckStub::Generate(MacroAssembler* masm) { | 8058 void StackCheckStub::Generate(MacroAssembler* masm) { |
| 8062 // Because builtins always remove the receiver from the stack, we | 8059 // Because builtins always remove the receiver from the stack, we |
| 8063 // have to fake one to avoid underflowing the stack. The receiver | 8060 // have to fake one to avoid underflowing the stack. The receiver |
| 8064 // must be inserted below the return address on the stack so we | 8061 // must be inserted below the return address on the stack so we |
| 8065 // temporarily store that in a register. | 8062 // temporarily store that in a register. |
| 8066 __ pop(rax); | 8063 __ pop(rax); |
| 8067 __ Push(Smi::FromInt(0)); | 8064 __ Push(Smi::FromInt(0)); |
| 8068 __ push(rax); | 8065 __ push(rax); |
| 8069 | 8066 |
| 8070 // Do tail-call to runtime routine. | 8067 // Do tail-call to runtime routine. |
| 8071 Runtime::Function* f = Runtime::FunctionForId(Runtime::kStackGuard); | 8068 __ TailCallRuntime(Runtime::kStackGuard, 1, 1); |
| 8072 __ TailCallRuntime(ExternalReference(f), 1, f->result_size); | |
| 8073 } | 8069 } |
| 8074 | 8070 |
| 8075 | 8071 |
| 8076 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, | 8072 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, |
| 8077 Register number) { | 8073 Register number) { |
| 8078 Label load_smi, done; | 8074 Label load_smi, done; |
| 8079 | 8075 |
| 8080 __ JumpIfSmi(number, &load_smi); | 8076 __ JumpIfSmi(number, &load_smi); |
| 8081 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); | 8077 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); |
| 8082 __ jmp(&done); | 8078 __ jmp(&done); |
| (...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9060 // rcx: next character of result | 9056 // rcx: next character of result |
| 9061 // rdx: first char of second argument | 9057 // rdx: first char of second argument |
| 9062 // rdi: length of second argument | 9058 // rdi: length of second argument |
| 9063 GenerateCopyCharacters(masm, rcx, rdx, rdi, false); | 9059 GenerateCopyCharacters(masm, rcx, rdx, rdi, false); |
| 9064 __ movq(rax, rbx); | 9060 __ movq(rax, rbx); |
| 9065 __ IncrementCounter(&Counters::string_add_native, 1); | 9061 __ IncrementCounter(&Counters::string_add_native, 1); |
| 9066 __ ret(2 * kPointerSize); | 9062 __ ret(2 * kPointerSize); |
| 9067 | 9063 |
| 9068 // Just jump to runtime to add the two strings. | 9064 // Just jump to runtime to add the two strings. |
| 9069 __ bind(&string_add_runtime); | 9065 __ bind(&string_add_runtime); |
| 9070 __ TailCallRuntime(ExternalReference(Runtime::kStringAdd), 2, 1); | 9066 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
| 9071 } | 9067 } |
| 9072 | 9068 |
| 9073 | 9069 |
| 9074 void StringStubBase::GenerateCopyCharacters(MacroAssembler* masm, | 9070 void StringStubBase::GenerateCopyCharacters(MacroAssembler* masm, |
| 9075 Register dest, | 9071 Register dest, |
| 9076 Register src, | 9072 Register src, |
| 9077 Register count, | 9073 Register count, |
| 9078 bool ascii) { | 9074 bool ascii) { |
| 9079 Label loop; | 9075 Label loop; |
| 9080 __ bind(&loop); | 9076 __ bind(&loop); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9254 // rdx: original value of rsi | 9250 // rdx: original value of rsi |
| 9255 // rdi: first character of result | 9251 // rdi: first character of result |
| 9256 // rsi: character of sub string start | 9252 // rsi: character of sub string start |
| 9257 GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false); | 9253 GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false); |
| 9258 __ movq(rsi, rdx); // Restore esi. | 9254 __ movq(rsi, rdx); // Restore esi. |
| 9259 __ IncrementCounter(&Counters::sub_string_native, 1); | 9255 __ IncrementCounter(&Counters::sub_string_native, 1); |
| 9260 __ ret(kArgumentsSize); | 9256 __ ret(kArgumentsSize); |
| 9261 | 9257 |
| 9262 // Just jump to runtime to create the sub string. | 9258 // Just jump to runtime to create the sub string. |
| 9263 __ bind(&runtime); | 9259 __ bind(&runtime); |
| 9264 __ TailCallRuntime(ExternalReference(Runtime::kSubString), 3, 1); | 9260 __ TailCallRuntime(Runtime::kSubString, 3, 1); |
| 9265 } | 9261 } |
| 9266 | 9262 |
| 9267 | 9263 |
| 9268 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, | 9264 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, |
| 9269 Register left, | 9265 Register left, |
| 9270 Register right, | 9266 Register right, |
| 9271 Register scratch1, | 9267 Register scratch1, |
| 9272 Register scratch2, | 9268 Register scratch2, |
| 9273 Register scratch3, | 9269 Register scratch3, |
| 9274 Register scratch4) { | 9270 Register scratch4) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9374 // Check that both are sequential ASCII strings. | 9370 // Check that both are sequential ASCII strings. |
| 9375 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); | 9371 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); |
| 9376 | 9372 |
| 9377 // Inline comparison of ascii strings. | 9373 // Inline comparison of ascii strings. |
| 9378 __ IncrementCounter(&Counters::string_compare_native, 1); | 9374 __ IncrementCounter(&Counters::string_compare_native, 1); |
| 9379 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); | 9375 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); |
| 9380 | 9376 |
| 9381 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 9377 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 9382 // tagged as a small integer. | 9378 // tagged as a small integer. |
| 9383 __ bind(&runtime); | 9379 __ bind(&runtime); |
| 9384 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); | 9380 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 9385 } | 9381 } |
| 9386 | 9382 |
| 9387 #undef __ | 9383 #undef __ |
| 9388 | 9384 |
| 9389 #define __ masm. | 9385 #define __ masm. |
| 9390 | 9386 |
| 9391 #ifdef _WIN64 | 9387 #ifdef _WIN64 |
| 9392 typedef double (*ModuloFunction)(double, double); | 9388 typedef double (*ModuloFunction)(double, double); |
| 9393 // Define custom fmod implementation. | 9389 // Define custom fmod implementation. |
| 9394 ModuloFunction CreateModuloFunction() { | 9390 ModuloFunction CreateModuloFunction() { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9474 // Call the function from C++. | 9470 // Call the function from C++. |
| 9475 return FUNCTION_CAST<ModuloFunction>(buffer); | 9471 return FUNCTION_CAST<ModuloFunction>(buffer); |
| 9476 } | 9472 } |
| 9477 | 9473 |
| 9478 #endif | 9474 #endif |
| 9479 | 9475 |
| 9480 | 9476 |
| 9481 #undef __ | 9477 #undef __ |
| 9482 | 9478 |
| 9483 } } // namespace v8::internal | 9479 } } // namespace v8::internal |
| OLD | NEW |