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 |