| 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/generic-node-inl.h" | 5 #include "src/compiler/generic-node-inl.h" |
| 6 #include "src/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
| 7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 ArchOpcode opcode) { | 268 ArchOpcode opcode) { |
| 269 X64OperandGenerator g(selector); | 269 X64OperandGenerator g(selector); |
| 270 Int32BinopMatcher m(node); | 270 Int32BinopMatcher m(node); |
| 271 Node* left = m.left().node(); | 271 Node* left = m.left().node(); |
| 272 Node* right = m.right().node(); | 272 Node* right = m.right().node(); |
| 273 | 273 |
| 274 if (g.CanBeImmediate(right)) { | 274 if (g.CanBeImmediate(right)) { |
| 275 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), | 275 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), |
| 276 g.UseImmediate(right)); | 276 g.UseImmediate(right)); |
| 277 } else { | 277 } else { |
| 278 if (m.right().IsWord32And()) { | |
| 279 Int32BinopMatcher mright(right); | |
| 280 if (mright.right().Is(0x1F)) { | |
| 281 right = mright.left().node(); | |
| 282 } | |
| 283 } | |
| 284 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), | 278 selector->Emit(opcode, g.DefineSameAsFirst(node), g.UseRegister(left), |
| 285 g.UseFixed(right, rcx)); | 279 g.UseFixed(right, rcx)); |
| 286 } | 280 } |
| 287 } | 281 } |
| 288 | 282 |
| 289 | 283 |
| 290 // Shared routine for multiple 64-bit shift operations. | 284 // Shared routine for multiple 64-bit shift operations. |
| 291 // TODO(bmeurer): Merge this with VisitWord32Shift using template magic? | 285 // TODO(bmeurer): Merge this with VisitWord32Shift using template magic? |
| 292 void VisitWord64Shift(InstructionSelector* selector, Node* node, | 286 void VisitWord64Shift(InstructionSelector* selector, Node* node, |
| 293 ArchOpcode opcode) { | 287 ArchOpcode opcode) { |
| (...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1163 VisitFloat64Compare(this, node, &cont); | 1157 VisitFloat64Compare(this, node, &cont); |
| 1164 } | 1158 } |
| 1165 | 1159 |
| 1166 | 1160 |
| 1167 // static | 1161 // static |
| 1168 MachineOperatorBuilder::Flags | 1162 MachineOperatorBuilder::Flags |
| 1169 InstructionSelector::SupportedMachineOperatorFlags() { | 1163 InstructionSelector::SupportedMachineOperatorFlags() { |
| 1170 if (CpuFeatures::IsSupported(SSE4_1)) { | 1164 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 1171 return MachineOperatorBuilder::kFloat64Floor | | 1165 return MachineOperatorBuilder::kFloat64Floor | |
| 1172 MachineOperatorBuilder::kFloat64Ceil | | 1166 MachineOperatorBuilder::kFloat64Ceil | |
| 1173 MachineOperatorBuilder::kFloat64RoundTruncate; | 1167 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1168 MachineOperatorBuilder::kWord32ShiftIsSafe; |
| 1174 } | 1169 } |
| 1175 return MachineOperatorBuilder::kNoFlags; | 1170 return MachineOperatorBuilder::kNoFlags; |
| 1176 } | 1171 } |
| 1177 | 1172 |
| 1178 } // namespace compiler | 1173 } // namespace compiler |
| 1179 } // namespace internal | 1174 } // namespace internal |
| 1180 } // namespace v8 | 1175 } // namespace v8 |
| OLD | NEW |