Home | History | Annotate | Download | only in arm64
      1 // Copyright 2014 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 kArm64Add:
     18     case kArm64Add32:
     19     case kArm64And:
     20     case kArm64And32:
     21     case kArm64Bic:
     22     case kArm64Bic32:
     23     case kArm64Clz:
     24     case kArm64Clz32:
     25     case kArm64Cmp:
     26     case kArm64Cmp32:
     27     case kArm64Cmn:
     28     case kArm64Cmn32:
     29     case kArm64Tst:
     30     case kArm64Tst32:
     31     case kArm64Or:
     32     case kArm64Or32:
     33     case kArm64Orn:
     34     case kArm64Orn32:
     35     case kArm64Eor:
     36     case kArm64Eor32:
     37     case kArm64Eon:
     38     case kArm64Eon32:
     39     case kArm64Sub:
     40     case kArm64Sub32:
     41     case kArm64Mul:
     42     case kArm64Mul32:
     43     case kArm64Smull:
     44     case kArm64Umull:
     45     case kArm64Madd:
     46     case kArm64Madd32:
     47     case kArm64Msub:
     48     case kArm64Msub32:
     49     case kArm64Mneg:
     50     case kArm64Mneg32:
     51     case kArm64Idiv:
     52     case kArm64Idiv32:
     53     case kArm64Udiv:
     54     case kArm64Udiv32:
     55     case kArm64Imod:
     56     case kArm64Imod32:
     57     case kArm64Umod:
     58     case kArm64Umod32:
     59     case kArm64Not:
     60     case kArm64Not32:
     61     case kArm64Lsl:
     62     case kArm64Lsl32:
     63     case kArm64Lsr:
     64     case kArm64Lsr32:
     65     case kArm64Asr:
     66     case kArm64Asr32:
     67     case kArm64Ror:
     68     case kArm64Ror32:
     69     case kArm64Mov32:
     70     case kArm64Sxtb32:
     71     case kArm64Sxth32:
     72     case kArm64Sxtw:
     73     case kArm64Sbfx32:
     74     case kArm64Ubfx:
     75     case kArm64Ubfx32:
     76     case kArm64Ubfiz32:
     77     case kArm64Bfi:
     78     case kArm64Float32Cmp:
     79     case kArm64Float32Add:
     80     case kArm64Float32Sub:
     81     case kArm64Float32Mul:
     82     case kArm64Float32Div:
     83     case kArm64Float32Max:
     84     case kArm64Float32Min:
     85     case kArm64Float32Abs:
     86     case kArm64Float32Sqrt:
     87     case kArm64Float32RoundDown:
     88     case kArm64Float64Cmp:
     89     case kArm64Float64Add:
     90     case kArm64Float64Sub:
     91     case kArm64Float64Mul:
     92     case kArm64Float64Div:
     93     case kArm64Float64Mod:
     94     case kArm64Float64Max:
     95     case kArm64Float64Min:
     96     case kArm64Float64Abs:
     97     case kArm64Float64Neg:
     98     case kArm64Float64Sqrt:
     99     case kArm64Float64RoundDown:
    100     case kArm64Float64RoundTiesAway:
    101     case kArm64Float64RoundTruncate:
    102     case kArm64Float64RoundTiesEven:
    103     case kArm64Float64RoundUp:
    104     case kArm64Float32RoundTiesEven:
    105     case kArm64Float32RoundTruncate:
    106     case kArm64Float32RoundUp:
    107     case kArm64Float32ToFloat64:
    108     case kArm64Float64ToFloat32:
    109     case kArm64Float64ToInt32:
    110     case kArm64Float64ToUint32:
    111     case kArm64Float32ToInt64:
    112     case kArm64Float64ToInt64:
    113     case kArm64Float32ToUint64:
    114     case kArm64Float64ToUint64:
    115     case kArm64Int32ToFloat64:
    116     case kArm64Int64ToFloat32:
    117     case kArm64Int64ToFloat64:
    118     case kArm64Uint32ToFloat64:
    119     case kArm64Uint64ToFloat32:
    120     case kArm64Uint64ToFloat64:
    121     case kArm64Float64ExtractLowWord32:
    122     case kArm64Float64ExtractHighWord32:
    123     case kArm64Float64InsertLowWord32:
    124     case kArm64Float64InsertHighWord32:
    125     case kArm64Float64MoveU64:
    126     case kArm64U64MoveFloat64:
    127       return kNoOpcodeFlags;
    128 
    129     case kArm64TestAndBranch32:
    130     case kArm64TestAndBranch:
    131     case kArm64CompareAndBranch32:
    132       return kIsBlockTerminator;
    133 
    134     case kArm64LdrS:
    135     case kArm64LdrD:
    136     case kArm64Ldrb:
    137     case kArm64Ldrsb:
    138     case kArm64Ldrh:
    139     case kArm64Ldrsh:
    140     case kArm64LdrW:
    141     case kArm64Ldr:
    142       return kIsLoadOperation;
    143 
    144     case kArm64ClaimForCallArguments:
    145     case kArm64Poke:
    146     case kArm64PokePair:
    147     case kArm64StrS:
    148     case kArm64StrD:
    149     case kArm64Strb:
    150     case kArm64Strh:
    151     case kArm64StrW:
    152     case kArm64Str:
    153       return kHasSideEffect;
    154 
    155 #define CASE(Name) case k##Name:
    156     COMMON_ARCH_OPCODE_LIST(CASE)
    157 #undef CASE
    158       // Already covered in architecture independent code.
    159       UNREACHABLE();
    160   }
    161 
    162   UNREACHABLE();
    163   return kNoOpcodeFlags;
    164 }
    165 
    166 
    167 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
    168   // Basic latency modeling for arm64 instructions. They have been determined
    169   // in an empirical way.
    170   switch (instr->arch_opcode()) {
    171     case kArm64Float32ToFloat64:
    172     case kArm64Float64ToFloat32:
    173     case kArm64Float64ToInt32:
    174     case kArm64Float64ToUint32:
    175     case kArm64Int32ToFloat64:
    176     case kArm64Uint32ToFloat64:
    177       return 3;
    178 
    179     case kArm64Float64Add:
    180     case kArm64Float64Sub:
    181       return 2;
    182 
    183     case kArm64Float64Mul:
    184       return 3;
    185 
    186     case kArm64Float64Div:
    187       return 6;
    188 
    189     case kArm64Lsl:
    190     case kArm64Lsl32:
    191     case kArm64Lsr:
    192     case kArm64Lsr32:
    193     case kArm64Asr:
    194     case kArm64Asr32:
    195     case kArm64Ror:
    196     case kArm64Ror32:
    197       return 3;
    198 
    199     case kCheckedLoadInt8:
    200     case kCheckedLoadUint8:
    201     case kCheckedLoadInt16:
    202     case kCheckedLoadUint16:
    203     case kCheckedLoadWord32:
    204     case kCheckedLoadWord64:
    205     case kCheckedLoadFloat32:
    206     case kCheckedLoadFloat64:
    207     case kArm64LdrS:
    208     case kArm64LdrD:
    209     case kArm64Ldrb:
    210     case kArm64Ldrsb:
    211     case kArm64Ldrh:
    212     case kArm64Ldrsh:
    213     case kArm64LdrW:
    214     case kArm64Ldr:
    215       return 5;
    216 
    217     default:
    218       return 1;
    219   }
    220 }
    221 
    222 }  // namespace compiler
    223 }  // namespace internal
    224 }  // namespace v8
    225