Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
| 6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
| 7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 void VisitRRO(InstructionSelector* selector, ArchOpcode opcode, Node* node, | 134 void VisitRRO(InstructionSelector* selector, ArchOpcode opcode, Node* node, |
| 135 ImmediateMode operand_mode) { | 135 ImmediateMode operand_mode) { |
| 136 Arm64OperandGenerator g(selector); | 136 Arm64OperandGenerator g(selector); |
| 137 selector->Emit(opcode, g.DefineAsRegister(node), | 137 selector->Emit(opcode, g.DefineAsRegister(node), |
| 138 g.UseRegister(node->InputAt(0)), | 138 g.UseRegister(node->InputAt(0)), |
| 139 g.UseOperand(node->InputAt(1), operand_mode)); | 139 g.UseOperand(node->InputAt(1), operand_mode)); |
| 140 } | 140 } |
| 141 | 141 |
| 142 | 142 |
| 143 bool TryMatchAnyShift(InstructionSelector* selector, Node* node, | 143 bool TryMatchAnyShift(InstructionSelector* selector, Node* node, |
| 144 Node* input_node, InstructionCode* opcode, bool try_ror) { | 144 Node* input_node, InstructionCode* opcode, bool try_ror) { |
|
titzer
2015/11/24 08:35:02
Can you add additional unittests for the instructi
| |
| 145 Arm64OperandGenerator g(selector); | 145 Arm64OperandGenerator g(selector); |
| 146 | 146 |
| 147 if (!selector->CanCover(node, input_node)) return false; | 147 if (!selector->CanCover(node, input_node)) return false; |
| 148 if (input_node->InputCount() != 2) return false; | 148 if (input_node->InputCount() != 2) return false; |
| 149 if (!g.IsIntegerConstant(input_node->InputAt(1))) return false; | 149 if (!g.IsIntegerConstant(input_node->InputAt(1))) return false; |
| 150 | 150 |
| 151 // Shift right can't be grouped with 32-bit operation, because the data | |
| 152 // will be lost. | |
| 153 bool is_word_output = !IrOpcode::Is64(node->opcode()); | |
|
titzer
2015/11/13 23:35:17
Can you move this condition inline (so that it is
fedor.indutny
2015/11/14 00:15:52
Acknowledged.
| |
| 154 | |
| 151 switch (input_node->opcode()) { | 155 switch (input_node->opcode()) { |
| 152 case IrOpcode::kWord32Shl: | 156 case IrOpcode::kWord32Shl: |
| 153 case IrOpcode::kWord64Shl: | 157 case IrOpcode::kWord64Shl: |
| 154 *opcode |= AddressingModeField::encode(kMode_Operand2_R_LSL_I); | 158 *opcode |= AddressingModeField::encode(kMode_Operand2_R_LSL_I); |
| 155 return true; | 159 return true; |
| 160 case IrOpcode::kWord64Shr: | |
| 161 if (is_word_output) return false; | |
| 156 case IrOpcode::kWord32Shr: | 162 case IrOpcode::kWord32Shr: |
| 157 case IrOpcode::kWord64Shr: | |
| 158 *opcode |= AddressingModeField::encode(kMode_Operand2_R_LSR_I); | 163 *opcode |= AddressingModeField::encode(kMode_Operand2_R_LSR_I); |
| 159 return true; | 164 return true; |
| 165 case IrOpcode::kWord64Sar: | |
| 166 if (is_word_output) return false; | |
| 160 case IrOpcode::kWord32Sar: | 167 case IrOpcode::kWord32Sar: |
| 161 case IrOpcode::kWord64Sar: | |
| 162 *opcode |= AddressingModeField::encode(kMode_Operand2_R_ASR_I); | 168 *opcode |= AddressingModeField::encode(kMode_Operand2_R_ASR_I); |
| 163 return true; | 169 return true; |
| 164 case IrOpcode::kWord32Ror: | 170 case IrOpcode::kWord32Ror: |
| 165 case IrOpcode::kWord64Ror: | 171 case IrOpcode::kWord64Ror: |
| 166 if (try_ror) { | 172 if (try_ror) { |
| 167 *opcode |= AddressingModeField::encode(kMode_Operand2_R_ROR_I); | 173 *opcode |= AddressingModeField::encode(kMode_Operand2_R_ROR_I); |
| 168 return true; | 174 return true; |
| 169 } | 175 } |
| 170 return false; | 176 return false; |
| 171 default: | 177 default: |
| (...skipping 1872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2044 MachineOperatorBuilder::kFloat64RoundTruncate | | 2050 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 2045 MachineOperatorBuilder::kFloat64RoundTiesAway | | 2051 MachineOperatorBuilder::kFloat64RoundTiesAway | |
| 2046 MachineOperatorBuilder::kWord32ShiftIsSafe | | 2052 MachineOperatorBuilder::kWord32ShiftIsSafe | |
| 2047 MachineOperatorBuilder::kInt32DivIsSafe | | 2053 MachineOperatorBuilder::kInt32DivIsSafe | |
| 2048 MachineOperatorBuilder::kUint32DivIsSafe; | 2054 MachineOperatorBuilder::kUint32DivIsSafe; |
| 2049 } | 2055 } |
| 2050 | 2056 |
| 2051 } // namespace compiler | 2057 } // namespace compiler |
| 2052 } // namespace internal | 2058 } // namespace internal |
| 2053 } // namespace v8 | 2059 } // namespace v8 |
| OLD | NEW |