Index: src/x64/stub-cache-x64.cc |
diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
index 48e073dd2ddd5f22fad3c5930b938f150cdc6dbb..a83408bca63b15743a506d67edcf0042650e7dba 100644 |
--- a/src/x64/stub-cache-x64.cc |
+++ b/src/x64/stub-cache-x64.cc |
@@ -1956,196 +1956,6 @@ Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall( |
} |
-Handle<Code> CallStubCompiler::CompileMathFloorCall( |
- Handle<Object> object, |
- Handle<JSObject> holder, |
- Handle<Cell> cell, |
- Handle<JSFunction> function, |
- Handle<String> name, |
- Code::StubType type) { |
- const int argc = arguments().immediate(); |
- StackArgumentsAccessor args(rsp, argc); |
- |
- // If the object is not a JSObject or we got an unexpected number of |
- // arguments, bail out to the regular call. |
- if (!object->IsJSObject() || argc != 1) { |
- return Handle<Code>::null(); |
- } |
- |
- Label miss, slow; |
- |
- HandlerFrontendHeader(object, holder, name, RECEIVER_MAP_CHECK, &miss); |
- if (!cell.is_null()) { |
- ASSERT(cell->value() == *function); |
- GenerateLoadFunctionFromCell(cell, function, &miss); |
- } |
- |
- // Load the (only) argument into rax. |
- __ movq(rax, args.GetArgumentOperand(1)); |
- |
- // Check if the argument is a smi. |
- Label smi; |
- STATIC_ASSERT(kSmiTag == 0); |
- __ JumpIfSmi(rax, &smi); |
- |
- // Check if the argument is a heap number and load its value into xmm0. |
- __ CheckMap(rax, factory()->heap_number_map(), &slow, DONT_DO_SMI_CHECK); |
- __ movsd(xmm0, FieldOperand(rax, HeapNumber::kValueOffset)); |
- |
- // Check if the argument is strictly positive. Note this also discards NaN. |
- __ xorpd(xmm1, xmm1); |
- __ ucomisd(xmm0, xmm1); |
- __ j(below_equal, &slow); |
- |
- // Do a truncating conversion. |
- __ cvttsd2si(rax, xmm0); |
- |
- // Checks for 0x80000000 which signals a failed conversion. |
- Label conversion_failure; |
- __ cmpl(rax, Immediate(0x80000000)); |
- __ j(equal, &conversion_failure); |
- |
- // Smi tag and return. |
- __ Integer32ToSmi(rax, rax); |
- __ bind(&smi); |
- __ ret(2 * kPointerSize); |
- |
- // Check if the argument is < 2^kMantissaBits. |
- Label already_round; |
- __ bind(&conversion_failure); |
- int64_t kTwoMantissaBits= V8_INT64_C(0x4330000000000000); |
- __ movq(rbx, kTwoMantissaBits); |
- __ movq(xmm1, rbx); |
- __ ucomisd(xmm0, xmm1); |
- __ j(above_equal, &already_round); |
- |
- // Save a copy of the argument. |
- __ movaps(xmm2, xmm0); |
- |
- // Compute (argument + 2^kMantissaBits) - 2^kMantissaBits. |
- __ addsd(xmm0, xmm1); |
- __ subsd(xmm0, xmm1); |
- |
- // Compare the argument and the tentative result to get the right mask: |
- // if xmm2 < xmm0: |
- // xmm2 = 1...1 |
- // else: |
- // xmm2 = 0...0 |
- __ cmpltsd(xmm2, xmm0); |
- |
- // Subtract 1 if the argument was less than the tentative result. |
- int64_t kOne = V8_INT64_C(0x3ff0000000000000); |
- __ movq(rbx, kOne); |
- __ movq(xmm1, rbx); |
- __ andpd(xmm1, xmm2); |
- __ subsd(xmm0, xmm1); |
- |
- // Return a new heap number. |
- __ AllocateHeapNumber(rax, rbx, &slow); |
- __ movsd(FieldOperand(rax, HeapNumber::kValueOffset), xmm0); |
- __ ret(2 * kPointerSize); |
- |
- // Return the argument (when it's an already round heap number). |
- __ bind(&already_round); |
- __ movq(rax, args.GetArgumentOperand(1)); |
- __ ret(2 * kPointerSize); |
- |
- __ bind(&slow); |
- // We do not have to patch the receiver because the function makes no use of |
- // it. |
- GenerateJumpFunctionIgnoreReceiver(function); |
- |
- HandlerFrontendFooter(&miss); |
- |
- // Return the generated code. |
- return GetCode(type, name); |
-} |
- |
- |
-Handle<Code> CallStubCompiler::CompileMathAbsCall( |
- Handle<Object> object, |
- Handle<JSObject> holder, |
- Handle<Cell> cell, |
- Handle<JSFunction> function, |
- Handle<String> name, |
- Code::StubType type) { |
- // If the object is not a JSObject or we got an unexpected number of |
- // arguments, bail out to the regular call. |
- const int argc = arguments().immediate(); |
- StackArgumentsAccessor args(rsp, argc); |
- if (!object->IsJSObject() || argc != 1) return Handle<Code>::null(); |
- |
- Label miss; |
- |
- HandlerFrontendHeader(object, holder, name, RECEIVER_MAP_CHECK, &miss); |
- if (!cell.is_null()) { |
- ASSERT(cell->value() == *function); |
- GenerateLoadFunctionFromCell(cell, function, &miss); |
- } |
- |
- // Load the (only) argument into rax. |
- __ movq(rax, args.GetArgumentOperand(1)); |
- |
- // Check if the argument is a smi. |
- Label not_smi; |
- STATIC_ASSERT(kSmiTag == 0); |
- __ JumpIfNotSmi(rax, ¬_smi); |
- |
- // Branchless abs implementation, refer to below: |
- // http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs |
- // Set ebx to 1...1 (== -1) if the argument is negative, or to 0...0 |
- // otherwise. |
- __ movq(rbx, rax); |
- __ sar(rbx, Immediate(kBitsPerPointer - 1)); |
- |
- // Do bitwise not or do nothing depending on ebx. |
- __ xor_(rax, rbx); |
- |
- // Add 1 or do nothing depending on ebx. |
- __ subq(rax, rbx); |
- |
- // If the result is still negative, go to the slow case. |
- // This only happens for the most negative smi. |
- Label slow; |
- __ j(negative, &slow); |
- |
- __ ret(2 * kPointerSize); |
- |
- // Check if the argument is a heap number and load its value. |
- __ bind(¬_smi); |
- __ CheckMap(rax, factory()->heap_number_map(), &slow, DONT_DO_SMI_CHECK); |
- __ MoveDouble(rbx, FieldOperand(rax, HeapNumber::kValueOffset)); |
- |
- // Check the sign of the argument. If the argument is positive, |
- // just return it. |
- Label negative_sign; |
- const int sign_mask_shift = |
- (HeapNumber::kExponentOffset - HeapNumber::kValueOffset) * kBitsPerByte; |
- __ Set(rdi, static_cast<int64_t>(HeapNumber::kSignMask) << sign_mask_shift); |
- __ testq(rbx, rdi); |
- __ j(not_zero, &negative_sign); |
- __ ret(2 * kPointerSize); |
- |
- // If the argument is negative, clear the sign, and return a new |
- // number. We still have the sign mask in rdi. |
- __ bind(&negative_sign); |
- __ xor_(rbx, rdi); |
- __ AllocateHeapNumber(rax, rdx, &slow); |
- __ MoveDouble(FieldOperand(rax, HeapNumber::kValueOffset), rbx); |
- __ ret(2 * kPointerSize); |
- |
- __ bind(&slow); |
- // We do not have to patch the receiver because the function makes no use of |
- // it. |
- GenerateJumpFunctionIgnoreReceiver(function); |
- |
- HandlerFrontendFooter(&miss); |
- |
- // Return the generated code. |
- return GetCode(type, name); |
-} |
- |
- |
Handle<Code> CallStubCompiler::CompileFastApiCall( |
const CallOptimization& optimization, |
Handle<Object> object, |