X64: Add DoCallNamed, DoContext, DoCallGlobal, and DoLoadFunctionPrototype lithium instructions.

Review URL: http://codereview.chromium.org/6471025

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6734 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
ricow@chromium.org 2011-02-10 16:33:01 +00:00
parent 091237ce5b
commit 512a02764f
4 changed files with 70 additions and 24 deletions

View File

@ -1728,7 +1728,43 @@ void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) {
Abort("Unimplemented: %s", "DoLoadFunctionPrototype");
Register function = ToRegister(instr->function());
Register result = ToRegister(instr->result());
// Check that the function really is a function.
__ CmpObjectType(function, JS_FUNCTION_TYPE, result);
DeoptimizeIf(not_equal, instr->environment());
// Check whether the function has an instance prototype.
NearLabel non_instance;
__ testb(FieldOperand(result, Map::kBitFieldOffset),
Immediate(1 << Map::kHasNonInstancePrototype));
__ j(not_zero, &non_instance);
// Get the prototype or initial map from the function.
__ movq(result,
FieldOperand(function, JSFunction::kPrototypeOrInitialMapOffset));
// Check that the function has a prototype or an initial map.
__ CompareRoot(result, Heap::kTheHoleValueRootIndex);
DeoptimizeIf(equal, instr->environment());
// If the function does not have an initial map, we're done.
NearLabel done;
__ CmpObjectType(result, MAP_TYPE, kScratchRegister);
__ j(not_equal, &done);
// Get the prototype from the initial map.
__ movq(result, FieldOperand(result, Map::kPrototypeOffset));
__ jmp(&done);
// Non-instance prototype: Fetch prototype from constructor field
// in the function's map.
__ bind(&non_instance);
__ movq(result, FieldOperand(result, Map::kConstructorOffset));
// All done.
__ bind(&done);
}
@ -1838,6 +1874,12 @@ void LCodeGen::DoPushArgument(LPushArgument* instr) {
}
void LCodeGen::DoContext(LContext* instr) {
Register result = ToRegister(instr->result());
__ movq(result, Operand(rbp, StandardFrameConstants::kContextOffset));
}
void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
Register result = ToRegister(instr->result());
__ movq(result, GlobalObjectOperand());
@ -1955,7 +1997,13 @@ void LCodeGen::DoCallKeyed(LCallKeyed* instr) {
void LCodeGen::DoCallNamed(LCallNamed* instr) {
Abort("Unimplemented: %s", "DoCallNamed");
ASSERT(ToRegister(instr->result()).is(rax));
int arity = instr->arity();
Handle<Code> ic = StubCache::ComputeCallInitialize(arity, NOT_IN_LOOP);
__ Move(rcx, instr->name());
CallCode(ic, RelocInfo::CODE_TARGET, instr);
__ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
}
@ -1965,7 +2013,12 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) {
void LCodeGen::DoCallGlobal(LCallGlobal* instr) {
Abort("Unimplemented: %s", "DoCallGlobal");
ASSERT(ToRegister(instr->result()).is(rax));
int arity = instr->arity();
Handle<Code> ic = StubCache::ComputeCallInitialize(arity, NOT_IN_LOOP);
__ Move(rcx, instr->name());
CallCode(ic, RelocInfo::CODE_TARGET_CONTEXT, instr);
__ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
}

View File

@ -1144,8 +1144,7 @@ LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
LInstruction* LChunkBuilder::DoContext(HContext* instr) {
Abort("Unimplemented: DoContext");
return NULL;
return DefineAsRegister(new LContext);
}
@ -1191,8 +1190,8 @@ LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
Abort("Unimplemented: %s", "DoCallGlobal");
return NULL;
argument_count_ -= instr->argument_count();
return MarkAsCall(DefineFixed(new LCallGlobal, rax), instr);
}
@ -1637,8 +1636,8 @@ LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
LInstruction* LChunkBuilder::DoLoadFunctionPrototype(
HLoadFunctionPrototype* instr) {
Abort("Unimplemented: %s", "DoLoadFunctionPrototype");
return NULL;
return AssignEnvironment(DefineAsRegister(
new LLoadFunctionPrototype(UseRegister(instr->function()))));
}

View File

@ -84,6 +84,7 @@ class LCodeGen;
V(ConstantD) \
V(ConstantI) \
V(ConstantT) \
V(Context) \
V(DeleteProperty) \
V(Deoptimize) \
V(DivI) \
@ -1130,11 +1131,10 @@ class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
};
class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 1> {
class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 0> {
public:
LLoadFunctionPrototype(LOperand* function, LOperand* temp) {
explicit LLoadFunctionPrototype(LOperand* function) {
inputs_[0] = function;
temps_[0] = temp;
}
DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
@ -1255,6 +1255,12 @@ class LPushArgument: public LTemplateInstruction<0, 1, 0> {
};
class LContext: public LTemplateInstruction<1, 0, 0> {
public:
DECLARE_CONCRETE_INSTRUCTION(Context, "context")
};
class LGlobalObject: public LTemplateInstruction<1, 0, 0> {
public:
DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")

View File

@ -58,23 +58,11 @@ test-heap/TestInternalWeakListsTraverseWithGC: PASS || FAIL
[ $arch == x64 && $crankshaft ]
# Tests that fail with crankshaft.
test-deoptimization/DeoptimizeBinaryOperationADDString: FAIL
test-deoptimization/DeoptimizeBinaryOperationADD: FAIL
test-deoptimization/DeoptimizeBinaryOperationSUB: FAIL
test-deoptimization/DeoptimizeBinaryOperationMUL: FAIL
test-deoptimization/DeoptimizeBinaryOperationMOD: FAIL
test-deoptimization/DeoptimizeBinaryOperationDIV: FAIL
test-deoptimization/DeoptimizeLoadICStoreIC: FAIL
test-deoptimization/DeoptimizeLoadICStoreICNested: FAIL
test-deoptimization/DeoptimizeCompare: PASS || FAIL
# Tests that time out with crankshaft.
test-api/Threading: SKIP
# BUG(1069): Context serialization fails on optimized functions.
test-serialize/ContextSerialization: SKIP
test-serialize/ContextDeserialization: SKIP
##############################################################################
[ $arch == arm ]