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()) {
55 case kSSEFloat32Round:
69 case kSSEFloat64Round:
70 case kSSEFloat32ToFloat64:
71 case kSSEFloat64ToFloat32:
72 case kSSEFloat32ToInt32:
73 case kSSEFloat32ToUint32:
74 case kSSEFloat64ToInt32:
75 case kSSEFloat64ToUint32:
76 case kSSEInt32ToFloat32:
77 case kSSEUint32ToFloat32:
78 case kSSEInt32ToFloat64:
79 case kSSEUint32ToFloat64:
80 case kSSEFloat64ExtractLowWord32:
81 case kSSEFloat64ExtractHighWord32:
82 case kSSEFloat64InsertLowWord32:
83 case kSSEFloat64InsertHighWord32:
84 case kSSEFloat64LoadLowWord32:
85 case kSSEFloat64SilenceNaN:
102 case kSSEF32x4ExtractLane:
103 case kAVXF32x4ExtractLane:
104 case kSSEF32x4ReplaceLane:
105 case kAVXF32x4ReplaceLane:
106 case kIA32F32x4SConvertI32x4:
107 case kSSEF32x4UConvertI32x4:
108 case kAVXF32x4UConvertI32x4:
113 case kIA32F32x4RecipApprox:
114 case kIA32F32x4RecipSqrtApprox:
117 case kSSEF32x4AddHoriz:
118 case kAVXF32x4AddHoriz:
135 case kIA32I32x4Splat:
136 case kIA32I32x4ExtractLane:
137 case kSSEI32x4ReplaceLane:
138 case kAVXI32x4ReplaceLane:
139 case kSSEI32x4SConvertF32x4:
140 case kAVXI32x4SConvertF32x4:
141 case kIA32I32x4SConvertI16x8Low:
142 case kIA32I32x4SConvertI16x8High:
150 case kSSEI32x4AddHoriz:
151 case kAVXI32x4AddHoriz:
168 case kSSEI32x4UConvertF32x4:
169 case kAVXI32x4UConvertF32x4:
170 case kIA32I32x4UConvertI16x8Low:
171 case kIA32I32x4UConvertI16x8High:
182 case kIA32I16x8Splat:
183 case kIA32I16x8ExtractLane:
184 case kSSEI16x8ReplaceLane:
185 case kAVXI16x8ReplaceLane:
186 case kIA32I16x8SConvertI8x16Low:
187 case kIA32I16x8SConvertI8x16High:
193 case kSSEI16x8SConvertI32x4:
194 case kAVXI16x8SConvertI32x4:
197 case kSSEI16x8AddSaturateS:
198 case kAVXI16x8AddSaturateS:
199 case kSSEI16x8AddHoriz:
200 case kAVXI16x8AddHoriz:
203 case kSSEI16x8SubSaturateS:
204 case kAVXI16x8SubSaturateS:
219 case kIA32I16x8UConvertI8x16Low:
220 case kIA32I16x8UConvertI8x16High:
223 case kSSEI16x8UConvertI32x4:
224 case kAVXI16x8UConvertI32x4:
225 case kSSEI16x8AddSaturateU:
226 case kAVXI16x8AddSaturateU:
227 case kSSEI16x8SubSaturateU:
228 case kAVXI16x8SubSaturateU:
237 case kIA32I8x16Splat:
238 case kIA32I8x16ExtractLane:
239 case kSSEI8x16ReplaceLane:
240 case kAVXI8x16ReplaceLane:
241 case kSSEI8x16SConvertI16x8:
242 case kAVXI8x16SConvertI16x8:
249 case kSSEI8x16AddSaturateS:
250 case kAVXI8x16AddSaturateS:
253 case kSSEI8x16SubSaturateS:
254 case kAVXI8x16SubSaturateS:
269 case kSSEI8x16UConvertI16x8:
270 case kAVXI8x16UConvertI16x8:
271 case kSSEI8x16AddSaturateU:
272 case kAVXI8x16AddSaturateU:
273 case kSSEI8x16SubSaturateU:
274 case kAVXI8x16SubSaturateU:
295 case kIA32S8x16Shuffle:
296 case kIA32S32x4Swizzle:
297 case kIA32S32x4Shuffle:
298 case kIA32S16x8Blend:
299 case kIA32S16x8HalfShuffle1:
300 case kIA32S16x8HalfShuffle2:
301 case kIA32S8x16Alignr:
304 case kSSES16x8UnzipHigh:
305 case kAVXS16x8UnzipHigh:
306 case kSSES16x8UnzipLow:
307 case kAVXS16x8UnzipLow:
308 case kSSES8x16UnzipHigh:
309 case kAVXS8x16UnzipHigh:
310 case kSSES8x16UnzipLow:
311 case kAVXS8x16UnzipLow:
312 case kIA32S64x2UnpackHigh:
313 case kIA32S32x4UnpackHigh:
314 case kIA32S16x8UnpackHigh:
315 case kIA32S8x16UnpackHigh:
316 case kIA32S64x2UnpackLow:
317 case kIA32S32x4UnpackLow:
318 case kIA32S16x8UnpackLow:
319 case kIA32S8x16UnpackLow:
320 case kSSES8x16TransposeLow:
321 case kAVXS8x16TransposeLow:
322 case kSSES8x16TransposeHigh:
323 case kAVXS8x16TransposeHigh:
324 case kSSES8x8Reverse:
325 case kAVXS8x8Reverse:
326 case kSSES8x4Reverse:
327 case kAVXS8x4Reverse:
328 case kSSES8x2Reverse:
329 case kAVXS8x2Reverse:
330 case kIA32S1x4AnyTrue:
331 case kIA32S1x4AllTrue:
332 case kIA32S1x8AnyTrue:
333 case kIA32S1x8AllTrue:
334 case kIA32S1x16AnyTrue:
335 case kIA32S1x16AllTrue:
336 return (instr->addressing_mode() == kMode_None)
338 : kIsLoadOperation | kHasSideEffect;
342 return (instr->addressing_mode() == kMode_None)
343 ? kMayNeedDeoptOrTrapCheck
344 : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect;
357 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
359 case kIA32StackCheck:
361 return kIsLoadOperation;
364 case kIA32PushFloat32:
365 case kIA32PushFloat64:
366 case kIA32PushSimd128:
369 return kHasSideEffect;
371 case kIA32Word32AtomicPairLoad:
372 return kIsLoadOperation;
374 case kIA32Word32AtomicPairStore:
375 case kIA32Word32AtomicPairAdd:
376 case kIA32Word32AtomicPairSub:
377 case kIA32Word32AtomicPairAnd:
378 case kIA32Word32AtomicPairOr:
379 case kIA32Word32AtomicPairXor:
380 case kIA32Word32AtomicPairExchange:
381 case kIA32Word32AtomicPairCompareExchange:
382 return kHasSideEffect;
384 #define CASE(Name) case k##Name: 385 COMMON_ARCH_OPCODE_LIST(CASE)
394 int InstructionScheduler::GetInstructionLatency(
const Instruction* instr) {
397 switch (instr->arch_opcode()) {
419 case kSSEFloat32ToFloat64:
420 case kSSEFloat64ToFloat32:
422 case kSSEFloat32Round:
423 case kSSEFloat64Round:
424 case kSSEFloat32ToInt32:
425 case kSSEFloat64ToInt32:
427 case kSSEFloat32ToUint32:
429 case kSSEFloat64ToUint32:
439 case kSSEFloat32Sqrt:
440 case kSSEFloat64Sqrt:
444 case kArchTruncateDoubleToI: