blob: ca372993b84e616f6de152753352745f7fba5a6c [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
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 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:
Ben Murdoch097c5b22016-05-18 11:27:45 +010078 case kArm64Rbit:
79 case kArm64Rbit32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 case kArm64Float32Cmp:
81 case kArm64Float32Add:
82 case kArm64Float32Sub:
83 case kArm64Float32Mul:
84 case kArm64Float32Div:
85 case kArm64Float32Max:
86 case kArm64Float32Min:
87 case kArm64Float32Abs:
88 case kArm64Float32Sqrt:
89 case kArm64Float32RoundDown:
90 case kArm64Float64Cmp:
91 case kArm64Float64Add:
92 case kArm64Float64Sub:
93 case kArm64Float64Mul:
94 case kArm64Float64Div:
95 case kArm64Float64Mod:
96 case kArm64Float64Max:
97 case kArm64Float64Min:
98 case kArm64Float64Abs:
99 case kArm64Float64Neg:
100 case kArm64Float64Sqrt:
101 case kArm64Float64RoundDown:
102 case kArm64Float64RoundTiesAway:
103 case kArm64Float64RoundTruncate:
104 case kArm64Float64RoundTiesEven:
105 case kArm64Float64RoundUp:
106 case kArm64Float32RoundTiesEven:
107 case kArm64Float32RoundTruncate:
108 case kArm64Float32RoundUp:
109 case kArm64Float32ToFloat64:
110 case kArm64Float64ToFloat32:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100111 case kArm64Float32ToInt32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000112 case kArm64Float64ToInt32:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100113 case kArm64Float32ToUint32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 case kArm64Float64ToUint32:
115 case kArm64Float32ToInt64:
116 case kArm64Float64ToInt64:
117 case kArm64Float32ToUint64:
118 case kArm64Float64ToUint64:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100119 case kArm64Int32ToFloat32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120 case kArm64Int32ToFloat64:
121 case kArm64Int64ToFloat32:
122 case kArm64Int64ToFloat64:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100123 case kArm64Uint32ToFloat32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000124 case kArm64Uint32ToFloat64:
125 case kArm64Uint64ToFloat32:
126 case kArm64Uint64ToFloat64:
127 case kArm64Float64ExtractLowWord32:
128 case kArm64Float64ExtractHighWord32:
129 case kArm64Float64InsertLowWord32:
130 case kArm64Float64InsertHighWord32:
131 case kArm64Float64MoveU64:
132 case kArm64U64MoveFloat64:
133 return kNoOpcodeFlags;
134
135 case kArm64TestAndBranch32:
136 case kArm64TestAndBranch:
137 case kArm64CompareAndBranch32:
138 return kIsBlockTerminator;
139
140 case kArm64LdrS:
141 case kArm64LdrD:
142 case kArm64Ldrb:
143 case kArm64Ldrsb:
144 case kArm64Ldrh:
145 case kArm64Ldrsh:
146 case kArm64LdrW:
147 case kArm64Ldr:
148 return kIsLoadOperation;
149
Ben Murdoch097c5b22016-05-18 11:27:45 +0100150 case kArm64ClaimCSP:
151 case kArm64ClaimJSSP:
152 case kArm64PokeCSP:
153 case kArm64PokeJSSP:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154 case kArm64PokePair:
155 case kArm64StrS:
156 case kArm64StrD:
157 case kArm64Strb:
158 case kArm64Strh:
159 case kArm64StrW:
160 case kArm64Str:
161 return kHasSideEffect;
162
163#define CASE(Name) case k##Name:
164 COMMON_ARCH_OPCODE_LIST(CASE)
165#undef CASE
166 // Already covered in architecture independent code.
167 UNREACHABLE();
168 }
169
170 UNREACHABLE();
171 return kNoOpcodeFlags;
172}
173
174
175int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
176 // Basic latency modeling for arm64 instructions. They have been determined
177 // in an empirical way.
178 switch (instr->arch_opcode()) {
179 case kArm64Float32ToFloat64:
180 case kArm64Float64ToFloat32:
181 case kArm64Float64ToInt32:
182 case kArm64Float64ToUint32:
183 case kArm64Int32ToFloat64:
184 case kArm64Uint32ToFloat64:
185 return 3;
186
187 case kArm64Float64Add:
188 case kArm64Float64Sub:
189 return 2;
190
191 case kArm64Float64Mul:
192 return 3;
193
194 case kArm64Float64Div:
195 return 6;
196
197 case kArm64Lsl:
198 case kArm64Lsl32:
199 case kArm64Lsr:
200 case kArm64Lsr32:
201 case kArm64Asr:
202 case kArm64Asr32:
203 case kArm64Ror:
204 case kArm64Ror32:
205 return 3;
206
207 case kCheckedLoadInt8:
208 case kCheckedLoadUint8:
209 case kCheckedLoadInt16:
210 case kCheckedLoadUint16:
211 case kCheckedLoadWord32:
212 case kCheckedLoadWord64:
213 case kCheckedLoadFloat32:
214 case kCheckedLoadFloat64:
215 case kArm64LdrS:
216 case kArm64LdrD:
217 case kArm64Ldrb:
218 case kArm64Ldrsb:
219 case kArm64Ldrh:
220 case kArm64Ldrsh:
221 case kArm64LdrW:
222 case kArm64Ldr:
223 return 5;
224
225 default:
226 return 1;
227 }
228}
229
230} // namespace compiler
231} // namespace internal
232} // namespace v8