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
3// found in the LICENSE file.
4
5#include "src/compiler/backend/instruction-scheduler.h"
6
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11bool InstructionScheduler::SchedulerSupported() { return true; }
12
13int InstructionScheduler::GetTargetInstructionFlags(
14    const Instruction* instr) const {
15  switch (instr->arch_opcode()) {
16    case kArm64Add:
17    case kArm64Add32:
18    case kArm64And:
19    case kArm64And32:
20    case kArm64Bic:
21    case kArm64Bic32:
22    case kArm64Clz:
23    case kArm64Clz32:
24    case kArm64Cmp:
25    case kArm64Cmp32:
26    case kArm64Cmn:
27    case kArm64Cmn32:
28    case kArm64Cnt:
29    case kArm64Cnt32:
30    case kArm64Cnt64:
31    case kArm64Tst:
32    case kArm64Tst32:
33    case kArm64Or:
34    case kArm64Or32:
35    case kArm64Orn:
36    case kArm64Orn32:
37    case kArm64Eor:
38    case kArm64Eor32:
39    case kArm64Eon:
40    case kArm64Eon32:
41    case kArm64Sadalp:
42    case kArm64Saddlp:
43    case kArm64Sub:
44    case kArm64Sub32:
45    case kArm64Mul:
46    case kArm64Mul32:
47    case kArm64Smlal:
48    case kArm64Smlal2:
49    case kArm64Smull:
50    case kArm64Smull2:
51    case kArm64Uadalp:
52    case kArm64Uaddlp:
53    case kArm64Umlal:
54    case kArm64Umlal2:
55    case kArm64Umull:
56    case kArm64Umull2:
57    case kArm64Madd:
58    case kArm64Madd32:
59    case kArm64Msub:
60    case kArm64Msub32:
61    case kArm64Mneg:
62    case kArm64Mneg32:
63    case kArm64Idiv:
64    case kArm64Idiv32:
65    case kArm64Udiv:
66    case kArm64Udiv32:
67    case kArm64Imod:
68    case kArm64Imod32:
69    case kArm64Umod:
70    case kArm64Umod32:
71    case kArm64Not:
72    case kArm64Not32:
73    case kArm64Lsl:
74    case kArm64Lsl32:
75    case kArm64Lsr:
76    case kArm64Lsr32:
77    case kArm64Asr:
78    case kArm64Asr32:
79    case kArm64Ror:
80    case kArm64Ror32:
81    case kArm64Mov32:
82    case kArm64Sxtb:
83    case kArm64Sxtb32:
84    case kArm64Sxth:
85    case kArm64Sxth32:
86    case kArm64Sxtw:
87    case kArm64Sbfx:
88    case kArm64Sbfx32:
89    case kArm64Ubfx:
90    case kArm64Ubfx32:
91    case kArm64Ubfiz32:
92    case kArm64Bfi:
93    case kArm64Rbit:
94    case kArm64Rbit32:
95    case kArm64Rev:
96    case kArm64Rev32:
97    case kArm64Float32Cmp:
98    case kArm64Float32Add:
99    case kArm64Float32Sub:
100    case kArm64Float32Mul:
101    case kArm64Float32Div:
102    case kArm64Float32Abs:
103    case kArm64Float32Abd:
104    case kArm64Float32Neg:
105    case kArm64Float32Sqrt:
106    case kArm64Float32Fnmul:
107    case kArm64Float32RoundDown:
108    case kArm64Float32Max:
109    case kArm64Float32Min:
110    case kArm64Float64Cmp:
111    case kArm64Float64Add:
112    case kArm64Float64Sub:
113    case kArm64Float64Mul:
114    case kArm64Float64Div:
115    case kArm64Float64Max:
116    case kArm64Float64Min:
117    case kArm64Float64Abs:
118    case kArm64Float64Abd:
119    case kArm64Float64Neg:
120    case kArm64Float64Sqrt:
121    case kArm64Float64Fnmul:
122    case kArm64Float64RoundDown:
123    case kArm64Float64RoundTiesAway:
124    case kArm64Float64RoundTruncate:
125    case kArm64Float64RoundTiesEven:
126    case kArm64Float64RoundUp:
127    case kArm64Float32RoundTiesEven:
128    case kArm64Float32RoundTruncate:
129    case kArm64Float32RoundUp:
130    case kArm64Float32ToFloat64:
131    case kArm64Float64ToFloat32:
132    case kArm64Float32ToInt32:
133    case kArm64Float64ToInt32:
134    case kArm64Float32ToUint32:
135    case kArm64Float64ToUint32:
136    case kArm64Float32ToInt64:
137    case kArm64Float64ToInt64:
138    case kArm64Float32ToUint64:
139    case kArm64Float64ToUint64:
140    case kArm64Int32ToFloat32:
141    case kArm64Int32ToFloat64:
142    case kArm64Int64ToFloat32:
143    case kArm64Int64ToFloat64:
144    case kArm64Uint32ToFloat32:
145    case kArm64Uint32ToFloat64:
146    case kArm64Uint64ToFloat32:
147    case kArm64Uint64ToFloat64:
148    case kArm64Float64ExtractLowWord32:
149    case kArm64Float64ExtractHighWord32:
150    case kArm64Float64InsertLowWord32:
151    case kArm64Float64InsertHighWord32:
152    case kArm64Float64Mod:
153    case kArm64Float64MoveU64:
154    case kArm64U64MoveFloat64:
155    case kArm64Float64SilenceNaN:
156    case kArm64FExtractLane:
157    case kArm64FReplaceLane:
158    case kArm64FSplat:
159    case kArm64FAbs:
160    case kArm64FSqrt:
161    case kArm64FNeg:
162    case kArm64FAdd:
163    case kArm64FSub:
164    case kArm64FMul:
165    case kArm64FMulElement:
166    case kArm64FDiv:
167    case kArm64FMin:
168    case kArm64FMax:
169    case kArm64FEq:
170    case kArm64FNe:
171    case kArm64FLt:
172    case kArm64FLe:
173    case kArm64FGt:
174    case kArm64FGe:
175    case kArm64F64x2Qfma:
176    case kArm64F64x2Qfms:
177    case kArm64F64x2Pmin:
178    case kArm64F64x2Pmax:
179    case kArm64F64x2ConvertLowI32x4S:
180    case kArm64F64x2ConvertLowI32x4U:
181    case kArm64F64x2PromoteLowF32x4:
182    case kArm64F32x4SConvertI32x4:
183    case kArm64F32x4UConvertI32x4:
184    case kArm64F32x4RecipApprox:
185    case kArm64F32x4RecipSqrtApprox:
186    case kArm64F32x4Qfma:
187    case kArm64F32x4Qfms:
188    case kArm64F32x4Pmin:
189    case kArm64F32x4Pmax:
190    case kArm64F32x4DemoteF64x2Zero:
191    case kArm64IExtractLane:
192    case kArm64IReplaceLane:
193    case kArm64ISplat:
194    case kArm64IAbs:
195    case kArm64INeg:
196    case kArm64Mla:
197    case kArm64Mls:
198    case kArm64RoundingAverageU:
199    case kArm64I64x2Shl:
200    case kArm64I64x2ShrS:
201    case kArm64IAdd:
202    case kArm64ISub:
203    case kArm64I64x2Mul:
204    case kArm64IEq:
205    case kArm64INe:
206    case kArm64IGtS:
207    case kArm64IGeS:
208    case kArm64ILtS:
209    case kArm64ILeS:
210    case kArm64I64x2ShrU:
211    case kArm64I64x2BitMask:
212    case kArm64I32x4SConvertF32x4:
213    case kArm64Sxtl:
214    case kArm64Sxtl2:
215    case kArm64Uxtl:
216    case kArm64Uxtl2:
217    case kArm64I32x4Shl:
218    case kArm64I32x4ShrS:
219    case kArm64I32x4Mul:
220    case kArm64IMinS:
221    case kArm64IMaxS:
222    case kArm64I32x4UConvertF32x4:
223    case kArm64I32x4ShrU:
224    case kArm64IMinU:
225    case kArm64IMaxU:
226    case kArm64IGtU:
227    case kArm64IGeU:
228    case kArm64I32x4BitMask:
229    case kArm64I32x4DotI16x8S:
230    case kArm64I32x4TruncSatF64x2SZero:
231    case kArm64I32x4TruncSatF64x2UZero:
232    case kArm64IExtractLaneU:
233    case kArm64IExtractLaneS:
234    case kArm64I16x8Shl:
235    case kArm64I16x8ShrS:
236    case kArm64I16x8SConvertI32x4:
237    case kArm64IAddSatS:
238    case kArm64ISubSatS:
239    case kArm64I16x8Mul:
240    case kArm64I16x8ShrU:
241    case kArm64I16x8UConvertI32x4:
242    case kArm64IAddSatU:
243    case kArm64ISubSatU:
244    case kArm64I16x8Q15MulRSatS:
245    case kArm64I16x8BitMask:
246    case kArm64I8x16Shl:
247    case kArm64I8x16ShrS:
248    case kArm64I8x16SConvertI16x8:
249    case kArm64I8x16UConvertI16x8:
250    case kArm64I8x16ShrU:
251    case kArm64I8x16BitMask:
252    case kArm64S128Const:
253    case kArm64S128Zero:
254    case kArm64S128Dup:
255    case kArm64S128And:
256    case kArm64S128Or:
257    case kArm64S128Xor:
258    case kArm64S128Not:
259    case kArm64S128Select:
260    case kArm64S128AndNot:
261    case kArm64Ssra:
262    case kArm64Usra:
263    case kArm64S32x4ZipLeft:
264    case kArm64S32x4ZipRight:
265    case kArm64S32x4UnzipLeft:
266    case kArm64S32x4UnzipRight:
267    case kArm64S32x4TransposeLeft:
268    case kArm64S32x4TransposeRight:
269    case kArm64S32x4Shuffle:
270    case kArm64S16x8ZipLeft:
271    case kArm64S16x8ZipRight:
272    case kArm64S16x8UnzipLeft:
273    case kArm64S16x8UnzipRight:
274    case kArm64S16x8TransposeLeft:
275    case kArm64S16x8TransposeRight:
276    case kArm64S8x16ZipLeft:
277    case kArm64S8x16ZipRight:
278    case kArm64S8x16UnzipLeft:
279    case kArm64S8x16UnzipRight:
280    case kArm64S8x16TransposeLeft:
281    case kArm64S8x16TransposeRight:
282    case kArm64S8x16Concat:
283    case kArm64I8x16Swizzle:
284    case kArm64I8x16Shuffle:
285    case kArm64S32x2Reverse:
286    case kArm64S16x4Reverse:
287    case kArm64S16x2Reverse:
288    case kArm64S8x8Reverse:
289    case kArm64S8x4Reverse:
290    case kArm64S8x2Reverse:
291    case kArm64V128AnyTrue:
292    case kArm64I64x2AllTrue:
293    case kArm64I32x4AllTrue:
294    case kArm64I16x8AllTrue:
295    case kArm64I8x16AllTrue:
296    case kArm64TestAndBranch32:
297    case kArm64TestAndBranch:
298    case kArm64CompareAndBranch32:
299    case kArm64CompareAndBranch:
300      return kNoOpcodeFlags;
301
302    case kArm64LdrS:
303    case kArm64LdrD:
304    case kArm64LdrQ:
305    case kArm64Ldrb:
306    case kArm64Ldrsb:
307    case kArm64LdrsbW:
308    case kArm64Ldrh:
309    case kArm64Ldrsh:
310    case kArm64LdrshW:
311    case kArm64Ldrsw:
312    case kArm64LdrW:
313    case kArm64Ldr:
314    case kArm64LdrDecompressTaggedSigned:
315    case kArm64LdrDecompressTaggedPointer:
316    case kArm64LdrDecompressAnyTagged:
317    case kArm64LdarDecompressTaggedSigned:
318    case kArm64LdarDecompressTaggedPointer:
319    case kArm64LdarDecompressAnyTagged:
320    case kArm64LdrDecodeSandboxedPointer:
321    case kArm64Peek:
322    case kArm64LoadSplat:
323    case kArm64LoadLane:
324    case kArm64S128Load8x8S:
325    case kArm64S128Load8x8U:
326    case kArm64S128Load16x4S:
327    case kArm64S128Load16x4U:
328    case kArm64S128Load32x2S:
329    case kArm64S128Load32x2U:
330      return kIsLoadOperation;
331
332    case kArm64Claim:
333    case kArm64Poke:
334    case kArm64PokePair:
335    case kArm64StrS:
336    case kArm64StrD:
337    case kArm64StrQ:
338    case kArm64Strb:
339    case kArm64Strh:
340    case kArm64StrW:
341    case kArm64Str:
342    case kArm64StrCompressTagged:
343    case kArm64StlrCompressTagged:
344    case kArm64StrEncodeSandboxedPointer:
345    case kArm64DmbIsh:
346    case kArm64DsbIsb:
347    case kArm64StoreLane:
348      return kHasSideEffect;
349
350    case kArm64Word64AtomicLoadUint64:
351      return kIsLoadOperation;
352
353    case kArm64Word64AtomicStoreWord64:
354    case kArm64Word64AtomicAddUint64:
355    case kArm64Word64AtomicSubUint64:
356    case kArm64Word64AtomicAndUint64:
357    case kArm64Word64AtomicOrUint64:
358    case kArm64Word64AtomicXorUint64:
359    case kArm64Word64AtomicExchangeUint64:
360    case kArm64Word64AtomicCompareExchangeUint64:
361      return kHasSideEffect;
362
363#define CASE(Name) case k##Name:
364      COMMON_ARCH_OPCODE_LIST(CASE)
365#undef CASE
366      // Already covered in architecture independent code.
367      UNREACHABLE();
368  }
369
370  UNREACHABLE();
371}
372
373int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
374  // Basic latency modeling for arm64 instructions. They have been determined
375  // in an empirical way.
376  switch (instr->arch_opcode()) {
377    case kArm64Add:
378    case kArm64Add32:
379    case kArm64And:
380    case kArm64And32:
381    case kArm64Bic:
382    case kArm64Bic32:
383    case kArm64Cmn:
384    case kArm64Cmn32:
385    case kArm64Cmp:
386    case kArm64Cmp32:
387    case kArm64Eon:
388    case kArm64Eon32:
389    case kArm64Eor:
390    case kArm64Eor32:
391    case kArm64Not:
392    case kArm64Not32:
393    case kArm64Or:
394    case kArm64Or32:
395    case kArm64Orn:
396    case kArm64Orn32:
397    case kArm64Sub:
398    case kArm64Sub32:
399    case kArm64Tst:
400    case kArm64Tst32:
401      if (instr->addressing_mode() != kMode_None) {
402        return 3;
403      } else {
404        return 1;
405      }
406
407    case kArm64Clz:
408    case kArm64Clz32:
409    case kArm64Sbfx:
410    case kArm64Sbfx32:
411    case kArm64Sxtb32:
412    case kArm64Sxth32:
413    case kArm64Sxtw:
414    case kArm64Ubfiz32:
415    case kArm64Ubfx:
416    case kArm64Ubfx32:
417      return 1;
418
419    case kArm64Lsl:
420    case kArm64Lsl32:
421    case kArm64Lsr:
422    case kArm64Lsr32:
423    case kArm64Asr:
424    case kArm64Asr32:
425    case kArm64Ror:
426    case kArm64Ror32:
427      return 1;
428
429    case kArm64LdrDecompressTaggedSigned:
430    case kArm64LdrDecompressTaggedPointer:
431    case kArm64LdrDecompressAnyTagged:
432    case kArm64Ldr:
433    case kArm64LdrD:
434    case kArm64LdrS:
435    case kArm64LdrW:
436    case kArm64Ldrb:
437    case kArm64Ldrh:
438    case kArm64Ldrsb:
439    case kArm64Ldrsh:
440    case kArm64Ldrsw:
441      return 11;
442
443    case kArm64Str:
444    case kArm64StrD:
445    case kArm64StrS:
446    case kArm64StrW:
447    case kArm64Strb:
448    case kArm64Strh:
449      return 1;
450
451    case kArm64Madd32:
452    case kArm64Mneg32:
453    case kArm64Msub32:
454    case kArm64Mul32:
455      return 3;
456
457    case kArm64Madd:
458    case kArm64Mneg:
459    case kArm64Msub:
460    case kArm64Mul:
461      return 5;
462
463    case kArm64Idiv32:
464    case kArm64Udiv32:
465      return 12;
466
467    case kArm64Idiv:
468    case kArm64Udiv:
469      return 20;
470
471    case kArm64Float32Add:
472    case kArm64Float32Sub:
473    case kArm64Float64Add:
474    case kArm64Float64Sub:
475      return 5;
476
477    case kArm64Float32Abs:
478    case kArm64Float32Cmp:
479    case kArm64Float32Neg:
480    case kArm64Float64Abs:
481    case kArm64Float64Cmp:
482    case kArm64Float64Neg:
483      return 3;
484
485    case kArm64Float32Div:
486    case kArm64Float32Sqrt:
487      return 12;
488
489    case kArm64Float64Div:
490    case kArm64Float64Sqrt:
491      return 19;
492
493    case kArm64Float32RoundDown:
494    case kArm64Float32RoundTiesEven:
495    case kArm64Float32RoundTruncate:
496    case kArm64Float32RoundUp:
497    case kArm64Float64RoundDown:
498    case kArm64Float64RoundTiesAway:
499    case kArm64Float64RoundTiesEven:
500    case kArm64Float64RoundTruncate:
501    case kArm64Float64RoundUp:
502      return 5;
503
504    case kArm64Float32ToFloat64:
505    case kArm64Float64ToFloat32:
506    case kArm64Float64ToInt32:
507    case kArm64Float64ToUint32:
508    case kArm64Float32ToInt64:
509    case kArm64Float64ToInt64:
510    case kArm64Float32ToUint64:
511    case kArm64Float64ToUint64:
512    case kArm64Int32ToFloat64:
513    case kArm64Int64ToFloat32:
514    case kArm64Int64ToFloat64:
515    case kArm64Uint32ToFloat64:
516    case kArm64Uint64ToFloat32:
517    case kArm64Uint64ToFloat64:
518      return 5;
519
520    default:
521      return 2;
522  }
523}
524
525}  // namespace compiler
526}  // namespace internal
527}  // namespace v8
528