Home | History | Annotate | Download | only in arm
      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