Index: src/compiler/arm/instruction-selector-arm.cc |
diff --git a/src/compiler/arm/instruction-selector-arm.cc b/src/compiler/arm/instruction-selector-arm.cc |
index bcf5ba676659bb1fb6b3cf9955eb62324ac1fd5a..4b9d5bc71d9d8efabe837782b851ccb81bb7ca32 100644 |
--- a/src/compiler/arm/instruction-selector-arm.cc |
+++ b/src/compiler/arm/instruction-selector-arm.cc |
@@ -217,6 +217,18 @@ static inline bool TryMatchLSR(InstructionSelector* selector, |
} |
+static inline bool TryMatchShift(InstructionSelector* selector, |
titzer
2014/08/01 11:12:33
s/inline//
|
+ InstructionCode* opcode_return, Node* node, |
+ InstructionOperand** value_return, |
+ InstructionOperand** shift_return) { |
+ return ( |
+ TryMatchASR(selector, opcode_return, node, value_return, shift_return) || |
+ TryMatchLSL(selector, opcode_return, node, value_return, shift_return) || |
+ TryMatchLSR(selector, opcode_return, node, value_return, shift_return) || |
+ TryMatchROR(selector, opcode_return, node, value_return, shift_return)); |
+} |
+ |
+ |
static inline bool TryMatchImmediateOrShift(InstructionSelector* selector, |
InstructionCode* opcode_return, |
Node* node, |
@@ -229,10 +241,7 @@ static inline bool TryMatchImmediateOrShift(InstructionSelector* selector, |
*input_count_return = 1; |
return true; |
} |
- if (TryMatchASR(selector, opcode_return, node, &inputs[0], &inputs[1]) || |
- TryMatchLSL(selector, opcode_return, node, &inputs[0], &inputs[1]) || |
- TryMatchLSR(selector, opcode_return, node, &inputs[0], &inputs[1]) || |
- TryMatchROR(selector, opcode_return, node, &inputs[0], &inputs[1])) { |
+ if (TryMatchShift(selector, opcode_return, node, &inputs[0], &inputs[1])) { |
*input_count_return = 2; |
return true; |
} |
@@ -425,23 +434,16 @@ static inline void EmitBic(InstructionSelector* selector, Node* node, |
Node* left, Node* right) { |
ArmOperandGenerator g(selector); |
InstructionCode opcode = kArmBic; |
- InstructionOperand* inputs[3]; |
- size_t input_count = 0; |
- InstructionOperand* outputs[1] = {g.DefineAsRegister(node)}; |
- const size_t output_count = ARRAY_SIZE(outputs); |
- |
- inputs[input_count++] = g.UseRegister(left); |
- if (!TryMatchImmediateOrShift(selector, &opcode, right, &input_count, |
- &inputs[input_count])) { |
- opcode |= AddressingModeField::encode(kMode_Operand2_R); |
- inputs[input_count++] = g.UseRegister(right); |
+ InstructionOperand* value_operand; |
+ InstructionOperand* shift_operand; |
+ if (TryMatchShift(selector, &opcode, right, &value_operand, &shift_operand)) { |
+ selector->Emit(opcode, g.DefineAsRegister(node), g.UseRegister(left), |
+ value_operand, shift_operand); |
+ return; |
} |
- |
- ASSERT_NE(0, input_count); |
- ASSERT_GE(ARRAY_SIZE(inputs), input_count); |
- ASSERT_NE(kMode_None, AddressingModeField::decode(opcode)); |
- |
- selector->Emit(opcode, output_count, outputs, input_count, inputs); |
+ selector->Emit(opcode | AddressingModeField::encode(kMode_Operand2_R), |
+ g.DefineAsRegister(node), g.UseRegister(left), |
+ g.UseRegister(right)); |
} |
@@ -512,11 +514,19 @@ void InstructionSelector::VisitWord32Xor(Node* node) { |
ArmOperandGenerator g(this); |
Int32BinopMatcher m(node); |
if (m.right().Is(-1)) { |
- Emit(kArmMvn | AddressingModeField::encode(kMode_Operand2_R), |
- g.DefineSameAsFirst(node), g.UseRegister(m.left().node())); |
- } else { |
- VisitBinop(this, node, kArmEor, kArmEor); |
+ InstructionCode opcode = kArmMvn; |
+ InstructionOperand* value_operand; |
+ InstructionOperand* shift_operand; |
+ if (TryMatchShift(this, &opcode, m.left().node(), &value_operand, |
+ &shift_operand)) { |
+ Emit(opcode, g.DefineAsRegister(node), value_operand, shift_operand); |
+ return; |
+ } |
+ Emit(opcode | AddressingModeField::encode(kMode_Operand2_R), |
+ g.DefineAsRegister(node), g.UseRegister(m.left().node())); |
+ return; |
} |
+ VisitBinop(this, node, kArmEor, kArmEor); |
} |