V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
instruction-scheduler-arm64.cc
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 
7 namespace v8 {
8 namespace internal {
9 namespace compiler {
10 
11 bool InstructionScheduler::SchedulerSupported() { return true; }
12 
13 int 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 kArm64Tst:
29  case kArm64Tst32:
30  case kArm64Or:
31  case kArm64Or32:
32  case kArm64Orn:
33  case kArm64Orn32:
34  case kArm64Eor:
35  case kArm64Eor32:
36  case kArm64Eon:
37  case kArm64Eon32:
38  case kArm64Sub:
39  case kArm64Sub32:
40  case kArm64Mul:
41  case kArm64Mul32:
42  case kArm64Smull:
43  case kArm64Umull:
44  case kArm64Madd:
45  case kArm64Madd32:
46  case kArm64Msub:
47  case kArm64Msub32:
48  case kArm64Mneg:
49  case kArm64Mneg32:
50  case kArm64Idiv:
51  case kArm64Idiv32:
52  case kArm64Udiv:
53  case kArm64Udiv32:
54  case kArm64Imod:
55  case kArm64Imod32:
56  case kArm64Umod:
57  case kArm64Umod32:
58  case kArm64Not:
59  case kArm64Not32:
60  case kArm64Lsl:
61  case kArm64Lsl32:
62  case kArm64Lsr:
63  case kArm64Lsr32:
64  case kArm64Asr:
65  case kArm64Asr32:
66  case kArm64Ror:
67  case kArm64Ror32:
68  case kArm64Mov32:
69  case kArm64Sxtb:
70  case kArm64Sxtb32:
71  case kArm64Sxth:
72  case kArm64Sxth32:
73  case kArm64Sxtw:
74  case kArm64Sbfx32:
75  case kArm64Ubfx:
76  case kArm64Ubfx32:
77  case kArm64Ubfiz32:
78  case kArm64Bfi:
79  case kArm64Rbit:
80  case kArm64Rbit32:
81  case kArm64Rev:
82  case kArm64Rev32:
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:
143  case kArm64F32x4Abs:
144  case kArm64F32x4Neg:
145  case kArm64F32x4RecipApprox:
146  case kArm64F32x4RecipSqrtApprox:
147  case kArm64F32x4Add:
148  case kArm64F32x4AddHoriz:
149  case kArm64F32x4Sub:
150  case kArm64F32x4Mul:
151  case kArm64F32x4Min:
152  case kArm64F32x4Max:
153  case kArm64F32x4Eq:
154  case kArm64F32x4Ne:
155  case kArm64F32x4Lt:
156  case kArm64F32x4Le:
157  case kArm64I32x4Splat:
158  case kArm64I32x4ExtractLane:
159  case kArm64I32x4ReplaceLane:
160  case kArm64I32x4SConvertF32x4:
161  case kArm64I32x4SConvertI16x8Low:
162  case kArm64I32x4SConvertI16x8High:
163  case kArm64I32x4Neg:
164  case kArm64I32x4Shl:
165  case kArm64I32x4ShrS:
166  case kArm64I32x4Add:
167  case kArm64I32x4AddHoriz:
168  case kArm64I32x4Sub:
169  case kArm64I32x4Mul:
170  case kArm64I32x4MinS:
171  case kArm64I32x4MaxS:
172  case kArm64I32x4Eq:
173  case kArm64I32x4Ne:
174  case kArm64I32x4GtS:
175  case kArm64I32x4GeS:
176  case kArm64I32x4UConvertF32x4:
177  case kArm64I32x4UConvertI16x8Low:
178  case kArm64I32x4UConvertI16x8High:
179  case kArm64I32x4ShrU:
180  case kArm64I32x4MinU:
181  case kArm64I32x4MaxU:
182  case kArm64I32x4GtU:
183  case kArm64I32x4GeU:
184  case kArm64I16x8Splat:
185  case kArm64I16x8ExtractLane:
186  case kArm64I16x8ReplaceLane:
187  case kArm64I16x8SConvertI8x16Low:
188  case kArm64I16x8SConvertI8x16High:
189  case kArm64I16x8Neg:
190  case kArm64I16x8Shl:
191  case kArm64I16x8ShrS:
192  case kArm64I16x8SConvertI32x4:
193  case kArm64I16x8Add:
194  case kArm64I16x8AddSaturateS:
195  case kArm64I16x8AddHoriz:
196  case kArm64I16x8Sub:
197  case kArm64I16x8SubSaturateS:
198  case kArm64I16x8Mul:
199  case kArm64I16x8MinS:
200  case kArm64I16x8MaxS:
201  case kArm64I16x8Eq:
202  case kArm64I16x8Ne:
203  case kArm64I16x8GtS:
204  case kArm64I16x8GeS:
205  case kArm64I16x8UConvertI8x16Low:
206  case kArm64I16x8UConvertI8x16High:
207  case kArm64I16x8ShrU:
208  case kArm64I16x8UConvertI32x4:
209  case kArm64I16x8AddSaturateU:
210  case kArm64I16x8SubSaturateU:
211  case kArm64I16x8MinU:
212  case kArm64I16x8MaxU:
213  case kArm64I16x8GtU:
214  case kArm64I16x8GeU:
215  case kArm64I8x16Splat:
216  case kArm64I8x16ExtractLane:
217  case kArm64I8x16ReplaceLane:
218  case kArm64I8x16Neg:
219  case kArm64I8x16Shl:
220  case kArm64I8x16ShrS:
221  case kArm64I8x16SConvertI16x8:
222  case kArm64I8x16Add:
223  case kArm64I8x16AddSaturateS:
224  case kArm64I8x16Sub:
225  case kArm64I8x16SubSaturateS:
226  case kArm64I8x16Mul:
227  case kArm64I8x16MinS:
228  case kArm64I8x16MaxS:
229  case kArm64I8x16Eq:
230  case kArm64I8x16Ne:
231  case kArm64I8x16GtS:
232  case kArm64I8x16GeS:
233  case kArm64I8x16UConvertI16x8:
234  case kArm64I8x16AddSaturateU:
235  case kArm64I8x16SubSaturateU:
236  case kArm64I8x16ShrU:
237  case kArm64I8x16MinU:
238  case kArm64I8x16MaxU:
239  case kArm64I8x16GtU:
240  case kArm64I8x16GeU:
241  case kArm64S128Zero:
242  case kArm64S128Dup:
243  case kArm64S128And:
244  case kArm64S128Or:
245  case kArm64S128Xor:
246  case kArm64S128Not:
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;
286 
287  case kArm64LdrS:
288  case kArm64LdrD:
289  case kArm64LdrQ:
290  case kArm64Ldrb:
291  case kArm64Ldrsb:
292  case kArm64Ldrh:
293  case kArm64Ldrsh:
294  case kArm64Ldrsw:
295  case kArm64LdrW:
296  case kArm64Ldr:
297  case kArm64Peek:
298  return kIsLoadOperation;
299 
300  case kArm64Claim:
301  case kArm64Poke:
302  case kArm64PokePair:
303  case kArm64StrS:
304  case kArm64StrD:
305  case kArm64StrQ:
306  case kArm64Strb:
307  case kArm64Strh:
308  case kArm64StrW:
309  case kArm64Str:
310  case kArm64DsbIsb:
311  return kHasSideEffect;
312 
313  case kArm64Word64AtomicLoadUint8:
314  case kArm64Word64AtomicLoadUint16:
315  case kArm64Word64AtomicLoadUint32:
316  case kArm64Word64AtomicLoadUint64:
317  return kIsLoadOperation;
318 
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;
352 
353 #define CASE(Name) case k##Name:
354  COMMON_ARCH_OPCODE_LIST(CASE)
355 #undef CASE
356  // Already covered in architecture independent code.
357  UNREACHABLE();
358  }
359 
360  UNREACHABLE();
361 }
362 
363 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
364  // Basic latency modeling for arm64 instructions. They have been determined
365  // in an empirical way.
366  switch (instr->arch_opcode()) {
367  case kArm64Add:
368  case kArm64Add32:
369  case kArm64And:
370  case kArm64And32:
371  case kArm64Bic:
372  case kArm64Bic32:
373  case kArm64Cmn:
374  case kArm64Cmn32:
375  case kArm64Cmp:
376  case kArm64Cmp32:
377  case kArm64Eon:
378  case kArm64Eon32:
379  case kArm64Eor:
380  case kArm64Eor32:
381  case kArm64Not:
382  case kArm64Not32:
383  case kArm64Or:
384  case kArm64Or32:
385  case kArm64Orn:
386  case kArm64Orn32:
387  case kArm64Sub:
388  case kArm64Sub32:
389  case kArm64Tst:
390  case kArm64Tst32:
391  if (instr->addressing_mode() != kMode_None) {
392  return 3;
393  } else {
394  return 1;
395  }
396 
397  case kArm64Clz:
398  case kArm64Clz32:
399  case kArm64Sbfx32:
400  case kArm64Sxtb32:
401  case kArm64Sxth32:
402  case kArm64Sxtw:
403  case kArm64Ubfiz32:
404  case kArm64Ubfx:
405  case kArm64Ubfx32:
406  return 1;
407 
408  case kArm64Lsl:
409  case kArm64Lsl32:
410  case kArm64Lsr:
411  case kArm64Lsr32:
412  case kArm64Asr:
413  case kArm64Asr32:
414  case kArm64Ror:
415  case kArm64Ror32:
416  return 1;
417 
418  case kArm64Ldr:
419  case kArm64LdrD:
420  case kArm64LdrS:
421  case kArm64LdrW:
422  case kArm64Ldrb:
423  case kArm64Ldrh:
424  case kArm64Ldrsb:
425  case kArm64Ldrsh:
426  case kArm64Ldrsw:
427  return 11;
428 
429  case kArm64Str:
430  case kArm64StrD:
431  case kArm64StrS:
432  case kArm64StrW:
433  case kArm64Strb:
434  case kArm64Strh:
435  return 1;
436 
437  case kArm64Madd32:
438  case kArm64Mneg32:
439  case kArm64Msub32:
440  case kArm64Mul32:
441  return 3;
442 
443  case kArm64Madd:
444  case kArm64Mneg:
445  case kArm64Msub:
446  case kArm64Mul:
447  return 5;
448 
449  case kArm64Idiv32:
450  case kArm64Udiv32:
451  return 12;
452 
453  case kArm64Idiv:
454  case kArm64Udiv:
455  return 20;
456 
457  case kArm64Float32Add:
458  case kArm64Float32Sub:
459  case kArm64Float64Add:
460  case kArm64Float64Sub:
461  return 5;
462 
463  case kArm64Float32Abs:
464  case kArm64Float32Cmp:
465  case kArm64Float32Neg:
466  case kArm64Float64Abs:
467  case kArm64Float64Cmp:
468  case kArm64Float64Neg:
469  return 3;
470 
471  case kArm64Float32Div:
472  case kArm64Float32Sqrt:
473  return 12;
474 
475  case kArm64Float64Div:
476  case kArm64Float64Sqrt:
477  return 19;
478 
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:
488  return 5;
489 
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:
504  return 5;
505 
506  default:
507  return 2;
508  }
509 }
510 
511 } // namespace compiler
512 } // namespace internal
513 } // namespace v8
Definition: libplatform.h:13