5 #include "src/compiler/backend/instruction-scheduler.h" 11 bool InstructionScheduler::SchedulerSupported() {
return true; }
13 int InstructionScheduler::GetTargetInstructionFlags(
14 const Instruction* instr)
const {
15 switch (instr->arch_opcode()) {
66 case kSSEFloat32Round:
67 case kSSEFloat32ToFloat64:
77 case kSSEFloat64Round:
82 case kSSEFloat64ToFloat32:
83 case kSSEFloat32ToInt32:
84 case kSSEFloat32ToUint32:
85 case kSSEFloat64ToInt32:
86 case kSSEFloat64ToUint32:
87 case kSSEFloat64ToInt64:
88 case kSSEFloat32ToInt64:
89 case kSSEFloat64ToUint64:
90 case kSSEFloat32ToUint64:
91 case kSSEInt32ToFloat64:
92 case kSSEInt32ToFloat32:
93 case kSSEInt64ToFloat32:
94 case kSSEInt64ToFloat64:
95 case kSSEUint64ToFloat32:
96 case kSSEUint64ToFloat64:
97 case kSSEUint32ToFloat64:
98 case kSSEUint32ToFloat32:
99 case kSSEFloat64ExtractLowWord32:
100 case kSSEFloat64ExtractHighWord32:
101 case kSSEFloat64InsertLowWord32:
102 case kSSEFloat64InsertHighWord32:
103 case kSSEFloat64LoadLowWord32:
104 case kSSEFloat64SilenceNaN:
128 case kX64F32x4ExtractLane:
129 case kX64F32x4ReplaceLane:
130 case kX64F32x4SConvertI32x4:
131 case kX64F32x4UConvertI32x4:
132 case kX64F32x4RecipApprox:
133 case kX64F32x4RecipSqrtApprox:
137 case kX64F32x4AddHoriz:
147 case kX64I32x4ExtractLane:
148 case kX64I32x4ReplaceLane:
149 case kX64I32x4SConvertF32x4:
150 case kX64I32x4SConvertI16x8Low:
151 case kX64I32x4SConvertI16x8High:
156 case kX64I32x4AddHoriz:
165 case kX64I32x4UConvertF32x4:
166 case kX64I32x4UConvertI16x8Low:
167 case kX64I32x4UConvertI16x8High:
174 case kX64I16x8ExtractLane:
175 case kX64I16x8ReplaceLane:
176 case kX64I16x8SConvertI8x16Low:
177 case kX64I16x8SConvertI8x16High:
181 case kX64I16x8SConvertI32x4:
183 case kX64I16x8AddSaturateS:
184 case kX64I16x8AddHoriz:
186 case kX64I16x8SubSaturateS:
194 case kX64I16x8UConvertI8x16Low:
195 case kX64I16x8UConvertI8x16High:
196 case kX64I16x8UConvertI32x4:
198 case kX64I16x8AddSaturateU:
199 case kX64I16x8SubSaturateU:
205 case kX64I8x16ExtractLane:
206 case kX64I8x16ReplaceLane:
207 case kX64I8x16SConvertI16x8:
212 case kX64I8x16AddSaturateS:
214 case kX64I8x16SubSaturateS:
222 case kX64I8x16UConvertI16x8:
223 case kX64I8x16AddSaturateU:
224 case kX64I8x16SubSaturateU:
236 case kX64S1x4AnyTrue:
237 case kX64S1x4AllTrue:
238 case kX64S1x8AnyTrue:
239 case kX64S1x8AllTrue:
240 case kX64S1x16AnyTrue:
241 case kX64S1x16AllTrue:
242 return (instr->addressing_mode() == kMode_None)
244 : kIsLoadOperation | kHasSideEffect;
250 return (instr->addressing_mode() == kMode_None)
251 ? kMayNeedDeoptOrTrapCheck
252 : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect;
263 DCHECK_LE(1, instr->InputCount());
264 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
269 return kHasSideEffect;
272 if (instr->HasOutput()) {
273 DCHECK_LE(1, instr->InputCount());
274 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
277 return kHasSideEffect;
280 case kX64MovqDecompressTaggedSigned:
281 case kX64MovqDecompressTaggedPointer:
282 case kX64MovqDecompressAnyTagged:
287 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
291 return kIsLoadOperation;
295 return kHasSideEffect;
298 return kHasSideEffect;
300 case kX64Word64AtomicLoadUint8:
301 case kX64Word64AtomicLoadUint16:
302 case kX64Word64AtomicLoadUint32:
303 case kX64Word64AtomicLoadUint64:
304 return kIsLoadOperation;
306 case kX64Word64AtomicStoreWord8:
307 case kX64Word64AtomicStoreWord16:
308 case kX64Word64AtomicStoreWord32:
309 case kX64Word64AtomicStoreWord64:
310 case kX64Word64AtomicAddUint8:
311 case kX64Word64AtomicAddUint16:
312 case kX64Word64AtomicAddUint32:
313 case kX64Word64AtomicAddUint64:
314 case kX64Word64AtomicSubUint8:
315 case kX64Word64AtomicSubUint16:
316 case kX64Word64AtomicSubUint32:
317 case kX64Word64AtomicSubUint64:
318 case kX64Word64AtomicAndUint8:
319 case kX64Word64AtomicAndUint16:
320 case kX64Word64AtomicAndUint32:
321 case kX64Word64AtomicAndUint64:
322 case kX64Word64AtomicOrUint8:
323 case kX64Word64AtomicOrUint16:
324 case kX64Word64AtomicOrUint32:
325 case kX64Word64AtomicOrUint64:
326 case kX64Word64AtomicXorUint8:
327 case kX64Word64AtomicXorUint16:
328 case kX64Word64AtomicXorUint32:
329 case kX64Word64AtomicXorUint64:
330 case kX64Word64AtomicExchangeUint8:
331 case kX64Word64AtomicExchangeUint16:
332 case kX64Word64AtomicExchangeUint32:
333 case kX64Word64AtomicExchangeUint64:
334 case kX64Word64AtomicCompareExchangeUint8:
335 case kX64Word64AtomicCompareExchangeUint16:
336 case kX64Word64AtomicCompareExchangeUint32:
337 case kX64Word64AtomicCompareExchangeUint64:
338 return kHasSideEffect;
340 #define CASE(Name) case k##Name: 341 COMMON_ARCH_OPCODE_LIST(CASE)
350 int InstructionScheduler::GetInstructionLatency(
const Instruction* instr) {
353 switch (instr->arch_opcode()) {
374 case kSSEFloat32ToFloat64:
375 case kSSEFloat64ToFloat32:
376 case kSSEFloat32Round:
377 case kSSEFloat64Round:
378 case kSSEFloat32ToInt32:
379 case kSSEFloat32ToUint32:
380 case kSSEFloat64ToInt32:
381 case kSSEFloat64ToUint32:
393 case kSSEFloat32Sqrt:
394 case kSSEFloat64Sqrt:
396 case kSSEFloat32ToInt64:
397 case kSSEFloat64ToInt64:
398 case kSSEFloat32ToUint64:
399 case kSSEFloat64ToUint64:
403 case kArchTruncateDoubleToI: