• 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 kArmAdd:
17     case kArmAnd:
18     case kArmBic:
19     case kArmClz:
20     case kArmCmp:
21     case kArmCmn:
22     case kArmTst:
23     case kArmTeq:
24     case kArmOrr:
25     case kArmEor:
26     case kArmSub:
27     case kArmRsb:
28     case kArmMul:
29     case kArmMla:
30     case kArmMls:
31     case kArmSmmul:
32     case kArmSmull:
33     case kArmSmmla:
34     case kArmUmull:
35     case kArmSdiv:
36     case kArmUdiv:
37     case kArmMov:
38     case kArmMvn:
39     case kArmBfc:
40     case kArmUbfx:
41     case kArmSbfx:
42     case kArmSxtb:
43     case kArmSxth:
44     case kArmSxtab:
45     case kArmSxtah:
46     case kArmUxtb:
47     case kArmUxth:
48     case kArmUxtab:
49     case kArmUxtah:
50     case kArmRbit:
51     case kArmRev:
52     case kArmAddPair:
53     case kArmSubPair:
54     case kArmMulPair:
55     case kArmLslPair:
56     case kArmLsrPair:
57     case kArmAsrPair:
58     case kArmVcmpF32:
59     case kArmVaddF32:
60     case kArmVsubF32:
61     case kArmVmulF32:
62     case kArmVmlaF32:
63     case kArmVmlsF32:
64     case kArmVdivF32:
65     case kArmVabsF32:
66     case kArmVnegF32:
67     case kArmVsqrtF32:
68     case kArmVcmpF64:
69     case kArmVaddF64:
70     case kArmVsubF64:
71     case kArmVmulF64:
72     case kArmVmlaF64:
73     case kArmVmlsF64:
74     case kArmVdivF64:
75     case kArmVmodF64:
76     case kArmVabsF64:
77     case kArmVnegF64:
78     case kArmVsqrtF64:
79     case kArmVmullLow:
80     case kArmVmullHigh:
81     case kArmVrintmF32:
82     case kArmVrintmF64:
83     case kArmVrintpF32:
84     case kArmVrintpF64:
85     case kArmVrintzF32:
86     case kArmVrintzF64:
87     case kArmVrintaF64:
88     case kArmVrintnF32:
89     case kArmVrintnF64:
90     case kArmVcvtF32F64:
91     case kArmVcvtF64F32:
92     case kArmVcvtF32S32:
93     case kArmVcvtF32U32:
94     case kArmVcvtF64S32:
95     case kArmVcvtF64U32:
96     case kArmVcvtS32F32:
97     case kArmVcvtU32F32:
98     case kArmVcvtS32F64:
99     case kArmVcvtU32F64:
100     case kArmVmovU32F32:
101     case kArmVmovF32U32:
102     case kArmVmovLowU32F64:
103     case kArmVmovLowF64U32:
104     case kArmVmovHighU32F64:
105     case kArmVmovHighF64U32:
106     case kArmVmovF64U32U32:
107     case kArmVmovU32U32F64:
108     case kArmVcnt:
109     case kArmVpadal:
110     case kArmVpaddl:
111     case kArmFloat32Max:
112     case kArmFloat64Max:
113     case kArmFloat32Min:
114     case kArmFloat64Min:
115     case kArmFloat64SilenceNaN:
116     case kArmF64x2Splat:
117     case kArmF64x2ExtractLane:
118     case kArmF64x2ReplaceLane:
119     case kArmF64x2Abs:
120     case kArmF64x2Neg:
121     case kArmF64x2Sqrt:
122     case kArmF64x2Add:
123     case kArmF64x2Sub:
124     case kArmF64x2Mul:
125     case kArmF64x2Div:
126     case kArmF64x2Min:
127     case kArmF64x2Max:
128     case kArmF64x2Eq:
129     case kArmF64x2Ne:
130     case kArmF64x2Lt:
131     case kArmF64x2Le:
132     case kArmF64x2Pmin:
133     case kArmF64x2Pmax:
134     case kArmF64x2Ceil:
135     case kArmF64x2Floor:
136     case kArmF64x2Trunc:
137     case kArmF64x2NearestInt:
138     case kArmF64x2ConvertLowI32x4S:
139     case kArmF64x2ConvertLowI32x4U:
140     case kArmF64x2PromoteLowF32x4:
141     case kArmF32x4Splat:
142     case kArmF32x4ExtractLane:
143     case kArmF32x4ReplaceLane:
144     case kArmF32x4SConvertI32x4:
145     case kArmF32x4UConvertI32x4:
146     case kArmF32x4Abs:
147     case kArmF32x4Neg:
148     case kArmF32x4Sqrt:
149     case kArmF32x4RecipApprox:
150     case kArmF32x4RecipSqrtApprox:
151     case kArmF32x4Add:
152     case kArmF32x4Sub:
153     case kArmF32x4Mul:
154     case kArmF32x4Div:
155     case kArmF32x4Min:
156     case kArmF32x4Max:
157     case kArmF32x4Eq:
158     case kArmF32x4Ne:
159     case kArmF32x4Lt:
160     case kArmF32x4Le:
161     case kArmF32x4Pmin:
162     case kArmF32x4Pmax:
163     case kArmF32x4DemoteF64x2Zero:
164     case kArmI64x2SplatI32Pair:
165     case kArmI64x2ReplaceLaneI32Pair:
166     case kArmI64x2Abs:
167     case kArmI64x2Neg:
168     case kArmI64x2Shl:
169     case kArmI64x2ShrS:
170     case kArmI64x2Add:
171     case kArmI64x2Sub:
172     case kArmI64x2Mul:
173     case kArmI64x2ShrU:
174     case kArmI64x2BitMask:
175     case kArmI64x2Eq:
176     case kArmI64x2Ne:
177     case kArmI64x2GtS:
178     case kArmI64x2GeS:
179     case kArmI64x2SConvertI32x4Low:
180     case kArmI64x2SConvertI32x4High:
181     case kArmI64x2UConvertI32x4Low:
182     case kArmI64x2UConvertI32x4High:
183     case kArmI32x4Splat:
184     case kArmI32x4ExtractLane:
185     case kArmI32x4ReplaceLane:
186     case kArmI32x4SConvertF32x4:
187     case kArmI32x4SConvertI16x8Low:
188     case kArmI32x4SConvertI16x8High:
189     case kArmI32x4Neg:
190     case kArmI32x4Shl:
191     case kArmI32x4ShrS:
192     case kArmI32x4Add:
193     case kArmI32x4Sub:
194     case kArmI32x4Mul:
195     case kArmI32x4MinS:
196     case kArmI32x4MaxS:
197     case kArmI32x4Eq:
198     case kArmI32x4Ne:
199     case kArmI32x4GtS:
200     case kArmI32x4GeS:
201     case kArmI32x4UConvertF32x4:
202     case kArmI32x4UConvertI16x8Low:
203     case kArmI32x4UConvertI16x8High:
204     case kArmI32x4ShrU:
205     case kArmI32x4MinU:
206     case kArmI32x4MaxU:
207     case kArmI32x4GtU:
208     case kArmI32x4GeU:
209     case kArmI32x4Abs:
210     case kArmI32x4BitMask:
211     case kArmI32x4DotI16x8S:
212     case kArmI32x4TruncSatF64x2SZero:
213     case kArmI32x4TruncSatF64x2UZero:
214     case kArmI16x8Splat:
215     case kArmI16x8ExtractLaneS:
216     case kArmI16x8ReplaceLane:
217     case kArmI16x8SConvertI8x16Low:
218     case kArmI16x8SConvertI8x16High:
219     case kArmI16x8Neg:
220     case kArmI16x8Shl:
221     case kArmI16x8ShrS:
222     case kArmI16x8SConvertI32x4:
223     case kArmI16x8Add:
224     case kArmI16x8AddSatS:
225     case kArmI16x8Sub:
226     case kArmI16x8SubSatS:
227     case kArmI16x8Mul:
228     case kArmI16x8MinS:
229     case kArmI16x8MaxS:
230     case kArmI16x8Eq:
231     case kArmI16x8Ne:
232     case kArmI16x8GtS:
233     case kArmI16x8GeS:
234     case kArmI16x8ExtractLaneU:
235     case kArmI16x8UConvertI8x16Low:
236     case kArmI16x8UConvertI8x16High:
237     case kArmI16x8ShrU:
238     case kArmI16x8UConvertI32x4:
239     case kArmI16x8AddSatU:
240     case kArmI16x8SubSatU:
241     case kArmI16x8MinU:
242     case kArmI16x8MaxU:
243     case kArmI16x8GtU:
244     case kArmI16x8GeU:
245     case kArmI16x8RoundingAverageU:
246     case kArmI16x8Abs:
247     case kArmI16x8BitMask:
248     case kArmI16x8Q15MulRSatS:
249     case kArmI8x16Splat:
250     case kArmI8x16ExtractLaneS:
251     case kArmI8x16ReplaceLane:
252     case kArmI8x16Neg:
253     case kArmI8x16Shl:
254     case kArmI8x16ShrS:
255     case kArmI8x16SConvertI16x8:
256     case kArmI8x16Add:
257     case kArmI8x16AddSatS:
258     case kArmI8x16Sub:
259     case kArmI8x16SubSatS:
260     case kArmI8x16MinS:
261     case kArmI8x16MaxS:
262     case kArmI8x16Eq:
263     case kArmI8x16Ne:
264     case kArmI8x16GtS:
265     case kArmI8x16GeS:
266     case kArmI8x16ExtractLaneU:
267     case kArmI8x16UConvertI16x8:
268     case kArmI8x16AddSatU:
269     case kArmI8x16SubSatU:
270     case kArmI8x16ShrU:
271     case kArmI8x16MinU:
272     case kArmI8x16MaxU:
273     case kArmI8x16GtU:
274     case kArmI8x16GeU:
275     case kArmI8x16RoundingAverageU:
276     case kArmI8x16Abs:
277     case kArmI8x16BitMask:
278     case kArmS128Const:
279     case kArmS128Zero:
280     case kArmS128AllOnes:
281     case kArmS128Dup:
282     case kArmS128And:
283     case kArmS128Or:
284     case kArmS128Xor:
285     case kArmS128Not:
286     case kArmS128Select:
287     case kArmS128AndNot:
288     case kArmS32x4ZipLeft:
289     case kArmS32x4ZipRight:
290     case kArmS32x4UnzipLeft:
291     case kArmS32x4UnzipRight:
292     case kArmS32x4TransposeLeft:
293     case kArmS32x4TransposeRight:
294     case kArmS32x4Shuffle:
295     case kArmS16x8ZipLeft:
296     case kArmS16x8ZipRight:
297     case kArmS16x8UnzipLeft:
298     case kArmS16x8UnzipRight:
299     case kArmS16x8TransposeLeft:
300     case kArmS16x8TransposeRight:
301     case kArmS8x16ZipLeft:
302     case kArmS8x16ZipRight:
303     case kArmS8x16UnzipLeft:
304     case kArmS8x16UnzipRight:
305     case kArmS8x16TransposeLeft:
306     case kArmS8x16TransposeRight:
307     case kArmS8x16Concat:
308     case kArmI8x16Swizzle:
309     case kArmI8x16Shuffle:
310     case kArmS32x2Reverse:
311     case kArmS16x4Reverse:
312     case kArmS16x2Reverse:
313     case kArmS8x8Reverse:
314     case kArmS8x4Reverse:
315     case kArmS8x2Reverse:
316     case kArmI64x2AllTrue:
317     case kArmI32x4AllTrue:
318     case kArmI16x8AllTrue:
319     case kArmV128AnyTrue:
320     case kArmI8x16AllTrue:
321       return kNoOpcodeFlags;
322 
323     case kArmVldrF32:
324     case kArmVldrF64:
325     case kArmVld1F64:
326     case kArmVld1S128:
327     case kArmLdrb:
328     case kArmLdrsb:
329     case kArmLdrh:
330     case kArmLdrsh:
331     case kArmLdr:
332     case kArmPeek:
333     case kArmWord32AtomicPairLoad:
334     case kArmS128Load8Splat:
335     case kArmS128Load16Splat:
336     case kArmS128Load32Splat:
337     case kArmS128Load64Splat:
338     case kArmS128Load8x8S:
339     case kArmS128Load8x8U:
340     case kArmS128Load16x4S:
341     case kArmS128Load16x4U:
342     case kArmS128Load32x2S:
343     case kArmS128Load32x2U:
344     case kArmS128Load32Zero:
345     case kArmS128Load64Zero:
346     case kArmS128LoadLaneLow:
347     case kArmS128LoadLaneHigh:
348       return kIsLoadOperation;
349 
350     case kArmVstrF32:
351     case kArmVstrF64:
352     case kArmVst1F64:
353     case kArmVst1S128:
354     case kArmStrb:
355     case kArmStrh:
356     case kArmStr:
357     case kArmPush:
358     case kArmPoke:
359     case kArmDmbIsh:
360     case kArmDsbIsb:
361     case kArmWord32AtomicPairStore:
362     case kArmWord32AtomicPairAdd:
363     case kArmWord32AtomicPairSub:
364     case kArmWord32AtomicPairAnd:
365     case kArmWord32AtomicPairOr:
366     case kArmWord32AtomicPairXor:
367     case kArmWord32AtomicPairExchange:
368     case kArmWord32AtomicPairCompareExchange:
369     case kArmS128StoreLaneLow:
370     case kArmS128StoreLaneHigh:
371       return kHasSideEffect;
372 
373 #define CASE(Name) case k##Name:
374       COMMON_ARCH_OPCODE_LIST(CASE)
375 #undef CASE
376       // Already covered in architecture independent code.
377       UNREACHABLE();
378   }
379 
380   UNREACHABLE();
381 }
382 
GetInstructionLatency(const Instruction * instr)383 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
384   // TODO(all): Add instruction cost modeling.
385   return 1;
386 }
387 
388 }  // namespace compiler
389 }  // namespace internal
390 }  // namespace v8
391