Implement x64 lithium instructions DoGlobalObject and DoSub
Review URL: http://codereview.chromium.org/6324011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6456 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
43d7951677
commit
6c800fa6fd
@ -608,7 +608,22 @@ void LCodeGen::DoShiftI(LShiftI* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoSubI(LSubI* instr) {
|
||||
Abort("Unimplemented: %s", "DoSubI");
|
||||
LOperand* left = instr->InputAt(0);
|
||||
LOperand* right = instr->InputAt(1);
|
||||
ASSERT(left->Equals(instr->result()));
|
||||
|
||||
if (right->IsConstantOperand()) {
|
||||
__ subl(ToRegister(left),
|
||||
Immediate(ToInteger32(LConstantOperand::cast(right))));
|
||||
} else if (right->IsRegister()) {
|
||||
__ subl(ToRegister(left), ToRegister(right));
|
||||
} else {
|
||||
__ subl(ToRegister(left), ToOperand(right));
|
||||
}
|
||||
|
||||
if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
|
||||
DeoptimizeIf(overflow, instr->environment());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1444,7 +1459,8 @@ void LCodeGen::DoPushArgument(LPushArgument* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
|
||||
Abort("Unimplemented: %s", "DoGlobalObject");
|
||||
Register result = ToRegister(instr->result());
|
||||
__ movq(result, GlobalObjectOperand());
|
||||
}
|
||||
|
||||
|
||||
|
@ -1033,8 +1033,7 @@ LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
|
||||
Abort("Unimplemented: %s", "DoGlobalObject");
|
||||
return NULL;
|
||||
return DefineAsRegister(new LGlobalObject);
|
||||
}
|
||||
|
||||
|
||||
@ -1160,8 +1159,23 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoSub(HSub* instr) {
|
||||
Abort("Unimplemented: %s", "DoSub");
|
||||
return NULL;
|
||||
if (instr->representation().IsInteger32()) {
|
||||
ASSERT(instr->left()->representation().IsInteger32());
|
||||
ASSERT(instr->right()->representation().IsInteger32());
|
||||
LOperand* left = UseRegisterAtStart(instr->left());
|
||||
LOperand* right = UseOrConstantAtStart(instr->right());
|
||||
LSubI* sub = new LSubI(left, right);
|
||||
LInstruction* result = DefineSameAsFirst(sub);
|
||||
if (instr->CheckFlag(HValue::kCanOverflow)) {
|
||||
result = AssignEnvironment(result);
|
||||
}
|
||||
return result;
|
||||
} else if (instr->representation().IsDouble()) {
|
||||
return DoArithmeticD(Token::SUB, instr);
|
||||
} else {
|
||||
ASSERT(instr->representation().IsTagged());
|
||||
return DoArithmeticT(Token::SUB, instr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user