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 | 7 |
8 namespace v8 { | 8 namespace v8 { |
9 namespace internal { | 9 namespace internal { |
10 namespace compiler { | 10 namespace compiler { |
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 } | 1187 } |
1188 } | 1188 } |
1189 } | 1189 } |
1190 break; | 1190 break; |
1191 case IrOpcode::kInt32Add: | 1191 case IrOpcode::kInt32Add: |
1192 return VisitWordCompare(this, value, kArm64Cmn32, &cont, true, | 1192 return VisitWordCompare(this, value, kArm64Cmn32, &cont, true, |
1193 kArithmeticImm); | 1193 kArithmeticImm); |
1194 case IrOpcode::kInt32Sub: | 1194 case IrOpcode::kInt32Sub: |
1195 return VisitWordCompare(this, value, kArm64Cmp32, &cont, false, | 1195 return VisitWordCompare(this, value, kArm64Cmp32, &cont, false, |
1196 kArithmeticImm); | 1196 kArithmeticImm); |
1197 case IrOpcode::kWord32And: | 1197 case IrOpcode::kWord32And: { |
| 1198 Int32BinopMatcher m(value); |
| 1199 if (m.right().HasValue() && |
| 1200 (base::bits::CountPopulation32(m.right().Value()) == 1)) { |
| 1201 // If the mask has only one bit set, we can use tbz/tbnz. |
| 1202 DCHECK((cont.condition() == kEqual) || |
| 1203 (cont.condition() == kNotEqual)); |
| 1204 ArchOpcode opcode = |
| 1205 (cont.condition() == kEqual) ? kArm64Tbz32 : kArm64Tbnz32; |
| 1206 Emit(opcode, NULL, g.UseRegister(m.left().node()), |
| 1207 g.TempImmediate( |
| 1208 base::bits::CountTrailingZeros32(m.right().Value())), |
| 1209 g.Label(cont.true_block()), |
| 1210 g.Label(cont.false_block()))->MarkAsControl(); |
| 1211 return; |
| 1212 } |
1198 return VisitWordCompare(this, value, kArm64Tst32, &cont, true, | 1213 return VisitWordCompare(this, value, kArm64Tst32, &cont, true, |
1199 kLogical32Imm); | 1214 kLogical32Imm); |
1200 case IrOpcode::kWord64And: | 1215 } |
| 1216 case IrOpcode::kWord64And: { |
| 1217 Int64BinopMatcher m(value); |
| 1218 if (m.right().HasValue() && |
| 1219 (base::bits::CountPopulation64(m.right().Value()) == 1)) { |
| 1220 // If the mask has only one bit set, we can use tbz/tbnz. |
| 1221 DCHECK((cont.condition() == kEqual) || |
| 1222 (cont.condition() == kNotEqual)); |
| 1223 ArchOpcode opcode = |
| 1224 (cont.condition() == kEqual) ? kArm64Tbz : kArm64Tbnz; |
| 1225 Emit(opcode, NULL, g.UseRegister(m.left().node()), |
| 1226 g.TempImmediate( |
| 1227 base::bits::CountTrailingZeros64(m.right().Value())), |
| 1228 g.Label(cont.true_block()), |
| 1229 g.Label(cont.false_block()))->MarkAsControl(); |
| 1230 return; |
| 1231 } |
1201 return VisitWordCompare(this, value, kArm64Tst, &cont, true, | 1232 return VisitWordCompare(this, value, kArm64Tst, &cont, true, |
1202 kLogical64Imm); | 1233 kLogical64Imm); |
| 1234 } |
1203 default: | 1235 default: |
1204 break; | 1236 break; |
1205 } | 1237 } |
1206 } | 1238 } |
1207 | 1239 |
1208 // Branch could not be combined with a compare, emit compare against 0. | 1240 // Branch could not be combined with a compare, emit compare against 0. |
1209 VisitWord32Test(this, value, &cont); | 1241 VisitWord32Test(this, value, &cont); |
1210 } | 1242 } |
1211 | 1243 |
1212 | 1244 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 MachineOperatorBuilder::Flags | 1376 MachineOperatorBuilder::Flags |
1345 InstructionSelector::SupportedMachineOperatorFlags() { | 1377 InstructionSelector::SupportedMachineOperatorFlags() { |
1346 return MachineOperatorBuilder::kFloat64Floor | | 1378 return MachineOperatorBuilder::kFloat64Floor | |
1347 MachineOperatorBuilder::kFloat64Ceil | | 1379 MachineOperatorBuilder::kFloat64Ceil | |
1348 MachineOperatorBuilder::kFloat64RoundTruncate | | 1380 MachineOperatorBuilder::kFloat64RoundTruncate | |
1349 MachineOperatorBuilder::kFloat64RoundTiesAway; | 1381 MachineOperatorBuilder::kFloat64RoundTiesAway; |
1350 } | 1382 } |
1351 } // namespace compiler | 1383 } // namespace compiler |
1352 } // namespace internal | 1384 } // namespace internal |
1353 } // namespace v8 | 1385 } // namespace v8 |
OLD | NEW |