| 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 6327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6338 // Return and remove the on-stack parameter. | 6338 // Return and remove the on-stack parameter. |
| 6339 __ ret(1 * kPointerSize); | 6339 __ ret(1 * kPointerSize); |
| 6340 | 6340 |
| 6341 // Create a new closure through the slower runtime call. | 6341 // Create a new closure through the slower runtime call. |
| 6342 __ bind(&gc); | 6342 __ bind(&gc); |
| 6343 __ pop(rcx); // Temporarily remove return address. | 6343 __ pop(rcx); // Temporarily remove return address. |
| 6344 __ pop(rdx); | 6344 __ pop(rdx); |
| 6345 __ push(rsi); | 6345 __ push(rsi); |
| 6346 __ push(rdx); | 6346 __ push(rdx); |
| 6347 __ push(rcx); // Restore return address. | 6347 __ push(rcx); // Restore return address. |
| 6348 __ TailCallRuntime(ExternalReference(Runtime::kNewClosure), 2, 1); | 6348 __ TailCallRuntime(Runtime::kNewClosure, 2, 1); |
| 6349 } | 6349 } |
| 6350 | 6350 |
| 6351 | 6351 |
| 6352 void FastNewContextStub::Generate(MacroAssembler* masm) { | 6352 void FastNewContextStub::Generate(MacroAssembler* masm) { |
| 6353 // Try to allocate the context in new space. | 6353 // Try to allocate the context in new space. |
| 6354 Label gc; | 6354 Label gc; |
| 6355 int length = slots_ + Context::MIN_CONTEXT_SLOTS; | 6355 int length = slots_ + Context::MIN_CONTEXT_SLOTS; |
| 6356 __ AllocateInNewSpace((length * kPointerSize) + FixedArray::kHeaderSize, | 6356 __ AllocateInNewSpace((length * kPointerSize) + FixedArray::kHeaderSize, |
| 6357 rax, rbx, rcx, &gc, TAG_OBJECT); | 6357 rax, rbx, rcx, &gc, TAG_OBJECT); |
| 6358 | 6358 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 6380 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; i++) { | 6380 for (int i = Context::MIN_CONTEXT_SLOTS; i < length; i++) { |
| 6381 __ movq(Operand(rax, Context::SlotOffset(i)), rbx); | 6381 __ movq(Operand(rax, Context::SlotOffset(i)), rbx); |
| 6382 } | 6382 } |
| 6383 | 6383 |
| 6384 // Return and remove the on-stack parameter. | 6384 // Return and remove the on-stack parameter. |
| 6385 __ movq(rsi, rax); | 6385 __ movq(rsi, rax); |
| 6386 __ ret(1 * kPointerSize); | 6386 __ ret(1 * kPointerSize); |
| 6387 | 6387 |
| 6388 // Need to collect. Call into runtime system. | 6388 // Need to collect. Call into runtime system. |
| 6389 __ bind(&gc); | 6389 __ bind(&gc); |
| 6390 __ TailCallRuntime(ExternalReference(Runtime::kNewContext), 1, 1); | 6390 __ TailCallRuntime(Runtime::kNewContext, 1, 1); |
| 6391 } | 6391 } |
| 6392 | 6392 |
| 6393 | 6393 |
| 6394 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { | 6394 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
| 6395 // Stack layout on entry: | 6395 // Stack layout on entry: |
| 6396 // | 6396 // |
| 6397 // [rsp + kPointerSize]: constant elements. | 6397 // [rsp + kPointerSize]: constant elements. |
| 6398 // [rsp + (2 * kPointerSize)]: literal index. | 6398 // [rsp + (2 * kPointerSize)]: literal index. |
| 6399 // [rsp + (3 * kPointerSize)]: literals array. | 6399 // [rsp + (3 * kPointerSize)]: literals array. |
| 6400 | 6400 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6436 for (int i = 0; i < elements_size; i += kPointerSize) { | 6436 for (int i = 0; i < elements_size; i += kPointerSize) { |
| 6437 __ movq(rbx, FieldOperand(rcx, i)); | 6437 __ movq(rbx, FieldOperand(rcx, i)); |
| 6438 __ movq(FieldOperand(rdx, i), rbx); | 6438 __ movq(FieldOperand(rdx, i), rbx); |
| 6439 } | 6439 } |
| 6440 } | 6440 } |
| 6441 | 6441 |
| 6442 // Return and remove the on-stack parameters. | 6442 // Return and remove the on-stack parameters. |
| 6443 __ ret(3 * kPointerSize); | 6443 __ ret(3 * kPointerSize); |
| 6444 | 6444 |
| 6445 __ bind(&slow_case); | 6445 __ bind(&slow_case); |
| 6446 ExternalReference runtime(Runtime::kCreateArrayLiteralShallow); | 6446 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); |
| 6447 __ TailCallRuntime(runtime, 3, 1); | |
| 6448 } | 6447 } |
| 6449 | 6448 |
| 6450 | 6449 |
| 6451 void ToBooleanStub::Generate(MacroAssembler* masm) { | 6450 void ToBooleanStub::Generate(MacroAssembler* masm) { |
| 6452 Label false_result, true_result, not_string; | 6451 Label false_result, true_result, not_string; |
| 6453 __ movq(rax, Operand(rsp, 1 * kPointerSize)); | 6452 __ movq(rax, Operand(rsp, 1 * kPointerSize)); |
| 6454 | 6453 |
| 6455 // 'null' => false. | 6454 // 'null' => false. |
| 6456 __ CompareRoot(rax, Heap::kNullValueRootIndex); | 6455 __ CompareRoot(rax, Heap::kNullValueRootIndex); |
| 6457 __ j(equal, &false_result); | 6456 __ j(equal, &false_result); |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6796 UNREACHABLE(); | 6795 UNREACHABLE(); |
| 6797 } | 6796 } |
| 6798 } | 6797 } |
| 6799 | 6798 |
| 6800 | 6799 |
| 6801 void RegExpExecStub::Generate(MacroAssembler* masm) { | 6800 void RegExpExecStub::Generate(MacroAssembler* masm) { |
| 6802 // Just jump directly to runtime if native RegExp is not selected at compile | 6801 // Just jump directly to runtime if native RegExp is not selected at compile |
| 6803 // time or if regexp entry in generated code is turned off runtime switch or | 6802 // time or if regexp entry in generated code is turned off runtime switch or |
| 6804 // at compilation. | 6803 // at compilation. |
| 6805 #ifndef V8_NATIVE_REGEXP | 6804 #ifndef V8_NATIVE_REGEXP |
| 6806 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 6805 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 6807 #else // V8_NATIVE_REGEXP | 6806 #else // V8_NATIVE_REGEXP |
| 6808 if (!FLAG_regexp_entry_native) { | 6807 if (!FLAG_regexp_entry_native) { |
| 6809 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 6808 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 6810 return; | 6809 return; |
| 6811 } | 6810 } |
| 6812 | 6811 |
| 6813 // Stack frame on entry. | 6812 // Stack frame on entry. |
| 6814 // esp[0]: return address | 6813 // esp[0]: return address |
| 6815 // esp[8]: last_match_info (expected JSArray) | 6814 // esp[8]: last_match_info (expected JSArray) |
| 6816 // esp[16]: previous index | 6815 // esp[16]: previous index |
| 6817 // esp[24]: subject string | 6816 // esp[24]: subject string |
| 6818 // esp[32]: JSRegExp object | 6817 // esp[32]: JSRegExp object |
| 6819 | 6818 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7143 rdi); | 7142 rdi); |
| 7144 __ jmp(&next_capture); | 7143 __ jmp(&next_capture); |
| 7145 __ bind(&done); | 7144 __ bind(&done); |
| 7146 | 7145 |
| 7147 // Return last match info. | 7146 // Return last match info. |
| 7148 __ movq(rax, Operand(rsp, kLastMatchInfoOffset)); | 7147 __ movq(rax, Operand(rsp, kLastMatchInfoOffset)); |
| 7149 __ ret(4 * kPointerSize); | 7148 __ ret(4 * kPointerSize); |
| 7150 | 7149 |
| 7151 // Do the runtime call to execute the regexp. | 7150 // Do the runtime call to execute the regexp. |
| 7152 __ bind(&runtime); | 7151 __ bind(&runtime); |
| 7153 __ TailCallRuntime(ExternalReference(Runtime::kRegExpExec), 4, 1); | 7152 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
| 7154 #endif // V8_NATIVE_REGEXP | 7153 #endif // V8_NATIVE_REGEXP |
| 7155 } | 7154 } |
| 7156 | 7155 |
| 7157 | 7156 |
| 7158 void CompareStub::Generate(MacroAssembler* masm) { | 7157 void CompareStub::Generate(MacroAssembler* masm) { |
| 7159 Label call_builtin, done; | 7158 Label call_builtin, done; |
| 7160 | 7159 |
| 7161 // NOTICE! This code is only reached after a smi-fast-case check, so | 7160 // NOTICE! This code is only reached after a smi-fast-case check, so |
| 7162 // it is certain that at least one operand isn't a smi. | 7161 // it is certain that at least one operand isn't a smi. |
| 7163 | 7162 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7554 __ subq(rdx, Immediate(kPointerSize)); | 7553 __ subq(rdx, Immediate(kPointerSize)); |
| 7555 __ decq(rcx); | 7554 __ decq(rcx); |
| 7556 __ j(not_zero, &loop); | 7555 __ j(not_zero, &loop); |
| 7557 | 7556 |
| 7558 // Return and remove the on-stack parameters. | 7557 // Return and remove the on-stack parameters. |
| 7559 __ bind(&done); | 7558 __ bind(&done); |
| 7560 __ ret(3 * kPointerSize); | 7559 __ ret(3 * kPointerSize); |
| 7561 | 7560 |
| 7562 // Do the runtime call to allocate the arguments object. | 7561 // Do the runtime call to allocate the arguments object. |
| 7563 __ bind(&runtime); | 7562 __ bind(&runtime); |
| 7564 __ TailCallRuntime(ExternalReference(Runtime::kNewArgumentsFast), 3, 1); | 7563 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); |
| 7565 } | 7564 } |
| 7566 | 7565 |
| 7567 | 7566 |
| 7568 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { | 7567 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| 7569 // The key is in rdx and the parameter count is in rax. | 7568 // The key is in rdx and the parameter count is in rax. |
| 7570 | 7569 |
| 7571 // The displacement is used for skipping the frame pointer on the | 7570 // The displacement is used for skipping the frame pointer on the |
| 7572 // stack. It is the offset of the last parameter (if any) relative | 7571 // stack. It is the offset of the last parameter (if any) relative |
| 7573 // to the frame pointer. | 7572 // to the frame pointer. |
| 7574 static const int kDisplacement = 1 * kPointerSize; | 7573 static const int kDisplacement = 1 * kPointerSize; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7611 index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); | 7610 index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); |
| 7612 __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); | 7611 __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); |
| 7613 __ Ret(); | 7612 __ Ret(); |
| 7614 | 7613 |
| 7615 // Slow-case: Handle non-smi or out-of-bounds access to arguments | 7614 // Slow-case: Handle non-smi or out-of-bounds access to arguments |
| 7616 // by calling the runtime system. | 7615 // by calling the runtime system. |
| 7617 __ bind(&slow); | 7616 __ bind(&slow); |
| 7618 __ pop(rbx); // Return address. | 7617 __ pop(rbx); // Return address. |
| 7619 __ push(rdx); | 7618 __ push(rdx); |
| 7620 __ push(rbx); | 7619 __ push(rbx); |
| 7621 Runtime::Function* f = | 7620 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); |
| 7622 Runtime::FunctionForId(Runtime::kGetArgumentsProperty); | |
| 7623 __ TailCallRuntime(ExternalReference(f), 1, f->result_size); | |
| 7624 } | 7621 } |
| 7625 | 7622 |
| 7626 | 7623 |
| 7627 void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { | 7624 void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { |
| 7628 // Check if the calling frame is an arguments adaptor frame. | 7625 // Check if the calling frame is an arguments adaptor frame. |
| 7629 Label adaptor; | 7626 Label adaptor; |
| 7630 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 7627 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
| 7631 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), | 7628 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), |
| 7632 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 7629 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
| 7633 | 7630 |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8102 void StackCheckStub::Generate(MacroAssembler* masm) { | 8099 void StackCheckStub::Generate(MacroAssembler* masm) { |
| 8103 // Because builtins always remove the receiver from the stack, we | 8100 // Because builtins always remove the receiver from the stack, we |
| 8104 // have to fake one to avoid underflowing the stack. The receiver | 8101 // have to fake one to avoid underflowing the stack. The receiver |
| 8105 // must be inserted below the return address on the stack so we | 8102 // must be inserted below the return address on the stack so we |
| 8106 // temporarily store that in a register. | 8103 // temporarily store that in a register. |
| 8107 __ pop(rax); | 8104 __ pop(rax); |
| 8108 __ Push(Smi::FromInt(0)); | 8105 __ Push(Smi::FromInt(0)); |
| 8109 __ push(rax); | 8106 __ push(rax); |
| 8110 | 8107 |
| 8111 // Do tail-call to runtime routine. | 8108 // Do tail-call to runtime routine. |
| 8112 Runtime::Function* f = Runtime::FunctionForId(Runtime::kStackGuard); | 8109 __ TailCallRuntime(Runtime::kStackGuard, 1, 1); |
| 8113 __ TailCallRuntime(ExternalReference(f), 1, f->result_size); | |
| 8114 } | 8110 } |
| 8115 | 8111 |
| 8116 | 8112 |
| 8117 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, | 8113 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, |
| 8118 Register number) { | 8114 Register number) { |
| 8119 Label load_smi, done; | 8115 Label load_smi, done; |
| 8120 | 8116 |
| 8121 __ JumpIfSmi(number, &load_smi); | 8117 __ JumpIfSmi(number, &load_smi); |
| 8122 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); | 8118 __ fld_d(FieldOperand(number, HeapNumber::kValueOffset)); |
| 8123 __ jmp(&done); | 8119 __ jmp(&done); |
| (...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9101 // rcx: next character of result | 9097 // rcx: next character of result |
| 9102 // rdx: first char of second argument | 9098 // rdx: first char of second argument |
| 9103 // rdi: length of second argument | 9099 // rdi: length of second argument |
| 9104 GenerateCopyCharacters(masm, rcx, rdx, rdi, false); | 9100 GenerateCopyCharacters(masm, rcx, rdx, rdi, false); |
| 9105 __ movq(rax, rbx); | 9101 __ movq(rax, rbx); |
| 9106 __ IncrementCounter(&Counters::string_add_native, 1); | 9102 __ IncrementCounter(&Counters::string_add_native, 1); |
| 9107 __ ret(2 * kPointerSize); | 9103 __ ret(2 * kPointerSize); |
| 9108 | 9104 |
| 9109 // Just jump to runtime to add the two strings. | 9105 // Just jump to runtime to add the two strings. |
| 9110 __ bind(&string_add_runtime); | 9106 __ bind(&string_add_runtime); |
| 9111 __ TailCallRuntime(ExternalReference(Runtime::kStringAdd), 2, 1); | 9107 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
| 9112 } | 9108 } |
| 9113 | 9109 |
| 9114 | 9110 |
| 9115 void StringStubBase::GenerateCopyCharacters(MacroAssembler* masm, | 9111 void StringStubBase::GenerateCopyCharacters(MacroAssembler* masm, |
| 9116 Register dest, | 9112 Register dest, |
| 9117 Register src, | 9113 Register src, |
| 9118 Register count, | 9114 Register count, |
| 9119 bool ascii) { | 9115 bool ascii) { |
| 9120 Label loop; | 9116 Label loop; |
| 9121 __ bind(&loop); | 9117 __ bind(&loop); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9295 // rdx: original value of rsi | 9291 // rdx: original value of rsi |
| 9296 // rdi: first character of result | 9292 // rdi: first character of result |
| 9297 // rsi: character of sub string start | 9293 // rsi: character of sub string start |
| 9298 GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false); | 9294 GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false); |
| 9299 __ movq(rsi, rdx); // Restore esi. | 9295 __ movq(rsi, rdx); // Restore esi. |
| 9300 __ IncrementCounter(&Counters::sub_string_native, 1); | 9296 __ IncrementCounter(&Counters::sub_string_native, 1); |
| 9301 __ ret(kArgumentsSize); | 9297 __ ret(kArgumentsSize); |
| 9302 | 9298 |
| 9303 // Just jump to runtime to create the sub string. | 9299 // Just jump to runtime to create the sub string. |
| 9304 __ bind(&runtime); | 9300 __ bind(&runtime); |
| 9305 __ TailCallRuntime(ExternalReference(Runtime::kSubString), 3, 1); | 9301 __ TailCallRuntime(Runtime::kSubString, 3, 1); |
| 9306 } | 9302 } |
| 9307 | 9303 |
| 9308 | 9304 |
| 9309 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, | 9305 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, |
| 9310 Register left, | 9306 Register left, |
| 9311 Register right, | 9307 Register right, |
| 9312 Register scratch1, | 9308 Register scratch1, |
| 9313 Register scratch2, | 9309 Register scratch2, |
| 9314 Register scratch3, | 9310 Register scratch3, |
| 9315 Register scratch4) { | 9311 Register scratch4) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9415 // Check that both are sequential ASCII strings. | 9411 // Check that both are sequential ASCII strings. |
| 9416 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); | 9412 __ JumpIfNotBothSequentialAsciiStrings(rdx, rax, rcx, rbx, &runtime); |
| 9417 | 9413 |
| 9418 // Inline comparison of ascii strings. | 9414 // Inline comparison of ascii strings. |
| 9419 __ IncrementCounter(&Counters::string_compare_native, 1); | 9415 __ IncrementCounter(&Counters::string_compare_native, 1); |
| 9420 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); | 9416 GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); |
| 9421 | 9417 |
| 9422 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 9418 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 9423 // tagged as a small integer. | 9419 // tagged as a small integer. |
| 9424 __ bind(&runtime); | 9420 __ bind(&runtime); |
| 9425 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); | 9421 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 9426 } | 9422 } |
| 9427 | 9423 |
| 9428 #undef __ | 9424 #undef __ |
| 9429 | 9425 |
| 9430 #define __ masm. | 9426 #define __ masm. |
| 9431 | 9427 |
| 9432 #ifdef _WIN64 | 9428 #ifdef _WIN64 |
| 9433 typedef double (*ModuloFunction)(double, double); | 9429 typedef double (*ModuloFunction)(double, double); |
| 9434 // Define custom fmod implementation. | 9430 // Define custom fmod implementation. |
| 9435 ModuloFunction CreateModuloFunction() { | 9431 ModuloFunction CreateModuloFunction() { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9515 // Call the function from C++. | 9511 // Call the function from C++. |
| 9516 return FUNCTION_CAST<ModuloFunction>(buffer); | 9512 return FUNCTION_CAST<ModuloFunction>(buffer); |
| 9517 } | 9513 } |
| 9518 | 9514 |
| 9519 #endif | 9515 #endif |
| 9520 | 9516 |
| 9521 | 9517 |
| 9522 #undef __ | 9518 #undef __ |
| 9523 | 9519 |
| 9524 } } // namespace v8::internal | 9520 } } // namespace v8::internal |
| OLD | NEW |