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()11bool InstructionScheduler::SchedulerSupported() { return true; } 12 GetTargetInstructionFlags(const Instruction * instr) const13int InstructionScheduler::GetTargetInstructionFlags( 14 const Instruction* instr) const { 15 switch (instr->arch_opcode()) { 16 case kIA32Add: 17 case kIA32And: 18 case kIA32Cmp: 19 case kIA32Cmp16: 20 case kIA32Cmp8: 21 case kIA32Test: 22 case kIA32Test16: 23 case kIA32Test8: 24 case kIA32Or: 25 case kIA32Xor: 26 case kIA32Sub: 27 case kIA32Imul: 28 case kIA32ImulHigh: 29 case kIA32UmulHigh: 30 case kIA32Not: 31 case kIA32Neg: 32 case kIA32Shl: 33 case kIA32Shr: 34 case kIA32Sar: 35 case kIA32AddPair: 36 case kIA32SubPair: 37 case kIA32MulPair: 38 case kIA32ShlPair: 39 case kIA32ShrPair: 40 case kIA32SarPair: 41 case kIA32Rol: 42 case kIA32Ror: 43 case kIA32Lzcnt: 44 case kIA32Tzcnt: 45 case kIA32Popcnt: 46 case kIA32Bswap: 47 case kIA32Lea: 48 case kSSEFloat32Cmp: 49 case kSSEFloat32Add: 50 case kSSEFloat32Sub: 51 case kSSEFloat32Mul: 52 case kSSEFloat32Div: 53 case kSSEFloat32Abs: 54 case kSSEFloat32Neg: 55 case kSSEFloat32Sqrt: 56 case kSSEFloat32Round: 57 case kSSEFloat64Cmp: 58 case kSSEFloat64Add: 59 case kSSEFloat64Sub: 60 case kSSEFloat64Mul: 61 case kSSEFloat64Div: 62 case kSSEFloat64Mod: 63 case kSSEFloat32Max: 64 case kSSEFloat64Max: 65 case kSSEFloat32Min: 66 case kSSEFloat64Min: 67 case kSSEFloat64Abs: 68 case kSSEFloat64Neg: 69 case kSSEFloat64Sqrt: 70 case kSSEFloat64Round: 71 case kSSEFloat32ToFloat64: 72 case kSSEFloat64ToFloat32: 73 case kSSEFloat32ToInt32: 74 case kSSEFloat32ToUint32: 75 case kSSEFloat64ToInt32: 76 case kSSEFloat64ToUint32: 77 case kSSEInt32ToFloat32: 78 case kSSEUint32ToFloat32: 79 case kSSEInt32ToFloat64: 80 case kSSEUint32ToFloat64: 81 case kSSEFloat64ExtractLowWord32: 82 case kSSEFloat64ExtractHighWord32: 83 case kSSEFloat64InsertLowWord32: 84 case kSSEFloat64InsertHighWord32: 85 case kSSEFloat64LoadLowWord32: 86 case kSSEFloat64SilenceNaN: 87 case kAVXFloat32Add: 88 case kAVXFloat32Sub: 89 case kAVXFloat32Mul: 90 case kAVXFloat32Div: 91 case kAVXFloat64Add: 92 case kAVXFloat64Sub: 93 case kAVXFloat64Mul: 94 case kAVXFloat64Div: 95 case kAVXFloat64Abs: 96 case kAVXFloat64Neg: 97 case kAVXFloat32Abs: 98 case kAVXFloat32Neg: 99 case kIA32BitcastFI: 100 case kIA32BitcastIF: 101 case kSSEF64x2Splat: 102 case kAVXF64x2Splat: 103 case kSSEF64x2ExtractLane: 104 case kAVXF64x2ExtractLane: 105 case kSSEF64x2ReplaceLane: 106 case kAVXF64x2ReplaceLane: 107 case kIA32F64x2Sqrt: 108 case kIA32F64x2Add: 109 case kIA32F64x2Sub: 110 case kIA32F64x2Mul: 111 case kIA32F64x2Div: 112 case kIA32F64x2Min: 113 case kIA32F64x2Max: 114 case kIA32F64x2Eq: 115 case kIA32F64x2Ne: 116 case kIA32F64x2Lt: 117 case kIA32F64x2Le: 118 case kIA32F64x2Pmin: 119 case kIA32F64x2Pmax: 120 case kIA32F64x2Round: 121 case kIA32I64x2SplatI32Pair: 122 case kIA32I64x2ReplaceLaneI32Pair: 123 case kIA32I64x2Neg: 124 case kIA32I64x2Shl: 125 case kIA32I64x2ShrS: 126 case kIA32I64x2Add: 127 case kIA32I64x2Sub: 128 case kIA32I64x2Mul: 129 case kIA32I64x2ShrU: 130 case kSSEF32x4Splat: 131 case kAVXF32x4Splat: 132 case kSSEF32x4ExtractLane: 133 case kAVXF32x4ExtractLane: 134 case kSSEF32x4ReplaceLane: 135 case kAVXF32x4ReplaceLane: 136 case kIA32F32x4SConvertI32x4: 137 case kSSEF32x4UConvertI32x4: 138 case kAVXF32x4UConvertI32x4: 139 case kSSEF32x4Abs: 140 case kAVXF32x4Abs: 141 case kSSEF32x4Neg: 142 case kAVXF32x4Neg: 143 case kSSEF32x4Sqrt: 144 case kAVXF32x4Sqrt: 145 case kIA32F32x4RecipApprox: 146 case kIA32F32x4RecipSqrtApprox: 147 case kSSEF32x4Add: 148 case kAVXF32x4Add: 149 case kSSEF32x4AddHoriz: 150 case kAVXF32x4AddHoriz: 151 case kSSEF32x4Sub: 152 case kAVXF32x4Sub: 153 case kSSEF32x4Mul: 154 case kAVXF32x4Mul: 155 case kSSEF32x4Div: 156 case kAVXF32x4Div: 157 case kSSEF32x4Min: 158 case kAVXF32x4Min: 159 case kSSEF32x4Max: 160 case kAVXF32x4Max: 161 case kSSEF32x4Eq: 162 case kAVXF32x4Eq: 163 case kSSEF32x4Ne: 164 case kAVXF32x4Ne: 165 case kSSEF32x4Lt: 166 case kAVXF32x4Lt: 167 case kSSEF32x4Le: 168 case kAVXF32x4Le: 169 case kIA32F32x4Pmin: 170 case kIA32F32x4Pmax: 171 case kIA32F32x4Round: 172 case kIA32I32x4Splat: 173 case kIA32I32x4ExtractLane: 174 case kSSEI32x4ReplaceLane: 175 case kAVXI32x4ReplaceLane: 176 case kSSEI32x4SConvertF32x4: 177 case kAVXI32x4SConvertF32x4: 178 case kIA32I32x4SConvertI16x8Low: 179 case kIA32I32x4SConvertI16x8High: 180 case kIA32I32x4Neg: 181 case kIA32I32x4Shl: 182 case kIA32I32x4ShrS: 183 case kSSEI32x4Add: 184 case kAVXI32x4Add: 185 case kSSEI32x4AddHoriz: 186 case kAVXI32x4AddHoriz: 187 case kSSEI32x4Sub: 188 case kAVXI32x4Sub: 189 case kSSEI32x4Mul: 190 case kAVXI32x4Mul: 191 case kSSEI32x4MinS: 192 case kAVXI32x4MinS: 193 case kSSEI32x4MaxS: 194 case kAVXI32x4MaxS: 195 case kSSEI32x4Eq: 196 case kAVXI32x4Eq: 197 case kSSEI32x4Ne: 198 case kAVXI32x4Ne: 199 case kSSEI32x4GtS: 200 case kAVXI32x4GtS: 201 case kSSEI32x4GeS: 202 case kAVXI32x4GeS: 203 case kSSEI32x4UConvertF32x4: 204 case kAVXI32x4UConvertF32x4: 205 case kIA32I32x4UConvertI16x8Low: 206 case kIA32I32x4UConvertI16x8High: 207 case kIA32I32x4ShrU: 208 case kSSEI32x4MinU: 209 case kAVXI32x4MinU: 210 case kSSEI32x4MaxU: 211 case kAVXI32x4MaxU: 212 case kSSEI32x4GtU: 213 case kAVXI32x4GtU: 214 case kSSEI32x4GeU: 215 case kAVXI32x4GeU: 216 case kIA32I32x4Abs: 217 case kIA32I32x4BitMask: 218 case kIA32I32x4DotI16x8S: 219 case kIA32I16x8Splat: 220 case kIA32I16x8ExtractLaneU: 221 case kIA32I16x8ExtractLaneS: 222 case kSSEI16x8ReplaceLane: 223 case kAVXI16x8ReplaceLane: 224 case kIA32I16x8SConvertI8x16Low: 225 case kIA32I16x8SConvertI8x16High: 226 case kIA32I16x8Neg: 227 case kIA32I16x8Shl: 228 case kIA32I16x8ShrS: 229 case kSSEI16x8SConvertI32x4: 230 case kAVXI16x8SConvertI32x4: 231 case kSSEI16x8Add: 232 case kAVXI16x8Add: 233 case kSSEI16x8AddSatS: 234 case kAVXI16x8AddSatS: 235 case kSSEI16x8AddHoriz: 236 case kAVXI16x8AddHoriz: 237 case kSSEI16x8Sub: 238 case kAVXI16x8Sub: 239 case kSSEI16x8SubSatS: 240 case kAVXI16x8SubSatS: 241 case kSSEI16x8Mul: 242 case kAVXI16x8Mul: 243 case kSSEI16x8MinS: 244 case kAVXI16x8MinS: 245 case kSSEI16x8MaxS: 246 case kAVXI16x8MaxS: 247 case kSSEI16x8Eq: 248 case kAVXI16x8Eq: 249 case kSSEI16x8Ne: 250 case kAVXI16x8Ne: 251 case kSSEI16x8GtS: 252 case kAVXI16x8GtS: 253 case kSSEI16x8GeS: 254 case kAVXI16x8GeS: 255 case kIA32I16x8UConvertI8x16Low: 256 case kIA32I16x8UConvertI8x16High: 257 case kIA32I16x8ShrU: 258 case kSSEI16x8UConvertI32x4: 259 case kAVXI16x8UConvertI32x4: 260 case kSSEI16x8AddSatU: 261 case kAVXI16x8AddSatU: 262 case kSSEI16x8SubSatU: 263 case kAVXI16x8SubSatU: 264 case kSSEI16x8MinU: 265 case kAVXI16x8MinU: 266 case kSSEI16x8MaxU: 267 case kAVXI16x8MaxU: 268 case kSSEI16x8GtU: 269 case kAVXI16x8GtU: 270 case kSSEI16x8GeU: 271 case kAVXI16x8GeU: 272 case kIA32I16x8RoundingAverageU: 273 case kIA32I16x8Abs: 274 case kIA32I16x8BitMask: 275 case kIA32I8x16Splat: 276 case kIA32I8x16ExtractLaneU: 277 case kIA32I8x16ExtractLaneS: 278 case kSSEI8x16ReplaceLane: 279 case kAVXI8x16ReplaceLane: 280 case kSSEI8x16SConvertI16x8: 281 case kAVXI8x16SConvertI16x8: 282 case kIA32I8x16Neg: 283 case kIA32I8x16Shl: 284 case kIA32I8x16ShrS: 285 case kSSEI8x16Add: 286 case kAVXI8x16Add: 287 case kSSEI8x16AddSatS: 288 case kAVXI8x16AddSatS: 289 case kSSEI8x16Sub: 290 case kAVXI8x16Sub: 291 case kSSEI8x16SubSatS: 292 case kAVXI8x16SubSatS: 293 case kSSEI8x16Mul: 294 case kAVXI8x16Mul: 295 case kSSEI8x16MinS: 296 case kAVXI8x16MinS: 297 case kSSEI8x16MaxS: 298 case kAVXI8x16MaxS: 299 case kSSEI8x16Eq: 300 case kAVXI8x16Eq: 301 case kSSEI8x16Ne: 302 case kAVXI8x16Ne: 303 case kSSEI8x16GtS: 304 case kAVXI8x16GtS: 305 case kSSEI8x16GeS: 306 case kAVXI8x16GeS: 307 case kSSEI8x16UConvertI16x8: 308 case kAVXI8x16UConvertI16x8: 309 case kSSEI8x16AddSatU: 310 case kAVXI8x16AddSatU: 311 case kSSEI8x16SubSatU: 312 case kAVXI8x16SubSatU: 313 case kIA32I8x16ShrU: 314 case kSSEI8x16MinU: 315 case kAVXI8x16MinU: 316 case kSSEI8x16MaxU: 317 case kAVXI8x16MaxU: 318 case kSSEI8x16GtU: 319 case kAVXI8x16GtU: 320 case kSSEI8x16GeU: 321 case kAVXI8x16GeU: 322 case kIA32I8x16RoundingAverageU: 323 case kIA32I8x16Abs: 324 case kIA32I8x16BitMask: 325 case kIA32S128Const: 326 case kIA32S128Zero: 327 case kIA32S128AllOnes: 328 case kSSES128Not: 329 case kAVXS128Not: 330 case kSSES128And: 331 case kAVXS128And: 332 case kSSES128Or: 333 case kAVXS128Or: 334 case kSSES128Xor: 335 case kAVXS128Xor: 336 case kSSES128Select: 337 case kAVXS128Select: 338 case kIA32S128AndNot: 339 case kIA32I8x16Swizzle: 340 case kIA32I8x16Shuffle: 341 case kIA32S32x4Swizzle: 342 case kIA32S32x4Shuffle: 343 case kIA32S16x8Blend: 344 case kIA32S16x8HalfShuffle1: 345 case kIA32S16x8HalfShuffle2: 346 case kIA32S8x16Alignr: 347 case kIA32S16x8Dup: 348 case kIA32S8x16Dup: 349 case kSSES16x8UnzipHigh: 350 case kAVXS16x8UnzipHigh: 351 case kSSES16x8UnzipLow: 352 case kAVXS16x8UnzipLow: 353 case kSSES8x16UnzipHigh: 354 case kAVXS8x16UnzipHigh: 355 case kSSES8x16UnzipLow: 356 case kAVXS8x16UnzipLow: 357 case kIA32S64x2UnpackHigh: 358 case kIA32S32x4UnpackHigh: 359 case kIA32S16x8UnpackHigh: 360 case kIA32S8x16UnpackHigh: 361 case kIA32S64x2UnpackLow: 362 case kIA32S32x4UnpackLow: 363 case kIA32S16x8UnpackLow: 364 case kIA32S8x16UnpackLow: 365 case kSSES8x16TransposeLow: 366 case kAVXS8x16TransposeLow: 367 case kSSES8x16TransposeHigh: 368 case kAVXS8x16TransposeHigh: 369 case kSSES8x8Reverse: 370 case kAVXS8x8Reverse: 371 case kSSES8x4Reverse: 372 case kAVXS8x4Reverse: 373 case kSSES8x2Reverse: 374 case kAVXS8x2Reverse: 375 case kIA32V32x4AnyTrue: 376 case kIA32V32x4AllTrue: 377 case kIA32V16x8AnyTrue: 378 case kIA32V16x8AllTrue: 379 case kIA32V8x16AnyTrue: 380 case kIA32V8x16AllTrue: 381 return (instr->addressing_mode() == kMode_None) 382 ? kNoOpcodeFlags 383 : kIsLoadOperation | kHasSideEffect; 384 385 case kIA32Idiv: 386 case kIA32Udiv: 387 return (instr->addressing_mode() == kMode_None) 388 ? kMayNeedDeoptOrTrapCheck 389 : kMayNeedDeoptOrTrapCheck | kIsLoadOperation | kHasSideEffect; 390 391 case kIA32Movsxbl: 392 case kIA32Movzxbl: 393 case kIA32Movb: 394 case kIA32Movsxwl: 395 case kIA32Movzxwl: 396 case kIA32Movw: 397 case kIA32Movl: 398 case kIA32Movss: 399 case kIA32Movsd: 400 case kIA32Movdqu: 401 // Moves are used for memory load/store operations. 402 case kIA32S128Load8Splat: 403 case kIA32S128Load16Splat: 404 case kIA32S128Load32Splat: 405 case kIA32S128Load64Splat: 406 case kIA32S128Load8x8S: 407 case kIA32S128Load8x8U: 408 case kIA32S128Load16x4S: 409 case kIA32S128Load16x4U: 410 case kIA32S128Load32x2S: 411 case kIA32S128Load32x2U: 412 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect; 413 414 case kIA32Peek: 415 return kIsLoadOperation; 416 417 case kIA32Push: 418 case kIA32PushFloat32: 419 case kIA32PushFloat64: 420 case kIA32PushSimd128: 421 case kIA32Poke: 422 case kIA32MFence: 423 case kIA32LFence: 424 return kHasSideEffect; 425 426 case kIA32Word32AtomicPairLoad: 427 return kIsLoadOperation; 428 429 case kIA32Word32AtomicPairStore: 430 case kIA32Word32AtomicPairAdd: 431 case kIA32Word32AtomicPairSub: 432 case kIA32Word32AtomicPairAnd: 433 case kIA32Word32AtomicPairOr: 434 case kIA32Word32AtomicPairXor: 435 case kIA32Word32AtomicPairExchange: 436 case kIA32Word32AtomicPairCompareExchange: 437 return kHasSideEffect; 438 439 #define CASE(Name) case k##Name: 440 COMMON_ARCH_OPCODE_LIST(CASE) 441 #undef CASE 442 // Already covered in architecture independent code. 443 UNREACHABLE(); 444 } 445 446 UNREACHABLE(); 447 } 448 GetInstructionLatency(const Instruction * instr)449int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 450 // Basic latency modeling for ia32 instructions. They have been determined 451 // in an empirical way. 452 switch (instr->arch_opcode()) { 453 case kSSEFloat64Mul: 454 return 5; 455 case kIA32Imul: 456 case kIA32ImulHigh: 457 return 5; 458 case kSSEFloat32Cmp: 459 case kSSEFloat64Cmp: 460 return 9; 461 case kSSEFloat32Add: 462 case kSSEFloat32Sub: 463 case kSSEFloat32Abs: 464 case kSSEFloat32Neg: 465 case kSSEFloat64Add: 466 case kSSEFloat64Sub: 467 case kSSEFloat64Max: 468 case kSSEFloat64Min: 469 case kSSEFloat64Abs: 470 case kSSEFloat64Neg: 471 return 5; 472 case kSSEFloat32Mul: 473 return 4; 474 case kSSEFloat32ToFloat64: 475 case kSSEFloat64ToFloat32: 476 return 6; 477 case kSSEFloat32Round: 478 case kSSEFloat64Round: 479 case kSSEFloat32ToInt32: 480 case kSSEFloat64ToInt32: 481 return 8; 482 case kSSEFloat32ToUint32: 483 return 21; 484 case kSSEFloat64ToUint32: 485 return 15; 486 case kIA32Idiv: 487 return 33; 488 case kIA32Udiv: 489 return 26; 490 case kSSEFloat32Div: 491 return 35; 492 case kSSEFloat64Div: 493 return 63; 494 case kSSEFloat32Sqrt: 495 case kSSEFloat64Sqrt: 496 return 25; 497 case kSSEFloat64Mod: 498 return 50; 499 case kArchTruncateDoubleToI: 500 return 9; 501 default: 502 return 1; 503 } 504 } 505 506 } // namespace compiler 507 } // namespace internal 508 } // namespace v8 509