| Index: src/arm/macro-assembler-arm.cc
|
| ===================================================================
|
| --- src/arm/macro-assembler-arm.cc (revision 8479)
|
| +++ src/arm/macro-assembler-arm.cc (working copy)
|
| @@ -91,7 +91,7 @@
|
| }
|
|
|
|
|
| -void MacroAssembler::Jump(byte* target, RelocInfo::Mode rmode,
|
| +void MacroAssembler::Jump(Address target, RelocInfo::Mode rmode,
|
| Condition cond) {
|
| ASSERT(!RelocInfo::IsCodeTarget(rmode));
|
| Jump(reinterpret_cast<intptr_t>(target), rmode, cond);
|
| @@ -118,10 +118,8 @@
|
| void MacroAssembler::Call(Register target, Condition cond) {
|
| // Block constant pool for the call instruction sequence.
|
| BlockConstPoolScope block_const_pool(this);
|
| -#ifdef DEBUG
|
| - int pre_position = pc_offset();
|
| -#endif
|
| -
|
| + Label start;
|
| + bind(&start);
|
| #if USE_BLX
|
| blx(target, cond);
|
| #else
|
| @@ -129,34 +127,29 @@
|
| mov(lr, Operand(pc), LeaveCC, cond);
|
| mov(pc, Operand(target), LeaveCC, cond);
|
| #endif
|
| -
|
| -#ifdef DEBUG
|
| - int post_position = pc_offset();
|
| - CHECK_EQ(pre_position + CallSize(target, cond), post_position);
|
| -#endif
|
| + ASSERT_EQ(CallSize(target, cond), SizeOfCodeGeneratedSince(&start));
|
| }
|
|
|
|
|
| int MacroAssembler::CallSize(
|
| - intptr_t target, RelocInfo::Mode rmode, Condition cond) {
|
| + Address target, RelocInfo::Mode rmode, Condition cond) {
|
| int size = 2 * kInstrSize;
|
| Instr mov_instr = cond | MOV | LeaveCC;
|
| - if (!Operand(target, rmode).is_single_instruction(mov_instr)) {
|
| + intptr_t immediate = reinterpret_cast<intptr_t>(target);
|
| + if (!Operand(immediate, rmode).is_single_instruction(mov_instr)) {
|
| size += kInstrSize;
|
| }
|
| return size;
|
| }
|
|
|
|
|
| -void MacroAssembler::Call(intptr_t target,
|
| +void MacroAssembler::Call(Address target,
|
| RelocInfo::Mode rmode,
|
| Condition cond) {
|
| // Block constant pool for the call instruction sequence.
|
| BlockConstPoolScope block_const_pool(this);
|
| -#ifdef DEBUG
|
| - int pre_position = pc_offset();
|
| -#endif
|
| -
|
| + Label start;
|
| + bind(&start);
|
| #if USE_BLX
|
| // On ARMv5 and after the recommended call sequence is:
|
| // ldr ip, [pc, #...]
|
| @@ -168,7 +161,7 @@
|
| // we have to do it explicitly.
|
| positions_recorder()->WriteRecordedPositions();
|
|
|
| - mov(ip, Operand(target, rmode));
|
| + mov(ip, Operand(reinterpret_cast<int32_t>(target), rmode));
|
| blx(ip, cond);
|
|
|
| ASSERT(kCallTargetAddressOffset == 2 * kInstrSize);
|
| @@ -176,82 +169,36 @@
|
| // Set lr for return at current pc + 8.
|
| mov(lr, Operand(pc), LeaveCC, cond);
|
| // Emit a ldr<cond> pc, [pc + offset of target in constant pool].
|
| - mov(pc, Operand(target, rmode), LeaveCC, cond);
|
| + mov(pc, Operand(reinterpret_cast<int32_t>(target), rmode), LeaveCC, cond);
|
| ASSERT(kCallTargetAddressOffset == kInstrSize);
|
| #endif
|
| -
|
| -#ifdef DEBUG
|
| - int post_position = pc_offset();
|
| - CHECK_EQ(pre_position + CallSize(target, rmode, cond), post_position);
|
| -#endif
|
| + ASSERT_EQ(CallSize(target, rmode, cond), SizeOfCodeGeneratedSince(&start));
|
| }
|
|
|
|
|
| -int MacroAssembler::CallSize(
|
| - byte* target, RelocInfo::Mode rmode, Condition cond) {
|
| - return CallSize(reinterpret_cast<intptr_t>(target), rmode);
|
| +int MacroAssembler::CallSize(Handle<Code> code,
|
| + RelocInfo::Mode rmode,
|
| + unsigned ast_id,
|
| + Condition cond) {
|
| + return CallSize(reinterpret_cast<Address>(code.location()), rmode, cond);
|
| }
|
|
|
|
|
| -void MacroAssembler::Call(
|
| - byte* target, RelocInfo::Mode rmode, Condition cond) {
|
| -#ifdef DEBUG
|
| - int pre_position = pc_offset();
|
| -#endif
|
| -
|
| - ASSERT(!RelocInfo::IsCodeTarget(rmode));
|
| - Call(reinterpret_cast<intptr_t>(target), rmode, cond);
|
| -
|
| -#ifdef DEBUG
|
| - int post_position = pc_offset();
|
| - CHECK_EQ(pre_position + CallSize(target, rmode, cond), post_position);
|
| -#endif
|
| -}
|
| -
|
| -
|
| -int MacroAssembler::CallSize(
|
| - Handle<Code> code, RelocInfo::Mode rmode, Condition cond) {
|
| - return CallSize(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::CallWithAstId(Handle<Code> code,
|
| - RelocInfo::Mode rmode,
|
| - unsigned ast_id,
|
| - Condition cond) {
|
| -#ifdef DEBUG
|
| - int pre_position = pc_offset();
|
| -#endif
|
| -
|
| - ASSERT(rmode == RelocInfo::CODE_TARGET_WITH_ID);
|
| - ASSERT(ast_id != kNoASTId);
|
| - ASSERT(ast_id_for_reloc_info_ == kNoASTId);
|
| - ast_id_for_reloc_info_ = ast_id;
|
| - // 'code' is always generated ARM code, never THUMB code
|
| - Call(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
|
| -
|
| -#ifdef DEBUG
|
| - int post_position = pc_offset();
|
| - CHECK_EQ(pre_position + CallSize(code, rmode, cond), post_position);
|
| -#endif
|
| -}
|
| -
|
| -
|
| void MacroAssembler::Call(Handle<Code> code,
|
| RelocInfo::Mode rmode,
|
| + unsigned ast_id,
|
| Condition cond) {
|
| -#ifdef DEBUG
|
| - int pre_position = pc_offset();
|
| -#endif
|
| -
|
| + Label start;
|
| + bind(&start);
|
| ASSERT(RelocInfo::IsCodeTarget(rmode));
|
| + if (rmode == RelocInfo::CODE_TARGET && ast_id != kNoASTId) {
|
| + ASSERT(ast_id_for_reloc_info_ == kNoASTId);
|
| + ast_id_for_reloc_info_ = ast_id;
|
| + rmode = RelocInfo::CODE_TARGET_WITH_ID;
|
| + }
|
| // 'code' is always generated ARM code, never THUMB code
|
| - Call(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
|
| -
|
| -#ifdef DEBUG
|
| - int post_position = pc_offset();
|
| - CHECK_EQ(pre_position + CallSize(code, rmode, cond), post_position);
|
| -#endif
|
| + Call(reinterpret_cast<Address>(code.location()), rmode, cond);
|
| + ASSERT_EQ(CallSize(code, rmode, cond), SizeOfCodeGeneratedSince(&start));
|
| }
|
|
|
|
|
| @@ -994,9 +941,9 @@
|
| Handle<Code> adaptor =
|
| isolate()->builtins()->ArgumentsAdaptorTrampoline();
|
| if (flag == CALL_FUNCTION) {
|
| - call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET));
|
| + call_wrapper.BeforeCall(CallSize(adaptor));
|
| SetCallKind(r5, call_kind);
|
| - Call(adaptor, RelocInfo::CODE_TARGET);
|
| + Call(adaptor);
|
| call_wrapper.AfterCall();
|
| b(done);
|
| } else {
|
|
|