Cleaned up calling-related methods in the ARM assembler.
Generalized Call macro instruction to handle AST IDs, too, making things more similar to the Intel assemblers. Removed unused methods. Minor signature cleanup. Simplified assertions. Review URL: http://codereview.chromium.org/7284029 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8482 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
3f84fcf6c9
commit
233a8dc237
@ -378,7 +378,6 @@ class Operand BASE_EMBEDDED {
|
||||
INLINE(explicit Operand(int32_t immediate,
|
||||
RelocInfo::Mode rmode = RelocInfo::NONE));
|
||||
INLINE(explicit Operand(const ExternalReference& f));
|
||||
INLINE(explicit Operand(const char* s));
|
||||
explicit Operand(Handle<Object> handle);
|
||||
INLINE(explicit Operand(Smi* value));
|
||||
|
||||
@ -1141,8 +1140,13 @@ class Assembler : public AssemblerBase {
|
||||
void jmp(Label* L) { b(L, al); }
|
||||
|
||||
// Check the code size generated from label to here.
|
||||
int InstructionsGeneratedSince(Label* l) {
|
||||
return (pc_offset() - l->pos()) / kInstrSize;
|
||||
int SizeOfCodeGeneratedSince(Label* label) {
|
||||
return pc_offset() - label->pos();
|
||||
}
|
||||
|
||||
// Check the number of instructions generated from label to here.
|
||||
int InstructionsGeneratedSince(Label* label) {
|
||||
return SizeOfCodeGeneratedSince(label) / kInstrSize;
|
||||
}
|
||||
|
||||
// Check whether an immediate fits an addressing mode 1 instruction.
|
||||
|
@ -1044,8 +1044,7 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
|
||||
// Invoke the code and pass argc as r0.
|
||||
__ mov(r0, Operand(r3));
|
||||
if (is_construct) {
|
||||
__ Call(masm->isolate()->builtins()->JSConstructCall(),
|
||||
RelocInfo::CODE_TARGET);
|
||||
__ Call(masm->isolate()->builtins()->JSConstructCall());
|
||||
} else {
|
||||
ParameterCount actual(r0);
|
||||
__ InvokeFunction(r1, actual, CALL_FUNCTION,
|
||||
|
@ -392,11 +392,11 @@ void FloatingPointHelper::LoadSmis(MacroAssembler* masm,
|
||||
__ mov(scratch1, Operand(r0));
|
||||
ConvertToDoubleStub stub1(r3, r2, scratch1, scratch2);
|
||||
__ push(lr);
|
||||
__ Call(stub1.GetCode(), RelocInfo::CODE_TARGET);
|
||||
__ Call(stub1.GetCode());
|
||||
// Write Smi from r1 to r1 and r0 in double format.
|
||||
__ mov(scratch1, Operand(r1));
|
||||
ConvertToDoubleStub stub2(r1, r0, scratch1, scratch2);
|
||||
__ Call(stub2.GetCode(), RelocInfo::CODE_TARGET);
|
||||
__ Call(stub2.GetCode());
|
||||
__ pop(lr);
|
||||
}
|
||||
}
|
||||
@ -473,7 +473,7 @@ void FloatingPointHelper::LoadNumber(MacroAssembler* masm,
|
||||
__ mov(scratch1, Operand(object));
|
||||
ConvertToDoubleStub stub(dst2, dst1, scratch1, scratch2);
|
||||
__ push(lr);
|
||||
__ Call(stub.GetCode(), RelocInfo::CODE_TARGET);
|
||||
__ Call(stub.GetCode());
|
||||
__ pop(lr);
|
||||
}
|
||||
|
||||
@ -1058,7 +1058,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm,
|
||||
// Convert lhs to a double in r2, r3.
|
||||
__ mov(r7, Operand(lhs));
|
||||
ConvertToDoubleStub stub1(r3, r2, r7, r6);
|
||||
__ Call(stub1.GetCode(), RelocInfo::CODE_TARGET);
|
||||
__ Call(stub1.GetCode());
|
||||
// Load rhs to a double in r0, r1.
|
||||
__ Ldrd(r0, r1, FieldMemOperand(rhs, HeapNumber::kValueOffset));
|
||||
__ pop(lr);
|
||||
@ -1100,7 +1100,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm,
|
||||
// Convert rhs to a double in r0, r1.
|
||||
__ mov(r7, Operand(rhs));
|
||||
ConvertToDoubleStub stub2(r1, r0, r7, r6);
|
||||
__ Call(stub2.GetCode(), RelocInfo::CODE_TARGET);
|
||||
__ Call(stub2.GetCode());
|
||||
__ pop(lr);
|
||||
}
|
||||
// Fall through to both_loaded_as_doubles.
|
||||
|
@ -4200,12 +4200,7 @@ void FullCodeGenerator::EmitCallIC(Handle<Code> ic,
|
||||
unsigned ast_id) {
|
||||
ASSERT(mode == RelocInfo::CODE_TARGET ||
|
||||
mode == RelocInfo::CODE_TARGET_CONTEXT);
|
||||
if (ast_id == kNoASTId || mode == RelocInfo::CODE_TARGET_CONTEXT) {
|
||||
__ Call(ic, mode);
|
||||
} else {
|
||||
ASSERT(mode == RelocInfo::CODE_TARGET);
|
||||
__ CallWithAstId(ic, RelocInfo::CODE_TARGET_WITH_ID, ast_id);
|
||||
}
|
||||
__ Call(ic, mode, ast_id);
|
||||
}
|
||||
|
||||
|
||||
|
@ -91,7 +91,7 @@ void MacroAssembler::Jump(intptr_t target, RelocInfo::Mode rmode,
|
||||
}
|
||||
|
||||
|
||||
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 @@ int MacroAssembler::CallSize(Register target, Condition cond) {
|
||||
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 @@ void MacroAssembler::Call(Register target, Condition cond) {
|
||||
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 @@ void MacroAssembler::Call(intptr_t target,
|
||||
// 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 @@ void MacroAssembler::Call(intptr_t target,
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
||||
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,
|
||||
int MacroAssembler::CallSize(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
|
||||
return CallSize(reinterpret_cast<Address>(code.location()), rmode, cond);
|
||||
}
|
||||
|
||||
|
||||
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 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
|
||||
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 {
|
||||
|
@ -90,19 +90,19 @@ class MacroAssembler: public Assembler {
|
||||
|
||||
// Jump, Call, and Ret pseudo instructions implementing inter-working.
|
||||
void Jump(Register target, Condition cond = al);
|
||||
void Jump(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Jump(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Jump(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(Register target, Condition cond = al);
|
||||
void Call(Register target, Condition cond = al);
|
||||
int CallSize(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Call(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Call(Handle<Code> code,
|
||||
RelocInfo::Mode rmode,
|
||||
int CallSize(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Call(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(Handle<Code> code,
|
||||
RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
|
||||
unsigned ast_id = kNoASTId,
|
||||
Condition cond = al);
|
||||
void CallWithAstId(Handle<Code> code,
|
||||
RelocInfo::Mode rmode,
|
||||
unsigned ast_id,
|
||||
void Call(Handle<Code> code,
|
||||
RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
|
||||
unsigned ast_id = kNoASTId,
|
||||
Condition cond = al);
|
||||
void Ret(Condition cond = al);
|
||||
|
||||
@ -1036,10 +1036,6 @@ class MacroAssembler: public Assembler {
|
||||
int num_double_arguments);
|
||||
|
||||
void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Call(intptr_t target,
|
||||
RelocInfo::Mode rmode,
|
||||
Condition cond = al);
|
||||
|
||||
// Helper functions for generating invokes.
|
||||
void InvokePrologue(const ParameterCount& expected,
|
||||
|
@ -990,7 +990,9 @@ class Assembler : public AssemblerBase {
|
||||
void Print();
|
||||
|
||||
// Check the code size generated from label to here.
|
||||
int SizeOfCodeGeneratedSince(Label* l) { return pc_offset() - l->pos(); }
|
||||
int SizeOfCodeGeneratedSince(Label* label) {
|
||||
return pc_offset() - label->pos();
|
||||
}
|
||||
|
||||
// Mark address of the ExitJSFrame code.
|
||||
void RecordJSReturn();
|
||||
|
@ -1350,7 +1350,9 @@ class Assembler : public AssemblerBase {
|
||||
void Print();
|
||||
|
||||
// Check the code size generated from label to here.
|
||||
int SizeOfCodeGeneratedSince(Label* l) { return pc_offset() - l->pos(); }
|
||||
int SizeOfCodeGeneratedSince(Label* label) {
|
||||
return pc_offset() - label->pos();
|
||||
}
|
||||
|
||||
// Mark address of the ExitJSFrame code.
|
||||
void RecordJSReturn();
|
||||
|
Loading…
Reference in New Issue
Block a user