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/instruction-scheduler.h" 6 7 namespace v8 { 8 namespace internal { 9 namespace compiler { 10 11 bool InstructionScheduler::SchedulerSupported() { return true; } 12 13 14 int InstructionScheduler::GetTargetInstructionFlags( 15 const Instruction* instr) const { 16 switch (instr->arch_opcode()) { 17 case kArmAdd: 18 case kArmAnd: 19 case kArmBic: 20 case kArmClz: 21 case kArmCmp: 22 case kArmCmn: 23 case kArmTst: 24 case kArmTeq: 25 case kArmOrr: 26 case kArmEor: 27 case kArmSub: 28 case kArmRsb: 29 case kArmMul: 30 case kArmMla: 31 case kArmMls: 32 case kArmSmmul: 33 case kArmSmull: 34 case kArmSmmla: 35 case kArmUmull: 36 case kArmSdiv: 37 case kArmUdiv: 38 case kArmMov: 39 case kArmMvn: 40 case kArmBfc: 41 case kArmUbfx: 42 case kArmSbfx: 43 case kArmSxtb: 44 case kArmSxth: 45 case kArmSxtab: 46 case kArmSxtah: 47 case kArmUxtb: 48 case kArmUxth: 49 case kArmUxtab: 50 case kArmUxtah: 51 case kArmRbit: 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 kArmVrintmF32: 80 case kArmVrintmF64: 81 case kArmVrintpF32: 82 case kArmVrintpF64: 83 case kArmVrintzF32: 84 case kArmVrintzF64: 85 case kArmVrintaF64: 86 case kArmVrintnF32: 87 case kArmVrintnF64: 88 case kArmVcvtF32F64: 89 case kArmVcvtF64F32: 90 case kArmVcvtF32S32: 91 case kArmVcvtF32U32: 92 case kArmVcvtF64S32: 93 case kArmVcvtF64U32: 94 case kArmVcvtS32F32: 95 case kArmVcvtU32F32: 96 case kArmVcvtS32F64: 97 case kArmVcvtU32F64: 98 case kArmVmovU32F32: 99 case kArmVmovF32U32: 100 case kArmVmovLowU32F64: 101 case kArmVmovLowF64U32: 102 case kArmVmovHighU32F64: 103 case kArmVmovHighF64U32: 104 case kArmVmovF64U32U32: 105 case kArmVmovU32U32F64: 106 case kArmFloat32Max: 107 case kArmFloat64Max: 108 case kArmFloat32Min: 109 case kArmFloat64Min: 110 case kArmFloat64SilenceNaN: 111 case kArmFloat32x4Splat: 112 case kArmFloat32x4ExtractLane: 113 case kArmFloat32x4ReplaceLane: 114 case kArmFloat32x4FromInt32x4: 115 case kArmFloat32x4FromUint32x4: 116 case kArmFloat32x4Abs: 117 case kArmFloat32x4Neg: 118 case kArmFloat32x4Add: 119 case kArmFloat32x4Sub: 120 case kArmFloat32x4Equal: 121 case kArmFloat32x4NotEqual: 122 case kArmInt32x4Splat: 123 case kArmInt32x4ExtractLane: 124 case kArmInt32x4ReplaceLane: 125 case kArmInt32x4FromFloat32x4: 126 case kArmUint32x4FromFloat32x4: 127 case kArmInt32x4Neg: 128 case kArmInt32x4ShiftLeftByScalar: 129 case kArmInt32x4ShiftRightByScalar: 130 case kArmInt32x4Add: 131 case kArmInt32x4Sub: 132 case kArmInt32x4Mul: 133 case kArmInt32x4Min: 134 case kArmInt32x4Max: 135 case kArmInt32x4Equal: 136 case kArmInt32x4NotEqual: 137 case kArmInt32x4GreaterThan: 138 case kArmInt32x4GreaterThanOrEqual: 139 case kArmUint32x4ShiftRightByScalar: 140 case kArmUint32x4Min: 141 case kArmUint32x4Max: 142 case kArmUint32x4GreaterThan: 143 case kArmUint32x4GreaterThanOrEqual: 144 case kArmInt16x8Splat: 145 case kArmInt16x8ExtractLane: 146 case kArmInt16x8ReplaceLane: 147 case kArmInt16x8Neg: 148 case kArmInt16x8ShiftLeftByScalar: 149 case kArmInt16x8ShiftRightByScalar: 150 case kArmInt16x8Add: 151 case kArmInt16x8AddSaturate: 152 case kArmInt16x8Sub: 153 case kArmInt16x8SubSaturate: 154 case kArmInt16x8Mul: 155 case kArmInt16x8Min: 156 case kArmInt16x8Max: 157 case kArmInt16x8Equal: 158 case kArmInt16x8NotEqual: 159 case kArmInt16x8GreaterThan: 160 case kArmInt16x8GreaterThanOrEqual: 161 case kArmUint16x8ShiftRightByScalar: 162 case kArmUint16x8AddSaturate: 163 case kArmUint16x8SubSaturate: 164 case kArmUint16x8Min: 165 case kArmUint16x8Max: 166 case kArmUint16x8GreaterThan: 167 case kArmUint16x8GreaterThanOrEqual: 168 case kArmInt8x16Splat: 169 case kArmInt8x16ExtractLane: 170 case kArmInt8x16ReplaceLane: 171 case kArmInt8x16Neg: 172 case kArmInt8x16ShiftLeftByScalar: 173 case kArmInt8x16ShiftRightByScalar: 174 case kArmInt8x16Add: 175 case kArmInt8x16AddSaturate: 176 case kArmInt8x16Sub: 177 case kArmInt8x16SubSaturate: 178 case kArmInt8x16Mul: 179 case kArmInt8x16Min: 180 case kArmInt8x16Max: 181 case kArmInt8x16Equal: 182 case kArmInt8x16NotEqual: 183 case kArmInt8x16GreaterThan: 184 case kArmInt8x16GreaterThanOrEqual: 185 case kArmUint8x16ShiftRightByScalar: 186 case kArmUint8x16AddSaturate: 187 case kArmUint8x16SubSaturate: 188 case kArmUint8x16Min: 189 case kArmUint8x16Max: 190 case kArmUint8x16GreaterThan: 191 case kArmUint8x16GreaterThanOrEqual: 192 case kArmSimd128And: 193 case kArmSimd128Or: 194 case kArmSimd128Xor: 195 case kArmSimd128Not: 196 case kArmSimd32x4Select: 197 case kArmSimd16x8Select: 198 case kArmSimd8x16Select: 199 return kNoOpcodeFlags; 200 201 case kArmVldrF32: 202 case kArmVldrF64: 203 case kArmLdrb: 204 case kArmLdrsb: 205 case kArmLdrh: 206 case kArmLdrsh: 207 case kArmLdr: 208 return kIsLoadOperation; 209 210 case kArmVstrF32: 211 case kArmVstrF64: 212 case kArmStrb: 213 case kArmStrh: 214 case kArmStr: 215 case kArmPush: 216 case kArmPoke: 217 return kHasSideEffect; 218 219 #define CASE(Name) case k##Name: 220 COMMON_ARCH_OPCODE_LIST(CASE) 221 #undef CASE 222 // Already covered in architecture independent code. 223 UNREACHABLE(); 224 } 225 226 UNREACHABLE(); 227 return kNoOpcodeFlags; 228 } 229 230 231 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 232 // TODO(all): Add instruction cost modeling. 233 return 1; 234 } 235 236 } // namespace compiler 237 } // namespace internal 238 } // namespace v8 239