V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
instruction-scheduler-ia32.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 kIA32Add:
17  case kIA32And:
18  case kIA32Cmp:
19  case kIA32Cmp16:
20  case kIA32Cmp8:
21  case kIA32Test:
22  case kIA32Test16:
23  case kIA32Test8:
24  case kIA32Or:
25  case kIA32Xor:
26  case kIA32Sub:
27  case kIA32Imul:
28  case kIA32ImulHigh:
29  case kIA32UmulHigh:
30  case kIA32Not:
31  case kIA32Neg:
32  case kIA32Shl:
33  case kIA32Shr:
34  case kIA32Sar:
35  case kIA32AddPair:
36  case kIA32SubPair:
37  case kIA32MulPair:
38  case kIA32ShlPair:
39  case kIA32ShrPair:
40  case kIA32SarPair:
41  case kIA32Ror:
42  case kIA32Lzcnt:
43  case kIA32Tzcnt:
44  case kIA32Popcnt:
45  case kIA32Bswap:
46  case kIA32Lea:
47  case kSSEFloat32Cmp:
48  case kSSEFloat32Add:
49  case kSSEFloat32Sub:
50  case kSSEFloat32Mul:
51  case kSSEFloat32Div:
52  case kSSEFloat32Abs:
53  case kSSEFloat32Neg:
54  case kSSEFloat32Sqrt:
55  case kSSEFloat32Round:
56  case kSSEFloat64Cmp:
57  case kSSEFloat64Add:
58  case kSSEFloat64Sub:
59  case kSSEFloat64Mul:
60  case kSSEFloat64Div:
61  case kSSEFloat64Mod:
62  case kSSEFloat32Max:
63  case kSSEFloat64Max:
64  case kSSEFloat32Min:
65  case kSSEFloat64Min:
66  case kSSEFloat64Abs:
67  case kSSEFloat64Neg:
68  case kSSEFloat64Sqrt:
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:
86  case kAVXFloat32Add:
87  case kAVXFloat32Sub:
88  case kAVXFloat32Mul:
89  case kAVXFloat32Div:
90  case kAVXFloat64Add:
91  case kAVXFloat64Sub:
92  case kAVXFloat64Mul:
93  case kAVXFloat64Div:
94  case kAVXFloat64Abs:
95  case kAVXFloat64Neg:
96  case kAVXFloat32Abs:
97  case kAVXFloat32Neg:
98  case kIA32BitcastFI:
99  case kIA32BitcastIF:
100  case kSSEF32x4Splat:
101  case kAVXF32x4Splat:
102  case kSSEF32x4ExtractLane:
103  case kAVXF32x4ExtractLane:
104  case kSSEF32x4ReplaceLane:
105  case kAVXF32x4ReplaceLane:
106  case kIA32F32x4SConvertI32x4:
107  case kSSEF32x4UConvertI32x4:
108  case kAVXF32x4UConvertI32x4:
109  case kSSEF32x4Abs:
110  case kAVXF32x4Abs:
111  case kSSEF32x4Neg:
112  case kAVXF32x4Neg:
113  case kIA32F32x4RecipApprox:
114  case kIA32F32x4RecipSqrtApprox:
115  case kSSEF32x4Add:
116  case kAVXF32x4Add:
117  case kSSEF32x4AddHoriz:
118  case kAVXF32x4AddHoriz:
119  case kSSEF32x4Sub:
120  case kAVXF32x4Sub:
121  case kSSEF32x4Mul:
122  case kAVXF32x4Mul:
123  case kSSEF32x4Min:
124  case kAVXF32x4Min:
125  case kSSEF32x4Max:
126  case kAVXF32x4Max:
127  case kSSEF32x4Eq:
128  case kAVXF32x4Eq:
129  case kSSEF32x4Ne:
130  case kAVXF32x4Ne:
131  case kSSEF32x4Lt:
132  case kAVXF32x4Lt:
133  case kSSEF32x4Le:
134  case kAVXF32x4Le:
135  case kIA32I32x4Splat:
136  case kIA32I32x4ExtractLane:
137  case kSSEI32x4ReplaceLane:
138  case kAVXI32x4ReplaceLane:
139  case kSSEI32x4SConvertF32x4:
140  case kAVXI32x4SConvertF32x4:
141  case kIA32I32x4SConvertI16x8Low:
142  case kIA32I32x4SConvertI16x8High:
143  case kIA32I32x4Neg:
144  case kSSEI32x4Shl:
145  case kAVXI32x4Shl:
146  case kSSEI32x4ShrS:
147  case kAVXI32x4ShrS:
148  case kSSEI32x4Add:
149  case kAVXI32x4Add:
150  case kSSEI32x4AddHoriz:
151  case kAVXI32x4AddHoriz:
152  case kSSEI32x4Sub:
153  case kAVXI32x4Sub:
154  case kSSEI32x4Mul:
155  case kAVXI32x4Mul:
156  case kSSEI32x4MinS:
157  case kAVXI32x4MinS:
158  case kSSEI32x4MaxS:
159  case kAVXI32x4MaxS:
160  case kSSEI32x4Eq:
161  case kAVXI32x4Eq:
162  case kSSEI32x4Ne:
163  case kAVXI32x4Ne:
164  case kSSEI32x4GtS:
165  case kAVXI32x4GtS:
166  case kSSEI32x4GeS:
167  case kAVXI32x4GeS:
168  case kSSEI32x4UConvertF32x4:
169  case kAVXI32x4UConvertF32x4:
170  case kIA32I32x4UConvertI16x8Low:
171  case kIA32I32x4UConvertI16x8High:
172  case kSSEI32x4ShrU:
173  case kAVXI32x4ShrU:
174  case kSSEI32x4MinU:
175  case kAVXI32x4MinU:
176  case kSSEI32x4MaxU:
177  case kAVXI32x4MaxU:
178  case kSSEI32x4GtU:
179  case kAVXI32x4GtU:
180  case kSSEI32x4GeU:
181  case kAVXI32x4GeU:
182  case kIA32I16x8Splat:
183  case kIA32I16x8ExtractLane:
184  case kSSEI16x8ReplaceLane:
185  case kAVXI16x8ReplaceLane:
186  case kIA32I16x8SConvertI8x16Low:
187  case kIA32I16x8SConvertI8x16High:
188  case kIA32I16x8Neg:
189  case kSSEI16x8Shl:
190  case kAVXI16x8Shl:
191  case kSSEI16x8ShrS:
192  case kAVXI16x8ShrS:
193  case kSSEI16x8SConvertI32x4:
194  case kAVXI16x8SConvertI32x4:
195  case kSSEI16x8Add:
196  case kAVXI16x8Add:
197  case kSSEI16x8AddSaturateS:
198  case kAVXI16x8AddSaturateS:
199  case kSSEI16x8AddHoriz:
200  case kAVXI16x8AddHoriz:
201  case kSSEI16x8Sub:
202  case kAVXI16x8Sub:
203  case kSSEI16x8SubSaturateS:
204  case kAVXI16x8SubSaturateS:
205  case kSSEI16x8Mul:
206  case kAVXI16x8Mul:
207  case kSSEI16x8MinS:
208  case kAVXI16x8MinS:
209  case kSSEI16x8MaxS:
210  case kAVXI16x8MaxS:
211  case kSSEI16x8Eq:
212  case kAVXI16x8Eq:
213  case kSSEI16x8Ne:
214  case kAVXI16x8Ne:
215  case kSSEI16x8GtS:
216  case kAVXI16x8GtS:
217  case kSSEI16x8GeS:
218  case kAVXI16x8GeS:
219  case kIA32I16x8UConvertI8x16Low:
220  case kIA32I16x8UConvertI8x16High:
221  case kSSEI16x8ShrU:
222  case kAVXI16x8ShrU:
223  case kSSEI16x8UConvertI32x4:
224  case kAVXI16x8UConvertI32x4:
225  case kSSEI16x8AddSaturateU:
226  case kAVXI16x8AddSaturateU:
227  case kSSEI16x8SubSaturateU:
228  case kAVXI16x8SubSaturateU:
229  case kSSEI16x8MinU:
230  case kAVXI16x8MinU:
231  case kSSEI16x8MaxU:
232  case kAVXI16x8MaxU:
233  case kSSEI16x8GtU:
234  case kAVXI16x8GtU:
235  case kSSEI16x8GeU:
236  case kAVXI16x8GeU:
237  case kIA32I8x16Splat:
238  case kIA32I8x16ExtractLane:
239  case kSSEI8x16ReplaceLane:
240  case kAVXI8x16ReplaceLane:
241  case kSSEI8x16SConvertI16x8:
242  case kAVXI8x16SConvertI16x8:
243  case kIA32I8x16Neg:
244  case kSSEI8x16Shl:
245  case kAVXI8x16Shl:
246  case kIA32I8x16ShrS:
247  case kSSEI8x16Add:
248  case kAVXI8x16Add:
249  case kSSEI8x16AddSaturateS:
250  case kAVXI8x16AddSaturateS:
251  case kSSEI8x16Sub:
252  case kAVXI8x16Sub:
253  case kSSEI8x16SubSaturateS:
254  case kAVXI8x16SubSaturateS:
255  case kSSEI8x16Mul:
256  case kAVXI8x16Mul:
257  case kSSEI8x16MinS:
258  case kAVXI8x16MinS:
259  case kSSEI8x16MaxS:
260  case kAVXI8x16MaxS:
261  case kSSEI8x16Eq:
262  case kAVXI8x16Eq:
263  case kSSEI8x16Ne:
264  case kAVXI8x16Ne:
265  case kSSEI8x16GtS:
266  case kAVXI8x16GtS:
267  case kSSEI8x16GeS:
268  case kAVXI8x16GeS:
269  case kSSEI8x16UConvertI16x8:
270  case kAVXI8x16UConvertI16x8:
271  case kSSEI8x16AddSaturateU:
272  case kAVXI8x16AddSaturateU:
273  case kSSEI8x16SubSaturateU:
274  case kAVXI8x16SubSaturateU:
275  case kIA32I8x16ShrU:
276  case kSSEI8x16MinU:
277  case kAVXI8x16MinU:
278  case kSSEI8x16MaxU:
279  case kAVXI8x16MaxU:
280  case kSSEI8x16GtU:
281  case kAVXI8x16GtU:
282  case kSSEI8x16GeU:
283  case kAVXI8x16GeU:
284  case kIA32S128Zero:
285  case kSSES128Not:
286  case kAVXS128Not:
287  case kSSES128And:
288  case kAVXS128And:
289  case kSSES128Or:
290  case kAVXS128Or:
291  case kSSES128Xor:
292  case kAVXS128Xor:
293  case kSSES128Select:
294  case kAVXS128Select:
295  case kIA32S8x16Shuffle:
296  case kIA32S32x4Swizzle:
297  case kIA32S32x4Shuffle:
298  case kIA32S16x8Blend:
299  case kIA32S16x8HalfShuffle1:
300  case kIA32S16x8HalfShuffle2:
301  case kIA32S8x16Alignr:
302  case kIA32S16x8Dup:
303  case kIA32S8x16Dup:
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)
337  ? kNoOpcodeFlags
338  : kIsLoadOperation | kHasSideEffect;
339 
340  case kIA32Idiv:
341  case kIA32Udiv:
342  return (instr->addressing_mode() == kMode_None)
343  ? kMayNeedDeoptOrTrapCheck
344  : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect;
345 
346  case kIA32Movsxbl:
347  case kIA32Movzxbl:
348  case kIA32Movb:
349  case kIA32Movsxwl:
350  case kIA32Movzxwl:
351  case kIA32Movw:
352  case kIA32Movl:
353  case kIA32Movss:
354  case kIA32Movsd:
355  case kIA32Movdqu:
356  // Moves are used for memory load/store operations.
357  return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
358 
359  case kIA32StackCheck:
360  case kIA32Peek:
361  return kIsLoadOperation;
362 
363  case kIA32Push:
364  case kIA32PushFloat32:
365  case kIA32PushFloat64:
366  case kIA32PushSimd128:
367  case kIA32Poke:
368  case kLFence:
369  return kHasSideEffect;
370 
371  case kIA32Word32AtomicPairLoad:
372  return kIsLoadOperation;
373 
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;
383 
384 #define CASE(Name) case k##Name:
385  COMMON_ARCH_OPCODE_LIST(CASE)
386 #undef CASE
387  // Already covered in architecture independent code.
388  UNREACHABLE();
389  }
390 
391  UNREACHABLE();
392 }
393 
394 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
395  // Basic latency modeling for ia32 instructions. They have been determined
396  // in an empirical way.
397  switch (instr->arch_opcode()) {
398  case kSSEFloat64Mul:
399  return 5;
400  case kIA32Imul:
401  case kIA32ImulHigh:
402  return 5;
403  case kSSEFloat32Cmp:
404  case kSSEFloat64Cmp:
405  return 9;
406  case kSSEFloat32Add:
407  case kSSEFloat32Sub:
408  case kSSEFloat32Abs:
409  case kSSEFloat32Neg:
410  case kSSEFloat64Add:
411  case kSSEFloat64Sub:
412  case kSSEFloat64Max:
413  case kSSEFloat64Min:
414  case kSSEFloat64Abs:
415  case kSSEFloat64Neg:
416  return 5;
417  case kSSEFloat32Mul:
418  return 4;
419  case kSSEFloat32ToFloat64:
420  case kSSEFloat64ToFloat32:
421  return 6;
422  case kSSEFloat32Round:
423  case kSSEFloat64Round:
424  case kSSEFloat32ToInt32:
425  case kSSEFloat64ToInt32:
426  return 8;
427  case kSSEFloat32ToUint32:
428  return 21;
429  case kSSEFloat64ToUint32:
430  return 15;
431  case kIA32Idiv:
432  return 33;
433  case kIA32Udiv:
434  return 26;
435  case kSSEFloat32Div:
436  return 35;
437  case kSSEFloat64Div:
438  return 63;
439  case kSSEFloat32Sqrt:
440  case kSSEFloat64Sqrt:
441  return 25;
442  case kSSEFloat64Mod:
443  return 50;
444  case kArchTruncateDoubleToI:
445  return 9;
446  default:
447  return 1;
448  }
449 }
450 
451 } // namespace compiler
452 } // namespace internal
453 } // namespace v8
Definition: libplatform.h:13