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 |