• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SchedulerSupported()11 bool InstructionScheduler::SchedulerSupported() { return true; }
12 
GetTargetInstructionFlags(const Instruction * instr) const13 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 kIA32Rol:
42     case kIA32Ror:
43     case kIA32Lzcnt:
44     case kIA32Tzcnt:
45     case kIA32Popcnt:
46     case kIA32Bswap:
47     case kIA32Lea:
48     case kSSEFloat32Cmp:
49     case kSSEFloat32Add:
50     case kSSEFloat32Sub:
51     case kSSEFloat32Mul:
52     case kSSEFloat32Div:
53     case kSSEFloat32Abs:
54     case kSSEFloat32Neg:
55     case kSSEFloat32Sqrt:
56     case kSSEFloat32Round:
57     case kSSEFloat64Cmp:
58     case kSSEFloat64Add:
59     case kSSEFloat64Sub:
60     case kSSEFloat64Mul:
61     case kSSEFloat64Div:
62     case kSSEFloat64Mod:
63     case kSSEFloat32Max:
64     case kSSEFloat64Max:
65     case kSSEFloat32Min:
66     case kSSEFloat64Min:
67     case kSSEFloat64Abs:
68     case kSSEFloat64Neg:
69     case kSSEFloat64Sqrt:
70     case kSSEFloat64Round:
71     case kSSEFloat32ToFloat64:
72     case kSSEFloat64ToFloat32:
73     case kSSEFloat32ToInt32:
74     case kSSEFloat32ToUint32:
75     case kSSEFloat64ToInt32:
76     case kSSEFloat64ToUint32:
77     case kSSEInt32ToFloat32:
78     case kSSEUint32ToFloat32:
79     case kSSEInt32ToFloat64:
80     case kSSEUint32ToFloat64:
81     case kSSEFloat64ExtractLowWord32:
82     case kSSEFloat64ExtractHighWord32:
83     case kSSEFloat64InsertLowWord32:
84     case kSSEFloat64InsertHighWord32:
85     case kSSEFloat64LoadLowWord32:
86     case kSSEFloat64SilenceNaN:
87     case kAVXFloat32Add:
88     case kAVXFloat32Sub:
89     case kAVXFloat32Mul:
90     case kAVXFloat32Div:
91     case kAVXFloat64Add:
92     case kAVXFloat64Sub:
93     case kAVXFloat64Mul:
94     case kAVXFloat64Div:
95     case kAVXFloat64Abs:
96     case kAVXFloat64Neg:
97     case kAVXFloat32Abs:
98     case kAVXFloat32Neg:
99     case kIA32BitcastFI:
100     case kIA32BitcastIF:
101     case kSSEF64x2Splat:
102     case kAVXF64x2Splat:
103     case kSSEF64x2ExtractLane:
104     case kAVXF64x2ExtractLane:
105     case kSSEF64x2ReplaceLane:
106     case kAVXF64x2ReplaceLane:
107     case kIA32F64x2Sqrt:
108     case kIA32F64x2Add:
109     case kIA32F64x2Sub:
110     case kIA32F64x2Mul:
111     case kIA32F64x2Div:
112     case kIA32F64x2Min:
113     case kIA32F64x2Max:
114     case kIA32F64x2Eq:
115     case kIA32F64x2Ne:
116     case kIA32F64x2Lt:
117     case kIA32F64x2Le:
118     case kIA32F64x2Pmin:
119     case kIA32F64x2Pmax:
120     case kIA32F64x2Round:
121     case kIA32I64x2SplatI32Pair:
122     case kIA32I64x2ReplaceLaneI32Pair:
123     case kIA32I64x2Neg:
124     case kIA32I64x2Shl:
125     case kIA32I64x2ShrS:
126     case kIA32I64x2Add:
127     case kIA32I64x2Sub:
128     case kIA32I64x2Mul:
129     case kIA32I64x2ShrU:
130     case kSSEF32x4Splat:
131     case kAVXF32x4Splat:
132     case kSSEF32x4ExtractLane:
133     case kAVXF32x4ExtractLane:
134     case kSSEF32x4ReplaceLane:
135     case kAVXF32x4ReplaceLane:
136     case kIA32F32x4SConvertI32x4:
137     case kSSEF32x4UConvertI32x4:
138     case kAVXF32x4UConvertI32x4:
139     case kSSEF32x4Abs:
140     case kAVXF32x4Abs:
141     case kSSEF32x4Neg:
142     case kAVXF32x4Neg:
143     case kSSEF32x4Sqrt:
144     case kAVXF32x4Sqrt:
145     case kIA32F32x4RecipApprox:
146     case kIA32F32x4RecipSqrtApprox:
147     case kSSEF32x4Add:
148     case kAVXF32x4Add:
149     case kSSEF32x4AddHoriz:
150     case kAVXF32x4AddHoriz:
151     case kSSEF32x4Sub:
152     case kAVXF32x4Sub:
153     case kSSEF32x4Mul:
154     case kAVXF32x4Mul:
155     case kSSEF32x4Div:
156     case kAVXF32x4Div:
157     case kSSEF32x4Min:
158     case kAVXF32x4Min:
159     case kSSEF32x4Max:
160     case kAVXF32x4Max:
161     case kSSEF32x4Eq:
162     case kAVXF32x4Eq:
163     case kSSEF32x4Ne:
164     case kAVXF32x4Ne:
165     case kSSEF32x4Lt:
166     case kAVXF32x4Lt:
167     case kSSEF32x4Le:
168     case kAVXF32x4Le:
169     case kIA32F32x4Pmin:
170     case kIA32F32x4Pmax:
171     case kIA32F32x4Round:
172     case kIA32I32x4Splat:
173     case kIA32I32x4ExtractLane:
174     case kSSEI32x4ReplaceLane:
175     case kAVXI32x4ReplaceLane:
176     case kSSEI32x4SConvertF32x4:
177     case kAVXI32x4SConvertF32x4:
178     case kIA32I32x4SConvertI16x8Low:
179     case kIA32I32x4SConvertI16x8High:
180     case kIA32I32x4Neg:
181     case kIA32I32x4Shl:
182     case kIA32I32x4ShrS:
183     case kSSEI32x4Add:
184     case kAVXI32x4Add:
185     case kSSEI32x4AddHoriz:
186     case kAVXI32x4AddHoriz:
187     case kSSEI32x4Sub:
188     case kAVXI32x4Sub:
189     case kSSEI32x4Mul:
190     case kAVXI32x4Mul:
191     case kSSEI32x4MinS:
192     case kAVXI32x4MinS:
193     case kSSEI32x4MaxS:
194     case kAVXI32x4MaxS:
195     case kSSEI32x4Eq:
196     case kAVXI32x4Eq:
197     case kSSEI32x4Ne:
198     case kAVXI32x4Ne:
199     case kSSEI32x4GtS:
200     case kAVXI32x4GtS:
201     case kSSEI32x4GeS:
202     case kAVXI32x4GeS:
203     case kSSEI32x4UConvertF32x4:
204     case kAVXI32x4UConvertF32x4:
205     case kIA32I32x4UConvertI16x8Low:
206     case kIA32I32x4UConvertI16x8High:
207     case kIA32I32x4ShrU:
208     case kSSEI32x4MinU:
209     case kAVXI32x4MinU:
210     case kSSEI32x4MaxU:
211     case kAVXI32x4MaxU:
212     case kSSEI32x4GtU:
213     case kAVXI32x4GtU:
214     case kSSEI32x4GeU:
215     case kAVXI32x4GeU:
216     case kIA32I32x4Abs:
217     case kIA32I32x4BitMask:
218     case kIA32I32x4DotI16x8S:
219     case kIA32I16x8Splat:
220     case kIA32I16x8ExtractLaneU:
221     case kIA32I16x8ExtractLaneS:
222     case kSSEI16x8ReplaceLane:
223     case kAVXI16x8ReplaceLane:
224     case kIA32I16x8SConvertI8x16Low:
225     case kIA32I16x8SConvertI8x16High:
226     case kIA32I16x8Neg:
227     case kIA32I16x8Shl:
228     case kIA32I16x8ShrS:
229     case kSSEI16x8SConvertI32x4:
230     case kAVXI16x8SConvertI32x4:
231     case kSSEI16x8Add:
232     case kAVXI16x8Add:
233     case kSSEI16x8AddSatS:
234     case kAVXI16x8AddSatS:
235     case kSSEI16x8AddHoriz:
236     case kAVXI16x8AddHoriz:
237     case kSSEI16x8Sub:
238     case kAVXI16x8Sub:
239     case kSSEI16x8SubSatS:
240     case kAVXI16x8SubSatS:
241     case kSSEI16x8Mul:
242     case kAVXI16x8Mul:
243     case kSSEI16x8MinS:
244     case kAVXI16x8MinS:
245     case kSSEI16x8MaxS:
246     case kAVXI16x8MaxS:
247     case kSSEI16x8Eq:
248     case kAVXI16x8Eq:
249     case kSSEI16x8Ne:
250     case kAVXI16x8Ne:
251     case kSSEI16x8GtS:
252     case kAVXI16x8GtS:
253     case kSSEI16x8GeS:
254     case kAVXI16x8GeS:
255     case kIA32I16x8UConvertI8x16Low:
256     case kIA32I16x8UConvertI8x16High:
257     case kIA32I16x8ShrU:
258     case kSSEI16x8UConvertI32x4:
259     case kAVXI16x8UConvertI32x4:
260     case kSSEI16x8AddSatU:
261     case kAVXI16x8AddSatU:
262     case kSSEI16x8SubSatU:
263     case kAVXI16x8SubSatU:
264     case kSSEI16x8MinU:
265     case kAVXI16x8MinU:
266     case kSSEI16x8MaxU:
267     case kAVXI16x8MaxU:
268     case kSSEI16x8GtU:
269     case kAVXI16x8GtU:
270     case kSSEI16x8GeU:
271     case kAVXI16x8GeU:
272     case kIA32I16x8RoundingAverageU:
273     case kIA32I16x8Abs:
274     case kIA32I16x8BitMask:
275     case kIA32I8x16Splat:
276     case kIA32I8x16ExtractLaneU:
277     case kIA32I8x16ExtractLaneS:
278     case kSSEI8x16ReplaceLane:
279     case kAVXI8x16ReplaceLane:
280     case kSSEI8x16SConvertI16x8:
281     case kAVXI8x16SConvertI16x8:
282     case kIA32I8x16Neg:
283     case kIA32I8x16Shl:
284     case kIA32I8x16ShrS:
285     case kSSEI8x16Add:
286     case kAVXI8x16Add:
287     case kSSEI8x16AddSatS:
288     case kAVXI8x16AddSatS:
289     case kSSEI8x16Sub:
290     case kAVXI8x16Sub:
291     case kSSEI8x16SubSatS:
292     case kAVXI8x16SubSatS:
293     case kSSEI8x16Mul:
294     case kAVXI8x16Mul:
295     case kSSEI8x16MinS:
296     case kAVXI8x16MinS:
297     case kSSEI8x16MaxS:
298     case kAVXI8x16MaxS:
299     case kSSEI8x16Eq:
300     case kAVXI8x16Eq:
301     case kSSEI8x16Ne:
302     case kAVXI8x16Ne:
303     case kSSEI8x16GtS:
304     case kAVXI8x16GtS:
305     case kSSEI8x16GeS:
306     case kAVXI8x16GeS:
307     case kSSEI8x16UConvertI16x8:
308     case kAVXI8x16UConvertI16x8:
309     case kSSEI8x16AddSatU:
310     case kAVXI8x16AddSatU:
311     case kSSEI8x16SubSatU:
312     case kAVXI8x16SubSatU:
313     case kIA32I8x16ShrU:
314     case kSSEI8x16MinU:
315     case kAVXI8x16MinU:
316     case kSSEI8x16MaxU:
317     case kAVXI8x16MaxU:
318     case kSSEI8x16GtU:
319     case kAVXI8x16GtU:
320     case kSSEI8x16GeU:
321     case kAVXI8x16GeU:
322     case kIA32I8x16RoundingAverageU:
323     case kIA32I8x16Abs:
324     case kIA32I8x16BitMask:
325     case kIA32S128Const:
326     case kIA32S128Zero:
327     case kIA32S128AllOnes:
328     case kSSES128Not:
329     case kAVXS128Not:
330     case kSSES128And:
331     case kAVXS128And:
332     case kSSES128Or:
333     case kAVXS128Or:
334     case kSSES128Xor:
335     case kAVXS128Xor:
336     case kSSES128Select:
337     case kAVXS128Select:
338     case kIA32S128AndNot:
339     case kIA32I8x16Swizzle:
340     case kIA32I8x16Shuffle:
341     case kIA32S32x4Swizzle:
342     case kIA32S32x4Shuffle:
343     case kIA32S16x8Blend:
344     case kIA32S16x8HalfShuffle1:
345     case kIA32S16x8HalfShuffle2:
346     case kIA32S8x16Alignr:
347     case kIA32S16x8Dup:
348     case kIA32S8x16Dup:
349     case kSSES16x8UnzipHigh:
350     case kAVXS16x8UnzipHigh:
351     case kSSES16x8UnzipLow:
352     case kAVXS16x8UnzipLow:
353     case kSSES8x16UnzipHigh:
354     case kAVXS8x16UnzipHigh:
355     case kSSES8x16UnzipLow:
356     case kAVXS8x16UnzipLow:
357     case kIA32S64x2UnpackHigh:
358     case kIA32S32x4UnpackHigh:
359     case kIA32S16x8UnpackHigh:
360     case kIA32S8x16UnpackHigh:
361     case kIA32S64x2UnpackLow:
362     case kIA32S32x4UnpackLow:
363     case kIA32S16x8UnpackLow:
364     case kIA32S8x16UnpackLow:
365     case kSSES8x16TransposeLow:
366     case kAVXS8x16TransposeLow:
367     case kSSES8x16TransposeHigh:
368     case kAVXS8x16TransposeHigh:
369     case kSSES8x8Reverse:
370     case kAVXS8x8Reverse:
371     case kSSES8x4Reverse:
372     case kAVXS8x4Reverse:
373     case kSSES8x2Reverse:
374     case kAVXS8x2Reverse:
375     case kIA32V32x4AnyTrue:
376     case kIA32V32x4AllTrue:
377     case kIA32V16x8AnyTrue:
378     case kIA32V16x8AllTrue:
379     case kIA32V8x16AnyTrue:
380     case kIA32V8x16AllTrue:
381       return (instr->addressing_mode() == kMode_None)
382                  ? kNoOpcodeFlags
383                  : kIsLoadOperation | kHasSideEffect;
384 
385     case kIA32Idiv:
386     case kIA32Udiv:
387       return (instr->addressing_mode() == kMode_None)
388                  ? kMayNeedDeoptOrTrapCheck
389                  : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect;
390 
391     case kIA32Movsxbl:
392     case kIA32Movzxbl:
393     case kIA32Movb:
394     case kIA32Movsxwl:
395     case kIA32Movzxwl:
396     case kIA32Movw:
397     case kIA32Movl:
398     case kIA32Movss:
399     case kIA32Movsd:
400     case kIA32Movdqu:
401     // Moves are used for memory load/store operations.
402     case kIA32S128Load8Splat:
403     case kIA32S128Load16Splat:
404     case kIA32S128Load32Splat:
405     case kIA32S128Load64Splat:
406     case kIA32S128Load8x8S:
407     case kIA32S128Load8x8U:
408     case kIA32S128Load16x4S:
409     case kIA32S128Load16x4U:
410     case kIA32S128Load32x2S:
411     case kIA32S128Load32x2U:
412       return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
413 
414     case kIA32Peek:
415       return kIsLoadOperation;
416 
417     case kIA32Push:
418     case kIA32PushFloat32:
419     case kIA32PushFloat64:
420     case kIA32PushSimd128:
421     case kIA32Poke:
422     case kIA32MFence:
423     case kIA32LFence:
424       return kHasSideEffect;
425 
426     case kIA32Word32AtomicPairLoad:
427       return kIsLoadOperation;
428 
429     case kIA32Word32AtomicPairStore:
430     case kIA32Word32AtomicPairAdd:
431     case kIA32Word32AtomicPairSub:
432     case kIA32Word32AtomicPairAnd:
433     case kIA32Word32AtomicPairOr:
434     case kIA32Word32AtomicPairXor:
435     case kIA32Word32AtomicPairExchange:
436     case kIA32Word32AtomicPairCompareExchange:
437       return kHasSideEffect;
438 
439 #define CASE(Name) case k##Name:
440       COMMON_ARCH_OPCODE_LIST(CASE)
441 #undef CASE
442       // Already covered in architecture independent code.
443       UNREACHABLE();
444   }
445 
446   UNREACHABLE();
447 }
448 
GetInstructionLatency(const Instruction * instr)449 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
450   // Basic latency modeling for ia32 instructions. They have been determined
451   // in an empirical way.
452   switch (instr->arch_opcode()) {
453     case kSSEFloat64Mul:
454       return 5;
455     case kIA32Imul:
456     case kIA32ImulHigh:
457       return 5;
458     case kSSEFloat32Cmp:
459     case kSSEFloat64Cmp:
460       return 9;
461     case kSSEFloat32Add:
462     case kSSEFloat32Sub:
463     case kSSEFloat32Abs:
464     case kSSEFloat32Neg:
465     case kSSEFloat64Add:
466     case kSSEFloat64Sub:
467     case kSSEFloat64Max:
468     case kSSEFloat64Min:
469     case kSSEFloat64Abs:
470     case kSSEFloat64Neg:
471       return 5;
472     case kSSEFloat32Mul:
473       return 4;
474     case kSSEFloat32ToFloat64:
475     case kSSEFloat64ToFloat32:
476       return 6;
477     case kSSEFloat32Round:
478     case kSSEFloat64Round:
479     case kSSEFloat32ToInt32:
480     case kSSEFloat64ToInt32:
481       return 8;
482     case kSSEFloat32ToUint32:
483       return 21;
484     case kSSEFloat64ToUint32:
485       return 15;
486     case kIA32Idiv:
487       return 33;
488     case kIA32Udiv:
489       return 26;
490     case kSSEFloat32Div:
491       return 35;
492     case kSSEFloat64Div:
493       return 63;
494     case kSSEFloat32Sqrt:
495     case kSSEFloat64Sqrt:
496       return 25;
497     case kSSEFloat64Mod:
498       return 50;
499     case kArchTruncateDoubleToI:
500       return 9;
501     default:
502       return 1;
503   }
504 }
505 
506 }  // namespace compiler
507 }  // namespace internal
508 }  // namespace v8
509