Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 61d9d8324a5562589bde5f62078cc6696c2a3c3e..e7b563cffbeefb4525c40d8fa17bd9e3444cb111 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -949,7 +949,8 @@ void FloatingPointHelper::CallCCodeForDoubleOperation( |
__ push(lr); |
__ PrepareCallCFunction(4, scratch); // Two doubles are 4 arguments. |
// Call C routine that may not cause GC or other trouble. |
- __ CallCFunction(ExternalReference::double_fp_operation(op), 4); |
+ __ CallCFunction(ExternalReference::double_fp_operation(op, masm->isolate()), |
+ 4); |
// Store answer in the overwritable heap number. |
#if !defined(USE_ARM_EABI) |
// Double returned in fp coprocessor register 0 and 1, encoded as |
@@ -1304,7 +1305,7 @@ static void EmitTwoNonNanDoubleComparison(MacroAssembler* masm, |
// Call C routine that may not cause GC or other trouble. |
__ push(lr); |
__ PrepareCallCFunction(4, r5); // Two doubles count as 4 arguments. |
- __ CallCFunction(ExternalReference::compare_doubles(), 4); |
+ __ CallCFunction(ExternalReference::compare_doubles(masm->isolate()), 4); |
__ pop(pc); // Return. |
} |
} |
@@ -2018,7 +2019,8 @@ void GenericBinaryOpStub::HandleBinaryOpSlowCases( |
__ PrepareCallCFunction(4, r4); // Two doubles count as 4 arguments. |
// Call C routine that may not cause GC or other trouble. r5 is callee |
// save. |
- __ CallCFunction(ExternalReference::double_fp_operation(op_), 4); |
+ __ CallCFunction( |
+ ExternalReference::double_fp_operation(op_, masm->isolate()), 4); |
// Store answer in the overwritable heap number. |
#if !defined(USE_ARM_EABI) |
// Double returned in fp coprocessor register 0 and 1, encoded as |
@@ -2822,7 +2824,7 @@ void GenericBinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { |
__ Push(r2, r1, r0); |
__ TailCallExternalReference( |
- ExternalReference(IC_Utility(IC::kBinaryOp_Patch)), |
+ ExternalReference(IC_Utility(IC::kBinaryOp_Patch), masm->isolate()), |
5, |
1); |
} |
@@ -2853,7 +2855,8 @@ void TypeRecordingBinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { |
__ Push(r2, r1, r0); |
__ TailCallExternalReference( |
- ExternalReference(IC_Utility(IC::kTypeRecordingBinaryOp_Patch)), |
+ ExternalReference(IC_Utility(IC::kTypeRecordingBinaryOp_Patch), |
+ masm->isolate()), |
5, |
1); |
} |
@@ -3797,11 +3800,14 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
// r2 = low 32 bits of double value. |
// r3 = high 32 bits of double value. |
// r1 = TranscendentalCache::hash(double value). |
- __ mov(cache_entry, |
- Operand(ExternalReference::transcendental_cache_array_address())); |
- // r0 points to cache array. |
- __ ldr(cache_entry, MemOperand(cache_entry, type_ * sizeof( |
- Isolate::Current()->transcendental_cache()->caches_[0]))); |
+ Isolate* isolate = masm->isolate(); |
+ ExternalReference cache_array = |
+ ExternalReference::transcendental_cache_array_address(isolate); |
+ __ mov(cache_entry, Operand(cache_array)); |
+ // cache_entry points to cache array. |
+ int cache_array_index |
+ = type_ * sizeof(isolate->transcendental_cache()->caches_[0]); |
+ __ ldr(cache_entry, MemOperand(cache_entry, cache_array_index)); |
// r0 points to the cache for the type type_. |
// If NULL, the cache hasn't been initialized yet, so go through runtime. |
__ cmp(cache_entry, Operand(0, RelocInfo::NONE)); |
@@ -3846,7 +3852,9 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
__ bind(&calculate); |
if (tagged) { |
__ bind(&invalid_cache); |
- __ TailCallExternalReference(ExternalReference(RuntimeFunction()), 1, 1); |
+ ExternalReference runtime_function = |
+ ExternalReference(RuntimeFunction(), masm->isolate()); |
+ __ TailCallExternalReference(runtime_function, 1, 1); |
} else { |
if (!Isolate::Current()->cpu_features()->IsSupported(VFP3)) UNREACHABLE(); |
CpuFeatures::Scope scope(VFP3); |
@@ -3909,18 +3917,20 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
void TranscendentalCacheStub::GenerateCallCFunction(MacroAssembler* masm, |
Register scratch) { |
+ Isolate* isolate = masm->isolate(); |
+ |
__ push(lr); |
__ PrepareCallCFunction(2, scratch); |
__ vmov(r0, r1, d2); |
switch (type_) { |
case TranscendentalCache::SIN: |
- __ CallCFunction(ExternalReference::math_sin_double_function(), 2); |
+ __ CallCFunction(ExternalReference::math_sin_double_function(isolate), 2); |
break; |
case TranscendentalCache::COS: |
- __ CallCFunction(ExternalReference::math_cos_double_function(), 2); |
+ __ CallCFunction(ExternalReference::math_cos_double_function(isolate), 2); |
break; |
case TranscendentalCache::LOG: |
- __ CallCFunction(ExternalReference::math_log_double_function(), 2); |
+ __ CallCFunction(ExternalReference::math_log_double_function(isolate), 2); |
break; |
default: |
UNIMPLEMENTED(); |
@@ -4140,7 +4150,8 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
__ PrepareCallCFunction(3, scratch); |
__ mov(r2, exponent); |
__ vmov(r0, r1, double_base); |
- __ CallCFunction(ExternalReference::power_double_int_function(), 3); |
+ __ CallCFunction( |
+ ExternalReference::power_double_int_function(masm->isolate()), 3); |
__ pop(lr); |
__ GetCFunctionDoubleResult(double_result); |
__ vstr(double_result, |
@@ -4169,7 +4180,8 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
__ PrepareCallCFunction(4, scratch); |
__ vmov(r0, r1, double_base); |
__ vmov(r2, r3, double_exponent); |
- __ CallCFunction(ExternalReference::power_double_double_function(), 4); |
+ __ CallCFunction( |
+ ExternalReference::power_double_double_function(masm->isolate()), 4); |
__ pop(lr); |
__ GetCFunctionDoubleResult(double_result); |
__ vstr(double_result, |
@@ -4209,15 +4221,16 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, |
// r4: number of arguments including receiver (C callee-saved) |
// r5: pointer to builtin function (C callee-saved) |
// r6: pointer to the first argument (C callee-saved) |
+ Isolate* isolate = masm->isolate(); |
if (do_gc) { |
// Passing r0. |
__ PrepareCallCFunction(1, r1); |
- __ CallCFunction(ExternalReference::perform_gc_function(), 1); |
+ __ CallCFunction(ExternalReference::perform_gc_function(isolate), 1); |
} |
ExternalReference scope_depth = |
- ExternalReference::heap_always_allocate_scope_depth(); |
+ ExternalReference::heap_always_allocate_scope_depth(isolate); |
if (always_allocate) { |
__ mov(r0, Operand(scope_depth)); |
__ ldr(r1, MemOperand(r0)); |
@@ -4302,15 +4315,16 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, |
__ b(eq, throw_out_of_memory_exception); |
// Retrieve the pending exception and clear the variable. |
- __ mov(ip, Operand(ExternalReference::the_hole_value_location())); |
+ __ mov(ip, Operand(ExternalReference::the_hole_value_location(isolate))); |
__ ldr(r3, MemOperand(ip)); |
- __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address))); |
+ __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address, |
+ isolate))); |
__ ldr(r0, MemOperand(ip)); |
__ str(r3, MemOperand(ip)); |
// Special handling of termination exceptions which are uncatchable |
// by javascript code. |
- __ cmp(r0, Operand(FACTORY->termination_exception())); |
+ __ cmp(r0, Operand(isolate->factory()->termination_exception())); |
__ b(eq, throw_termination_exception); |
// Handle normal exception. |
@@ -4418,11 +4432,13 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// r2: receiver |
// r3: argc |
// r4: argv |
+ Isolate* isolate = masm->isolate(); |
__ mov(r8, Operand(-1)); // Push a bad frame pointer to fail if it is used. |
int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; |
__ mov(r7, Operand(Smi::FromInt(marker))); |
__ mov(r6, Operand(Smi::FromInt(marker))); |
- __ mov(r5, Operand(ExternalReference(Isolate::k_c_entry_fp_address))); |
+ __ mov(r5, |
+ Operand(ExternalReference(Isolate::k_c_entry_fp_address, isolate))); |
__ ldr(r5, MemOperand(r5)); |
__ Push(r8, r7, r6, r5); |
@@ -4431,7 +4447,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
// If this is the outermost JS call, set js_entry_sp value. |
- ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address); |
+ ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address, isolate); |
__ mov(r5, Operand(ExternalReference(js_entry_sp))); |
__ ldr(r6, MemOperand(r5)); |
__ cmp(r6, Operand(0, RelocInfo::NONE)); |
@@ -4445,7 +4461,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// exception field in the JSEnv and return a failure sentinel. |
// Coming in here the fp will be invalid because the PushTryHandler below |
// sets it to 0 to signal the existence of the JSEntry frame. |
- __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address))); |
+ __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address, |
+ isolate))); |
__ str(r0, MemOperand(ip)); |
__ mov(r0, Operand(reinterpret_cast<int32_t>(Failure::Exception()))); |
__ b(&exit); |
@@ -4460,9 +4477,10 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// saved values before returning a failure to C. |
// Clear any pending exceptions. |
- __ mov(ip, Operand(ExternalReference::the_hole_value_location())); |
+ __ mov(ip, Operand(ExternalReference::the_hole_value_location(isolate))); |
__ ldr(r5, MemOperand(ip)); |
- __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address))); |
+ __ mov(ip, Operand(ExternalReference(Isolate::k_pending_exception_address, |
+ isolate))); |
__ str(r5, MemOperand(ip)); |
// Invoke the function by calling through JS entry trampoline builtin. |
@@ -4476,10 +4494,11 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// r3: argc |
// r4: argv |
if (is_construct) { |
- ExternalReference construct_entry(Builtins::JSConstructEntryTrampoline); |
+ ExternalReference construct_entry(Builtins::JSConstructEntryTrampoline, |
+ isolate); |
__ mov(ip, Operand(construct_entry)); |
} else { |
- ExternalReference entry(Builtins::JSEntryTrampoline); |
+ ExternalReference entry(Builtins::JSEntryTrampoline, isolate); |
__ mov(ip, Operand(entry)); |
} |
__ ldr(ip, MemOperand(ip)); // deref address |
@@ -4495,7 +4514,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
// displacement since the current stack pointer (sp) points directly |
// to the stack handler. |
__ ldr(r3, MemOperand(sp, StackHandlerConstants::kNextOffset)); |
- __ mov(ip, Operand(ExternalReference(Isolate::k_handler_address))); |
+ __ mov(ip, Operand(ExternalReference(Isolate::k_handler_address, isolate))); |
__ str(r3, MemOperand(ip)); |
// No need to restore registers |
__ add(sp, sp, Operand(StackHandlerConstants::kSize)); |
@@ -4513,7 +4532,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { |
__ bind(&exit); // r0 holds result |
// Restore the top frame descriptors from the stack. |
__ pop(r3); |
- __ mov(ip, Operand(ExternalReference(Isolate::k_c_entry_fp_address))); |
+ __ mov(ip, |
+ Operand(ExternalReference(Isolate::k_c_entry_fp_address, isolate))); |
__ str(r3, MemOperand(ip)); |
// Reset the stack to the callee saved registers. |
@@ -4909,10 +4929,11 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
Register last_match_info_elements = r6; |
// Ensure that a RegExp stack is allocated. |
+ Isolate* isolate = masm->isolate(); |
ExternalReference address_of_regexp_stack_memory_address = |
- ExternalReference::address_of_regexp_stack_memory_address(); |
+ ExternalReference::address_of_regexp_stack_memory_address(isolate); |
ExternalReference address_of_regexp_stack_memory_size = |
- ExternalReference::address_of_regexp_stack_memory_size(); |
+ ExternalReference::address_of_regexp_stack_memory_size(isolate); |
__ mov(r0, Operand(address_of_regexp_stack_memory_size)); |
__ ldr(r0, MemOperand(r0, 0)); |
__ tst(r0, Operand(r0)); |
@@ -5095,7 +5116,8 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
__ str(r0, MemOperand(sp, 2 * kPointerSize)); |
// Argument 5 (sp[4]): static offsets vector buffer. |
- __ mov(r0, Operand(ExternalReference::address_of_static_offsets_vector())); |
+ __ mov(r0, |
+ Operand(ExternalReference::address_of_static_offsets_vector(isolate))); |
__ str(r0, MemOperand(sp, 1 * kPointerSize)); |
// For arguments 4 and 3 get string length, calculate start of string data and |
@@ -5143,9 +5165,10 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// stack overflow (on the backtrack stack) was detected in RegExp code but |
// haven't created the exception yet. Handle that in the runtime system. |
// TODO(592): Rerunning the RegExp to get the stack overflow exception. |
- __ mov(r1, Operand(ExternalReference::the_hole_value_location())); |
+ __ mov(r1, Operand(ExternalReference::the_hole_value_location(isolate))); |
__ ldr(r1, MemOperand(r1, 0)); |
- __ mov(r2, Operand(ExternalReference(Isolate::k_pending_exception_address))); |
+ __ mov(r2, Operand(ExternalReference(Isolate::k_pending_exception_address, |
+ isolate))); |
__ ldr(r0, MemOperand(r2, 0)); |
__ cmp(r0, r1); |
__ b(eq, &runtime); |
@@ -5198,7 +5221,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// Get the static offsets vector filled by the native regexp code. |
ExternalReference address_of_static_offsets_vector = |
- ExternalReference::address_of_static_offsets_vector(); |
+ ExternalReference::address_of_static_offsets_vector(isolate); |
__ mov(r2, Operand(address_of_static_offsets_vector)); |
// r1: number of capture registers |
@@ -6793,7 +6816,8 @@ void ICCompareStub::GenerateMiss(MacroAssembler* masm) { |
__ push(lr); |
// Call the runtime system in a fresh internal frame. |
- ExternalReference miss = ExternalReference(IC_Utility(IC::kCompareIC_Miss)); |
+ ExternalReference miss = |
+ ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate()); |
__ EnterInternalFrame(); |
__ Push(r1, r0); |
__ mov(ip, Operand(Smi::FromInt(op_))); |