X64: Implement DoCallConstantFunction, DoLeaveInlined and DoCompareMap
in lithium-x64. Review URL: http://codereview.chromium.org/6410060 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6623 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
13e8360d94
commit
63d1b2c7f4
@ -1520,12 +1520,43 @@ void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) {
|
||||
void LCodeGen::CallKnownFunction(Handle<JSFunction> function,
|
||||
int arity,
|
||||
LInstruction* instr) {
|
||||
Abort("Unimplemented: %s", "CallKnownFunction");
|
||||
// Change context if needed.
|
||||
bool change_context =
|
||||
(graph()->info()->closure()->context() != function->context()) ||
|
||||
scope()->contains_with() ||
|
||||
(scope()->num_heap_slots() > 0);
|
||||
if (change_context) {
|
||||
__ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
|
||||
}
|
||||
|
||||
// Set eax to arguments count if adaption is not needed. Assumes that eax
|
||||
// is available to write to at this point.
|
||||
if (!function->NeedsArgumentsAdaption()) {
|
||||
__ Set(rax, arity);
|
||||
}
|
||||
|
||||
LPointerMap* pointers = instr->pointer_map();
|
||||
RecordPosition(pointers->position());
|
||||
|
||||
// Invoke function.
|
||||
if (*function == *graph()->info()->closure()) {
|
||||
__ CallSelf();
|
||||
} else {
|
||||
__ call(FieldOperand(rdi, JSFunction::kCodeEntryOffset));
|
||||
}
|
||||
|
||||
// Setup deoptimization.
|
||||
RegisterLazyDeoptimization(instr);
|
||||
|
||||
// Restore context.
|
||||
__ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) {
|
||||
Abort("Unimplemented: %s", "DoCallConstantFunction");
|
||||
ASSERT(ToRegister(instr->result()).is(eax));
|
||||
__ Move(rdi, instr->function());
|
||||
CallKnownFunction(instr->function(), instr->arity(), instr);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1007,8 +1007,9 @@ LInstruction* LChunkBuilder::DoTest(HTest* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
|
||||
Abort("Unimplemented: %s", "DoCompareMap");
|
||||
return NULL;
|
||||
ASSERT(instr->value()->representation().IsTagged());
|
||||
LOperand* value = UseRegisterAtStart(instr->value());
|
||||
return new LCmpMapAndBranch(value);
|
||||
}
|
||||
|
||||
|
||||
@ -1074,8 +1075,8 @@ LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) {
|
||||
|
||||
LInstruction* LChunkBuilder::DoCallConstantFunction(
|
||||
HCallConstantFunction* instr) {
|
||||
Abort("Unimplemented: %s", "DoCallConstantFunction");
|
||||
return NULL;
|
||||
argument_count_ -= instr->argument_count();
|
||||
return MarkAsCall(DefineFixed(new LCallConstantFunction, rax), instr);
|
||||
}
|
||||
|
||||
|
||||
@ -1719,7 +1720,8 @@ LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
|
||||
Abort("Unimplemented: %s", "DoLeaveInlined");
|
||||
HEnvironment* outer = current_block_->last_environment()->outer();
|
||||
current_block_->UpdateEnvironment(outer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -604,6 +604,12 @@ class MacroAssembler: public Assembler {
|
||||
void Call(ExternalReference ext);
|
||||
void Call(Handle<Code> code_object, RelocInfo::Mode rmode);
|
||||
|
||||
// Emit call to the code we are currently generating.
|
||||
void CallSelf() {
|
||||
Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location()));
|
||||
call(self, RelocInfo::CODE_TARGET);
|
||||
}
|
||||
|
||||
// Non-x64 instructions.
|
||||
// Push/pop all general purpose registers.
|
||||
// Does not push rsp/rbp nor any of the assembler's special purpose registers
|
||||
|
Loading…
Reference in New Issue
Block a user