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 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
231int 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