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 7namespace v8 { 8namespace internal { 9namespace compiler { 10 11bool InstructionScheduler::SchedulerSupported() { return true; } 12 13int InstructionScheduler::GetTargetInstructionFlags( 14 const Instruction* instr) const { 15 switch (instr->arch_opcode()) { 16 case kS390_Abs32: 17 case kS390_Abs64: 18 case kS390_And32: 19 case kS390_And64: 20 case kS390_Or32: 21 case kS390_Or64: 22 case kS390_Xor32: 23 case kS390_Xor64: 24 case kS390_ShiftLeft32: 25 case kS390_ShiftLeft64: 26 case kS390_ShiftRight32: 27 case kS390_ShiftRight64: 28 case kS390_ShiftRightArith32: 29 case kS390_ShiftRightArith64: 30 case kS390_RotRight32: 31 case kS390_RotRight64: 32 case kS390_Not32: 33 case kS390_Not64: 34 case kS390_RotLeftAndClear64: 35 case kS390_RotLeftAndClearLeft64: 36 case kS390_RotLeftAndClearRight64: 37 case kS390_Lay: 38 case kS390_Add32: 39 case kS390_Add64: 40 case kS390_AddFloat: 41 case kS390_AddDouble: 42 case kS390_Sub32: 43 case kS390_Sub64: 44 case kS390_SubFloat: 45 case kS390_SubDouble: 46 case kS390_Mul32: 47 case kS390_Mul32WithOverflow: 48 case kS390_Mul64: 49 case kS390_MulHigh32: 50 case kS390_MulHighU32: 51 case kS390_MulFloat: 52 case kS390_MulDouble: 53 case kS390_Div32: 54 case kS390_Div64: 55 case kS390_DivU32: 56 case kS390_DivU64: 57 case kS390_DivFloat: 58 case kS390_DivDouble: 59 case kS390_Mod32: 60 case kS390_Mod64: 61 case kS390_ModU32: 62 case kS390_ModU64: 63 case kS390_ModDouble: 64 case kS390_Neg32: 65 case kS390_Neg64: 66 case kS390_NegDouble: 67 case kS390_NegFloat: 68 case kS390_SqrtFloat: 69 case kS390_FloorFloat: 70 case kS390_CeilFloat: 71 case kS390_TruncateFloat: 72 case kS390_FloatNearestInt: 73 case kS390_AbsFloat: 74 case kS390_SqrtDouble: 75 case kS390_FloorDouble: 76 case kS390_CeilDouble: 77 case kS390_TruncateDouble: 78 case kS390_RoundDouble: 79 case kS390_DoubleNearestInt: 80 case kS390_MaxFloat: 81 case kS390_MaxDouble: 82 case kS390_MinFloat: 83 case kS390_MinDouble: 84 case kS390_AbsDouble: 85 case kS390_Cntlz32: 86 case kS390_Cntlz64: 87 case kS390_Popcnt32: 88 case kS390_Popcnt64: 89 case kS390_Cmp32: 90 case kS390_Cmp64: 91 case kS390_CmpFloat: 92 case kS390_CmpDouble: 93 case kS390_Tst32: 94 case kS390_Tst64: 95 case kS390_SignExtendWord8ToInt32: 96 case kS390_SignExtendWord16ToInt32: 97 case kS390_SignExtendWord8ToInt64: 98 case kS390_SignExtendWord16ToInt64: 99 case kS390_SignExtendWord32ToInt64: 100 case kS390_Uint32ToUint64: 101 case kS390_Int64ToInt32: 102 case kS390_Int64ToFloat32: 103 case kS390_Int64ToDouble: 104 case kS390_Uint64ToFloat32: 105 case kS390_Uint64ToDouble: 106 case kS390_Int32ToFloat32: 107 case kS390_Int32ToDouble: 108 case kS390_Uint32ToFloat32: 109 case kS390_Uint32ToDouble: 110 case kS390_Float32ToInt32: 111 case kS390_Float32ToUint32: 112 case kS390_Float32ToUint64: 113 case kS390_Float32ToDouble: 114 case kS390_Float64SilenceNaN: 115 case kS390_DoubleToInt32: 116 case kS390_DoubleToUint32: 117 case kS390_Float32ToInt64: 118 case kS390_DoubleToInt64: 119 case kS390_DoubleToUint64: 120 case kS390_DoubleToFloat32: 121 case kS390_DoubleExtractLowWord32: 122 case kS390_DoubleExtractHighWord32: 123 case kS390_DoubleInsertLowWord32: 124 case kS390_DoubleInsertHighWord32: 125 case kS390_DoubleConstruct: 126 case kS390_BitcastInt32ToFloat32: 127 case kS390_BitcastFloat32ToInt32: 128 case kS390_BitcastInt64ToDouble: 129 case kS390_BitcastDoubleToInt64: 130 case kS390_LoadReverse16RR: 131 case kS390_LoadReverse32RR: 132 case kS390_LoadReverse64RR: 133 case kS390_LoadReverseSimd128RR: 134 case kS390_LoadAndTestWord32: 135 case kS390_LoadAndTestWord64: 136 case kS390_LoadAndTestFloat32: 137 case kS390_LoadAndTestFloat64: 138 case kS390_F64x2Splat: 139 case kS390_F64x2ReplaceLane: 140 case kS390_F64x2Abs: 141 case kS390_F64x2Neg: 142 case kS390_F64x2Sqrt: 143 case kS390_F64x2Add: 144 case kS390_F64x2Sub: 145 case kS390_F64x2Mul: 146 case kS390_F64x2Div: 147 case kS390_F64x2Eq: 148 case kS390_F64x2Ne: 149 case kS390_F64x2Lt: 150 case kS390_F64x2Le: 151 case kS390_F64x2Min: 152 case kS390_F64x2Max: 153 case kS390_F64x2ExtractLane: 154 case kS390_F64x2Qfma: 155 case kS390_F64x2Qfms: 156 case kS390_F64x2Pmin: 157 case kS390_F64x2Pmax: 158 case kS390_F64x2Ceil: 159 case kS390_F64x2Floor: 160 case kS390_F64x2Trunc: 161 case kS390_F64x2NearestInt: 162 case kS390_F64x2ConvertLowI32x4S: 163 case kS390_F64x2ConvertLowI32x4U: 164 case kS390_F64x2PromoteLowF32x4: 165 case kS390_F32x4Splat: 166 case kS390_F32x4ExtractLane: 167 case kS390_F32x4ReplaceLane: 168 case kS390_F32x4Add: 169 case kS390_F32x4Sub: 170 case kS390_F32x4Mul: 171 case kS390_F32x4Eq: 172 case kS390_F32x4Ne: 173 case kS390_F32x4Lt: 174 case kS390_F32x4Le: 175 case kS390_F32x4Abs: 176 case kS390_F32x4Neg: 177 case kS390_F32x4RecipApprox: 178 case kS390_F32x4RecipSqrtApprox: 179 case kS390_F32x4SConvertI32x4: 180 case kS390_F32x4UConvertI32x4: 181 case kS390_F32x4Sqrt: 182 case kS390_F32x4Div: 183 case kS390_F32x4Min: 184 case kS390_F32x4Max: 185 case kS390_F32x4Qfma: 186 case kS390_F32x4Qfms: 187 case kS390_F32x4Pmin: 188 case kS390_F32x4Pmax: 189 case kS390_F32x4Ceil: 190 case kS390_F32x4Floor: 191 case kS390_F32x4Trunc: 192 case kS390_F32x4NearestInt: 193 case kS390_F32x4DemoteF64x2Zero: 194 case kS390_I64x2Neg: 195 case kS390_I64x2Add: 196 case kS390_I64x2Sub: 197 case kS390_I64x2Shl: 198 case kS390_I64x2ShrS: 199 case kS390_I64x2ShrU: 200 case kS390_I64x2Mul: 201 case kS390_I64x2Splat: 202 case kS390_I64x2ReplaceLane: 203 case kS390_I64x2ExtractLane: 204 case kS390_I64x2Eq: 205 case kS390_I64x2BitMask: 206 case kS390_I64x2ExtMulLowI32x4S: 207 case kS390_I64x2ExtMulHighI32x4S: 208 case kS390_I64x2ExtMulLowI32x4U: 209 case kS390_I64x2ExtMulHighI32x4U: 210 case kS390_I64x2SConvertI32x4Low: 211 case kS390_I64x2SConvertI32x4High: 212 case kS390_I64x2UConvertI32x4Low: 213 case kS390_I64x2UConvertI32x4High: 214 case kS390_I64x2Ne: 215 case kS390_I64x2GtS: 216 case kS390_I64x2GeS: 217 case kS390_I64x2Abs: 218 case kS390_I32x4Splat: 219 case kS390_I32x4ExtractLane: 220 case kS390_I32x4ReplaceLane: 221 case kS390_I32x4Add: 222 case kS390_I32x4Sub: 223 case kS390_I32x4Mul: 224 case kS390_I32x4MinS: 225 case kS390_I32x4MinU: 226 case kS390_I32x4MaxS: 227 case kS390_I32x4MaxU: 228 case kS390_I32x4Eq: 229 case kS390_I32x4Ne: 230 case kS390_I32x4GtS: 231 case kS390_I32x4GeS: 232 case kS390_I32x4GtU: 233 case kS390_I32x4GeU: 234 case kS390_I32x4Shl: 235 case kS390_I32x4ShrS: 236 case kS390_I32x4ShrU: 237 case kS390_I32x4Neg: 238 case kS390_I32x4SConvertF32x4: 239 case kS390_I32x4UConvertF32x4: 240 case kS390_I32x4SConvertI16x8Low: 241 case kS390_I32x4SConvertI16x8High: 242 case kS390_I32x4UConvertI16x8Low: 243 case kS390_I32x4UConvertI16x8High: 244 case kS390_I32x4Abs: 245 case kS390_I32x4BitMask: 246 case kS390_I32x4DotI16x8S: 247 case kS390_I32x4ExtMulLowI16x8S: 248 case kS390_I32x4ExtMulHighI16x8S: 249 case kS390_I32x4ExtMulLowI16x8U: 250 case kS390_I32x4ExtMulHighI16x8U: 251 case kS390_I32x4ExtAddPairwiseI16x8S: 252 case kS390_I32x4ExtAddPairwiseI16x8U: 253 case kS390_I32x4TruncSatF64x2SZero: 254 case kS390_I32x4TruncSatF64x2UZero: 255 case kS390_I16x8Splat: 256 case kS390_I16x8ExtractLaneU: 257 case kS390_I16x8ExtractLaneS: 258 case kS390_I16x8ReplaceLane: 259 case kS390_I16x8Add: 260 case kS390_I16x8Sub: 261 case kS390_I16x8Mul: 262 case kS390_I16x8MinS: 263 case kS390_I16x8MinU: 264 case kS390_I16x8MaxS: 265 case kS390_I16x8MaxU: 266 case kS390_I16x8Eq: 267 case kS390_I16x8Ne: 268 case kS390_I16x8GtS: 269 case kS390_I16x8GeS: 270 case kS390_I16x8GtU: 271 case kS390_I16x8GeU: 272 case kS390_I16x8Shl: 273 case kS390_I16x8ShrS: 274 case kS390_I16x8ShrU: 275 case kS390_I16x8Neg: 276 case kS390_I16x8SConvertI32x4: 277 case kS390_I16x8UConvertI32x4: 278 case kS390_I16x8SConvertI8x16Low: 279 case kS390_I16x8SConvertI8x16High: 280 case kS390_I16x8UConvertI8x16Low: 281 case kS390_I16x8UConvertI8x16High: 282 case kS390_I16x8AddSatS: 283 case kS390_I16x8SubSatS: 284 case kS390_I16x8AddSatU: 285 case kS390_I16x8SubSatU: 286 case kS390_I16x8RoundingAverageU: 287 case kS390_I16x8Abs: 288 case kS390_I16x8BitMask: 289 case kS390_I16x8ExtMulLowI8x16S: 290 case kS390_I16x8ExtMulHighI8x16S: 291 case kS390_I16x8ExtMulLowI8x16U: 292 case kS390_I16x8ExtMulHighI8x16U: 293 case kS390_I16x8ExtAddPairwiseI8x16S: 294 case kS390_I16x8ExtAddPairwiseI8x16U: 295 case kS390_I16x8Q15MulRSatS: 296 case kS390_I8x16Splat: 297 case kS390_I8x16ExtractLaneU: 298 case kS390_I8x16ExtractLaneS: 299 case kS390_I8x16ReplaceLane: 300 case kS390_I8x16Add: 301 case kS390_I8x16Sub: 302 case kS390_I8x16MinS: 303 case kS390_I8x16MinU: 304 case kS390_I8x16MaxS: 305 case kS390_I8x16MaxU: 306 case kS390_I8x16Eq: 307 case kS390_I8x16Ne: 308 case kS390_I8x16GtS: 309 case kS390_I8x16GeS: 310 case kS390_I8x16GtU: 311 case kS390_I8x16GeU: 312 case kS390_I8x16Shl: 313 case kS390_I8x16ShrS: 314 case kS390_I8x16ShrU: 315 case kS390_I8x16Neg: 316 case kS390_I8x16SConvertI16x8: 317 case kS390_I8x16UConvertI16x8: 318 case kS390_I8x16AddSatS: 319 case kS390_I8x16SubSatS: 320 case kS390_I8x16AddSatU: 321 case kS390_I8x16SubSatU: 322 case kS390_I8x16RoundingAverageU: 323 case kS390_I8x16Abs: 324 case kS390_I8x16BitMask: 325 case kS390_I8x16Shuffle: 326 case kS390_I8x16Swizzle: 327 case kS390_I8x16Popcnt: 328 case kS390_I64x2AllTrue: 329 case kS390_I32x4AllTrue: 330 case kS390_I16x8AllTrue: 331 case kS390_I8x16AllTrue: 332 case kS390_V128AnyTrue: 333 case kS390_S128And: 334 case kS390_S128Or: 335 case kS390_S128Xor: 336 case kS390_S128Const: 337 case kS390_S128Zero: 338 case kS390_S128AllOnes: 339 case kS390_S128Not: 340 case kS390_S128Select: 341 case kS390_S128AndNot: 342 return kNoOpcodeFlags; 343 344 case kS390_LoadWordS8: 345 case kS390_LoadWordU8: 346 case kS390_LoadWordS16: 347 case kS390_LoadWordU16: 348 case kS390_LoadWordS32: 349 case kS390_LoadWordU32: 350 case kS390_LoadWord64: 351 case kS390_LoadFloat32: 352 case kS390_LoadDouble: 353 case kS390_LoadSimd128: 354 case kS390_LoadReverse16: 355 case kS390_LoadReverse32: 356 case kS390_LoadReverse64: 357 case kS390_LoadReverseSimd128: 358 case kS390_Peek: 359 case kS390_LoadDecompressTaggedSigned: 360 case kS390_LoadDecompressTaggedPointer: 361 case kS390_LoadDecompressAnyTagged: 362 case kS390_S128Load8Splat: 363 case kS390_S128Load16Splat: 364 case kS390_S128Load32Splat: 365 case kS390_S128Load64Splat: 366 case kS390_S128Load8x8S: 367 case kS390_S128Load8x8U: 368 case kS390_S128Load16x4S: 369 case kS390_S128Load16x4U: 370 case kS390_S128Load32x2S: 371 case kS390_S128Load32x2U: 372 case kS390_S128Load32Zero: 373 case kS390_S128Load64Zero: 374 case kS390_S128Load8Lane: 375 case kS390_S128Load16Lane: 376 case kS390_S128Load32Lane: 377 case kS390_S128Load64Lane: 378 return kIsLoadOperation; 379 380 case kS390_StoreWord8: 381 case kS390_StoreWord16: 382 case kS390_StoreWord32: 383 case kS390_StoreWord64: 384 case kS390_StoreReverseSimd128: 385 case kS390_StoreReverse16: 386 case kS390_StoreReverse32: 387 case kS390_StoreReverse64: 388 case kS390_StoreFloat32: 389 case kS390_StoreDouble: 390 case kS390_StoreSimd128: 391 case kS390_StoreCompressTagged: 392 case kS390_Push: 393 case kS390_PushFrame: 394 case kS390_StoreToStackSlot: 395 case kS390_S128Store8Lane: 396 case kS390_S128Store16Lane: 397 case kS390_S128Store32Lane: 398 case kS390_S128Store64Lane: 399 return kHasSideEffect; 400 401 case kS390_Word64AtomicExchangeUint64: 402 case kS390_Word64AtomicCompareExchangeUint64: 403 case kS390_Word64AtomicAddUint64: 404 case kS390_Word64AtomicSubUint64: 405 case kS390_Word64AtomicAndUint64: 406 case kS390_Word64AtomicOrUint64: 407 case kS390_Word64AtomicXorUint64: 408 return kHasSideEffect; 409 410#define CASE(Name) case k##Name: 411 COMMON_ARCH_OPCODE_LIST(CASE) 412#undef CASE 413 // Already covered in architecture independent code. 414 UNREACHABLE(); 415 } 416 417 UNREACHABLE(); 418} 419 420int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 421 // TODO(all): Add instruction cost modeling. 422 return 1; 423} 424 425} // namespace compiler 426} // namespace internal 427} // namespace v8 428