V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
instruction-scheduler-x64.cc
1 // Copyright 2015 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 kX64Add:
17  case kX64Add32:
18  case kX64And:
19  case kX64And32:
20  case kX64Cmp:
21  case kX64Cmp32:
22  case kX64Cmp16:
23  case kX64Cmp8:
24  case kX64Test:
25  case kX64Test32:
26  case kX64Test16:
27  case kX64Test8:
28  case kX64Or:
29  case kX64Or32:
30  case kX64Xor:
31  case kX64Xor32:
32  case kX64Sub:
33  case kX64Sub32:
34  case kX64Imul:
35  case kX64Imul32:
36  case kX64ImulHigh32:
37  case kX64UmulHigh32:
38  case kX64Not:
39  case kX64Not32:
40  case kX64Neg:
41  case kX64Neg32:
42  case kX64Shl:
43  case kX64Shl32:
44  case kX64Shr:
45  case kX64Shr32:
46  case kX64Sar:
47  case kX64Sar32:
48  case kX64Ror:
49  case kX64Ror32:
50  case kX64Lzcnt:
51  case kX64Lzcnt32:
52  case kX64Tzcnt:
53  case kX64Tzcnt32:
54  case kX64Popcnt:
55  case kX64Popcnt32:
56  case kX64Bswap:
57  case kX64Bswap32:
58  case kSSEFloat32Cmp:
59  case kSSEFloat32Add:
60  case kSSEFloat32Sub:
61  case kSSEFloat32Mul:
62  case kSSEFloat32Div:
63  case kSSEFloat32Abs:
64  case kSSEFloat32Neg:
65  case kSSEFloat32Sqrt:
66  case kSSEFloat32Round:
67  case kSSEFloat32ToFloat64:
68  case kSSEFloat64Cmp:
69  case kSSEFloat64Add:
70  case kSSEFloat64Sub:
71  case kSSEFloat64Mul:
72  case kSSEFloat64Div:
73  case kSSEFloat64Mod:
74  case kSSEFloat64Abs:
75  case kSSEFloat64Neg:
76  case kSSEFloat64Sqrt:
77  case kSSEFloat64Round:
78  case kSSEFloat32Max:
79  case kSSEFloat64Max:
80  case kSSEFloat32Min:
81  case kSSEFloat64Min:
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:
105  case kAVXFloat32Cmp:
106  case kAVXFloat32Add:
107  case kAVXFloat32Sub:
108  case kAVXFloat32Mul:
109  case kAVXFloat32Div:
110  case kAVXFloat64Cmp:
111  case kAVXFloat64Add:
112  case kAVXFloat64Sub:
113  case kAVXFloat64Mul:
114  case kAVXFloat64Div:
115  case kAVXFloat64Abs:
116  case kAVXFloat64Neg:
117  case kAVXFloat32Abs:
118  case kAVXFloat32Neg:
119  case kX64BitcastFI:
120  case kX64BitcastDL:
121  case kX64BitcastIF:
122  case kX64BitcastLD:
123  case kX64Lea32:
124  case kX64Lea:
125  case kX64Dec32:
126  case kX64Inc32:
127  case kX64F32x4Splat:
128  case kX64F32x4ExtractLane:
129  case kX64F32x4ReplaceLane:
130  case kX64F32x4SConvertI32x4:
131  case kX64F32x4UConvertI32x4:
132  case kX64F32x4RecipApprox:
133  case kX64F32x4RecipSqrtApprox:
134  case kX64F32x4Abs:
135  case kX64F32x4Neg:
136  case kX64F32x4Add:
137  case kX64F32x4AddHoriz:
138  case kX64F32x4Sub:
139  case kX64F32x4Mul:
140  case kX64F32x4Min:
141  case kX64F32x4Max:
142  case kX64F32x4Eq:
143  case kX64F32x4Ne:
144  case kX64F32x4Lt:
145  case kX64F32x4Le:
146  case kX64I32x4Splat:
147  case kX64I32x4ExtractLane:
148  case kX64I32x4ReplaceLane:
149  case kX64I32x4SConvertF32x4:
150  case kX64I32x4SConvertI16x8Low:
151  case kX64I32x4SConvertI16x8High:
152  case kX64I32x4Neg:
153  case kX64I32x4Shl:
154  case kX64I32x4ShrS:
155  case kX64I32x4Add:
156  case kX64I32x4AddHoriz:
157  case kX64I32x4Sub:
158  case kX64I32x4Mul:
159  case kX64I32x4MinS:
160  case kX64I32x4MaxS:
161  case kX64I32x4Eq:
162  case kX64I32x4Ne:
163  case kX64I32x4GtS:
164  case kX64I32x4GeS:
165  case kX64I32x4UConvertF32x4:
166  case kX64I32x4UConvertI16x8Low:
167  case kX64I32x4UConvertI16x8High:
168  case kX64I32x4ShrU:
169  case kX64I32x4MinU:
170  case kX64I32x4MaxU:
171  case kX64I32x4GtU:
172  case kX64I32x4GeU:
173  case kX64I16x8Splat:
174  case kX64I16x8ExtractLane:
175  case kX64I16x8ReplaceLane:
176  case kX64I16x8SConvertI8x16Low:
177  case kX64I16x8SConvertI8x16High:
178  case kX64I16x8Neg:
179  case kX64I16x8Shl:
180  case kX64I16x8ShrS:
181  case kX64I16x8SConvertI32x4:
182  case kX64I16x8Add:
183  case kX64I16x8AddSaturateS:
184  case kX64I16x8AddHoriz:
185  case kX64I16x8Sub:
186  case kX64I16x8SubSaturateS:
187  case kX64I16x8Mul:
188  case kX64I16x8MinS:
189  case kX64I16x8MaxS:
190  case kX64I16x8Eq:
191  case kX64I16x8Ne:
192  case kX64I16x8GtS:
193  case kX64I16x8GeS:
194  case kX64I16x8UConvertI8x16Low:
195  case kX64I16x8UConvertI8x16High:
196  case kX64I16x8UConvertI32x4:
197  case kX64I16x8ShrU:
198  case kX64I16x8AddSaturateU:
199  case kX64I16x8SubSaturateU:
200  case kX64I16x8MinU:
201  case kX64I16x8MaxU:
202  case kX64I16x8GtU:
203  case kX64I16x8GeU:
204  case kX64I8x16Splat:
205  case kX64I8x16ExtractLane:
206  case kX64I8x16ReplaceLane:
207  case kX64I8x16SConvertI16x8:
208  case kX64I8x16Neg:
209  case kX64I8x16Shl:
210  case kX64I8x16ShrS:
211  case kX64I8x16Add:
212  case kX64I8x16AddSaturateS:
213  case kX64I8x16Sub:
214  case kX64I8x16SubSaturateS:
215  case kX64I8x16Mul:
216  case kX64I8x16MinS:
217  case kX64I8x16MaxS:
218  case kX64I8x16Eq:
219  case kX64I8x16Ne:
220  case kX64I8x16GtS:
221  case kX64I8x16GeS:
222  case kX64I8x16UConvertI16x8:
223  case kX64I8x16AddSaturateU:
224  case kX64I8x16SubSaturateU:
225  case kX64I8x16ShrU:
226  case kX64I8x16MinU:
227  case kX64I8x16MaxU:
228  case kX64I8x16GtU:
229  case kX64I8x16GeU:
230  case kX64S128And:
231  case kX64S128Or:
232  case kX64S128Xor:
233  case kX64S128Not:
234  case kX64S128Select:
235  case kX64S128Zero:
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)
243  ? kNoOpcodeFlags
244  : kIsLoadOperation | kHasSideEffect;
245 
246  case kX64Idiv:
247  case kX64Idiv32:
248  case kX64Udiv:
249  case kX64Udiv32:
250  return (instr->addressing_mode() == kMode_None)
251  ? kMayNeedDeoptOrTrapCheck
252  : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect;
253 
254  case kX64Movsxbl:
255  case kX64Movzxbl:
256  case kX64Movsxbq:
257  case kX64Movzxbq:
258  case kX64Movsxwl:
259  case kX64Movzxwl:
260  case kX64Movsxwq:
261  case kX64Movzxwq:
262  case kX64Movsxlq:
263  DCHECK_LE(1, instr->InputCount());
264  return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
265  : kIsLoadOperation;
266 
267  case kX64Movb:
268  case kX64Movw:
269  return kHasSideEffect;
270 
271  case kX64Movl:
272  if (instr->HasOutput()) {
273  DCHECK_LE(1, instr->InputCount());
274  return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
275  : kIsLoadOperation;
276  } else {
277  return kHasSideEffect;
278  }
279 
280  case kX64MovqDecompressTaggedSigned:
281  case kX64MovqDecompressTaggedPointer:
282  case kX64MovqDecompressAnyTagged:
283  case kX64Movq:
284  case kX64Movsd:
285  case kX64Movss:
286  case kX64Movdqu:
287  return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
288 
289  case kX64StackCheck:
290  case kX64Peek:
291  return kIsLoadOperation;
292 
293  case kX64Push:
294  case kX64Poke:
295  return kHasSideEffect;
296 
297  case kLFence:
298  return kHasSideEffect;
299 
300  case kX64Word64AtomicLoadUint8:
301  case kX64Word64AtomicLoadUint16:
302  case kX64Word64AtomicLoadUint32:
303  case kX64Word64AtomicLoadUint64:
304  return kIsLoadOperation;
305 
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;
339 
340 #define CASE(Name) case k##Name:
341  COMMON_ARCH_OPCODE_LIST(CASE)
342 #undef CASE
343  // Already covered in architecture independent code.
344  UNREACHABLE();
345  }
346 
347  UNREACHABLE();
348 }
349 
350 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
351  // Basic latency modeling for x64 instructions. They have been determined
352  // in an empirical way.
353  switch (instr->arch_opcode()) {
354  case kSSEFloat64Mul:
355  return 5;
356  case kX64Imul:
357  case kX64Imul32:
358  case kX64ImulHigh32:
359  case kX64UmulHigh32:
360  case kSSEFloat32Cmp:
361  case kSSEFloat32Add:
362  case kSSEFloat32Sub:
363  case kSSEFloat32Abs:
364  case kSSEFloat32Neg:
365  case kSSEFloat64Cmp:
366  case kSSEFloat64Add:
367  case kSSEFloat64Sub:
368  case kSSEFloat64Max:
369  case kSSEFloat64Min:
370  case kSSEFloat64Abs:
371  case kSSEFloat64Neg:
372  return 3;
373  case kSSEFloat32Mul:
374  case kSSEFloat32ToFloat64:
375  case kSSEFloat64ToFloat32:
376  case kSSEFloat32Round:
377  case kSSEFloat64Round:
378  case kSSEFloat32ToInt32:
379  case kSSEFloat32ToUint32:
380  case kSSEFloat64ToInt32:
381  case kSSEFloat64ToUint32:
382  return 4;
383  case kX64Idiv:
384  return 49;
385  case kX64Idiv32:
386  return 35;
387  case kX64Udiv:
388  return 38;
389  case kX64Udiv32:
390  return 26;
391  case kSSEFloat32Div:
392  case kSSEFloat64Div:
393  case kSSEFloat32Sqrt:
394  case kSSEFloat64Sqrt:
395  return 13;
396  case kSSEFloat32ToInt64:
397  case kSSEFloat64ToInt64:
398  case kSSEFloat32ToUint64:
399  case kSSEFloat64ToUint64:
400  return 10;
401  case kSSEFloat64Mod:
402  return 50;
403  case kArchTruncateDoubleToI:
404  return 6;
405  default:
406  return 1;
407  }
408 }
409 
410 } // namespace compiler
411 } // namespace internal
412 } // namespace v8
Definition: libplatform.h:13