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
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11bool InstructionScheduler::SchedulerSupported() { return true; }
12
13
14int 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 kArmSmmla:
34    case kArmUmull:
35    case kArmSdiv:
36    case kArmUdiv:
37    case kArmMov:
38    case kArmMvn:
39    case kArmBfc:
40    case kArmUbfx:
41    case kArmSxtb:
42    case kArmSxth:
43    case kArmSxtab:
44    case kArmSxtah:
45    case kArmUxtb:
46    case kArmUxth:
47    case kArmUxtab:
48    case kArmUxtah:
49    case kArmVcmpF32:
50    case kArmVaddF32:
51    case kArmVsubF32:
52    case kArmVmulF32:
53    case kArmVmlaF32:
54    case kArmVmlsF32:
55    case kArmVdivF32:
56    case kArmVabsF32:
57    case kArmVnegF32:
58    case kArmVsqrtF32:
59    case kArmVcmpF64:
60    case kArmVaddF64:
61    case kArmVsubF64:
62    case kArmVmulF64:
63    case kArmVmlaF64:
64    case kArmVmlsF64:
65    case kArmVdivF64:
66    case kArmVmodF64:
67    case kArmVabsF64:
68    case kArmVnegF64:
69    case kArmVsqrtF64:
70    case kArmVrintmF32:
71    case kArmVrintmF64:
72    case kArmVrintpF32:
73    case kArmVrintpF64:
74    case kArmVrintzF32:
75    case kArmVrintzF64:
76    case kArmVrintaF64:
77    case kArmVrintnF32:
78    case kArmVrintnF64:
79    case kArmVcvtF32F64:
80    case kArmVcvtF64F32:
81    case kArmVcvtF64S32:
82    case kArmVcvtF64U32:
83    case kArmVcvtS32F64:
84    case kArmVcvtU32F64:
85    case kArmVmovLowU32F64:
86    case kArmVmovLowF64U32:
87    case kArmVmovHighU32F64:
88    case kArmVmovHighF64U32:
89    case kArmVmovF64U32U32:
90      return kNoOpcodeFlags;
91
92    case kArmVldrF32:
93    case kArmVldrF64:
94    case kArmLdrb:
95    case kArmLdrsb:
96    case kArmLdrh:
97    case kArmLdrsh:
98    case kArmLdr:
99      return kIsLoadOperation;
100
101    case kArmVstrF32:
102    case kArmVstrF64:
103    case kArmStrb:
104    case kArmStrh:
105    case kArmStr:
106    case kArmPush:
107    case kArmPoke:
108      return kHasSideEffect;
109
110#define CASE(Name) case k##Name:
111    COMMON_ARCH_OPCODE_LIST(CASE)
112#undef CASE
113      // Already covered in architecture independent code.
114      UNREACHABLE();
115  }
116
117  UNREACHABLE();
118  return kNoOpcodeFlags;
119}
120
121
122int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
123  // TODO(all): Add instruction cost modeling.
124  return 1;
125}
126
127}  // namespace compiler
128}  // namespace internal
129}  // namespace v8
130