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 kS390_Abs32:
17     case kS390_Abs64:
18     case kS390_And32:
19     case kS390_And64:
20     case kS390_Or32:
21     case kS390_Or64:
22     case kS390_Xor32:
23     case kS390_Xor64:
24     case kS390_ShiftLeft32:
25     case kS390_ShiftLeft64:
26     case kS390_ShiftRight32:
27     case kS390_ShiftRight64:
28     case kS390_ShiftRightArith32:
29     case kS390_ShiftRightArith64:
30     case kS390_RotRight32:
31     case kS390_RotRight64:
32     case kS390_Not32:
33     case kS390_Not64:
34     case kS390_RotLeftAndClear64:
35     case kS390_RotLeftAndClearLeft64:
36     case kS390_RotLeftAndClearRight64:
37     case kS390_Lay:
38     case kS390_Add32:
39     case kS390_Add64:
40     case kS390_AddFloat:
41     case kS390_AddDouble:
42     case kS390_Sub32:
43     case kS390_Sub64:
44     case kS390_SubFloat:
45     case kS390_SubDouble:
46     case kS390_Mul32:
47     case kS390_Mul32WithOverflow:
48     case kS390_Mul64:
49     case kS390_MulHigh32:
50     case kS390_MulHighU32:
51     case kS390_MulFloat:
52     case kS390_MulDouble:
53     case kS390_Div32:
54     case kS390_Div64:
55     case kS390_DivU32:
56     case kS390_DivU64:
57     case kS390_DivFloat:
58     case kS390_DivDouble:
59     case kS390_Mod32:
60     case kS390_Mod64:
61     case kS390_ModU32:
62     case kS390_ModU64:
63     case kS390_ModDouble:
64     case kS390_Neg32:
65     case kS390_Neg64:
66     case kS390_NegDouble:
67     case kS390_NegFloat:
68     case kS390_SqrtFloat:
69     case kS390_FloorFloat:
70     case kS390_CeilFloat:
71     case kS390_TruncateFloat:
72     case kS390_FloatNearestInt:
73     case kS390_AbsFloat:
74     case kS390_SqrtDouble:
75     case kS390_FloorDouble:
76     case kS390_CeilDouble:
77     case kS390_TruncateDouble:
78     case kS390_RoundDouble:
79     case kS390_DoubleNearestInt:
80     case kS390_MaxFloat:
81     case kS390_MaxDouble:
82     case kS390_MinFloat:
83     case kS390_MinDouble:
84     case kS390_AbsDouble:
85     case kS390_Cntlz32:
86     case kS390_Cntlz64:
87     case kS390_Popcnt32:
88     case kS390_Popcnt64:
89     case kS390_Cmp32:
90     case kS390_Cmp64:
91     case kS390_CmpFloat:
92     case kS390_CmpDouble:
93     case kS390_Tst32:
94     case kS390_Tst64:
95     case kS390_SignExtendWord8ToInt32:
96     case kS390_SignExtendWord16ToInt32:
97     case kS390_SignExtendWord8ToInt64:
98     case kS390_SignExtendWord16ToInt64:
99     case kS390_SignExtendWord32ToInt64:
100     case kS390_Uint32ToUint64:
101     case kS390_Int64ToInt32:
102     case kS390_Int64ToFloat32:
103     case kS390_Int64ToDouble:
104     case kS390_Uint64ToFloat32:
105     case kS390_Uint64ToDouble:
106     case kS390_Int32ToFloat32:
107     case kS390_Int32ToDouble:
108     case kS390_Uint32ToFloat32:
109     case kS390_Uint32ToDouble:
110     case kS390_Float32ToInt32:
111     case kS390_Float32ToUint32:
112     case kS390_Float32ToUint64:
113     case kS390_Float32ToDouble:
114     case kS390_Float64SilenceNaN:
115     case kS390_DoubleToInt32:
116     case kS390_DoubleToUint32:
117     case kS390_Float32ToInt64:
118     case kS390_DoubleToInt64:
119     case kS390_DoubleToUint64:
120     case kS390_DoubleToFloat32:
121     case kS390_DoubleExtractLowWord32:
122     case kS390_DoubleExtractHighWord32:
123     case kS390_DoubleInsertLowWord32:
124     case kS390_DoubleInsertHighWord32:
125     case kS390_DoubleConstruct:
126     case kS390_BitcastInt32ToFloat32:
127     case kS390_BitcastFloat32ToInt32:
128     case kS390_BitcastInt64ToDouble:
129     case kS390_BitcastDoubleToInt64:
130     case kS390_LoadReverse16RR:
131     case kS390_LoadReverse32RR:
132     case kS390_LoadReverse64RR:
133     case kS390_LoadReverseSimd128RR:
134     case kS390_LoadAndTestWord32:
135     case kS390_LoadAndTestWord64:
136     case kS390_LoadAndTestFloat32:
137     case kS390_LoadAndTestFloat64:
138     case kS390_F64x2Splat:
139     case kS390_F64x2ReplaceLane:
140     case kS390_F64x2Abs:
141     case kS390_F64x2Neg:
142     case kS390_F64x2Sqrt:
143     case kS390_F64x2Add:
144     case kS390_F64x2Sub:
145     case kS390_F64x2Mul:
146     case kS390_F64x2Div:
147     case kS390_F64x2Eq:
148     case kS390_F64x2Ne:
149     case kS390_F64x2Lt:
150     case kS390_F64x2Le:
151     case kS390_F64x2Min:
152     case kS390_F64x2Max:
153     case kS390_F64x2ExtractLane:
154     case kS390_F64x2Qfma:
155     case kS390_F64x2Qfms:
156     case kS390_F64x2Pmin:
157     case kS390_F64x2Pmax:
158     case kS390_F64x2Ceil:
159     case kS390_F64x2Floor:
160     case kS390_F64x2Trunc:
161     case kS390_F64x2NearestInt:
162     case kS390_F64x2ConvertLowI32x4S:
163     case kS390_F64x2ConvertLowI32x4U:
164     case kS390_F64x2PromoteLowF32x4:
165     case kS390_F32x4Splat:
166     case kS390_F32x4ExtractLane:
167     case kS390_F32x4ReplaceLane:
168     case kS390_F32x4Add:
169     case kS390_F32x4Sub:
170     case kS390_F32x4Mul:
171     case kS390_F32x4Eq:
172     case kS390_F32x4Ne:
173     case kS390_F32x4Lt:
174     case kS390_F32x4Le:
175     case kS390_F32x4Abs:
176     case kS390_F32x4Neg:
177     case kS390_F32x4RecipApprox:
178     case kS390_F32x4RecipSqrtApprox:
179     case kS390_F32x4SConvertI32x4:
180     case kS390_F32x4UConvertI32x4:
181     case kS390_F32x4Sqrt:
182     case kS390_F32x4Div:
183     case kS390_F32x4Min:
184     case kS390_F32x4Max:
185     case kS390_F32x4Qfma:
186     case kS390_F32x4Qfms:
187     case kS390_F32x4Pmin:
188     case kS390_F32x4Pmax:
189     case kS390_F32x4Ceil:
190     case kS390_F32x4Floor:
191     case kS390_F32x4Trunc:
192     case kS390_F32x4NearestInt:
193     case kS390_F32x4DemoteF64x2Zero:
194     case kS390_I64x2Neg:
195     case kS390_I64x2Add:
196     case kS390_I64x2Sub:
197     case kS390_I64x2Shl:
198     case kS390_I64x2ShrS:
199     case kS390_I64x2ShrU:
200     case kS390_I64x2Mul:
201     case kS390_I64x2Splat:
202     case kS390_I64x2ReplaceLane:
203     case kS390_I64x2ExtractLane:
204     case kS390_I64x2Eq:
205     case kS390_I64x2BitMask:
206     case kS390_I64x2ExtMulLowI32x4S:
207     case kS390_I64x2ExtMulHighI32x4S:
208     case kS390_I64x2ExtMulLowI32x4U:
209     case kS390_I64x2ExtMulHighI32x4U:
210     case kS390_I64x2SConvertI32x4Low:
211     case kS390_I64x2SConvertI32x4High:
212     case kS390_I64x2UConvertI32x4Low:
213     case kS390_I64x2UConvertI32x4High:
214     case kS390_I64x2Ne:
215     case kS390_I64x2GtS:
216     case kS390_I64x2GeS:
217     case kS390_I64x2Abs:
218     case kS390_I32x4Splat:
219     case kS390_I32x4ExtractLane:
220     case kS390_I32x4ReplaceLane:
221     case kS390_I32x4Add:
222     case kS390_I32x4Sub:
223     case kS390_I32x4Mul:
224     case kS390_I32x4MinS:
225     case kS390_I32x4MinU:
226     case kS390_I32x4MaxS:
227     case kS390_I32x4MaxU:
228     case kS390_I32x4Eq:
229     case kS390_I32x4Ne:
230     case kS390_I32x4GtS:
231     case kS390_I32x4GeS:
232     case kS390_I32x4GtU:
233     case kS390_I32x4GeU:
234     case kS390_I32x4Shl:
235     case kS390_I32x4ShrS:
236     case kS390_I32x4ShrU:
237     case kS390_I32x4Neg:
238     case kS390_I32x4SConvertF32x4:
239     case kS390_I32x4UConvertF32x4:
240     case kS390_I32x4SConvertI16x8Low:
241     case kS390_I32x4SConvertI16x8High:
242     case kS390_I32x4UConvertI16x8Low:
243     case kS390_I32x4UConvertI16x8High:
244     case kS390_I32x4Abs:
245     case kS390_I32x4BitMask:
246     case kS390_I32x4DotI16x8S:
247     case kS390_I32x4ExtMulLowI16x8S:
248     case kS390_I32x4ExtMulHighI16x8S:
249     case kS390_I32x4ExtMulLowI16x8U:
250     case kS390_I32x4ExtMulHighI16x8U:
251     case kS390_I32x4ExtAddPairwiseI16x8S:
252     case kS390_I32x4ExtAddPairwiseI16x8U:
253     case kS390_I32x4TruncSatF64x2SZero:
254     case kS390_I32x4TruncSatF64x2UZero:
255     case kS390_I16x8Splat:
256     case kS390_I16x8ExtractLaneU:
257     case kS390_I16x8ExtractLaneS:
258     case kS390_I16x8ReplaceLane:
259     case kS390_I16x8Add:
260     case kS390_I16x8Sub:
261     case kS390_I16x8Mul:
262     case kS390_I16x8MinS:
263     case kS390_I16x8MinU:
264     case kS390_I16x8MaxS:
265     case kS390_I16x8MaxU:
266     case kS390_I16x8Eq:
267     case kS390_I16x8Ne:
268     case kS390_I16x8GtS:
269     case kS390_I16x8GeS:
270     case kS390_I16x8GtU:
271     case kS390_I16x8GeU:
272     case kS390_I16x8Shl:
273     case kS390_I16x8ShrS:
274     case kS390_I16x8ShrU:
275     case kS390_I16x8Neg:
276     case kS390_I16x8SConvertI32x4:
277     case kS390_I16x8UConvertI32x4:
278     case kS390_I16x8SConvertI8x16Low:
279     case kS390_I16x8SConvertI8x16High:
280     case kS390_I16x8UConvertI8x16Low:
281     case kS390_I16x8UConvertI8x16High:
282     case kS390_I16x8AddSatS:
283     case kS390_I16x8SubSatS:
284     case kS390_I16x8AddSatU:
285     case kS390_I16x8SubSatU:
286     case kS390_I16x8RoundingAverageU:
287     case kS390_I16x8Abs:
288     case kS390_I16x8BitMask:
289     case kS390_I16x8ExtMulLowI8x16S:
290     case kS390_I16x8ExtMulHighI8x16S:
291     case kS390_I16x8ExtMulLowI8x16U:
292     case kS390_I16x8ExtMulHighI8x16U:
293     case kS390_I16x8ExtAddPairwiseI8x16S:
294     case kS390_I16x8ExtAddPairwiseI8x16U:
295     case kS390_I16x8Q15MulRSatS:
296     case kS390_I8x16Splat:
297     case kS390_I8x16ExtractLaneU:
298     case kS390_I8x16ExtractLaneS:
299     case kS390_I8x16ReplaceLane:
300     case kS390_I8x16Add:
301     case kS390_I8x16Sub:
302     case kS390_I8x16MinS:
303     case kS390_I8x16MinU:
304     case kS390_I8x16MaxS:
305     case kS390_I8x16MaxU:
306     case kS390_I8x16Eq:
307     case kS390_I8x16Ne:
308     case kS390_I8x16GtS:
309     case kS390_I8x16GeS:
310     case kS390_I8x16GtU:
311     case kS390_I8x16GeU:
312     case kS390_I8x16Shl:
313     case kS390_I8x16ShrS:
314     case kS390_I8x16ShrU:
315     case kS390_I8x16Neg:
316     case kS390_I8x16SConvertI16x8:
317     case kS390_I8x16UConvertI16x8:
318     case kS390_I8x16AddSatS:
319     case kS390_I8x16SubSatS:
320     case kS390_I8x16AddSatU:
321     case kS390_I8x16SubSatU:
322     case kS390_I8x16RoundingAverageU:
323     case kS390_I8x16Abs:
324     case kS390_I8x16BitMask:
325     case kS390_I8x16Shuffle:
326     case kS390_I8x16Swizzle:
327     case kS390_I8x16Popcnt:
328     case kS390_I64x2AllTrue:
329     case kS390_I32x4AllTrue:
330     case kS390_I16x8AllTrue:
331     case kS390_I8x16AllTrue:
332     case kS390_V128AnyTrue:
333     case kS390_S128And:
334     case kS390_S128Or:
335     case kS390_S128Xor:
336     case kS390_S128Const:
337     case kS390_S128Zero:
338     case kS390_S128AllOnes:
339     case kS390_S128Not:
340     case kS390_S128Select:
341     case kS390_S128AndNot:
342       return kNoOpcodeFlags;
343 
344     case kS390_LoadWordS8:
345     case kS390_LoadWordU8:
346     case kS390_LoadWordS16:
347     case kS390_LoadWordU16:
348     case kS390_LoadWordS32:
349     case kS390_LoadWordU32:
350     case kS390_LoadWord64:
351     case kS390_LoadFloat32:
352     case kS390_LoadDouble:
353     case kS390_LoadSimd128:
354     case kS390_LoadReverse16:
355     case kS390_LoadReverse32:
356     case kS390_LoadReverse64:
357     case kS390_LoadReverseSimd128:
358     case kS390_Peek:
359     case kS390_LoadDecompressTaggedSigned:
360     case kS390_LoadDecompressTaggedPointer:
361     case kS390_LoadDecompressAnyTagged:
362     case kS390_S128Load8Splat:
363     case kS390_S128Load16Splat:
364     case kS390_S128Load32Splat:
365     case kS390_S128Load64Splat:
366     case kS390_S128Load8x8S:
367     case kS390_S128Load8x8U:
368     case kS390_S128Load16x4S:
369     case kS390_S128Load16x4U:
370     case kS390_S128Load32x2S:
371     case kS390_S128Load32x2U:
372     case kS390_S128Load32Zero:
373     case kS390_S128Load64Zero:
374     case kS390_S128Load8Lane:
375     case kS390_S128Load16Lane:
376     case kS390_S128Load32Lane:
377     case kS390_S128Load64Lane:
378       return kIsLoadOperation;
379 
380     case kS390_StoreWord8:
381     case kS390_StoreWord16:
382     case kS390_StoreWord32:
383     case kS390_StoreWord64:
384     case kS390_StoreReverseSimd128:
385     case kS390_StoreReverse16:
386     case kS390_StoreReverse32:
387     case kS390_StoreReverse64:
388     case kS390_StoreFloat32:
389     case kS390_StoreDouble:
390     case kS390_StoreSimd128:
391     case kS390_StoreCompressTagged:
392     case kS390_Push:
393     case kS390_PushFrame:
394     case kS390_StoreToStackSlot:
395     case kS390_S128Store8Lane:
396     case kS390_S128Store16Lane:
397     case kS390_S128Store32Lane:
398     case kS390_S128Store64Lane:
399       return kHasSideEffect;
400 
401     case kS390_Word64AtomicExchangeUint64:
402     case kS390_Word64AtomicCompareExchangeUint64:
403     case kS390_Word64AtomicAddUint64:
404     case kS390_Word64AtomicSubUint64:
405     case kS390_Word64AtomicAndUint64:
406     case kS390_Word64AtomicOrUint64:
407     case kS390_Word64AtomicXorUint64:
408       return kHasSideEffect;
409 
410 #define CASE(Name) case k##Name:
411       COMMON_ARCH_OPCODE_LIST(CASE)
412 #undef CASE
413       // Already covered in architecture independent code.
414       UNREACHABLE();
415   }
416 
417   UNREACHABLE();
418 }
419 
GetInstructionLatency(const Instruction* instr)420 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
421   // TODO(all): Add instruction cost modeling.
422   return 1;
423 }
424 
425 }  // namespace compiler
426 }  // namespace internal
427 }  // namespace v8
428