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 kPPC_And: 17 case kPPC_AndComplement: 18 case kPPC_Or: 19 case kPPC_OrComplement: 20 case kPPC_Xor: 21 case kPPC_ShiftLeft32: 22 case kPPC_ShiftLeft64: 23 case kPPC_ShiftLeftPair: 24 case kPPC_ShiftRight32: 25 case kPPC_ShiftRight64: 26 case kPPC_ShiftRightPair: 27 case kPPC_ShiftRightAlg32: 28 case kPPC_ShiftRightAlg64: 29 case kPPC_ShiftRightAlgPair: 30 case kPPC_RotRight32: 31 case kPPC_RotRight64: 32 case kPPC_Not: 33 case kPPC_RotLeftAndMask32: 34 case kPPC_RotLeftAndClear64: 35 case kPPC_RotLeftAndClearLeft64: 36 case kPPC_RotLeftAndClearRight64: 37 case kPPC_Add32: 38 case kPPC_Add64: 39 case kPPC_AddWithOverflow32: 40 case kPPC_AddPair: 41 case kPPC_AddDouble: 42 case kPPC_Sub: 43 case kPPC_SubWithOverflow32: 44 case kPPC_SubPair: 45 case kPPC_SubDouble: 46 case kPPC_Mul32: 47 case kPPC_Mul32WithHigh32: 48 case kPPC_Mul64: 49 case kPPC_MulHigh32: 50 case kPPC_MulHighU32: 51 case kPPC_MulPair: 52 case kPPC_MulDouble: 53 case kPPC_Div32: 54 case kPPC_Div64: 55 case kPPC_DivU32: 56 case kPPC_DivU64: 57 case kPPC_DivDouble: 58 case kPPC_Mod32: 59 case kPPC_Mod64: 60 case kPPC_ModU32: 61 case kPPC_ModU64: 62 case kPPC_ModDouble: 63 case kPPC_Neg: 64 case kPPC_NegDouble: 65 case kPPC_SqrtDouble: 66 case kPPC_FloorDouble: 67 case kPPC_CeilDouble: 68 case kPPC_TruncateDouble: 69 case kPPC_RoundDouble: 70 case kPPC_MaxDouble: 71 case kPPC_MinDouble: 72 case kPPC_AbsDouble: 73 case kPPC_Cntlz32: 74 case kPPC_Cntlz64: 75 case kPPC_Popcnt32: 76 case kPPC_Popcnt64: 77 case kPPC_Cmp32: 78 case kPPC_Cmp64: 79 case kPPC_CmpDouble: 80 case kPPC_Tst32: 81 case kPPC_Tst64: 82 case kPPC_ExtendSignWord8: 83 case kPPC_ExtendSignWord16: 84 case kPPC_ExtendSignWord32: 85 case kPPC_Uint32ToUint64: 86 case kPPC_Int64ToInt32: 87 case kPPC_Int64ToFloat32: 88 case kPPC_Int64ToDouble: 89 case kPPC_Uint64ToFloat32: 90 case kPPC_Uint64ToDouble: 91 case kPPC_Int32ToFloat32: 92 case kPPC_Int32ToDouble: 93 case kPPC_Uint32ToFloat32: 94 case kPPC_Uint32ToDouble: 95 case kPPC_Float32ToInt32: 96 case kPPC_Float32ToUint32: 97 case kPPC_Float32ToDouble: 98 case kPPC_Float64SilenceNaN: 99 case kPPC_DoubleToInt32: 100 case kPPC_DoubleToUint32: 101 case kPPC_DoubleToInt64: 102 case kPPC_DoubleToUint64: 103 case kPPC_DoubleToFloat32: 104 case kPPC_DoubleExtractLowWord32: 105 case kPPC_DoubleExtractHighWord32: 106 case kPPC_DoubleInsertLowWord32: 107 case kPPC_DoubleInsertHighWord32: 108 case kPPC_DoubleConstruct: 109 case kPPC_BitcastInt32ToFloat32: 110 case kPPC_BitcastFloat32ToInt32: 111 case kPPC_BitcastInt64ToDouble: 112 case kPPC_BitcastDoubleToInt64: 113 case kPPC_ByteRev32: 114 case kPPC_ByteRev64: 115 case kPPC_F64x2Splat: 116 case kPPC_F64x2ExtractLane: 117 case kPPC_F64x2ReplaceLane: 118 case kPPC_F64x2Add: 119 case kPPC_F64x2Sub: 120 case kPPC_F64x2Mul: 121 case kPPC_F64x2Eq: 122 case kPPC_F64x2Ne: 123 case kPPC_F64x2Le: 124 case kPPC_F64x2Lt: 125 case kPPC_F64x2Abs: 126 case kPPC_F64x2Neg: 127 case kPPC_F64x2Sqrt: 128 case kPPC_F64x2Qfma: 129 case kPPC_F64x2Qfms: 130 case kPPC_F64x2Div: 131 case kPPC_F64x2Min: 132 case kPPC_F64x2Max: 133 case kPPC_F64x2Ceil: 134 case kPPC_F64x2Floor: 135 case kPPC_F64x2Trunc: 136 case kPPC_F64x2Pmin: 137 case kPPC_F64x2Pmax: 138 case kPPC_F64x2ConvertLowI32x4S: 139 case kPPC_F64x2ConvertLowI32x4U: 140 case kPPC_F64x2PromoteLowF32x4: 141 case kPPC_F32x4Splat: 142 case kPPC_F32x4ExtractLane: 143 case kPPC_F32x4ReplaceLane: 144 case kPPC_F32x4Add: 145 case kPPC_F32x4Sub: 146 case kPPC_F32x4Mul: 147 case kPPC_F32x4Eq: 148 case kPPC_F32x4Ne: 149 case kPPC_F32x4Lt: 150 case kPPC_F32x4Le: 151 case kPPC_F32x4Abs: 152 case kPPC_F32x4Neg: 153 case kPPC_F32x4RecipApprox: 154 case kPPC_F32x4RecipSqrtApprox: 155 case kPPC_F32x4Sqrt: 156 case kPPC_F32x4SConvertI32x4: 157 case kPPC_F32x4UConvertI32x4: 158 case kPPC_F32x4Qfma: 159 case kPPC_F32x4Qfms: 160 case kPPC_F32x4Div: 161 case kPPC_F32x4Min: 162 case kPPC_F32x4Max: 163 case kPPC_F32x4Ceil: 164 case kPPC_F32x4Floor: 165 case kPPC_F32x4Trunc: 166 case kPPC_F32x4Pmin: 167 case kPPC_F32x4Pmax: 168 case kPPC_F32x4DemoteF64x2Zero: 169 case kPPC_I64x2Splat: 170 case kPPC_I64x2ExtractLane: 171 case kPPC_I64x2ReplaceLane: 172 case kPPC_I64x2Add: 173 case kPPC_I64x2Sub: 174 case kPPC_I64x2Mul: 175 case kPPC_I64x2Eq: 176 case kPPC_I64x2Ne: 177 case kPPC_I64x2GtS: 178 case kPPC_I64x2GeS: 179 case kPPC_I64x2Shl: 180 case kPPC_I64x2ShrS: 181 case kPPC_I64x2ShrU: 182 case kPPC_I64x2Neg: 183 case kPPC_I64x2BitMask: 184 case kPPC_I64x2SConvertI32x4Low: 185 case kPPC_I64x2SConvertI32x4High: 186 case kPPC_I64x2UConvertI32x4Low: 187 case kPPC_I64x2UConvertI32x4High: 188 case kPPC_I64x2ExtMulLowI32x4S: 189 case kPPC_I64x2ExtMulHighI32x4S: 190 case kPPC_I64x2ExtMulLowI32x4U: 191 case kPPC_I64x2ExtMulHighI32x4U: 192 case kPPC_I64x2Abs: 193 case kPPC_I32x4Splat: 194 case kPPC_I32x4ExtractLane: 195 case kPPC_I32x4ReplaceLane: 196 case kPPC_I32x4Add: 197 case kPPC_I32x4Sub: 198 case kPPC_I32x4Mul: 199 case kPPC_I32x4MinS: 200 case kPPC_I32x4MinU: 201 case kPPC_I32x4MaxS: 202 case kPPC_I32x4MaxU: 203 case kPPC_I32x4Eq: 204 case kPPC_I32x4Ne: 205 case kPPC_I32x4GtS: 206 case kPPC_I32x4GeS: 207 case kPPC_I32x4GtU: 208 case kPPC_I32x4GeU: 209 case kPPC_I32x4Shl: 210 case kPPC_I32x4ShrS: 211 case kPPC_I32x4ShrU: 212 case kPPC_I32x4Neg: 213 case kPPC_I32x4Abs: 214 case kPPC_I32x4SConvertF32x4: 215 case kPPC_I32x4UConvertF32x4: 216 case kPPC_I32x4SConvertI16x8Low: 217 case kPPC_I32x4SConvertI16x8High: 218 case kPPC_I32x4UConvertI16x8Low: 219 case kPPC_I32x4UConvertI16x8High: 220 case kPPC_I32x4BitMask: 221 case kPPC_I32x4DotI16x8S: 222 case kPPC_I32x4ExtAddPairwiseI16x8S: 223 case kPPC_I32x4ExtAddPairwiseI16x8U: 224 case kPPC_I32x4ExtMulLowI16x8S: 225 case kPPC_I32x4ExtMulHighI16x8S: 226 case kPPC_I32x4ExtMulLowI16x8U: 227 case kPPC_I32x4ExtMulHighI16x8U: 228 case kPPC_I32x4TruncSatF64x2SZero: 229 case kPPC_I32x4TruncSatF64x2UZero: 230 case kPPC_I16x8Splat: 231 case kPPC_I16x8ExtractLaneU: 232 case kPPC_I16x8ExtractLaneS: 233 case kPPC_I16x8ReplaceLane: 234 case kPPC_I16x8Add: 235 case kPPC_I16x8Sub: 236 case kPPC_I16x8Mul: 237 case kPPC_I16x8MinS: 238 case kPPC_I16x8MinU: 239 case kPPC_I16x8MaxS: 240 case kPPC_I16x8MaxU: 241 case kPPC_I16x8Eq: 242 case kPPC_I16x8Ne: 243 case kPPC_I16x8GtS: 244 case kPPC_I16x8GeS: 245 case kPPC_I16x8GtU: 246 case kPPC_I16x8GeU: 247 case kPPC_I16x8Shl: 248 case kPPC_I16x8ShrS: 249 case kPPC_I16x8ShrU: 250 case kPPC_I16x8Neg: 251 case kPPC_I16x8Abs: 252 case kPPC_I16x8SConvertI32x4: 253 case kPPC_I16x8UConvertI32x4: 254 case kPPC_I16x8SConvertI8x16Low: 255 case kPPC_I16x8SConvertI8x16High: 256 case kPPC_I16x8UConvertI8x16Low: 257 case kPPC_I16x8UConvertI8x16High: 258 case kPPC_I16x8AddSatS: 259 case kPPC_I16x8SubSatS: 260 case kPPC_I16x8AddSatU: 261 case kPPC_I16x8SubSatU: 262 case kPPC_I16x8RoundingAverageU: 263 case kPPC_I16x8BitMask: 264 case kPPC_I16x8ExtAddPairwiseI8x16S: 265 case kPPC_I16x8ExtAddPairwiseI8x16U: 266 case kPPC_I16x8Q15MulRSatS: 267 case kPPC_I16x8ExtMulLowI8x16S: 268 case kPPC_I16x8ExtMulHighI8x16S: 269 case kPPC_I16x8ExtMulLowI8x16U: 270 case kPPC_I16x8ExtMulHighI8x16U: 271 case kPPC_I8x16Splat: 272 case kPPC_I8x16ExtractLaneU: 273 case kPPC_I8x16ExtractLaneS: 274 case kPPC_I8x16ReplaceLane: 275 case kPPC_I8x16Add: 276 case kPPC_I8x16Sub: 277 case kPPC_I8x16MinS: 278 case kPPC_I8x16MinU: 279 case kPPC_I8x16MaxS: 280 case kPPC_I8x16MaxU: 281 case kPPC_I8x16Eq: 282 case kPPC_I8x16Ne: 283 case kPPC_I8x16GtS: 284 case kPPC_I8x16GeS: 285 case kPPC_I8x16GtU: 286 case kPPC_I8x16GeU: 287 case kPPC_I8x16Shl: 288 case kPPC_I8x16ShrS: 289 case kPPC_I8x16ShrU: 290 case kPPC_I8x16Neg: 291 case kPPC_I8x16Abs: 292 case kPPC_I8x16SConvertI16x8: 293 case kPPC_I8x16UConvertI16x8: 294 case kPPC_I8x16AddSatS: 295 case kPPC_I8x16SubSatS: 296 case kPPC_I8x16AddSatU: 297 case kPPC_I8x16SubSatU: 298 case kPPC_I8x16RoundingAverageU: 299 case kPPC_I8x16Shuffle: 300 case kPPC_I8x16Swizzle: 301 case kPPC_I8x16BitMask: 302 case kPPC_I8x16Popcnt: 303 case kPPC_I64x2AllTrue: 304 case kPPC_I32x4AllTrue: 305 case kPPC_I16x8AllTrue: 306 case kPPC_I8x16AllTrue: 307 case kPPC_V128AnyTrue: 308 case kPPC_S128And: 309 case kPPC_S128Or: 310 case kPPC_S128Xor: 311 case kPPC_S128Const: 312 case kPPC_S128Zero: 313 case kPPC_S128AllOnes: 314 case kPPC_S128Not: 315 case kPPC_S128Select: 316 case kPPC_S128AndNot: 317 case kPPC_LoadReverseSimd128RR: 318 return kNoOpcodeFlags; 319 320 case kPPC_LoadWordS8: 321 case kPPC_LoadWordU8: 322 case kPPC_LoadWordS16: 323 case kPPC_LoadWordU16: 324 case kPPC_LoadWordS32: 325 case kPPC_LoadWordU32: 326 case kPPC_LoadByteRev32: 327 case kPPC_LoadWord64: 328 case kPPC_LoadByteRev64: 329 case kPPC_LoadFloat32: 330 case kPPC_LoadDouble: 331 case kPPC_LoadSimd128: 332 case kPPC_Peek: 333 case kPPC_LoadDecompressTaggedSigned: 334 case kPPC_LoadDecompressTaggedPointer: 335 case kPPC_LoadDecompressAnyTagged: 336 case kPPC_S128Load8Splat: 337 case kPPC_S128Load16Splat: 338 case kPPC_S128Load32Splat: 339 case kPPC_S128Load64Splat: 340 case kPPC_S128Load8x8S: 341 case kPPC_S128Load8x8U: 342 case kPPC_S128Load16x4S: 343 case kPPC_S128Load16x4U: 344 case kPPC_S128Load32x2S: 345 case kPPC_S128Load32x2U: 346 case kPPC_S128Load32Zero: 347 case kPPC_S128Load64Zero: 348 case kPPC_S128Load8Lane: 349 case kPPC_S128Load16Lane: 350 case kPPC_S128Load32Lane: 351 case kPPC_S128Load64Lane: 352 return kIsLoadOperation; 353 354 case kPPC_StoreWord8: 355 case kPPC_StoreWord16: 356 case kPPC_StoreWord32: 357 case kPPC_StoreByteRev32: 358 case kPPC_StoreWord64: 359 case kPPC_StoreByteRev64: 360 case kPPC_StoreFloat32: 361 case kPPC_StoreDouble: 362 case kPPC_StoreSimd128: 363 case kPPC_StoreCompressTagged: 364 case kPPC_Push: 365 case kPPC_PushFrame: 366 case kPPC_StoreToStackSlot: 367 case kPPC_Sync: 368 case kPPC_S128Store8Lane: 369 case kPPC_S128Store16Lane: 370 case kPPC_S128Store32Lane: 371 case kPPC_S128Store64Lane: 372 return kHasSideEffect; 373 374 case kPPC_AtomicExchangeUint8: 375 case kPPC_AtomicExchangeUint16: 376 case kPPC_AtomicExchangeWord32: 377 case kPPC_AtomicExchangeWord64: 378 case kPPC_AtomicCompareExchangeUint8: 379 case kPPC_AtomicCompareExchangeUint16: 380 case kPPC_AtomicCompareExchangeWord32: 381 case kPPC_AtomicCompareExchangeWord64: 382 case kPPC_AtomicAddUint8: 383 case kPPC_AtomicAddUint16: 384 case kPPC_AtomicAddUint32: 385 case kPPC_AtomicAddUint64: 386 case kPPC_AtomicAddInt8: 387 case kPPC_AtomicAddInt16: 388 case kPPC_AtomicAddInt32: 389 case kPPC_AtomicAddInt64: 390 case kPPC_AtomicSubUint8: 391 case kPPC_AtomicSubUint16: 392 case kPPC_AtomicSubUint32: 393 case kPPC_AtomicSubUint64: 394 case kPPC_AtomicSubInt8: 395 case kPPC_AtomicSubInt16: 396 case kPPC_AtomicSubInt32: 397 case kPPC_AtomicSubInt64: 398 case kPPC_AtomicAndUint8: 399 case kPPC_AtomicAndUint16: 400 case kPPC_AtomicAndUint32: 401 case kPPC_AtomicAndUint64: 402 case kPPC_AtomicAndInt8: 403 case kPPC_AtomicAndInt16: 404 case kPPC_AtomicAndInt32: 405 case kPPC_AtomicAndInt64: 406 case kPPC_AtomicOrUint8: 407 case kPPC_AtomicOrUint16: 408 case kPPC_AtomicOrUint32: 409 case kPPC_AtomicOrUint64: 410 case kPPC_AtomicOrInt8: 411 case kPPC_AtomicOrInt16: 412 case kPPC_AtomicOrInt32: 413 case kPPC_AtomicOrInt64: 414 case kPPC_AtomicXorUint8: 415 case kPPC_AtomicXorUint16: 416 case kPPC_AtomicXorUint32: 417 case kPPC_AtomicXorUint64: 418 case kPPC_AtomicXorInt8: 419 case kPPC_AtomicXorInt16: 420 case kPPC_AtomicXorInt32: 421 case kPPC_AtomicXorInt64: 422 return kHasSideEffect; 423 424 #define CASE(Name) case k##Name: 425 COMMON_ARCH_OPCODE_LIST(CASE) 426 #undef CASE 427 // Already covered in architecture independent code. 428 UNREACHABLE(); 429 } 430 431 UNREACHABLE(); 432 } 433 GetInstructionLatency(const Instruction * instr)434int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 435 // TODO(all): Add instruction cost modeling. 436 return 1; 437 } 438 439 } // namespace compiler 440 } // namespace internal 441 } // namespace v8 442