v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
instruction-scheduler-arm.cc
Go to the documentation of this file.
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
6
7namespace v8 {
8namespace internal {
9namespace compiler {
10
12
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 kArmF64x2Qfma:
133 case kArmF64x2Qfms:
134 case kArmF64x2Pmin:
135 case kArmF64x2Pmax:
136 case kArmF64x2Ceil:
137 case kArmF64x2Floor:
138 case kArmF64x2Trunc:
139 case kArmF64x2NearestInt:
140 case kArmF64x2ConvertLowI32x4S:
141 case kArmF64x2ConvertLowI32x4U:
142 case kArmF64x2PromoteLowF32x4:
143 case kArmF32x4Splat:
144 case kArmF32x4ExtractLane:
145 case kArmF32x4ReplaceLane:
146 case kArmF32x4SConvertI32x4:
147 case kArmF32x4UConvertI32x4:
148 case kArmF32x4Abs:
149 case kArmF32x4Neg:
150 case kArmF32x4Sqrt:
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 kArmF32x4Qfma:
162 case kArmF32x4Qfms:
163 case kArmF32x4Pmin:
164 case kArmF32x4Pmax:
165 case kArmF32x4DemoteF64x2Zero:
166 case kArmI64x2SplatI32Pair:
167 case kArmI64x2ReplaceLaneI32Pair:
168 case kArmI64x2Abs:
169 case kArmI64x2Neg:
170 case kArmI64x2Shl:
171 case kArmI64x2ShrS:
172 case kArmI64x2Add:
173 case kArmI64x2Sub:
174 case kArmI64x2Mul:
175 case kArmI64x2ShrU:
176 case kArmI64x2BitMask:
177 case kArmI64x2Eq:
178 case kArmI64x2Ne:
179 case kArmI64x2GtS:
180 case kArmI64x2GeS:
181 case kArmI64x2SConvertI32x4Low:
182 case kArmI64x2SConvertI32x4High:
183 case kArmI64x2UConvertI32x4Low:
184 case kArmI64x2UConvertI32x4High:
185 case kArmI32x4Splat:
186 case kArmI32x4ExtractLane:
187 case kArmI32x4ReplaceLane:
188 case kArmI32x4SConvertF32x4:
189 case kArmI32x4SConvertI16x8Low:
190 case kArmI32x4SConvertI16x8High:
191 case kArmI32x4Neg:
192 case kArmI32x4Shl:
193 case kArmI32x4ShrS:
194 case kArmI32x4Add:
195 case kArmI32x4Sub:
196 case kArmI32x4Mul:
197 case kArmI32x4MinS:
198 case kArmI32x4MaxS:
199 case kArmI32x4Eq:
200 case kArmI32x4Ne:
201 case kArmI32x4GtS:
202 case kArmI32x4GeS:
203 case kArmI32x4UConvertF32x4:
204 case kArmI32x4UConvertI16x8Low:
205 case kArmI32x4UConvertI16x8High:
206 case kArmI32x4ShrU:
207 case kArmI32x4MinU:
208 case kArmI32x4MaxU:
209 case kArmI32x4GtU:
210 case kArmI32x4GeU:
211 case kArmI32x4Abs:
212 case kArmI32x4BitMask:
213 case kArmI32x4DotI16x8S:
214 case kArmI16x8DotI8x16S:
215 case kArmI32x4DotI8x16AddS:
216 case kArmI32x4TruncSatF64x2SZero:
217 case kArmI32x4TruncSatF64x2UZero:
218 case kArmI16x8Splat:
219 case kArmI16x8ExtractLaneS:
220 case kArmI16x8ReplaceLane:
221 case kArmI16x8SConvertI8x16Low:
222 case kArmI16x8SConvertI8x16High:
223 case kArmI16x8Neg:
224 case kArmI16x8Shl:
225 case kArmI16x8ShrS:
226 case kArmI16x8SConvertI32x4:
227 case kArmI16x8Add:
228 case kArmI16x8AddSatS:
229 case kArmI16x8Sub:
230 case kArmI16x8SubSatS:
231 case kArmI16x8Mul:
232 case kArmI16x8MinS:
233 case kArmI16x8MaxS:
234 case kArmI16x8Eq:
235 case kArmI16x8Ne:
236 case kArmI16x8GtS:
237 case kArmI16x8GeS:
238 case kArmI16x8ExtractLaneU:
239 case kArmI16x8UConvertI8x16Low:
240 case kArmI16x8UConvertI8x16High:
241 case kArmI16x8ShrU:
242 case kArmI16x8UConvertI32x4:
243 case kArmI16x8AddSatU:
244 case kArmI16x8SubSatU:
245 case kArmI16x8MinU:
246 case kArmI16x8MaxU:
247 case kArmI16x8GtU:
248 case kArmI16x8GeU:
249 case kArmI16x8RoundingAverageU:
250 case kArmI16x8Abs:
251 case kArmI16x8BitMask:
252 case kArmI16x8Q15MulRSatS:
253 case kArmI8x16Splat:
254 case kArmI8x16ExtractLaneS:
255 case kArmI8x16ReplaceLane:
256 case kArmI8x16Neg:
257 case kArmI8x16Shl:
258 case kArmI8x16ShrS:
259 case kArmI8x16SConvertI16x8:
260 case kArmI8x16Add:
261 case kArmI8x16AddSatS:
262 case kArmI8x16Sub:
263 case kArmI8x16SubSatS:
264 case kArmI8x16MinS:
265 case kArmI8x16MaxS:
266 case kArmI8x16Eq:
267 case kArmI8x16Ne:
268 case kArmI8x16GtS:
269 case kArmI8x16GeS:
270 case kArmI8x16ExtractLaneU:
271 case kArmI8x16UConvertI16x8:
272 case kArmI8x16AddSatU:
273 case kArmI8x16SubSatU:
274 case kArmI8x16ShrU:
275 case kArmI8x16MinU:
276 case kArmI8x16MaxU:
277 case kArmI8x16GtU:
278 case kArmI8x16GeU:
279 case kArmI8x16RoundingAverageU:
280 case kArmI8x16Abs:
281 case kArmI8x16BitMask:
282 case kArmS128Const:
283 case kArmS128Zero:
284 case kArmS128AllOnes:
285 case kArmS128Dup:
286 case kArmS128And:
287 case kArmS128Or:
288 case kArmS128Xor:
289 case kArmS128Not:
290 case kArmS128Select:
291 case kArmS128AndNot:
292 case kArmS32x4ZipLeft:
293 case kArmS32x4ZipRight:
294 case kArmS32x4UnzipLeft:
295 case kArmS32x4UnzipRight:
296 case kArmS32x4TransposeLeft:
297 case kArmS32x4TransposeRight:
298 case kArmS32x4Shuffle:
299 case kArmS16x8ZipLeft:
300 case kArmS16x8ZipRight:
301 case kArmS16x8UnzipLeft:
302 case kArmS16x8UnzipRight:
303 case kArmS16x8TransposeLeft:
304 case kArmS16x8TransposeRight:
305 case kArmS8x16ZipLeft:
306 case kArmS8x16ZipRight:
307 case kArmS8x16UnzipLeft:
308 case kArmS8x16UnzipRight:
309 case kArmS8x16TransposeLeft:
310 case kArmS8x16TransposeRight:
311 case kArmS8x16Concat:
312 case kArmI8x16Swizzle:
313 case kArmI8x16Shuffle:
314 case kArmS32x2Reverse:
315 case kArmS16x4Reverse:
316 case kArmS16x2Reverse:
317 case kArmS8x8Reverse:
318 case kArmS8x4Reverse:
319 case kArmS8x2Reverse:
320 case kArmI64x2AllTrue:
321 case kArmI32x4AllTrue:
322 case kArmI16x8AllTrue:
323 case kArmV128AnyTrue:
324 case kArmI8x16AllTrue:
325 return kNoOpcodeFlags;
326
327 case kArmVldrF32:
328 case kArmVldrF64:
329 case kArmVld1F64:
330 case kArmVld1S128:
331 case kArmLdrb:
332 case kArmLdrsb:
333 case kArmLdrh:
334 case kArmLdrsh:
335 case kArmLdr:
336 case kArmPeek:
337 case kArmWord32AtomicPairLoad:
338 case kArmS128Load8Splat:
339 case kArmS128Load16Splat:
340 case kArmS128Load32Splat:
341 case kArmS128Load64Splat:
342 case kArmS128Load8x8S:
343 case kArmS128Load8x8U:
344 case kArmS128Load16x4S:
345 case kArmS128Load16x4U:
346 case kArmS128Load32x2S:
347 case kArmS128Load32x2U:
348 case kArmS128Load32Zero:
349 case kArmS128Load64Zero:
350 case kArmS128LoadLaneLow:
351 case kArmS128LoadLaneHigh:
352 return kIsLoadOperation;
353
354 case kArmVstrF32:
355 case kArmVstrF64:
356 case kArmVst1F64:
357 case kArmVst1S128:
358 case kArmStrb:
359 case kArmStrh:
360 case kArmStr:
361 case kArmPush:
362 case kArmPoke:
363 case kArmDmbIsh:
364 case kArmDsbIsb:
365 case kArmWord32AtomicPairStore:
366 case kArmWord32AtomicPairAdd:
367 case kArmWord32AtomicPairSub:
368 case kArmWord32AtomicPairAnd:
369 case kArmWord32AtomicPairOr:
370 case kArmWord32AtomicPairXor:
371 case kArmWord32AtomicPairExchange:
372 case kArmWord32AtomicPairCompareExchange:
373 case kArmS128StoreLaneLow:
374 case kArmS128StoreLaneHigh:
375 return kHasSideEffect;
376
377#define CASE(Name) case k##Name:
379#undef CASE
380 // Already covered in architecture independent code.
381 UNREACHABLE();
382 }
383
384 UNREACHABLE();
385}
386
388 // TODO(all): Add instruction cost modeling.
389 return 1;
390}
391
392} // namespace compiler
393} // namespace internal
394} // namespace v8
int GetTargetInstructionFlags(const Instruction *instr) const
static int GetInstructionLatency(const Instruction *instr)
#define COMMON_ARCH_OPCODE_LIST(V)
Instruction * instr