Chromium Code Reviews| Index: src/x64/lithium-x64.cc |
| =================================================================== |
| --- src/x64/lithium-x64.cc (revision 6451) |
| +++ src/x64/lithium-x64.cc (working copy) |
| @@ -1054,8 +1054,7 @@ |
| LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) { |
| - Abort("Unimplemented: %s", "DoGlobalObject"); |
| - return NULL; |
| + return DefineAsRegister(new LGlobalObject); |
| } |
| @@ -1181,8 +1180,23 @@ |
| 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->LeastConstantOperand()); |
| + LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); |
| + LSubI* sub = new LSubI(left, right); |
| + LInstruction* result = DefineSameAsFirst(sub); |
|
William Hesse
2011/01/25 11:12:20
Subtraction is not commutative. I don't think you
|
| + 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); |
| + } |
| } |