| 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,
|
|
|