| 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 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 | 849 |
| 850 // Copy the arguments to this function possibly from the | 850 // Copy the arguments to this function possibly from the |
| 851 // adaptor frame below it. | 851 // adaptor frame below it. |
| 852 Label invoke, adapted; | 852 Label invoke, adapted; |
| 853 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); | 853 __ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
| 854 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), | 854 __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset), |
| 855 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); | 855 Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); |
| 856 __ j(equal, &adapted); | 856 __ j(equal, &adapted); |
| 857 | 857 |
| 858 // No arguments adaptor frame. Copy fixed number of arguments. | 858 // No arguments adaptor frame. Copy fixed number of arguments. |
| 859 __ movq(rax, Immediate(scope()->num_parameters())); | 859 __ Set(rax, scope()->num_parameters()); |
| 860 for (int i = 0; i < scope()->num_parameters(); i++) { | 860 for (int i = 0; i < scope()->num_parameters(); i++) { |
| 861 __ push(frame_->ParameterAt(i)); | 861 __ push(frame_->ParameterAt(i)); |
| 862 } | 862 } |
| 863 __ jmp(&invoke); | 863 __ jmp(&invoke); |
| 864 | 864 |
| 865 // Arguments adaptor frame present. Copy arguments from there, but | 865 // Arguments adaptor frame present. Copy arguments from there, but |
| 866 // avoid copying too many arguments to avoid stack overflows. | 866 // avoid copying too many arguments to avoid stack overflows. |
| 867 __ bind(&adapted); | 867 __ bind(&adapted); |
| 868 static const uint32_t kArgumentsLimit = 1 * KB; | 868 static const uint32_t kArgumentsLimit = 1 * KB; |
| 869 __ SmiToInteger32(rax, | 869 __ SmiToInteger32(rax, |
| (...skipping 8181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9051 __ pop(rcx); | 9051 __ pop(rcx); |
| 9052 __ push(rax); | 9052 __ push(rax); |
| 9053 __ push(rdx); | 9053 __ push(rdx); |
| 9054 __ push(rcx); | 9054 __ push(rcx); |
| 9055 | 9055 |
| 9056 // Generate the number comparison code. | 9056 // Generate the number comparison code. |
| 9057 if (include_number_compare_) { | 9057 if (include_number_compare_) { |
| 9058 Label non_number_comparison; | 9058 Label non_number_comparison; |
| 9059 Label unordered; | 9059 Label unordered; |
| 9060 FloatingPointHelper::LoadSSE2UnknownOperands(masm, &non_number_comparison); | 9060 FloatingPointHelper::LoadSSE2UnknownOperands(masm, &non_number_comparison); |
| 9061 __ xorl(rax, rax); |
| 9062 __ xorl(rcx, rcx); |
| 9061 __ ucomisd(xmm0, xmm1); | 9063 __ ucomisd(xmm0, xmm1); |
| 9062 | 9064 |
| 9063 // Don't base result on EFLAGS when a NaN is involved. | 9065 // Don't base result on EFLAGS when a NaN is involved. |
| 9064 __ j(parity_even, &unordered); | 9066 __ j(parity_even, &unordered); |
| 9065 // Return a result of -1, 0, or 1, based on EFLAGS. | 9067 // Return a result of -1, 0, or 1, based on EFLAGS. |
| 9066 __ movq(rax, Immediate(0)); // equal | 9068 __ setcc(above, rax); |
| 9067 __ movq(rcx, Immediate(1)); | 9069 __ setcc(below, rcx); |
| 9068 __ cmovq(above, rax, rcx); | 9070 __ subq(rax, rcx); |
| 9069 __ movq(rcx, Immediate(-1)); | |
| 9070 __ cmovq(below, rax, rcx); | |
| 9071 __ ret(2 * kPointerSize); // rax, rdx were pushed | 9071 __ ret(2 * kPointerSize); // rax, rdx were pushed |
| 9072 | 9072 |
| 9073 // If one of the numbers was NaN, then the result is always false. | 9073 // If one of the numbers was NaN, then the result is always false. |
| 9074 // The cc is never not-equal. | 9074 // The cc is never not-equal. |
| 9075 __ bind(&unordered); | 9075 __ bind(&unordered); |
| 9076 ASSERT(cc_ != not_equal); | 9076 ASSERT(cc_ != not_equal); |
| 9077 if (cc_ == less || cc_ == less_equal) { | 9077 if (cc_ == less || cc_ == less_equal) { |
| 9078 __ Set(rax, 1); | 9078 __ Set(rax, 1); |
| 9079 } else { | 9079 } else { |
| 9080 __ Set(rax, -1); | 9080 __ Set(rax, -1); |
| (...skipping 2825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11906 } | 11906 } |
| 11907 | 11907 |
| 11908 #endif | 11908 #endif |
| 11909 | 11909 |
| 11910 | 11910 |
| 11911 #undef __ | 11911 #undef __ |
| 11912 | 11912 |
| 11913 } } // namespace v8::internal | 11913 } } // namespace v8::internal |
| 11914 | 11914 |
| 11915 #endif // V8_TARGET_ARCH_X64 | 11915 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |