Chromium Code Reviews| Index: runtime/vm/intermediate_language_arm.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_arm.cc (revision 29901) |
| +++ runtime/vm/intermediate_language_arm.cc (working copy) |
| @@ -494,6 +494,48 @@ |
| } |
| +LocationSummary* TestSmiInstr::MakeLocationSummary() const { |
| + const intptr_t kNumInputs = 2; |
| + const intptr_t kNumTemps = 0; |
| + LocationSummary* locs = |
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| + locs->set_in(0, Location::RequiresRegister()); |
| + // Only one input can be a constant operand. The case of two constant |
| + // operands should be handled by constant propagation. |
| + locs->set_in(1, Location::RegisterOrConstant(right())); |
| + return locs; |
| +} |
| + |
| + |
| +void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| + // Never emitted outside of the BranchInstr. |
| + UNREACHABLE(); |
| +} |
| + |
| + |
| +void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| + BranchInstr* branch) { |
| + Condition branch_condition = (kind() == Token::kNE) ? NE : EQ; |
| + Register left = locs()->in(0).reg(); |
| + Location right = locs()->in(1); |
| + if (right.IsConstant()) { |
| + ASSERT(right.constant().IsSmi()); |
| + const int32_t imm = |
| + reinterpret_cast<int32_t>(right.constant().raw()); |
| + ShifterOperand shifter_op; |
| + if (ShifterOperand::CanHold(imm, &shifter_op)) { |
|
zra
2013/11/05 18:38:03
Maybe add TstImmediate macro to assembler.
Florian Schneider
2013/11/06 12:13:42
Done.
|
| + __ tst(left, shifter_op); |
| + } else { |
| + __ LoadImmediate(IP, imm); |
| + __ tst(left, ShifterOperand(IP)); |
| + } |
| + } else { |
| + __ tst(left, ShifterOperand(right.reg())); |
| + } |
| + branch->EmitBranchOnCondition(compiler, branch_condition); |
| +} |
| + |
| + |
| LocationSummary* RelationalOpInstr::MakeLocationSummary() const { |
| const intptr_t kNumInputs = 2; |
| const intptr_t kNumTemps = 0; |