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 int InstructionScheduler::GetTargetInstructionFlags( 14 const Instruction* instr) const { 15 switch (instr->arch_opcode()) { 16 case kS390_And32: 17 case kS390_And64: 18 case kS390_Or32: 19 case kS390_Or64: 20 case kS390_Xor32: 21 case kS390_Xor64: 22 case kS390_ShiftLeft32: 23 case kS390_ShiftLeft64: 24 case kS390_ShiftLeftPair: 25 case kS390_ShiftRight32: 26 case kS390_ShiftRight64: 27 case kS390_ShiftRightPair: 28 case kS390_ShiftRightArith32: 29 case kS390_ShiftRightArith64: 30 case kS390_ShiftRightArithPair: 31 case kS390_RotRight32: 32 case kS390_RotRight64: 33 case kS390_Not32: 34 case kS390_Not64: 35 case kS390_RotLeftAndClear64: 36 case kS390_RotLeftAndClearLeft64: 37 case kS390_RotLeftAndClearRight64: 38 case kS390_Lay: 39 case kS390_Add32: 40 case kS390_Add64: 41 case kS390_AddPair: 42 case kS390_AddFloat: 43 case kS390_AddDouble: 44 case kS390_Sub32: 45 case kS390_Sub64: 46 case kS390_SubPair: 47 case kS390_MulPair: 48 case kS390_SubFloat: 49 case kS390_SubDouble: 50 case kS390_Mul32: 51 case kS390_Mul32WithOverflow: 52 case kS390_Mul64: 53 case kS390_MulHigh32: 54 case kS390_MulHighU32: 55 case kS390_MulFloat: 56 case kS390_MulDouble: 57 case kS390_Div32: 58 case kS390_Div64: 59 case kS390_DivU32: 60 case kS390_DivU64: 61 case kS390_DivFloat: 62 case kS390_DivDouble: 63 case kS390_Mod32: 64 case kS390_Mod64: 65 case kS390_ModU32: 66 case kS390_ModU64: 67 case kS390_ModDouble: 68 case kS390_Neg32: 69 case kS390_Neg64: 70 case kS390_NegDouble: 71 case kS390_NegFloat: 72 case kS390_SqrtFloat: 73 case kS390_FloorFloat: 74 case kS390_CeilFloat: 75 case kS390_TruncateFloat: 76 case kS390_AbsFloat: 77 case kS390_SqrtDouble: 78 case kS390_FloorDouble: 79 case kS390_CeilDouble: 80 case kS390_TruncateDouble: 81 case kS390_RoundDouble: 82 case kS390_MaxFloat: 83 case kS390_MaxDouble: 84 case kS390_MinFloat: 85 case kS390_MinDouble: 86 case kS390_AbsDouble: 87 case kS390_Cntlz32: 88 case kS390_Cntlz64: 89 case kS390_Popcnt32: 90 case kS390_Popcnt64: 91 case kS390_Cmp32: 92 case kS390_Cmp64: 93 case kS390_CmpFloat: 94 case kS390_CmpDouble: 95 case kS390_Tst32: 96 case kS390_Tst64: 97 case kS390_ExtendSignWord8: 98 case kS390_ExtendSignWord16: 99 case kS390_ExtendSignWord32: 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_LoadAndTestWord32: 134 case kS390_LoadAndTestWord64: 135 case kS390_LoadAndTestFloat32: 136 case kS390_LoadAndTestFloat64: 137 return kNoOpcodeFlags; 138 139 case kS390_LoadWordS8: 140 case kS390_LoadWordU8: 141 case kS390_LoadWordS16: 142 case kS390_LoadWordU16: 143 case kS390_LoadWordS32: 144 case kS390_LoadWordU32: 145 case kS390_LoadWord64: 146 case kS390_LoadFloat32: 147 case kS390_LoadDouble: 148 case kS390_LoadReverse16: 149 case kS390_LoadReverse32: 150 case kS390_LoadReverse64: 151 return kIsLoadOperation; 152 153 case kS390_StoreWord8: 154 case kS390_StoreWord16: 155 case kS390_StoreWord32: 156 case kS390_StoreWord64: 157 case kS390_StoreReverse16: 158 case kS390_StoreReverse32: 159 case kS390_StoreReverse64: 160 case kS390_StoreFloat32: 161 case kS390_StoreDouble: 162 case kS390_Push: 163 case kS390_PushFrame: 164 case kS390_StoreToStackSlot: 165 return kHasSideEffect; 166 167 #define CASE(Name) case k##Name: 168 COMMON_ARCH_OPCODE_LIST(CASE) 169 #undef CASE 170 // Already covered in architecture independent code. 171 UNREACHABLE(); 172 } 173 174 UNREACHABLE(); 175 return kNoOpcodeFlags; 176 } 177 178 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { 179 // TODO(all): Add instruction cost modeling. 180 return 1; 181 } 182 183 } // namespace compiler 184 } // namespace internal 185 } // namespace v8 186