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:
parent
091237ce5b
commit
512a02764f
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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()))));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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 ]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user