OLD | NEW |
| (Empty) |
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 | |
163 | |
164 int InstructionScheduler::GetInstructionLatency(const Instruction* instr) { | |
165 // Basic latency modeling for arm64 instructions. They have been determined | |
166 // in an empirical way. | |
167 switch (instr->arch_opcode()) { | |
168 case kArm64Float32ToFloat64: | |
169 case kArm64Float64ToFloat32: | |
170 case kArm64Float64ToInt32: | |
171 case kArm64Float64ToUint32: | |
172 case kArm64Int32ToFloat64: | |
173 case kArm64Uint32ToFloat64: | |
174 return 3; | |
175 | |
176 case kArm64Float64Add: | |
177 case kArm64Float64Sub: | |
178 return 2; | |
179 | |
180 case kArm64Float64Mul: | |
181 return 3; | |
182 | |
183 case kArm64Float64Div: | |
184 return 6; | |
185 | |
186 case kArm64Lsl: | |
187 case kArm64Lsl32: | |
188 case kArm64Lsr: | |
189 case kArm64Lsr32: | |
190 case kArm64Asr: | |
191 case kArm64Asr32: | |
192 case kArm64Ror: | |
193 case kArm64Ror32: | |
194 return 3; | |
195 | |
196 case kCheckedLoadInt8: | |
197 case kCheckedLoadUint8: | |
198 case kCheckedLoadInt16: | |
199 case kCheckedLoadUint16: | |
200 case kCheckedLoadWord32: | |
201 case kCheckedLoadWord64: | |
202 case kCheckedLoadFloat32: | |
203 case kCheckedLoadFloat64: | |
204 case kArm64LdrS: | |
205 case kArm64LdrD: | |
206 case kArm64Ldrb: | |
207 case kArm64Ldrsb: | |
208 case kArm64Ldrh: | |
209 case kArm64Ldrsh: | |
210 case kArm64LdrW: | |
211 case kArm64Ldr: | |
212 return 5; | |
213 | |
214 default: | |
215 return 1; | |
216 } | |
217 } | |
218 | |
219 } // namespace compiler | |
220 } // namespace internal | |
221 } // namespace v8 | |
OLD | NEW |