v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
instruction-scheduler-ia32.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
5#include "src/base/logging.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
14bool InstructionScheduler::SchedulerSupported() { return true; }
15
17 const Instruction* instr) const {
18 switch (instr->arch_opcode()) {
19 case kIA32Add:
20 case kIA32And:
21 case kIA32Cmp:
22 case kIA32Cmp16:
23 case kIA32Cmp8:
24 case kIA32Test:
25 case kIA32Test16:
26 case kIA32Test8:
27 case kIA32Or:
28 case kIA32Xor:
29 case kIA32Sub:
30 case kIA32Imul:
31 case kIA32ImulHigh:
32 case kIA32UmulHigh:
33 case kIA32Not:
34 case kIA32Neg:
35 case kIA32Shl:
36 case kIA32Shr:
37 case kIA32Sar:
38 case kIA32AddPair:
39 case kIA32SubPair:
40 case kIA32MulPair:
41 case kIA32ShlPair:
42 case kIA32ShrPair:
43 case kIA32SarPair:
44 case kIA32Rol:
45 case kIA32Ror:
46 case kIA32Lzcnt:
47 case kIA32Tzcnt:
48 case kIA32Popcnt:
49 case kIA32Bswap:
50 case kIA32Lea:
51 case kIA32Float32Cmp:
52 case kIA32Float32Sqrt:
53 case kIA32Float32Round:
54 case kIA32Float64Cmp:
55 case kIA32Float64Mod:
56 case kIA32Float32Max:
57 case kIA32Float64Max:
58 case kIA32Float32Min:
59 case kIA32Float64Min:
60 case kIA32Float64Sqrt:
61 case kIA32Float64Round:
62 case kIA32Float32ToFloat64:
63 case kIA32Float64ToFloat32:
64 case kIA32Float32ToInt32:
65 case kIA32Float32ToUint32:
66 case kIA32Float64ToInt32:
67 case kIA32Float64ToUint32:
68 case kSSEInt32ToFloat32:
69 case kIA32Uint32ToFloat32:
70 case kSSEInt32ToFloat64:
71 case kIA32Uint32ToFloat64:
72 case kIA32Float64ExtractLowWord32:
73 case kIA32Float64ExtractHighWord32:
74 case kIA32Float64InsertLowWord32:
75 case kIA32Float64InsertHighWord32:
76 case kIA32Float64FromWord32Pair:
77 case kIA32Float64LoadLowWord32:
78 case kIA32Float64SilenceNaN:
79 case kFloat32Add:
80 case kFloat32Sub:
81 case kFloat64Add:
82 case kFloat64Sub:
83 case kFloat32Mul:
84 case kFloat32Div:
85 case kFloat64Mul:
86 case kFloat64Div:
87 case kFloat64Abs:
88 case kFloat64Neg:
89 case kFloat32Abs:
90 case kFloat32Neg:
91 case kIA32BitcastFI:
92 case kIA32BitcastIF:
93 case kIA32Blendvpd:
94 case kIA32Blendvps:
95 case kIA32Pblendvb:
96 case kIA32Cvttps2dq:
97 case kIA32Cvttpd2dq:
98 case kIA32I32x4TruncF32x4U:
99 case kIA32I32x4TruncF64x2UZero:
100 case kIA32F64x2Splat:
101 case kIA32F64x2ExtractLane:
102 case kIA32F64x2ReplaceLane:
103 case kIA32F64x2Sqrt:
104 case kIA32F64x2Add:
105 case kIA32F64x2Sub:
106 case kIA32F64x2Mul:
107 case kIA32F64x2Div:
108 case kIA32F64x2Min:
109 case kIA32F64x2Max:
110 case kIA32F64x2Eq:
111 case kIA32F64x2Ne:
112 case kIA32F64x2Lt:
113 case kIA32F64x2Le:
114 case kIA32F64x2Qfma:
115 case kIA32F64x2Qfms:
116 case kIA32Minpd:
117 case kIA32Maxpd:
118 case kIA32F64x2Round:
119 case kIA32F64x2ConvertLowI32x4S:
120 case kIA32F64x2ConvertLowI32x4U:
121 case kIA32F64x2PromoteLowF32x4:
122 case kIA32I64x2SplatI32Pair:
123 case kIA32I64x2ReplaceLaneI32Pair:
124 case kIA32I64x2Abs:
125 case kIA32I64x2Neg:
126 case kIA32I64x2Shl:
127 case kIA32I64x2ShrS:
128 case kIA32I64x2Add:
129 case kIA32I64x2Sub:
130 case kIA32I64x2Mul:
131 case kIA32I64x2ShrU:
132 case kIA32I64x2BitMask:
133 case kIA32I64x2Eq:
134 case kIA32I64x2Ne:
135 case kIA32I64x2GtS:
136 case kIA32I64x2GeS:
137 case kIA32I64x2ExtMulLowI32x4S:
138 case kIA32I64x2ExtMulHighI32x4S:
139 case kIA32I64x2ExtMulLowI32x4U:
140 case kIA32I64x2ExtMulHighI32x4U:
141 case kIA32I64x2SConvertI32x4Low:
142 case kIA32I64x2SConvertI32x4High:
143 case kIA32I64x2UConvertI32x4Low:
144 case kIA32I64x2UConvertI32x4High:
145 case kIA32F32x4Splat:
146 case kIA32F32x4ExtractLane:
147 case kIA32Insertps:
148 case kIA32F32x4SConvertI32x4:
149 case kIA32F32x4UConvertI32x4:
150 case kIA32F32x4Sqrt:
151 case kIA32F32x4Add:
152 case kIA32F32x4Sub:
153 case kIA32F32x4Mul:
154 case kIA32F32x4Div:
155 case kIA32F32x4Min:
156 case kIA32F32x4Max:
157 case kIA32F32x4Eq:
158 case kIA32F32x4Ne:
159 case kIA32F32x4Lt:
160 case kIA32F32x4Le:
161 case kIA32F32x4Qfma:
162 case kIA32F32x4Qfms:
163 case kIA32Minps:
164 case kIA32Maxps:
165 case kIA32F32x4Round:
166 case kIA32F32x4DemoteF64x2Zero:
167 case kIA32I32x4Splat:
168 case kIA32I32x4ExtractLane:
169 case kIA32I32x4SConvertF32x4:
170 case kIA32I32x4SConvertI16x8Low:
171 case kIA32I32x4SConvertI16x8High:
172 case kIA32I32x4Neg:
173 case kIA32I32x4Shl:
174 case kIA32I32x4ShrS:
175 case kIA32I32x4Add:
176 case kIA32I32x4Sub:
177 case kIA32I32x4Mul:
178 case kIA32I32x4MinS:
179 case kIA32I32x4MaxS:
180 case kIA32I32x4Eq:
181 case kIA32I32x4Ne:
182 case kIA32I32x4GtS:
183 case kIA32I32x4GeS:
184 case kSSEI32x4UConvertF32x4:
185 case kAVXI32x4UConvertF32x4:
186 case kIA32I32x4UConvertI16x8Low:
187 case kIA32I32x4UConvertI16x8High:
188 case kIA32I32x4ShrU:
189 case kIA32I32x4MinU:
190 case kIA32I32x4MaxU:
191 case kSSEI32x4GtU:
192 case kAVXI32x4GtU:
193 case kSSEI32x4GeU:
194 case kAVXI32x4GeU:
195 case kIA32I32x4Abs:
196 case kIA32I32x4BitMask:
197 case kIA32I32x4DotI16x8S:
198 case kIA32I32x4DotI8x16I7x16AddS:
199 case kIA32I32x4ExtMulLowI16x8S:
200 case kIA32I32x4ExtMulHighI16x8S:
201 case kIA32I32x4ExtMulLowI16x8U:
202 case kIA32I32x4ExtMulHighI16x8U:
203 case kIA32I32x4ExtAddPairwiseI16x8S:
204 case kIA32I32x4ExtAddPairwiseI16x8U:
205 case kIA32I32x4TruncSatF64x2SZero:
206 case kIA32I32x4TruncSatF64x2UZero:
207 case kIA32I16x8Splat:
208 case kIA32I16x8ExtractLaneS:
209 case kIA32I16x8SConvertI8x16Low:
210 case kIA32I16x8SConvertI8x16High:
211 case kIA32I16x8Neg:
212 case kIA32I16x8Shl:
213 case kIA32I16x8ShrS:
214 case kIA32I16x8SConvertI32x4:
215 case kIA32I16x8Add:
216 case kIA32I16x8AddSatS:
217 case kIA32I16x8Sub:
218 case kIA32I16x8SubSatS:
219 case kIA32I16x8Mul:
220 case kIA32I16x8MinS:
221 case kIA32I16x8MaxS:
222 case kIA32I16x8Eq:
223 case kSSEI16x8Ne:
224 case kAVXI16x8Ne:
225 case kIA32I16x8GtS:
226 case kSSEI16x8GeS:
227 case kAVXI16x8GeS:
228 case kIA32I16x8UConvertI8x16Low:
229 case kIA32I16x8UConvertI8x16High:
230 case kIA32I16x8ShrU:
231 case kIA32I16x8UConvertI32x4:
232 case kIA32I16x8AddSatU:
233 case kIA32I16x8SubSatU:
234 case kIA32I16x8MinU:
235 case kIA32I16x8MaxU:
236 case kSSEI16x8GtU:
237 case kAVXI16x8GtU:
238 case kSSEI16x8GeU:
239 case kAVXI16x8GeU:
240 case kIA32I16x8RoundingAverageU:
241 case kIA32I16x8Abs:
242 case kIA32I16x8BitMask:
243 case kIA32I16x8ExtMulLowI8x16S:
244 case kIA32I16x8ExtMulHighI8x16S:
245 case kIA32I16x8ExtMulLowI8x16U:
246 case kIA32I16x8ExtMulHighI8x16U:
247 case kIA32I16x8ExtAddPairwiseI8x16S:
248 case kIA32I16x8ExtAddPairwiseI8x16U:
249 case kIA32I16x8Q15MulRSatS:
250 case kIA32I16x8RelaxedQ15MulRS:
251 case kIA32I16x8DotI8x16I7x16S:
252 case kIA32I8x16Splat:
253 case kIA32I8x16ExtractLaneS:
254 case kIA32Pinsrb:
255 case kIA32Pinsrw:
256 case kIA32Pinsrd:
257 case kIA32Pextrb:
258 case kIA32Pextrw:
259 case kIA32S128Store32Lane:
260 case kIA32I8x16SConvertI16x8:
261 case kIA32I8x16Neg:
262 case kIA32I8x16Shl:
263 case kIA32I8x16ShrS:
264 case kIA32I8x16Add:
265 case kIA32I8x16AddSatS:
266 case kIA32I8x16Sub:
267 case kIA32I8x16SubSatS:
268 case kIA32I8x16MinS:
269 case kIA32I8x16MaxS:
270 case kIA32I8x16Eq:
271 case kSSEI8x16Ne:
272 case kAVXI8x16Ne:
273 case kIA32I8x16GtS:
274 case kSSEI8x16GeS:
275 case kAVXI8x16GeS:
276 case kIA32I8x16UConvertI16x8:
277 case kIA32I8x16AddSatU:
278 case kIA32I8x16SubSatU:
279 case kIA32I8x16ShrU:
280 case kIA32I8x16MinU:
281 case kIA32I8x16MaxU:
282 case kSSEI8x16GtU:
283 case kAVXI8x16GtU:
284 case kSSEI8x16GeU:
285 case kAVXI8x16GeU:
286 case kIA32I8x16RoundingAverageU:
287 case kIA32I8x16Abs:
288 case kIA32I8x16BitMask:
289 case kIA32I8x16Popcnt:
290 case kIA32S128Const:
291 case kIA32S128Zero:
292 case kIA32S128AllOnes:
293 case kIA32S128Not:
294 case kIA32S128And:
295 case kIA32S128Or:
296 case kIA32S128Xor:
297 case kIA32S128Select:
298 case kIA32S128AndNot:
299 case kIA32I8x16Swizzle:
300 case kIA32I8x16Shuffle:
301 case kIA32S32x4Rotate:
302 case kIA32S32x4Swizzle:
303 case kIA32S32x4Shuffle:
304 case kIA32S16x8Blend:
305 case kIA32S16x8HalfShuffle1:
306 case kIA32S16x8HalfShuffle2:
307 case kIA32S8x16Alignr:
308 case kIA32S16x8Dup:
309 case kIA32S8x16Dup:
310 case kSSES16x8UnzipHigh:
311 case kAVXS16x8UnzipHigh:
312 case kSSES16x8UnzipLow:
313 case kAVXS16x8UnzipLow:
314 case kSSES8x16UnzipHigh:
315 case kAVXS8x16UnzipHigh:
316 case kSSES8x16UnzipLow:
317 case kAVXS8x16UnzipLow:
318 case kIA32S64x2UnpackHigh:
319 case kIA32S32x4UnpackHigh:
320 case kIA32S16x8UnpackHigh:
321 case kIA32S8x16UnpackHigh:
322 case kIA32S64x2UnpackLow:
323 case kIA32S32x4UnpackLow:
324 case kIA32S16x8UnpackLow:
325 case kIA32S8x16UnpackLow:
326 case kSSES8x16TransposeLow:
327 case kAVXS8x16TransposeLow:
328 case kSSES8x16TransposeHigh:
329 case kAVXS8x16TransposeHigh:
330 case kSSES8x8Reverse:
331 case kAVXS8x8Reverse:
332 case kSSES8x4Reverse:
333 case kAVXS8x4Reverse:
334 case kSSES8x2Reverse:
335 case kAVXS8x2Reverse:
336 case kIA32S128AnyTrue:
337 case kIA32I64x2AllTrue:
338 case kIA32I32x4AllTrue:
339 case kIA32I16x8AllTrue:
340 case kIA32I8x16AllTrue:
341 return (instr->addressing_mode() == kMode_None)
344
345 case kIA32Idiv:
346 case kIA32Udiv:
347 return (instr->addressing_mode() == kMode_None)
350
351 case kIA32Movsxbl:
352 case kIA32Movzxbl:
353 case kIA32Movb:
354 case kIA32Movsxwl:
355 case kIA32Movzxwl:
356 case kIA32Movw:
357 case kIA32Movl:
358 case kIA32Movss:
359 case kIA32Movsd:
360 case kIA32Movdqu:
361 case kIA32Movlps:
362 case kIA32Movhps:
363 // Moves are used for memory load/store operations.
364 case kIA32S128Load8Splat:
365 case kIA32S128Load16Splat:
366 case kIA32S128Load32Splat:
367 case kIA32S128Load64Splat:
368 case kIA32S128Load8x8S:
369 case kIA32S128Load8x8U:
370 case kIA32S128Load16x4S:
371 case kIA32S128Load16x4U:
372 case kIA32S128Load32x2S:
373 case kIA32S128Load32x2U:
374 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
375
376 case kIA32Peek:
377 return kIsLoadOperation;
378
379 case kIA32Push:
380 case kIA32Poke:
381 case kIA32MFence:
382 case kIA32LFence:
383 return kHasSideEffect;
384
385 case kIA32Word32AtomicPairLoad:
386 return kIsLoadOperation;
387
388 case kIA32Word32ReleasePairStore:
389 case kIA32Word32SeqCstPairStore:
390 case kIA32Word32AtomicPairAdd:
391 case kIA32Word32AtomicPairSub:
392 case kIA32Word32AtomicPairAnd:
393 case kIA32Word32AtomicPairOr:
394 case kIA32Word32AtomicPairXor:
395 case kIA32Word32AtomicPairExchange:
396 case kIA32Word32AtomicPairCompareExchange:
397 return kHasSideEffect;
398
399#define CASE(Name) case k##Name:
401#undef CASE
402 // Already covered in architecture independent code.
403 UNREACHABLE();
404 }
405
406 UNREACHABLE();
407}
408
410 // Basic latency modeling for ia32 instructions. They have been determined
411 // in an empirical way.
412 switch (instr->arch_opcode()) {
413 case kFloat64Mul:
414 return 5;
415 case kIA32Imul:
416 case kIA32ImulHigh:
417 return 5;
418 case kIA32Float32Cmp:
419 case kIA32Float64Cmp:
420 return 9;
421 case kFloat32Add:
422 case kFloat32Sub:
423 case kFloat64Add:
424 case kFloat64Sub:
425 case kFloat32Abs:
426 case kFloat32Neg:
427 case kIA32Float64Max:
428 case kIA32Float64Min:
429 case kFloat64Abs:
430 case kFloat64Neg:
431 return 5;
432 case kFloat32Mul:
433 return 4;
434 case kIA32Float32ToFloat64:
435 case kIA32Float64ToFloat32:
436 return 6;
437 case kIA32Float32Round:
438 case kIA32Float64Round:
439 case kIA32Float32ToInt32:
440 case kIA32Float64ToInt32:
441 return 8;
442 case kIA32Float32ToUint32:
443 return 21;
444 case kIA32Float64ToUint32:
445 return 15;
446 case kIA32Idiv:
447 return 33;
448 case kIA32Udiv:
449 return 26;
450 case kFloat32Div:
451 return 35;
452 case kFloat64Div:
453 return 63;
454 case kIA32Float32Sqrt:
455 case kIA32Float64Sqrt:
456 return 25;
457 case kIA32Float64Mod:
458 return 50;
459 case kArchTruncateDoubleToI:
460 return 9;
461 default:
462 return 1;
463 }
464}
465
466} // namespace compiler
467} // namespace internal
468} // namespace v8
int GetTargetInstructionFlags(const Instruction *instr) const
static int GetInstructionLatency(const Instruction *instr)
#define COMMON_ARCH_OPCODE_LIST(V)
Instruction * instr
FloatBinopMask::For< FloatBinopOp::Kind::kSub, FloatRepresentation::Float64()> kFloat64Sub
Definition opmasks.h:205
FloatBinopMask::For< FloatBinopOp::Kind::kSub, FloatRepresentation::Float32()> kFloat32Sub
Definition opmasks.h:201
FloatBinopMask::For< FloatBinopOp::Kind::kMul, FloatRepresentation::Float32()> kFloat32Mul
Definition opmasks.h:203
FloatBinopMask::For< FloatBinopOp::Kind::kMul, FloatRepresentation::Float64()> kFloat64Mul
Definition opmasks.h:207
FloatUnaryMask::For< FloatUnaryOp::Kind::kAbs, FloatRepresentation::Float64()> kFloat64Abs
Definition opmasks.h:193