| Index: src/mips/code-stubs-mips.cc
|
| ===================================================================
|
| --- src/mips/code-stubs-mips.cc (revision 8174)
|
| +++ src/mips/code-stubs-mips.cc (working copy)
|
| @@ -672,9 +672,8 @@
|
| // Restore FCSR.
|
| __ ctc1(scratch1, FCSR);
|
|
|
| - // Check for inexact conversion.
|
| - __ srl(scratch2, scratch2, kFCSRFlagShift);
|
| - __ And(scratch2, scratch2, (kFCSRFlagMask | kFCSRInexactFlagBit));
|
| + // Check for inexact conversion or exception.
|
| + __ And(scratch2, scratch2, kFCSRFlagMask);
|
|
|
| // Jump to not_int32 if the operation did not succeed.
|
| __ Branch(not_int32, ne, scratch2, Operand(zero_reg));
|
| @@ -757,9 +756,8 @@
|
| // Restore FCSR.
|
| __ ctc1(scratch1, FCSR);
|
|
|
| - // Check for inexact conversion.
|
| - __ srl(scratch2, scratch2, kFCSRFlagShift);
|
| - __ And(scratch2, scratch2, (kFCSRFlagMask | kFCSRInexactFlagBit));
|
| + // Check for inexact conversion or exception.
|
| + __ And(scratch2, scratch2, kFCSRFlagMask);
|
|
|
| // Jump to not_int32 if the operation did not succeed.
|
| __ Branch(not_int32, ne, scratch2, Operand(zero_reg));
|
| @@ -985,13 +983,13 @@
|
| // Smis. If it's not a heap number, then return equal.
|
| if (cc == less || cc == greater) {
|
| __ GetObjectType(a0, t4, t4);
|
| - __ Branch(slow, greater, t4, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE));
|
| } else {
|
| __ GetObjectType(a0, t4, t4);
|
| __ Branch(&heap_number, eq, t4, Operand(HEAP_NUMBER_TYPE));
|
| // Comparing JS objects with <=, >= is complicated.
|
| if (cc != eq) {
|
| - __ Branch(slow, greater, t4, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE));
|
| // Normally here we fall through to return_equal, but undefined is
|
| // special: (undefined == undefined) == true, but
|
| // (undefined <= undefined) == false! See ECMAScript 11.8.5.
|
| @@ -1309,15 +1307,15 @@
|
| static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm,
|
| Register lhs,
|
| Register rhs) {
|
| - // If either operand is a JSObject or an oddball value, then they are
|
| + // If either operand is a JS object or an oddball value, then they are
|
| // not equal since their pointers are different.
|
| // There is no test for undetectability in strict equality.
|
| - STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| + STATIC_ASSERT(LAST_TYPE == LAST_CALLABLE_SPEC_OBJECT_TYPE);
|
| Label first_non_object;
|
| // Get the type of the first operand into a2 and compare it with
|
| - // FIRST_JS_OBJECT_TYPE.
|
| + // FIRST_SPEC_OBJECT_TYPE.
|
| __ GetObjectType(lhs, a2, a2);
|
| - __ Branch(&first_non_object, less, a2, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(&first_non_object, less, a2, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
|
| // Return non-zero.
|
| Label return_not_equal;
|
| @@ -1330,7 +1328,7 @@
|
| __ Branch(&return_not_equal, eq, a2, Operand(ODDBALL_TYPE));
|
|
|
| __ GetObjectType(rhs, a3, a3);
|
| - __ Branch(&return_not_equal, greater, a3, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(&return_not_equal, greater, a3, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
|
| // Check for oddballs: true, false, null, undefined.
|
| __ Branch(&return_not_equal, eq, a3, Operand(ODDBALL_TYPE));
|
| @@ -1406,9 +1404,9 @@
|
| __ Ret();
|
|
|
| __ bind(&object_test);
|
| - __ Branch(not_both_strings, lt, a2, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(not_both_strings, lt, a2, Operand(FIRST_SPEC_OBJECT_TYPE));
|
| __ GetObjectType(rhs, a2, a3);
|
| - __ Branch(not_both_strings, lt, a3, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Branch(not_both_strings, lt, a3, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
|
| // If both objects are undetectable, they are equal. Otherwise, they
|
| // are not equal, since they are different objects and an object is not
|
| @@ -1784,7 +1782,7 @@
|
| // "tos_" is a register and contains a non-zero value.
|
| // Hence we implicitly return true if the greater than
|
| // condition is satisfied.
|
| - __ Ret(gt, scratch0, Operand(FIRST_JS_OBJECT_TYPE));
|
| + __ Ret(gt, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
|
| // Check for string.
|
| __ lw(scratch0, FieldMemOperand(tos_, HeapObject::kMapOffset));
|
| @@ -1966,6 +1964,7 @@
|
| GenerateTypeTransition(masm);
|
| }
|
|
|
| +
|
| void UnaryOpStub::GenerateHeapNumberCodeSub(MacroAssembler* masm,
|
| Label* slow) {
|
| EmitCheckForHeapNumber(masm, a0, a1, t2, slow);
|
| @@ -2777,8 +2776,7 @@
|
| // Restore FCSR.
|
| __ ctc1(scratch1, FCSR);
|
|
|
| - // Check for inexact conversion.
|
| - __ srl(scratch2, scratch2, kFCSRFlagShift);
|
| + // Check for inexact conversion or exception.
|
| __ And(scratch2, scratch2, kFCSRFlagMask);
|
|
|
| if (result_type_ <= BinaryOpIC::INT32) {
|
| @@ -4710,7 +4708,11 @@
|
| Label call_as_function;
|
| __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
| __ Branch(&call_as_function, eq, t0, Operand(at));
|
| - __ InvokeFunction(a1, actual, JUMP_FUNCTION);
|
| + __ InvokeFunction(a1,
|
| + actual,
|
| + JUMP_FUNCTION,
|
| + NullCallWrapper(),
|
| + CALL_AS_METHOD);
|
| __ bind(&call_as_function);
|
| }
|
| __ InvokeFunction(a1,
|
| @@ -6370,6 +6372,7 @@
|
| __ Jump(a2);
|
| }
|
|
|
| +
|
| void DirectCEntryStub::Generate(MacroAssembler* masm) {
|
| // No need to pop or drop anything, LeaveExitFrame will restore the old
|
| // stack, thus dropping the allocated space for the return value.
|
| @@ -6394,6 +6397,7 @@
|
| this->GenerateCall(masm, t9);
|
| }
|
|
|
| +
|
| void DirectCEntryStub::GenerateCall(MacroAssembler* masm,
|
| Register target) {
|
| __ Move(t9, target);
|
|
|