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 kArmAdd: 17 case kArmAnd: 18 case kArmBic: 19 case kArmClz: 20 case kArmCmp: 21 case kArmCmn: 22 case kArmTst: 23 case kArmTeq: 24 case kArmOrr: 25 case kArmEor: 26 case kArmSub: 27 case kArmRsb: 28 case kArmMul: 29 case kArmMla: 30 case kArmMls: 31 case kArmSmmul: 32 case kArmSmull: 33 case kArmSmmla: 34 case kArmUmull: 35 case kArmSdiv: 36 case kArmUdiv: 37 case kArmMov: 38 case kArmMvn: 39 case kArmBfc: 40 case kArmUbfx: 41 case kArmSbfx: 42 case kArmSxtb: 43 case kArmSxth: 44 case kArmSxtab: 45 case kArmSxtah: 46 case kArmUxtb: 47 case kArmUxth: 48 case kArmUxtab: 49 case kArmUxtah: 50 case kArmRbit: 51 case kArmRev: 52 case kArmAddPair: 53 case kArmSubPair: 54 case kArmMulPair: 55 case kArmLslPair: 56 case kArmLsrPair: 57 case kArmAsrPair: 58 case kArmVcmpF32: 59 case kArmVaddF32: 60 case kArmVsubF32: 61 case kArmVmulF32: 62 case kArmVmlaF32: 63 case kArmVmlsF32: 64 case kArmVdivF32: 65 case kArmVabsF32: 66 case kArmVnegF32: 67 case kArmVsqrtF32: 68 case kArmVcmpF64: 69 case kArmVaddF64: 70 case kArmVsubF64: 71 case kArmVmulF64: 72 case kArmVmlaF64: 73 case kArmVmlsF64: 74 case kArmVdivF64: 75 case kArmVmodF64: 76 case kArmVabsF64: 77 case kArmVnegF64: 78 case kArmVsqrtF64: 79 case kArmVmullLow: 80 case kArmVmullHigh: 81 case kArmVrintmF32: 82 case kArmVrintmF64: 83 case kArmVrintpF32: 84 case kArmVrintpF64: 85 case kArmVrintzF32: 86 case kArmVrintzF64: 87 case kArmVrintaF64: 88 case kArmVrintnF32: 89 case kArmVrintnF64: 90 case kArmVcvtF32F64: 91 case kArmVcvtF64F32: 92 case kArmVcvtF32S32: 93 case kArmVcvtF32U32: 94 case kArmVcvtF64S32: 95 case kArmVcvtF64U32: 96 case kArmVcvtS32F32: 97 case kArmVcvtU32F32: 98 case kArmVcvtS32F64: 99 case kArmVcvtU32F64: 100 case kArmVmovU32F32: 101 case kArmVmovF32U32: 102 case kArmVmovLowU32F64: 103 case kArmVmovLowF64U32: 104 case kArmVmovHighU32F64: 105 case kArmVmovHighF64U32: 106 case kArmVmovF64U32U32: 107 case kArmVmovU32U32F64: 108 case kArmVcnt: 109 case kArmVpadal: 110 case kArmVpaddl: 111 case kArmFloat32Max: 112 case kArmFloat64Max: 113 case kArmFloat32Min: 114 case kArmFloat64Min: 115 case kArmFloat64SilenceNaN: 116 case kArmF64x2Splat: 117 case kArmF64x2ExtractLane: 118 case kArmF64x2ReplaceLane: 119 case kArmF64x2Abs: 120 case kArmF64x2Neg: 121 case kArmF64x2Sqrt: 122 case kArmF64x2Add: 123 case kArmF64x2Sub: 124 case kArmF64x2Mul: 125 case kArmF64x2Div: 126 case kArmF64x2Min: 127 case kArmF64x2Max: 128 case kArmF64x2Eq: 129 case kArmF64x2Ne: 130 case kArmF64x2Lt: 131 case kArmF64x2Le: 132 case kArmF64x2Pmin: 133 case kArmF64x2Pmax: 134 case kArmF64x2Ceil: 135 case kArmF64x2Floor: 136 case kArmF64x2Trunc: 137 case kArmF64x2NearestInt: 138 case kArmF64x2ConvertLowI32x4S: 139 case kArmF64x2ConvertLowI32x4U: 140 case kArmF64x2PromoteLowF32x4: 141 case kArmF32x4Splat: 142 case kArmF32x4ExtractLane: 143 case kArmF32x4ReplaceLane: 144 case kArmF32x4SConvertI32x4: 145 case kArmF32x4UConvertI32x4: 146 case kArmF32x4Abs: 147 case kArmF32x4Neg: 148 case kArmF32x4Sqrt: 149 case kArmF32x4RecipApprox: 150 case kArmF32x4RecipSqrtApprox: 151 case kArmF32x4Add: 152 case kArmF32x4Sub: 153 case kArmF32x4Mul: 154 case kArmF32x4Div: 155 case kArmF32x4Min: 156 case kArmF32x4Max: 157 case kArmF32x4Eq: 158 case kArmF32x4Ne: 159 case kArmF32x4Lt: 160 case kArmF32x4Le: 161 case kArmF32x4Pmin: 162 case kArmF32x4Pmax: 163 case kArmF32x4DemoteF64x2Zero: 164 case kArmI64x2SplatI32Pair: 165 case kArmI64x2ReplaceLaneI32Pair: 166 case kArmI64x2Abs: 167 case kArmI64x2Neg: 168 case kArmI64x2Shl: 169 case kArmI64x2ShrS: 170 case kArmI64x2Add: 171 case kArmI64x2Sub: 172 case kArmI64x2Mul: 173 case kArmI64x2ShrU: 174 case kArmI64x2BitMask: 175 case kArmI64x2Eq: 176 case kArmI64x2Ne: 177 case kArmI64x2GtS: 178 case kArmI64x2GeS: 179 case kArmI64x2SConvertI32x4Low: 180 case kArmI64x2SConvertI32x4High: 181 case kArmI64x2UConvertI32x4Low: 182 case kArmI64x2UConvertI32x4High: 183 case kArmI32x4Splat: 184 case kArmI32x4ExtractLane: 185 case kArmI32x4ReplaceLane: 186 case kArmI32x4SConvertF32x4: 187 case kArmI32x4SConvertI16x8Low: 188 case kArmI32x4SConvertI16x8High: 189 case kArmI32x4Neg: 190 case kArmI32x4Shl: 191 case kArmI32x4ShrS: 192 case kArmI32x4Add: 193 case kArmI32x4Sub: 194 case kArmI32x4Mul: 195 case kArmI32x4MinS: 196 case kArmI32x4MaxS: 197 case kArmI32x4Eq: 198 case kArmI32x4Ne: 199 case kArmI32x4GtS: 200 case kArmI32x4GeS: 201 case kArmI32x4UConvertF32x4: 202 case kArmI32x4UConvertI16x8Low: 203 case kArmI32x4UConvertI16x8High: 204 case kArmI32x4ShrU: 205 case kArmI32x4MinU: 206 case kArmI32x4MaxU: 207 case kArmI32x4GtU: 208 case kArmI32x4GeU: 209 case kArmI32x4Abs: 210 case kArmI32x4BitMask: 211 case kArmI32x4DotI16x8S: 212 case kArmI32x4TruncSatF64x2SZero: 213 case kArmI32x4TruncSatF64x2UZero: 214 case kArmI16x8Splat: 215 case kArmI16x8ExtractLaneS: 216 case kArmI16x8ReplaceLane: 217 case kArmI16x8SConvertI8x16Low: 218 case kArmI16x8SConvertI8x16High: 219 case kArmI16x8Neg: 220 case kArmI16x8Shl: 221 case kArmI16x8ShrS: 222 case kArmI16x8SConvertI32x4: 223 case kArmI16x8Add: 224 case kArmI16x8AddSatS: 225 case kArmI16x8Sub: 226 case kArmI16x8SubSatS: 227 case kArmI16x8Mul: 228 case kArmI16x8MinS: 229 case kArmI16x8MaxS: 230 case kArmI16x8Eq: 231 case kArmI16x8Ne: 232 case kArmI16x8GtS: 233 case kArmI16x8GeS: 234 case kArmI16x8ExtractLaneU: 235 case kArmI16x8UConvertI8x16Low: 236 case kArmI16x8UConvertI8x16High: 237 case kArmI16x8ShrU: 238 case kArmI16x8UConvertI32x4: 239 case kArmI16x8AddSatU: 240 case kArmI16x8SubSatU: 241 case kArmI16x8MinU: 242 case kArmI16x8MaxU: 243 case kArmI16x8GtU: 244 case kArmI16x8GeU: 245 case kArmI16x8RoundingAverageU: 246 case kArmI16x8Abs: 247 case kArmI16x8BitMask: 248 case kArmI16x8Q15MulRSatS: 249 case kArmI8x16Splat: 250 case kArmI8x16ExtractLaneS: 251 case kArmI8x16ReplaceLane: 252 case kArmI8x16Neg: 253 case kArmI8x16Shl: 254 case kArmI8x16ShrS: 255 case kArmI8x16SConvertI16x8: 256 case kArmI8x16Add: 257 case kArmI8x16AddSatS: 258 case kArmI8x16Sub: 259 case kArmI8x16SubSatS: 260 case kArmI8x16MinS: 261 case kArmI8x16MaxS: 262 case kArmI8x16Eq: 263 case kArmI8x16Ne: 264 case kArmI8x16GtS: 265 case kArmI8x16GeS: 266 case kArmI8x16ExtractLaneU: 267 case kArmI8x16UConvertI16x8: 268 case kArmI8x16AddSatU: 269 case kArmI8x16SubSatU: 270 case kArmI8x16ShrU: 271 case kArmI8x16MinU: 272 case kArmI8x16MaxU: 273 case kArmI8x16GtU: 274 case kArmI8x16GeU: 275 case kArmI8x16RoundingAverageU: 276 case kArmI8x16Abs: 277 case kArmI8x16BitMask: 278 case kArmS128Const: 279 case kArmS128Zero: 280 case kArmS128AllOnes: 281 case kArmS128Dup: 282 case kArmS128And: 283 case kArmS128Or: 284 case kArmS128Xor: 285 case kArmS128Not: 286 case kArmS128Select: 287 case kArmS128AndNot: 288 case kArmS32x4ZipLeft: 289 case kArmS32x4ZipRight: 290 case kArmS32x4UnzipLeft: 291 case kArmS32x4UnzipRight: 292 case kArmS32x4TransposeLeft: 293 case kArmS32x4TransposeRight: 294 case kArmS32x4Shuffle: 295 case kArmS16x8ZipLeft: 296 case kArmS16x8ZipRight: 297 case kArmS16x8UnzipLeft: 298 case kArmS16x8UnzipRight: 299 case kArmS16x8TransposeLeft: 300 case kArmS16x8TransposeRight: 301 case kArmS8x16ZipLeft: 302 case kArmS8x16ZipRight: 303 case kArmS8x16UnzipLeft: 304 case kArmS8x16UnzipRight: 305 case kArmS8x16TransposeLeft: 306 case kArmS8x16TransposeRight: 307 case kArmS8x16Concat: 308 case kArmI8x16Swizzle: 309 case kArmI8x16Shuffle: 310 case kArmS32x2Reverse: 311 case kArmS16x4Reverse: 312 case kArmS16x2Reverse: 313 case kArmS8x8Reverse: 314 case kArmS8x4Reverse: 315 case kArmS8x2Reverse: 316 case kArmI64x2AllTrue: 317 case kArmI32x4AllTrue: 318 case kArmI16x8AllTrue: 319 case kArmV128AnyTrue: 320 case kArmI8x16AllTrue: 321 return kNoOpcodeFlags; 322 323 case kArmVldrF32: 324 case kArmVldrF64: 325 case kArmVld1F64: 326 case kArmVld1S128: 327 case kArmLdrb: 328 case kArmLdrsb: 329 case kArmLdrh: 330 case kArmLdrsh: 331 case kArmLdr: 332 case kArmPeek: 333 case kArmWord32AtomicPairLoad: 334 case kArmS128Load8Splat: 335 case kArmS128Load16Splat: 336 case kArmS128Load32Splat: 337 case kArmS128Load64Splat: 338 case kArmS128Load8x8S: 339 case kArmS128Load8x8U: 340 case kArmS128Load16x4S: 341 case kArmS128Load16x4U: 342 case kArmS128Load32x2S: 343 case kArmS128Load32x2U: 344 case kArmS128Load32Zero: 345 case kArmS128Load64Zero: 346 case kArmS128LoadLaneLow: 347 case kArmS128LoadLaneHigh: 348 return kIsLoadOperation; 349 350 case kArmVstrF32: 351 case kArmVstrF64: 352 case kArmVst1F64: 353 case kArmVst1S128: 354 case kArmStrb: 355 case kArmStrh: 356 case kArmStr: 357 case kArmPush: 358 case kArmPoke: 359 case kArmDmbIsh: 360 case kArmDsbIsb: 361 case kArmWord32AtomicPairStore: 362 case kArmWord32AtomicPairAdd: 363 case kArmWord32AtomicPairSub: 364 case kArmWord32AtomicPairAnd: 365 case kArmWord32AtomicPairOr: 366 case kArmWord32AtomicPairXor: 367 case kArmWord32AtomicPairExchange: 368 case kArmWord32AtomicPairCompareExchange: 369 case kArmS128StoreLaneLow: 370 case kArmS128StoreLaneHigh: 371 return kHasSideEffect; 372 373 #define CASE(Name) case k##Name: 374 COMMON_ARCH_OPCODE_LIST(CASE) 375 #undef CASE 376 // Already covered in architecture independent code. 377 UNREACHABLE(); 378 } 379 380 UNREACHABLE(); 381 } 382 GetInstructionLatency(const Instruction * instr)383int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 384 // TODO(all): Add instruction cost modeling. 385 return 1; 386 } 387 388 } // namespace compiler 389 } // namespace internal 390 } // namespace v8 391