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
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11bool InstructionScheduler::SchedulerSupported() { return true; }
12
13int 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
420int 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