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()) {
83 case kArm64Float32Cmp:
84 case kArm64Float32Add:
85 case kArm64Float32Sub:
86 case kArm64Float32Mul:
87 case kArm64Float32Div:
88 case kArm64Float32Abs:
89 case kArm64Float32Neg:
90 case kArm64Float32Sqrt:
91 case kArm64Float32RoundDown:
92 case kArm64Float32Max:
93 case kArm64Float32Min:
94 case kArm64Float64Cmp:
95 case kArm64Float64Add:
96 case kArm64Float64Sub:
97 case kArm64Float64Mul:
98 case kArm64Float64Div:
99 case kArm64Float64Max:
100 case kArm64Float64Min:
101 case kArm64Float64Abs:
102 case kArm64Float64Neg:
103 case kArm64Float64Sqrt:
104 case kArm64Float64RoundDown:
105 case kArm64Float64RoundTiesAway:
106 case kArm64Float64RoundTruncate:
107 case kArm64Float64RoundTiesEven:
108 case kArm64Float64RoundUp:
109 case kArm64Float32RoundTiesEven:
110 case kArm64Float32RoundTruncate:
111 case kArm64Float32RoundUp:
112 case kArm64Float32ToFloat64:
113 case kArm64Float64ToFloat32:
114 case kArm64Float32ToInt32:
115 case kArm64Float64ToInt32:
116 case kArm64Float32ToUint32:
117 case kArm64Float64ToUint32:
118 case kArm64Float32ToInt64:
119 case kArm64Float64ToInt64:
120 case kArm64Float32ToUint64:
121 case kArm64Float64ToUint64:
122 case kArm64Int32ToFloat32:
123 case kArm64Int32ToFloat64:
124 case kArm64Int64ToFloat32:
125 case kArm64Int64ToFloat64:
126 case kArm64Uint32ToFloat32:
127 case kArm64Uint32ToFloat64:
128 case kArm64Uint64ToFloat32:
129 case kArm64Uint64ToFloat64:
130 case kArm64Float64ExtractLowWord32:
131 case kArm64Float64ExtractHighWord32:
132 case kArm64Float64InsertLowWord32:
133 case kArm64Float64InsertHighWord32:
134 case kArm64Float64Mod:
135 case kArm64Float64MoveU64:
136 case kArm64U64MoveFloat64:
137 case kArm64Float64SilenceNaN:
138 case kArm64F32x4Splat:
139 case kArm64F32x4ExtractLane:
140 case kArm64F32x4ReplaceLane:
141 case kArm64F32x4SConvertI32x4:
142 case kArm64F32x4UConvertI32x4:
145 case kArm64F32x4RecipApprox:
146 case kArm64F32x4RecipSqrtApprox:
148 case kArm64F32x4AddHoriz:
157 case kArm64I32x4Splat:
158 case kArm64I32x4ExtractLane:
159 case kArm64I32x4ReplaceLane:
160 case kArm64I32x4SConvertF32x4:
161 case kArm64I32x4SConvertI16x8Low:
162 case kArm64I32x4SConvertI16x8High:
165 case kArm64I32x4ShrS:
167 case kArm64I32x4AddHoriz:
170 case kArm64I32x4MinS:
171 case kArm64I32x4MaxS:
176 case kArm64I32x4UConvertF32x4:
177 case kArm64I32x4UConvertI16x8Low:
178 case kArm64I32x4UConvertI16x8High:
179 case kArm64I32x4ShrU:
180 case kArm64I32x4MinU:
181 case kArm64I32x4MaxU:
184 case kArm64I16x8Splat:
185 case kArm64I16x8ExtractLane:
186 case kArm64I16x8ReplaceLane:
187 case kArm64I16x8SConvertI8x16Low:
188 case kArm64I16x8SConvertI8x16High:
191 case kArm64I16x8ShrS:
192 case kArm64I16x8SConvertI32x4:
194 case kArm64I16x8AddSaturateS:
195 case kArm64I16x8AddHoriz:
197 case kArm64I16x8SubSaturateS:
199 case kArm64I16x8MinS:
200 case kArm64I16x8MaxS:
205 case kArm64I16x8UConvertI8x16Low:
206 case kArm64I16x8UConvertI8x16High:
207 case kArm64I16x8ShrU:
208 case kArm64I16x8UConvertI32x4:
209 case kArm64I16x8AddSaturateU:
210 case kArm64I16x8SubSaturateU:
211 case kArm64I16x8MinU:
212 case kArm64I16x8MaxU:
215 case kArm64I8x16Splat:
216 case kArm64I8x16ExtractLane:
217 case kArm64I8x16ReplaceLane:
220 case kArm64I8x16ShrS:
221 case kArm64I8x16SConvertI16x8:
223 case kArm64I8x16AddSaturateS:
225 case kArm64I8x16SubSaturateS:
227 case kArm64I8x16MinS:
228 case kArm64I8x16MaxS:
233 case kArm64I8x16UConvertI16x8:
234 case kArm64I8x16AddSaturateU:
235 case kArm64I8x16SubSaturateU:
236 case kArm64I8x16ShrU:
237 case kArm64I8x16MinU:
238 case kArm64I8x16MaxU:
247 case kArm64S128Select:
248 case kArm64S32x4ZipLeft:
249 case kArm64S32x4ZipRight:
250 case kArm64S32x4UnzipLeft:
251 case kArm64S32x4UnzipRight:
252 case kArm64S32x4TransposeLeft:
253 case kArm64S32x4TransposeRight:
254 case kArm64S32x4Shuffle:
255 case kArm64S16x8ZipLeft:
256 case kArm64S16x8ZipRight:
257 case kArm64S16x8UnzipLeft:
258 case kArm64S16x8UnzipRight:
259 case kArm64S16x8TransposeLeft:
260 case kArm64S16x8TransposeRight:
261 case kArm64S8x16ZipLeft:
262 case kArm64S8x16ZipRight:
263 case kArm64S8x16UnzipLeft:
264 case kArm64S8x16UnzipRight:
265 case kArm64S8x16TransposeLeft:
266 case kArm64S8x16TransposeRight:
267 case kArm64S8x16Concat:
268 case kArm64S8x16Shuffle:
269 case kArm64S32x2Reverse:
270 case kArm64S16x4Reverse:
271 case kArm64S16x2Reverse:
272 case kArm64S8x8Reverse:
273 case kArm64S8x4Reverse:
274 case kArm64S8x2Reverse:
275 case kArm64S1x4AnyTrue:
276 case kArm64S1x4AllTrue:
277 case kArm64S1x8AnyTrue:
278 case kArm64S1x8AllTrue:
279 case kArm64S1x16AnyTrue:
280 case kArm64S1x16AllTrue:
281 case kArm64TestAndBranch32:
282 case kArm64TestAndBranch:
283 case kArm64CompareAndBranch32:
284 case kArm64CompareAndBranch:
285 return kNoOpcodeFlags;
298 return kIsLoadOperation;
311 return kHasSideEffect;
313 case kArm64Word64AtomicLoadUint8:
314 case kArm64Word64AtomicLoadUint16:
315 case kArm64Word64AtomicLoadUint32:
316 case kArm64Word64AtomicLoadUint64:
317 return kIsLoadOperation;
319 case kArm64Word64AtomicStoreWord8:
320 case kArm64Word64AtomicStoreWord16:
321 case kArm64Word64AtomicStoreWord32:
322 case kArm64Word64AtomicStoreWord64:
323 case kArm64Word64AtomicAddUint8:
324 case kArm64Word64AtomicAddUint16:
325 case kArm64Word64AtomicAddUint32:
326 case kArm64Word64AtomicAddUint64:
327 case kArm64Word64AtomicSubUint8:
328 case kArm64Word64AtomicSubUint16:
329 case kArm64Word64AtomicSubUint32:
330 case kArm64Word64AtomicSubUint64:
331 case kArm64Word64AtomicAndUint8:
332 case kArm64Word64AtomicAndUint16:
333 case kArm64Word64AtomicAndUint32:
334 case kArm64Word64AtomicAndUint64:
335 case kArm64Word64AtomicOrUint8:
336 case kArm64Word64AtomicOrUint16:
337 case kArm64Word64AtomicOrUint32:
338 case kArm64Word64AtomicOrUint64:
339 case kArm64Word64AtomicXorUint8:
340 case kArm64Word64AtomicXorUint16:
341 case kArm64Word64AtomicXorUint32:
342 case kArm64Word64AtomicXorUint64:
343 case kArm64Word64AtomicExchangeUint8:
344 case kArm64Word64AtomicExchangeUint16:
345 case kArm64Word64AtomicExchangeUint32:
346 case kArm64Word64AtomicExchangeUint64:
347 case kArm64Word64AtomicCompareExchangeUint8:
348 case kArm64Word64AtomicCompareExchangeUint16:
349 case kArm64Word64AtomicCompareExchangeUint32:
350 case kArm64Word64AtomicCompareExchangeUint64:
351 return kHasSideEffect;
353 #define CASE(Name) case k##Name: 354 COMMON_ARCH_OPCODE_LIST(CASE)
363 int InstructionScheduler::GetInstructionLatency(
const Instruction* instr) {
366 switch (instr->arch_opcode()) {
391 if (instr->addressing_mode() != kMode_None) {
457 case kArm64Float32Add:
458 case kArm64Float32Sub:
459 case kArm64Float64Add:
460 case kArm64Float64Sub:
463 case kArm64Float32Abs:
464 case kArm64Float32Cmp:
465 case kArm64Float32Neg:
466 case kArm64Float64Abs:
467 case kArm64Float64Cmp:
468 case kArm64Float64Neg:
471 case kArm64Float32Div:
472 case kArm64Float32Sqrt:
475 case kArm64Float64Div:
476 case kArm64Float64Sqrt:
479 case kArm64Float32RoundDown:
480 case kArm64Float32RoundTiesEven:
481 case kArm64Float32RoundTruncate:
482 case kArm64Float32RoundUp:
483 case kArm64Float64RoundDown:
484 case kArm64Float64RoundTiesAway:
485 case kArm64Float64RoundTiesEven:
486 case kArm64Float64RoundTruncate:
487 case kArm64Float64RoundUp:
490 case kArm64Float32ToFloat64:
491 case kArm64Float64ToFloat32:
492 case kArm64Float64ToInt32:
493 case kArm64Float64ToUint32:
494 case kArm64Float32ToInt64:
495 case kArm64Float64ToInt64:
496 case kArm64Float32ToUint64:
497 case kArm64Float64ToUint64:
498 case kArm64Int32ToFloat64:
499 case kArm64Int64ToFloat32:
500 case kArm64Int64ToFloat64:
501 case kArm64Uint32ToFloat64:
502 case kArm64Uint64ToFloat32:
503 case kArm64Uint64ToFloat64: