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