| Index: src/arm/macro-assembler-arm.cc
|
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
|
| index 47d42a3122073e988ee8985047244a19a51e8b67..5f6076b41dfbd1bf726930aa129b4b63a1b51361 100644
|
| --- a/src/arm/macro-assembler-arm.cc
|
| +++ b/src/arm/macro-assembler-arm.cc
|
| @@ -44,7 +44,6 @@ namespace internal {
|
| MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size)
|
| : Assembler(arg_isolate, buffer, size),
|
| generating_stub_(false),
|
| - allow_stub_calls_(true),
|
| has_frame_(false) {
|
| if (isolate() != NULL) {
|
| code_object_ = Handle<Object>(isolate()->heap()->undefined_value(),
|
| @@ -516,6 +515,12 @@ void MacroAssembler::RecordWrite(Register object,
|
| Check(eq, kWrongAddressOrValuePassedToRecordWrite);
|
| }
|
|
|
| + // Count number of write barriers in generated code.
|
| + isolate()->counters()->write_barriers_static()->Increment();
|
| + // TODO(mstarzinger): Dynamic counter missing.
|
| +
|
| + // First, check if a write barrier is even needed. The tests below
|
| + // catch stores of smis and stores into the young generation.
|
| Label done;
|
|
|
| if (smi_check == INLINE_SMI_CHECK) {
|
| @@ -1223,7 +1228,7 @@ void MacroAssembler::InvokeFunction(Register fun,
|
| }
|
|
|
|
|
| -void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
|
| +void MacroAssembler::InvokeFunction(Register function,
|
| const ParameterCount& expected,
|
| const ParameterCount& actual,
|
| InvokeFlag flag,
|
| @@ -1232,8 +1237,10 @@ void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
|
| // You can't call a function without a valid frame.
|
| ASSERT(flag == JUMP_FUNCTION || has_frame());
|
|
|
| + // Contract with called JS functions requires that function is passed in r1.
|
| + ASSERT(function.is(r1));
|
| +
|
| // Get the function and setup the context.
|
| - Move(r1, function);
|
| ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
|
|
|
| // We call indirectly through the code field in the function to
|
| @@ -1244,6 +1251,17 @@ void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
|
| }
|
|
|
|
|
| +void MacroAssembler::InvokeFunction(Handle<JSFunction> function,
|
| + const ParameterCount& expected,
|
| + const ParameterCount& actual,
|
| + InvokeFlag flag,
|
| + const CallWrapper& call_wrapper,
|
| + CallKind call_kind) {
|
| + Move(r1, function);
|
| + InvokeFunction(r1, expected, actual, flag, call_wrapper, call_kind);
|
| +}
|
| +
|
| +
|
| void MacroAssembler::IsObjectJSObjectType(Register heap_object,
|
| Register map,
|
| Register scratch,
|
| @@ -2016,14 +2034,36 @@ void MacroAssembler::CompareObjectType(Register object,
|
| Register map,
|
| Register type_reg,
|
| InstanceType type) {
|
| + const Register temp = type_reg.is(no_reg) ? ip : type_reg;
|
| +
|
| + ldr(map, FieldMemOperand(object, HeapObject::kMapOffset));
|
| + CompareInstanceType(map, temp, type);
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::CheckObjectTypeRange(Register object,
|
| + Register map,
|
| + InstanceType min_type,
|
| + InstanceType max_type,
|
| + Label* false_label) {
|
| + STATIC_ASSERT(Map::kInstanceTypeOffset < 4096);
|
| + STATIC_ASSERT(LAST_TYPE < 256);
|
| ldr(map, FieldMemOperand(object, HeapObject::kMapOffset));
|
| - CompareInstanceType(map, type_reg, type);
|
| + ldrb(ip, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
| + sub(ip, ip, Operand(min_type));
|
| + cmp(ip, Operand(max_type - min_type));
|
| + b(hi, false_label);
|
| }
|
|
|
|
|
| void MacroAssembler::CompareInstanceType(Register map,
|
| Register type_reg,
|
| InstanceType type) {
|
| + // Registers map and type_reg can be ip. These two lines assert
|
| + // that ip can be used with the two instructions (the constants
|
| + // will never need ip).
|
| + STATIC_ASSERT(Map::kInstanceTypeOffset < 4096);
|
| + STATIC_ASSERT(LAST_TYPE < 256);
|
| ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
| cmp(type_reg, Operand(type));
|
| }
|
| @@ -2248,8 +2288,6 @@ void MacroAssembler::CallStub(CodeStub* stub,
|
|
|
|
|
| void MacroAssembler::TailCallStub(CodeStub* stub, Condition cond) {
|
| - ASSERT(allow_stub_calls_ ||
|
| - stub->CompilingCallsToThisStubIsGCSafe(isolate()));
|
| Jump(stub->GetCode(isolate()), RelocInfo::CODE_TARGET, cond);
|
| }
|
|
|
| @@ -2394,8 +2432,7 @@ void MacroAssembler::CallApiFunctionAndReturn(
|
|
|
|
|
| bool MacroAssembler::AllowThisStubCall(CodeStub* stub) {
|
| - if (!has_frame_ && stub->SometimesSetsUpAFrame()) return false;
|
| - return allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe(isolate());
|
| + return has_frame_ || !stub->SometimesSetsUpAFrame();
|
| }
|
|
|
|
|
| @@ -3456,9 +3493,8 @@ void MacroAssembler::PrepareCallCFunction(int num_reg_arguments,
|
|
|
|
|
| void MacroAssembler::SetCallCDoubleArguments(DwVfpRegister dreg) {
|
| - if (use_eabi_hardfloat()) {
|
| - Move(d0, dreg);
|
| - } else {
|
| + ASSERT(dreg.is(d0));
|
| + if (!use_eabi_hardfloat()) {
|
| vmov(r0, r1, dreg);
|
| }
|
| }
|
| @@ -3466,16 +3502,9 @@ void MacroAssembler::SetCallCDoubleArguments(DwVfpRegister dreg) {
|
|
|
| void MacroAssembler::SetCallCDoubleArguments(DwVfpRegister dreg1,
|
| DwVfpRegister dreg2) {
|
| - if (use_eabi_hardfloat()) {
|
| - if (dreg2.is(d0)) {
|
| - ASSERT(!dreg1.is(d1));
|
| - Move(d1, dreg2);
|
| - Move(d0, dreg1);
|
| - } else {
|
| - Move(d0, dreg1);
|
| - Move(d1, dreg2);
|
| - }
|
| - } else {
|
| + ASSERT(dreg1.is(d0));
|
| + ASSERT(dreg2.is(d1));
|
| + if (!use_eabi_hardfloat()) {
|
| vmov(r0, r1, dreg1);
|
| vmov(r2, r3, dreg2);
|
| }
|
| @@ -3484,8 +3513,8 @@ void MacroAssembler::SetCallCDoubleArguments(DwVfpRegister dreg1,
|
|
|
| void MacroAssembler::SetCallCDoubleArguments(DwVfpRegister dreg,
|
| Register reg) {
|
| + ASSERT(dreg.is(d0));
|
| if (use_eabi_hardfloat()) {
|
| - Move(d0, dreg);
|
| Move(r0, reg);
|
| } else {
|
| Move(r2, reg);
|
|
|