v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
instruction-scheduler-x64.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
11bool InstructionScheduler::SchedulerSupported() { return true; }
12
14 const Instruction* instr) const {
15 switch (instr->arch_opcode()) {
16 case kX64TraceInstruction:
17 return kHasSideEffect;
18 case kX64Add:
19 case kX64Add32:
20 case kX64And:
21 case kX64And32:
22 case kX64Cmp:
23 case kX64Cmp32:
24 case kX64Cmp16:
25 case kX64Cmp8:
26 case kX64Test:
27 case kX64Test32:
28 case kX64Test16:
29 case kX64Test8:
30 case kX64Or:
31 case kX64Or32:
32 case kX64Xor:
33 case kX64Xor32:
34 case kX64Sub:
35 case kX64Sub32:
36 case kX64Imul:
37 case kX64Imul32:
38 case kX64ImulHigh32:
39 case kX64UmulHigh32:
40 case kX64ImulHigh64:
41 case kX64UmulHigh64:
42 case kX64Not:
43 case kX64Not32:
44 case kX64Neg:
45 case kX64Neg32:
46 case kX64Shl:
47 case kX64Shl32:
48 case kX64Shr:
49 case kX64Shr32:
50 case kX64Sar:
51 case kX64Sar32:
52 case kX64Rol:
53 case kX64Rol32:
54 case kX64Ror:
55 case kX64Ror32:
56 case kX64Lzcnt:
57 case kX64Lzcnt32:
58 case kX64Tzcnt:
59 case kX64Tzcnt32:
60 case kX64Popcnt:
61 case kX64Popcnt32:
62 case kX64Bswap:
63 case kX64Bswap32:
64 case kSSEFloat32Cmp:
65 case kSSEFloat32Add:
66 case kSSEFloat32Sub:
67 case kSSEFloat32Mul:
68 case kSSEFloat32Div:
69 case kSSEFloat32Sqrt:
70 case kSSEFloat32Round:
71 case kSSEFloat32ToFloat64:
72 case kSSEFloat64Cmp:
73 case kSSEFloat64Add:
74 case kSSEFloat64Sub:
75 case kSSEFloat64Mul:
76 case kSSEFloat64Div:
77 case kSSEFloat64Mod:
78 case kSSEFloat64Sqrt:
79 case kSSEFloat64Round:
80 case kSSEFloat32Max:
81 case kSSEFloat64Max:
82 case kSSEFloat32Min:
83 case kSSEFloat64Min:
84 case kSSEFloat64ToFloat32:
85 case kSSEFloat64ToFloat16RawBits:
86 case kSSEFloat16RawBitsToFloat64:
87 case kSSEFloat32ToInt32:
88 case kSSEFloat32ToUint32:
89 case kSSEFloat64ToInt32:
90 case kSSEFloat64ToUint32:
91 case kSSEFloat64ToInt64:
92 case kSSEFloat32ToInt64:
93 case kSSEFloat64ToUint64:
94 case kSSEFloat32ToUint64:
95 case kSSEInt32ToFloat64:
96 case kSSEInt32ToFloat32:
97 case kSSEInt64ToFloat32:
98 case kSSEInt64ToFloat64:
99 case kSSEUint64ToFloat32:
100 case kSSEUint64ToFloat64:
101 case kSSEUint32ToFloat64:
102 case kSSEUint32ToFloat32:
103 case kSSEFloat64ExtractLowWord32:
104 case kSSEFloat64ExtractHighWord32:
105 case kSSEFloat64InsertLowWord32:
106 case kSSEFloat64InsertHighWord32:
107 case kSSEFloat64LoadLowWord32:
108 case kSSEFloat64SilenceNaN:
109 case kAVXFloat32Cmp:
110 case kAVXFloat32Add:
111 case kAVXFloat32Sub:
112 case kAVXFloat32Mul:
113 case kAVXFloat32Div:
114 case kAVXFloat64Cmp:
115 case kAVXFloat64Add:
116 case kAVXFloat64Sub:
117 case kAVXFloat64Mul:
118 case kAVXFloat64Div:
119 case kX64Float64Abs:
120 case kX64Float64Neg:
121 case kX64Float32Abs:
122 case kX64Float32Neg:
123 case kX64BitcastFI:
124 case kX64BitcastDL:
125 case kX64BitcastIF:
126 case kX64BitcastLD:
127 case kX64Lea32:
128 case kX64Lea:
129 case kX64Dec32:
130 case kX64Inc32:
131 case kX64Pinsrb:
132 case kX64Pinsrw:
133 case kX64Pinsrd:
134 case kX64Pinsrq:
135 case kX64Cvttps2dq:
136 case kX64Cvttpd2dq:
137 case kX64I32x4TruncF64x2UZero:
138 case kX64I32x4TruncF32x4U:
139 case kX64I32x8TruncF32x8U:
140 case kX64FSplat:
141 case kX64FExtractLane:
142 case kX64FReplaceLane:
143 case kX64FAbs:
144 case kX64FNeg:
145 case kX64FSqrt:
146 case kX64FAdd:
147 case kX64FSub:
148 case kX64FMul:
149 case kX64FDiv:
150 case kX64FMin:
151 case kX64FMax:
152 case kX64FEq:
153 case kX64FNe:
154 case kX64FLt:
155 case kX64FLe:
156 case kX64F64x2Qfma:
157 case kX64F64x2Qfms:
158 case kX64F64x4Qfma:
159 case kX64F64x4Qfms:
160 case kX64Minpd:
161 case kX64Maxpd:
162 case kX64F32x8Pmin:
163 case kX64F32x8Pmax:
164 case kX64F64x4Pmin:
165 case kX64F64x4Pmax:
166 case kX64F64x2Round:
167 case kX64F64x2ConvertLowI32x4S:
168 case kX64F64x4ConvertI32x4S:
169 case kX64F64x2ConvertLowI32x4U:
170 case kX64F64x2PromoteLowF32x4:
171 case kX64F32x4SConvertI32x4:
172 case kX64F32x8SConvertI32x8:
173 case kX64F32x4UConvertI32x4:
174 case kX64F32x8UConvertI32x8:
175 case kX64F32x4Qfma:
176 case kX64F32x4Qfms:
177 case kX64F32x8Qfma:
178 case kX64F32x8Qfms:
179 case kX64Minps:
180 case kX64Maxps:
181 case kX64F32x4Round:
182 case kX64F32x4DemoteF64x2Zero:
183 case kX64F32x4DemoteF64x4:
184 case kX64F16x8Round:
185 case kX64I16x8SConvertF16x8:
186 case kX64I16x8UConvertF16x8:
187 case kX64F16x8SConvertI16x8:
188 case kX64F16x8UConvertI16x8:
189 case kX64F16x8DemoteF32x4Zero:
190 case kX64F16x8DemoteF64x2Zero:
191 case kX64F32x4PromoteLowF16x8:
192 case kX64F16x8Qfma:
193 case kX64F16x8Qfms:
194 case kX64Minph:
195 case kX64Maxph:
196 case kX64ISplat:
197 case kX64IExtractLane:
198 case kX64IAbs:
199 case kX64INeg:
200 case kX64IBitMask:
201 case kX64IShl:
202 case kX64IShrS:
203 case kX64IAdd:
204 case kX64ISub:
205 case kX64IMul:
206 case kX64IEq:
207 case kX64IGtS:
208 case kX64IGeS:
209 case kX64INe:
210 case kX64IShrU:
211 case kX64I64x2ExtMulLowI32x4S:
212 case kX64I64x2ExtMulHighI32x4S:
213 case kX64I64x4ExtMulI32x4S:
214 case kX64I64x2ExtMulLowI32x4U:
215 case kX64I64x2ExtMulHighI32x4U:
216 case kX64I64x4ExtMulI32x4U:
217 case kX64I64x2SConvertI32x4Low:
218 case kX64I64x2SConvertI32x4High:
219 case kX64I64x4SConvertI32x4:
220 case kX64I64x2UConvertI32x4Low:
221 case kX64I64x2UConvertI32x4High:
222 case kX64I64x4UConvertI32x4:
223 case kX64I32x4SConvertF32x4:
224 case kX64I32x8SConvertF32x8:
225 case kX64I32x4SConvertI16x8Low:
226 case kX64I32x4SConvertI16x8High:
227 case kX64I32x8SConvertI16x8:
228 case kX64IMinS:
229 case kX64IMaxS:
230 case kX64I32x4UConvertF32x4:
231 case kX64I32x8UConvertF32x8:
232 case kX64I32x4UConvertI16x8Low:
233 case kX64I32x4UConvertI16x8High:
234 case kX64I32x8UConvertI16x8:
235 case kX64IMinU:
236 case kX64IMaxU:
237 case kX64IGtU:
238 case kX64IGeU:
239 case kX64I32x4DotI16x8S:
240 case kX64I32x8DotI16x16S:
241 case kX64I32x4DotI8x16I7x16AddS:
242 case kX64I32x8DotI8x32I7x32AddS:
243 case kX64I32x4ExtMulLowI16x8S:
244 case kX64I32x4ExtMulHighI16x8S:
245 case kX64I32x8ExtMulI16x8S:
246 case kX64I32x4ExtMulLowI16x8U:
247 case kX64I32x4ExtMulHighI16x8U:
248 case kX64I32x8ExtMulI16x8U:
249 case kX64I32x4ExtAddPairwiseI16x8S:
250 case kX64I32x8ExtAddPairwiseI16x16S:
251 case kX64I32x4ExtAddPairwiseI16x8U:
252 case kX64I32x8ExtAddPairwiseI16x16U:
253 case kX64I32x4TruncSatF64x2SZero:
254 case kX64I32x4TruncSatF64x2UZero:
255 case kX64I32X4ShiftZeroExtendI8x16:
256 case kX64IExtractLaneS:
257 case kX64I16x8SConvertI8x16Low:
258 case kX64I16x8SConvertI8x16High:
259 case kX64I16x16SConvertI8x16:
260 case kX64I16x8SConvertI32x4:
261 case kX64I16x16SConvertI32x8:
262 case kX64IAddSatS:
263 case kX64ISubSatS:
264 case kX64I16x8UConvertI8x16Low:
265 case kX64I16x8UConvertI8x16High:
266 case kX64I16x16UConvertI8x16:
267 case kX64I16x8UConvertI32x4:
268 case kX64I16x16UConvertI32x8:
269 case kX64IAddSatU:
270 case kX64ISubSatU:
271 case kX64IRoundingAverageU:
272 case kX64I16x8ExtMulLowI8x16S:
273 case kX64I16x8ExtMulHighI8x16S:
274 case kX64I16x16ExtMulI8x16S:
275 case kX64I16x8ExtMulLowI8x16U:
276 case kX64I16x8ExtMulHighI8x16U:
277 case kX64I16x16ExtMulI8x16U:
278 case kX64I16x8ExtAddPairwiseI8x16S:
279 case kX64I16x16ExtAddPairwiseI8x32S:
280 case kX64I16x8ExtAddPairwiseI8x16U:
281 case kX64I16x16ExtAddPairwiseI8x32U:
282 case kX64I16x8Q15MulRSatS:
283 case kX64I16x8RelaxedQ15MulRS:
284 case kX64I16x8DotI8x16I7x16S:
285 case kX64I16x16DotI8x32I7x32S:
286 case kX64I8x16SConvertI16x8:
287 case kX64I8x32SConvertI16x16:
288 case kX64I8x16UConvertI16x8:
289 case kX64I8x32UConvertI16x16:
290 case kX64SAnd:
291 case kX64SOr:
292 case kX64SXor:
293 case kX64SNot:
294 case kX64SSelect:
295 case kX64S128Const:
296 case kX64S256Const:
297 case kX64SZero:
298 case kX64SAllOnes:
299 case kX64SAndNot:
300 case kX64IAllTrue:
301 case kX64I8x16Swizzle:
302 case kX64Vpshufd:
303 case kX64I8x16Shuffle:
304 case kX64I8x16Popcnt:
305 case kX64Shufps:
306 case kX64S32x4Rotate:
307 case kX64S32x4Swizzle:
308 case kX64S32x4Shuffle:
309 case kX64S16x8Blend:
310 case kX64S16x8HalfShuffle1:
311 case kX64S16x8HalfShuffle2:
312 case kX64S8x16Alignr:
313 case kX64S16x8Dup:
314 case kX64S8x16Dup:
315 case kX64S16x8UnzipHigh:
316 case kX64S16x8UnzipLow:
317 case kX64S8x16UnzipHigh:
318 case kX64S8x16UnzipLow:
319 case kX64S64x2UnpackHigh:
320 case kX64S32x4UnpackHigh:
321 case kX64S16x8UnpackHigh:
322 case kX64S8x16UnpackHigh:
323 case kX64S32x8UnpackHigh:
324 case kX64S64x2UnpackLow:
325 case kX64S32x4UnpackLow:
326 case kX64S16x8UnpackLow:
327 case kX64S8x16UnpackLow:
328 case kX64S32x8UnpackLow:
329 case kX64S8x16TransposeLow:
330 case kX64S8x16TransposeHigh:
331 case kX64S8x8Reverse:
332 case kX64S8x4Reverse:
333 case kX64S8x2Reverse:
334 case kX64V128AnyTrue:
335 case kX64Blendvpd:
336 case kX64Blendvps:
337 case kX64Pblendvb:
338 case kX64ExtractF128:
339 case kX64InsertI128:
340 return (instr->addressing_mode() == kMode_None)
343
344 case kX64Idiv:
345 case kX64Idiv32:
346 case kX64Udiv:
347 case kX64Udiv32:
348 return (instr->addressing_mode() == kMode_None)
351
352 case kX64Movsxbl:
353 case kX64Movzxbl:
354 case kX64Movsxbq:
355 case kX64Movzxbq:
356 case kX64Movsxwl:
357 case kX64Movzxwl:
358 case kX64Movsxwq:
359 case kX64Movzxwq:
360 case kX64Movsxlq:
361 DCHECK_LE(1, instr->InputCount());
362 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
364
365 case kX64Movb:
366 case kX64Movw:
367 case kX64S128Store32Lane:
368 case kX64S128Store64Lane:
369 return kHasSideEffect;
370
371 case kX64Pextrb:
372 case kX64Pextrw:
373 case kX64Movl:
374 if (instr->HasOutput()) {
375 DCHECK_LE(1, instr->InputCount());
376 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
378 } else {
379 return kHasSideEffect;
380 }
381
382 case kX64MovqDecompressTaggedSigned:
383 case kX64MovqDecompressTagged:
384 case kX64MovqDecompressProtected:
385 case kX64MovqCompressTagged:
386 case kX64MovqStoreIndirectPointer:
387 case kX64MovqDecodeSandboxedPointer:
388 case kX64MovqEncodeSandboxedPointer:
389 case kX64Movq:
390 case kX64Movsd:
391 case kX64Movss:
392 case kX64Movsh:
393 case kX64Movdqu:
394 case kX64Movdqu256:
395 case kX64S128Load8Splat:
396 case kX64S256Load8Splat:
397 case kX64S128Load16Splat:
398 case kX64S256Load16Splat:
399 case kX64S128Load32Splat:
400 case kX64S256Load32Splat:
401 case kX64S128Load64Splat:
402 case kX64S256Load64Splat:
403 case kX64S128Load8x8S:
404 case kX64S128Load8x8U:
405 case kX64S128Load16x4S:
406 case kX64S128Load16x4U:
407 case kX64S128Load32x2S:
408 case kX64S128Load32x2U:
409 case kX64S256Load8x16S:
410 case kX64S256Load8x16U:
411 case kX64S256Load8x8U:
412 case kX64S256Load16x8S:
413 case kX64S256Load16x8U:
414 case kX64S256Load32x4S:
415 case kX64S256Load32x4U:
416 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
417
418 case kX64Peek:
419 return kIsLoadOperation;
420
421 case kX64Push:
422 case kX64Poke:
423 return kHasSideEffect;
424
425 case kX64MFence:
426 case kX64LFence:
427 return kHasSideEffect;
428
429 case kX64Word64AtomicStoreWord64:
430 case kX64Word64AtomicAddUint64:
431 case kX64Word64AtomicSubUint64:
432 case kX64Word64AtomicAndUint64:
433 case kX64Word64AtomicOrUint64:
434 case kX64Word64AtomicXorUint64:
435 case kX64Word64AtomicExchangeUint64:
436 case kX64Word64AtomicCompareExchangeUint64:
437 return kHasSideEffect;
438
439#define CASE(Name) case k##Name:
441#undef CASE
442 // Already covered in architecture independent code.
443 UNREACHABLE();
444 }
445
446 UNREACHABLE();
447}
448
450 // Basic latency modeling for x64 instructions. They have been determined
451 // in an empirical way.
452 switch (instr->arch_opcode()) {
453 case kSSEFloat64Mul:
454 return 5;
455 case kX64Imul:
456 case kX64Imul32:
457 case kX64ImulHigh32:
458 case kX64UmulHigh32:
459 case kX64ImulHigh64:
460 case kX64UmulHigh64:
461 case kX64Float32Abs:
462 case kX64Float32Neg:
463 case kX64Float64Abs:
464 case kX64Float64Neg:
465 case kSSEFloat32Cmp:
466 case kSSEFloat32Add:
467 case kSSEFloat32Sub:
468 case kSSEFloat64Cmp:
469 case kSSEFloat64Add:
470 case kSSEFloat64Sub:
471 case kSSEFloat64Max:
472 case kSSEFloat64Min:
473 return 3;
474 case kSSEFloat32Mul:
475 case kSSEFloat32ToFloat64:
476 case kSSEFloat64ToFloat32:
477 case kSSEFloat32Round:
478 case kSSEFloat64Round:
479 case kSSEFloat32ToInt32:
480 case kSSEFloat32ToUint32:
481 case kSSEFloat64ToInt32:
482 case kSSEFloat64ToUint32:
483 return 4;
484 case kX64Idiv:
485 return 49;
486 case kX64Idiv32:
487 return 35;
488 case kX64Udiv:
489 return 38;
490 case kX64Udiv32:
491 return 26;
492 case kSSEFloat32Div:
493 case kSSEFloat64Div:
494 case kSSEFloat32Sqrt:
495 case kSSEFloat64Sqrt:
496 return 13;
497 case kSSEFloat32ToInt64:
498 case kSSEFloat64ToInt64:
499 case kSSEFloat32ToUint64:
500 case kSSEFloat64ToUint64:
501 case kSSEFloat64ToFloat16RawBits:
502 case kSSEFloat16RawBitsToFloat64:
503 return 10;
504 case kSSEFloat64Mod:
505 return 50;
506 case kArchTruncateDoubleToI:
507 return 6;
508 default:
509 return 1;
510 }
511}
512
513} // namespace compiler
514} // namespace internal
515} // namespace v8
int GetTargetInstructionFlags(const Instruction *instr) const
static int GetInstructionLatency(const Instruction *instr)
#define COMMON_ARCH_OPCODE_LIST(V)
Instruction * instr
#define DCHECK_LE(v1, v2)
Definition logging.h:490