Index: src/mips/stub-cache-mips.cc |
=================================================================== |
--- src/mips/stub-cache-mips.cc (revision 8174) |
+++ src/mips/stub-cache-mips.cc (working copy) |
@@ -126,7 +126,7 @@ |
// Check that receiver is a JSObject. |
__ lbu(scratch0, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
- __ Branch(miss_label, lt, scratch0, Operand(FIRST_JS_OBJECT_TYPE)); |
+ __ Branch(miss_label, lt, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE)); |
// Load properties array. |
Register properties = scratch0; |
@@ -472,7 +472,8 @@ |
static void GenerateCallFunction(MacroAssembler* masm, |
Object* object, |
const ParameterCount& arguments, |
- Label* miss) { |
+ Label* miss, |
+ Code::ExtraICState extra_ic_state) { |
// ----------- S t a t e ------------- |
// -- a0: receiver |
// -- a1: function to call |
@@ -490,7 +491,10 @@ |
} |
// Invoke the function. |
- __ InvokeFunction(a1, arguments, JUMP_FUNCTION); |
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state) |
+ ? CALL_AS_FUNCTION |
+ : CALL_AS_METHOD; |
+ __ InvokeFunction(a1, arguments, JUMP_FUNCTION, NullCallWrapper(), call_kind); |
} |
@@ -629,10 +633,12 @@ |
public: |
CallInterceptorCompiler(StubCompiler* stub_compiler, |
const ParameterCount& arguments, |
- Register name) |
+ Register name, |
+ Code::ExtraICState extra_ic_state) |
: stub_compiler_(stub_compiler), |
arguments_(arguments), |
- name_(name) {} |
+ name_(name), |
+ extra_ic_state_(extra_ic_state) {} |
MaybeObject* Compile(MacroAssembler* masm, |
JSObject* object, |
@@ -760,8 +766,11 @@ |
arguments_.immediate()); |
if (result->IsFailure()) return result; |
} else { |
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
+ ? CALL_AS_FUNCTION |
+ : CALL_AS_METHOD; |
__ InvokeFunction(optimization.constant_function(), arguments_, |
- JUMP_FUNCTION); |
+ JUMP_FUNCTION, call_kind); |
} |
// Deferred code for fast API call case---clean preallocated space. |
@@ -844,6 +853,7 @@ |
StubCompiler* stub_compiler_; |
const ParameterCount& arguments_; |
Register name_; |
+ Code::ExtraICState extra_ic_state_; |
}; |
@@ -1503,7 +1513,7 @@ |
Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss); |
GenerateFastPropertyLoad(masm(), a1, reg, holder, index); |
- GenerateCallFunction(masm(), object, arguments(), &miss); |
+ GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); |
// Handle call cache miss. |
__ bind(&miss); |
@@ -2001,7 +2011,7 @@ |
// Tail call the full function. We do not have to patch the receiver |
// because the function makes no use of it. |
__ bind(&slow); |
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
__ bind(&miss); |
// a2: function name. |
@@ -2086,9 +2096,7 @@ |
// Retrieve FCSR and check for fpu errors. |
__ cfc1(t5, FCSR); |
- __ srl(t5, t5, kFCSRFlagShift); |
- // Flag 1 marks an inaccurate but still good result so we ignore it. |
- __ And(t5, t5, Operand(kFCSRFlagMask ^ 1)); |
+ __ And(t5, t5, Operand(kFCSRExceptionFlagMask)); |
__ Branch(&no_fpu_error, eq, t5, Operand(zero_reg)); |
// Check for NaN, Infinity, and -Infinity. |
@@ -2137,7 +2145,7 @@ |
__ bind(&slow); |
// Tail call the full function. We do not have to patch the receiver |
// because the function makes no use of it. |
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
__ bind(&miss); |
// a2: function name. |
@@ -2239,7 +2247,7 @@ |
// Tail call the full function. We do not have to patch the receiver |
// because the function makes no use of it. |
__ bind(&slow); |
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD); |
__ bind(&miss); |
// a2: function name. |
@@ -2425,7 +2433,10 @@ |
UNREACHABLE(); |
} |
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
+ ? CALL_AS_FUNCTION |
+ : CALL_AS_METHOD; |
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind); |
// Handle call cache miss. |
__ bind(&miss); |
@@ -2459,7 +2470,7 @@ |
// Get the receiver from the stack. |
__ lw(a1, MemOperand(sp, argc * kPointerSize)); |
- CallInterceptorCompiler compiler(this, arguments(), a2); |
+ CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_); |
MaybeObject* result = compiler.Compile(masm(), |
object, |
holder, |
@@ -2479,7 +2490,7 @@ |
// Restore receiver. |
__ lw(a0, MemOperand(sp, argc * kPointerSize)); |
- GenerateCallFunction(masm(), object, arguments(), &miss); |
+ GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_); |
// Handle call cache miss. |
__ bind(&miss); |
@@ -2491,13 +2502,11 @@ |
} |
-MaybeObject* CallStubCompiler::CompileCallGlobal( |
- JSObject* object, |
- GlobalObject* holder, |
- JSGlobalPropertyCell* cell, |
- JSFunction* function, |
- String* name, |
- Code::ExtraICState extra_ic_state) { |
+MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object, |
+ GlobalObject* holder, |
+ JSGlobalPropertyCell* cell, |
+ JSFunction* function, |
+ String* name) { |
// ----------- S t a t e ------------- |
// -- a2 : name |
// -- ra : return address |
@@ -2538,7 +2547,7 @@ |
ASSERT(function->is_compiled()); |
Handle<Code> code(function->code()); |
ParameterCount expected(function->shared()->formal_parameter_count()); |
- CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state) |
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) |
? CALL_AS_FUNCTION |
: CALL_AS_METHOD; |
if (V8::UseCrankshaft()) { |
@@ -3934,27 +3943,8 @@ |
__ addu(t8, a3, t8); |
__ sdc1(f0, MemOperand(t8, 0)); |
} else { |
- Label done; |
+ __ EmitECMATruncate(t3, f0, f2, t2, t1, t5); |
- // Need to perform float-to-int conversion. |
- // Test whether exponent equal to 0x7FF (infinity or NaN). |
- |
- __ mfc1(t3, f1); // Move exponent word of double to t3 (as raw bits). |
- __ li(t1, Operand(0x7FF00000)); |
- __ And(t3, t3, Operand(t1)); |
- __ Branch(USE_DELAY_SLOT, &done, eq, t3, Operand(t1)); |
- __ mov(t3, zero_reg); // In delay slot. |
- |
- // Not infinity or NaN simply convert to int. |
- if (IsElementTypeSigned(array_type)) { |
- __ trunc_w_d(f0, f0); |
- __ mfc1(t3, f0); |
- } else { |
- __ Trunc_uw_d(f0, t3); |
- } |
- |
- // t3: HeapNumber converted to integer |
- __ bind(&done); |
switch (array_type) { |
case kExternalByteArray: |
case kExternalUnsignedByteArray: |