Remove explicit Result arguments to IC calls on ARM.
Review URL: http://codereview.chromium.org/568016 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3769 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
10910394e6
commit
c9c504770a
@ -2591,13 +2591,12 @@ void CodeGenerator::LoadFromGlobalSlotCheckExtensions(Slot* slot,
|
||||
// Load the global object.
|
||||
LoadGlobal();
|
||||
// Setup the name register.
|
||||
Result name(r2);
|
||||
__ mov(r2, Operand(slot->var()->name()));
|
||||
// Call IC stub.
|
||||
if (typeof_state == INSIDE_TYPEOF) {
|
||||
frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, &name, 0);
|
||||
frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
|
||||
} else {
|
||||
frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET_CONTEXT, &name, 0);
|
||||
frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET_CONTEXT, 0);
|
||||
}
|
||||
|
||||
// Drop the global object. The result is in r0.
|
||||
@ -3160,22 +3159,15 @@ void CodeGenerator::VisitCallNew(CallNew* node) {
|
||||
}
|
||||
|
||||
// r0: the number of arguments.
|
||||
Result num_args(r0);
|
||||
__ mov(r0, Operand(arg_count));
|
||||
|
||||
// Load the function into r1 as per calling convention.
|
||||
Result function(r1);
|
||||
__ ldr(r1, frame_->ElementAt(arg_count + 1));
|
||||
|
||||
// Call the construct call builtin that handles allocation and
|
||||
// constructor invocation.
|
||||
CodeForSourcePosition(node->position());
|
||||
Handle<Code> ic(Builtins::builtin(Builtins::JSConstructCall));
|
||||
frame_->CallCodeObject(ic,
|
||||
RelocInfo::CONSTRUCT_CALL,
|
||||
&num_args,
|
||||
&function,
|
||||
arg_count + 1);
|
||||
frame_->CallCodeObject(ic, RelocInfo::CONSTRUCT_CALL, arg_count + 1);
|
||||
|
||||
// Discard old TOS value and push r0 on the stack (same as Pop(), push(r0)).
|
||||
__ str(r0, frame_->Top());
|
||||
@ -4332,13 +4324,12 @@ void Reference::GetValue() {
|
||||
Variable* var = expression_->AsVariableProxy()->AsVariable();
|
||||
Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
|
||||
// Setup the name register.
|
||||
Result name_reg(r2);
|
||||
__ mov(r2, Operand(name));
|
||||
ASSERT(var == NULL || var->is_global());
|
||||
RelocInfo::Mode rmode = (var == NULL)
|
||||
? RelocInfo::CODE_TARGET
|
||||
: RelocInfo::CODE_TARGET_CONTEXT;
|
||||
frame->CallCodeObject(ic, rmode, &name_reg, 0);
|
||||
frame->CallCodeObject(ic, rmode, 0);
|
||||
frame->EmitPush(r0);
|
||||
break;
|
||||
}
|
||||
@ -4389,17 +4380,10 @@ void Reference::SetValue(InitState init_state) {
|
||||
Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
|
||||
Handle<String> name(GetName());
|
||||
|
||||
Result value(r0);
|
||||
frame->EmitPop(r0);
|
||||
|
||||
// Setup the name register.
|
||||
Result property_name(r2);
|
||||
__ mov(r2, Operand(name));
|
||||
frame->CallCodeObject(ic,
|
||||
RelocInfo::CODE_TARGET,
|
||||
&value,
|
||||
&property_name,
|
||||
0);
|
||||
frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
|
||||
frame->EmitPush(r0);
|
||||
cgen_->UnloadReference(this);
|
||||
break;
|
||||
@ -4414,9 +4398,8 @@ void Reference::SetValue(InitState init_state) {
|
||||
// Call IC code.
|
||||
Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
|
||||
// TODO(1222589): Make the IC grab the values from the stack.
|
||||
Result value(r0);
|
||||
frame->EmitPop(r0); // value
|
||||
frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, &value, 0);
|
||||
frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
|
||||
frame->EmitPush(r0);
|
||||
cgen_->UnloadReference(this);
|
||||
break;
|
||||
|
@ -219,36 +219,15 @@ void VirtualFrame::PushTryHandler(HandlerType type) {
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::RawCallStub(CodeStub* stub) {
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
__ CallStub(stub);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallStub(CodeStub* stub, Result* arg) {
|
||||
PrepareForCall(0, 0);
|
||||
arg->Unuse();
|
||||
RawCallStub(stub);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallStub(CodeStub* stub, Result* arg0, Result* arg1) {
|
||||
PrepareForCall(0, 0);
|
||||
arg0->Unuse();
|
||||
arg1->Unuse();
|
||||
RawCallStub(stub);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallRuntime(Runtime::Function* f, int arg_count) {
|
||||
PrepareForCall(arg_count, arg_count);
|
||||
Forget(arg_count);
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
__ CallRuntime(f, arg_count);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallRuntime(Runtime::FunctionId id, int arg_count) {
|
||||
PrepareForCall(arg_count, arg_count);
|
||||
Forget(arg_count);
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
__ CallRuntime(id, arg_count);
|
||||
}
|
||||
@ -257,102 +236,34 @@ void VirtualFrame::CallRuntime(Runtime::FunctionId id, int arg_count) {
|
||||
void VirtualFrame::InvokeBuiltin(Builtins::JavaScript id,
|
||||
InvokeJSFlags flags,
|
||||
int arg_count) {
|
||||
PrepareForCall(arg_count, arg_count);
|
||||
Forget(arg_count);
|
||||
__ InvokeBuiltin(id, flags);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::RawCallCodeObject(Handle<Code> code,
|
||||
RelocInfo::Mode rmode) {
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
__ Call(code, rmode);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallCodeObject(Handle<Code> code,
|
||||
RelocInfo::Mode rmode,
|
||||
int dropped_args) {
|
||||
int spilled_args = 0;
|
||||
switch (code->kind()) {
|
||||
case Code::CALL_IC:
|
||||
spilled_args = dropped_args + 1;
|
||||
break;
|
||||
case Code::FUNCTION:
|
||||
spilled_args = dropped_args + 1;
|
||||
break;
|
||||
case Code::KEYED_LOAD_IC:
|
||||
ASSERT(dropped_args == 0);
|
||||
spilled_args = 2;
|
||||
break;
|
||||
default:
|
||||
// The other types of code objects are called with values
|
||||
// in specific registers, and are handled in functions with
|
||||
// a different signature.
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
PrepareForCall(spilled_args, dropped_args);
|
||||
RawCallCodeObject(code, rmode);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallCodeObject(Handle<Code> code,
|
||||
RelocInfo::Mode rmode,
|
||||
Result* arg,
|
||||
int dropped_args) {
|
||||
int spilled_args = 0;
|
||||
switch (code->kind()) {
|
||||
case Code::LOAD_IC:
|
||||
ASSERT(arg->reg().is(r2));
|
||||
ASSERT(dropped_args == 0);
|
||||
spilled_args = 1;
|
||||
break;
|
||||
case Code::KEYED_STORE_IC:
|
||||
ASSERT(arg->reg().is(r0));
|
||||
ASSERT(dropped_args == 0);
|
||||
spilled_args = 2;
|
||||
break;
|
||||
default:
|
||||
// No other types of code objects are called with values
|
||||
// in exactly one register.
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
PrepareForCall(spilled_args, dropped_args);
|
||||
arg->Unuse();
|
||||
RawCallCodeObject(code, rmode);
|
||||
}
|
||||
|
||||
|
||||
void VirtualFrame::CallCodeObject(Handle<Code> code,
|
||||
RelocInfo::Mode rmode,
|
||||
Result* arg0,
|
||||
Result* arg1,
|
||||
int dropped_args) {
|
||||
int spilled_args = 1;
|
||||
switch (code->kind()) {
|
||||
case Code::STORE_IC:
|
||||
ASSERT(arg0->reg().is(r0));
|
||||
ASSERT(arg1->reg().is(r2));
|
||||
ASSERT(dropped_args == 0);
|
||||
spilled_args = 1;
|
||||
break;
|
||||
case Code::BUILTIN:
|
||||
ASSERT(*code == Builtins::builtin(Builtins::JSConstructCall));
|
||||
ASSERT(arg0->reg().is(r0));
|
||||
ASSERT(arg1->reg().is(r1));
|
||||
spilled_args = dropped_args + 1;
|
||||
break;
|
||||
default:
|
||||
// No other types of code objects are called with values
|
||||
// in exactly two registers.
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
PrepareForCall(spilled_args, dropped_args);
|
||||
arg0->Unuse();
|
||||
arg1->Unuse();
|
||||
RawCallCodeObject(code, rmode);
|
||||
Forget(dropped_args);
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
__ Call(code, rmode);
|
||||
}
|
||||
|
||||
|
||||
|
@ -287,18 +287,11 @@ class VirtualFrame : public ZoneObject {
|
||||
// Call stub given the number of arguments it expects on (and
|
||||
// removes from) the stack.
|
||||
void CallStub(CodeStub* stub, int arg_count) {
|
||||
PrepareForCall(arg_count, arg_count);
|
||||
RawCallStub(stub);
|
||||
Forget(arg_count);
|
||||
ASSERT(cgen()->HasValidEntryRegisters());
|
||||
masm()->CallStub(stub);
|
||||
}
|
||||
|
||||
// Call stub that expects its argument in r0. The argument is given
|
||||
// as a result which must be the register r0.
|
||||
void CallStub(CodeStub* stub, Result* arg);
|
||||
|
||||
// Call stub that expects its arguments in r1 and r0. The arguments
|
||||
// are given as results which must be the appropriate registers.
|
||||
void CallStub(CodeStub* stub, Result* arg0, Result* arg1);
|
||||
|
||||
// Call runtime given the number of arguments expected on (and
|
||||
// removed from) the stack.
|
||||
void CallRuntime(Runtime::Function* f, int arg_count);
|
||||
@ -311,20 +304,11 @@ class VirtualFrame : public ZoneObject {
|
||||
int arg_count);
|
||||
|
||||
// Call into an IC stub given the number of arguments it removes
|
||||
// from the stack. Register arguments are passed as results and
|
||||
// consumed by the call.
|
||||
// from the stack. Register arguments to the IC stub are implicit,
|
||||
// and depend on the type of IC stub.
|
||||
void CallCodeObject(Handle<Code> ic,
|
||||
RelocInfo::Mode rmode,
|
||||
int dropped_args);
|
||||
void CallCodeObject(Handle<Code> ic,
|
||||
RelocInfo::Mode rmode,
|
||||
Result* arg,
|
||||
int dropped_args);
|
||||
void CallCodeObject(Handle<Code> ic,
|
||||
RelocInfo::Mode rmode,
|
||||
Result* arg0,
|
||||
Result* arg1,
|
||||
int dropped_args);
|
||||
|
||||
// Drop a number of elements from the top of the expression stack. May
|
||||
// emit code to affect the physical frame. Does not clobber any registers
|
||||
@ -511,14 +495,6 @@ class VirtualFrame : public ZoneObject {
|
||||
// Register counts are correctly updated.
|
||||
int InvalidateFrameSlotAt(int index);
|
||||
|
||||
// Call a code stub that has already been prepared for calling (via
|
||||
// PrepareForCall).
|
||||
void RawCallStub(CodeStub* stub);
|
||||
|
||||
// Calls a code object which has already been prepared for calling
|
||||
// (via PrepareForCall).
|
||||
void RawCallCodeObject(Handle<Code> code, RelocInfo::Mode rmode);
|
||||
|
||||
bool Equals(VirtualFrame* other);
|
||||
|
||||
// Classes that need raw access to the elements_ array.
|
||||
|
Loading…
Reference in New Issue
Block a user