Index: src/arm/macro-assembler-arm.cc |
=================================================================== |
--- src/arm/macro-assembler-arm.cc (revision 9808) |
+++ src/arm/macro-assembler-arm.cc (working copy) |
@@ -1101,24 +1101,16 @@ |
// You can't call a function without a valid frame. |
ASSERT(flag == JUMP_FUNCTION || has_frame()); |
- ASSERT(function->is_compiled()); |
- |
// Get the function and setup the context. |
mov(r1, Operand(Handle<JSFunction>(function))); |
ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
- // Invoke the cached code. |
- Handle<Code> code(function->code()); |
ParameterCount expected(function->shared()->formal_parameter_count()); |
- if (V8::UseCrankshaft()) { |
- // TODO(kasperl): For now, we always call indirectly through the |
- // code field in the function to allow recompilation to take effect |
- // without changing any of the call sites. |
- ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); |
- InvokeCode(r3, expected, actual, flag, NullCallWrapper(), call_kind); |
- } else { |
- InvokeCode(code, expected, actual, RelocInfo::CODE_TARGET, flag, call_kind); |
- } |
+ // We call indirectly through the code field in the function to |
+ // allow recompilation to take effect without changing any of the |
+ // call sites. |
+ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); |
+ InvokeCode(r3, expected, actual, flag, NullCallWrapper(), call_kind); |
} |
@@ -1602,6 +1594,7 @@ |
ASSERT(!result.is(scratch1)); |
ASSERT(!result.is(scratch2)); |
ASSERT(!scratch1.is(scratch2)); |
+ ASSERT(!object_size.is(ip)); |
ASSERT(!result.is(ip)); |
ASSERT(!scratch1.is(ip)); |
ASSERT(!scratch2.is(ip)); |
@@ -2030,7 +2023,8 @@ |
void MacroAssembler::TryGetFunctionPrototype(Register function, |
Register result, |
Register scratch, |
- Label* miss) { |
+ Label* miss, |
+ bool miss_on_bound_function) { |
// Check that the receiver isn't a smi. |
JumpIfSmi(function, miss); |
@@ -2038,6 +2032,16 @@ |
CompareObjectType(function, result, scratch, JS_FUNCTION_TYPE); |
b(ne, miss); |
+ if (miss_on_bound_function) { |
+ ldr(scratch, |
+ FieldMemOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
+ ldr(scratch, |
+ FieldMemOperand(scratch, SharedFunctionInfo::kCompilerHintsOffset)); |
+ tst(scratch, |
+ Operand(Smi::FromInt(1 << SharedFunctionInfo::kBoundFunction))); |
+ b(ne, miss); |
+ } |
+ |
// Make sure that the function has an instance prototype. |
Label non_instance; |
ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); |
@@ -3147,8 +3151,10 @@ |
#ifdef CAN_USE_ARMV5_INSTRUCTIONS |
clz(zeros, source); // This instruction is only supported after ARM5. |
#else |
+ // Order of the next two lines is important: zeros register |
+ // can be the same as source register. |
+ Move(scratch, source); |
mov(zeros, Operand(0, RelocInfo::NONE)); |
- Move(scratch, source); |
// Top 16. |
tst(scratch, Operand(0xffff0000)); |
add(zeros, zeros, Operand(16), LeaveCC, eq); |