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 SchedulerSupported()11bool InstructionScheduler::SchedulerSupported() { return true; } 12 13 GetTargetInstructionFlags(const Instruction * instr) const14int 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 return kNoOpcodeFlags; 112 113 case kArmVldrF32: 114 case kArmVldrF64: 115 case kArmLdrb: 116 case kArmLdrsb: 117 case kArmLdrh: 118 case kArmLdrsh: 119 case kArmLdr: 120 return kIsLoadOperation; 121 122 case kArmVstrF32: 123 case kArmVstrF64: 124 case kArmStrb: 125 case kArmStrh: 126 case kArmStr: 127 case kArmPush: 128 case kArmPoke: 129 return kHasSideEffect; 130 131 #define CASE(Name) case k##Name: 132 COMMON_ARCH_OPCODE_LIST(CASE) 133 #undef CASE 134 // Already covered in architecture independent code. 135 UNREACHABLE(); 136 } 137 138 UNREACHABLE(); 139 return kNoOpcodeFlags; 140 } 141 142 GetInstructionLatency(const Instruction * instr)143int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 144 // TODO(all): Add instruction cost modeling. 145 return 1; 146 } 147 148 } // namespace compiler 149 } // namespace internal 150 } // namespace v8 151