• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SchedulerSupported()11 bool InstructionScheduler::SchedulerSupported() { return true; }
12 
13 
GetTargetInstructionFlags(const Instruction * instr) const14 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 kArm64Rbit:
79     case kArm64Rbit32:
80     case kArm64Float32Cmp:
81     case kArm64Float32Add:
82     case kArm64Float32Sub:
83     case kArm64Float32Mul:
84     case kArm64Float32Div:
85     case kArm64Float32Abs:
86     case kArm64Float32Neg:
87     case kArm64Float32Sqrt:
88     case kArm64Float32RoundDown:
89     case kArm64Float32Max:
90     case kArm64Float32Min:
91     case kArm64Float64Cmp:
92     case kArm64Float64Add:
93     case kArm64Float64Sub:
94     case kArm64Float64Mul:
95     case kArm64Float64Div:
96     case kArm64Float64Mod:
97     case kArm64Float64Max:
98     case kArm64Float64Min:
99     case kArm64Float64Abs:
100     case kArm64Float64Neg:
101     case kArm64Float64Sqrt:
102     case kArm64Float64RoundDown:
103     case kArm64Float64RoundTiesAway:
104     case kArm64Float64RoundTruncate:
105     case kArm64Float64RoundTiesEven:
106     case kArm64Float64RoundUp:
107     case kArm64Float32RoundTiesEven:
108     case kArm64Float32RoundTruncate:
109     case kArm64Float32RoundUp:
110     case kArm64Float32ToFloat64:
111     case kArm64Float64ToFloat32:
112     case kArm64Float32ToInt32:
113     case kArm64Float64ToInt32:
114     case kArm64Float32ToUint32:
115     case kArm64Float64ToUint32:
116     case kArm64Float32ToInt64:
117     case kArm64Float64ToInt64:
118     case kArm64Float32ToUint64:
119     case kArm64Float64ToUint64:
120     case kArm64Int32ToFloat32:
121     case kArm64Int32ToFloat64:
122     case kArm64Int64ToFloat32:
123     case kArm64Int64ToFloat64:
124     case kArm64Uint32ToFloat32:
125     case kArm64Uint32ToFloat64:
126     case kArm64Uint64ToFloat32:
127     case kArm64Uint64ToFloat64:
128     case kArm64Float64ExtractLowWord32:
129     case kArm64Float64ExtractHighWord32:
130     case kArm64Float64InsertLowWord32:
131     case kArm64Float64InsertHighWord32:
132     case kArm64Float64MoveU64:
133     case kArm64U64MoveFloat64:
134     case kArm64Float64SilenceNaN:
135       return kNoOpcodeFlags;
136 
137     case kArm64TestAndBranch32:
138     case kArm64TestAndBranch:
139     case kArm64CompareAndBranch32:
140     case kArm64CompareAndBranch:
141       return kIsBlockTerminator;
142 
143     case kArm64LdrS:
144     case kArm64LdrD:
145     case kArm64Ldrb:
146     case kArm64Ldrsb:
147     case kArm64Ldrh:
148     case kArm64Ldrsh:
149     case kArm64Ldrsw:
150     case kArm64LdrW:
151     case kArm64Ldr:
152       return kIsLoadOperation;
153 
154     case kArm64ClaimCSP:
155     case kArm64ClaimJSSP:
156     case kArm64PokeCSP:
157     case kArm64PokeJSSP:
158     case kArm64PokePair:
159     case kArm64StrS:
160     case kArm64StrD:
161     case kArm64Strb:
162     case kArm64Strh:
163     case kArm64StrW:
164     case kArm64Str:
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 
GetInstructionLatency(const Instruction * instr)179 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
180   // Basic latency modeling for arm64 instructions. They have been determined
181   // in an empirical way.
182   switch (instr->arch_opcode()) {
183     case kArm64Add:
184     case kArm64Add32:
185     case kArm64And:
186     case kArm64And32:
187     case kArm64Bic:
188     case kArm64Bic32:
189     case kArm64Cmn:
190     case kArm64Cmn32:
191     case kArm64Cmp:
192     case kArm64Cmp32:
193     case kArm64Eon:
194     case kArm64Eon32:
195     case kArm64Eor:
196     case kArm64Eor32:
197     case kArm64Not:
198     case kArm64Not32:
199     case kArm64Or:
200     case kArm64Or32:
201     case kArm64Orn:
202     case kArm64Orn32:
203     case kArm64Sub:
204     case kArm64Sub32:
205     case kArm64Tst:
206     case kArm64Tst32:
207       if (instr->addressing_mode() != kMode_None) {
208         return 3;
209       } else {
210         return 1;
211       }
212 
213     case kArm64Clz:
214     case kArm64Clz32:
215     case kArm64Sbfx32:
216     case kArm64Sxtb32:
217     case kArm64Sxth32:
218     case kArm64Sxtw:
219     case kArm64Ubfiz32:
220     case kArm64Ubfx:
221     case kArm64Ubfx32:
222       return 1;
223 
224     case kArm64Lsl:
225     case kArm64Lsl32:
226     case kArm64Lsr:
227     case kArm64Lsr32:
228     case kArm64Asr:
229     case kArm64Asr32:
230     case kArm64Ror:
231     case kArm64Ror32:
232       return 1;
233 
234     case kArm64Ldr:
235     case kArm64LdrD:
236     case kArm64LdrS:
237     case kArm64LdrW:
238     case kArm64Ldrb:
239     case kArm64Ldrh:
240     case kArm64Ldrsb:
241     case kArm64Ldrsh:
242     case kArm64Ldrsw:
243       return 11;
244 
245     case kCheckedLoadInt8:
246     case kCheckedLoadUint8:
247     case kCheckedLoadInt16:
248     case kCheckedLoadUint16:
249     case kCheckedLoadWord32:
250     case kCheckedLoadWord64:
251     case kCheckedLoadFloat32:
252     case kCheckedLoadFloat64:
253       return 5;
254 
255     case kArm64Str:
256     case kArm64StrD:
257     case kArm64StrS:
258     case kArm64StrW:
259     case kArm64Strb:
260     case kArm64Strh:
261       return 1;
262 
263     case kCheckedStoreWord8:
264     case kCheckedStoreWord16:
265     case kCheckedStoreWord32:
266     case kCheckedStoreWord64:
267     case kCheckedStoreFloat32:
268     case kCheckedStoreFloat64:
269       return 1;
270 
271     case kArm64Madd32:
272     case kArm64Mneg32:
273     case kArm64Msub32:
274     case kArm64Mul32:
275       return 3;
276 
277     case kArm64Madd:
278     case kArm64Mneg:
279     case kArm64Msub:
280     case kArm64Mul:
281       return 5;
282 
283     case kArm64Idiv32:
284     case kArm64Udiv32:
285       return 12;
286 
287     case kArm64Idiv:
288     case kArm64Udiv:
289       return 20;
290 
291     case kArm64Float32Add:
292     case kArm64Float32Sub:
293     case kArm64Float64Add:
294     case kArm64Float64Sub:
295       return 5;
296 
297     case kArm64Float32Abs:
298     case kArm64Float32Cmp:
299     case kArm64Float32Neg:
300     case kArm64Float64Abs:
301     case kArm64Float64Cmp:
302     case kArm64Float64Neg:
303       return 3;
304 
305     case kArm64Float32Div:
306     case kArm64Float32Sqrt:
307       return 12;
308 
309     case kArm64Float64Div:
310     case kArm64Float64Sqrt:
311       return 19;
312 
313     case kArm64Float32RoundDown:
314     case kArm64Float32RoundTiesEven:
315     case kArm64Float32RoundTruncate:
316     case kArm64Float32RoundUp:
317     case kArm64Float64RoundDown:
318     case kArm64Float64RoundTiesAway:
319     case kArm64Float64RoundTiesEven:
320     case kArm64Float64RoundTruncate:
321     case kArm64Float64RoundUp:
322       return 5;
323 
324     case kArm64Float32ToFloat64:
325     case kArm64Float64ToFloat32:
326     case kArm64Float64ToInt32:
327     case kArm64Float64ToUint32:
328     case kArm64Float32ToInt64:
329     case kArm64Float64ToInt64:
330     case kArm64Float32ToUint64:
331     case kArm64Float64ToUint64:
332     case kArm64Int32ToFloat64:
333     case kArm64Int64ToFloat32:
334     case kArm64Int64ToFloat64:
335     case kArm64Uint32ToFloat64:
336     case kArm64Uint64ToFloat32:
337     case kArm64Uint64ToFloat64:
338       return 5;
339 
340     default:
341       return 2;
342   }
343 }
344 
345 }  // namespace compiler
346 }  // namespace internal
347 }  // namespace v8
348