blob: ba1b8fd594f1307bbaa4fb4d692db729fcf02b75 [file] [log] [blame]
Ben Cheng4238ec22009-08-24 16:32:22 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "Dalvik.h"
18#include "Dataflow.h"
19#include "Loop.h"
Dan Bornsteindf4daaf2010-12-01 14:23:44 -080020#include "libdex/DexOpcodes.h"
Ben Cheng4238ec22009-08-24 16:32:22 -070021
22/*
Dan Bornstein675b6422010-11-19 16:01:25 -080023 * Main table containing data flow attributes for each bytecode. The
Dan Bornsteinccaab182010-12-03 15:32:40 -080024 * first kNumPackedOpcodes entries are for Dalvik bytecode
Dan Bornstein675b6422010-11-19 16:01:25 -080025 * instructions, where extended opcode at the MIR level are appended
26 * afterwards.
Ben Cheng4238ec22009-08-24 16:32:22 -070027 *
28 * TODO - many optimization flags are incomplete - they will only limit the
29 * scope of optimizations but will not cause mis-optimizations.
30 */
Bill Buzbee1465db52009-09-23 17:17:35 -070031int dvmCompilerDataFlowAttributes[kMirOpLast] = {
Ben Cheng4238ec22009-08-24 16:32:22 -070032 // 00 OP_NOP
33 DF_NOP,
34
35 // 01 OP_MOVE vA, vB
36 DF_DA | DF_UB | DF_IS_MOVE,
37
38 // 02 OP_MOVE_FROM16 vAA, vBBBB
39 DF_DA | DF_UB | DF_IS_MOVE,
40
41 // 03 OP_MOVE_16 vAAAA, vBBBB
42 DF_DA | DF_UB | DF_IS_MOVE,
43
44 // 04 OP_MOVE_WIDE vA, vB
45 DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
46
47 // 05 OP_MOVE_WIDE_FROM16 vAA, vBBBB
48 DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
49
50 // 06 OP_MOVE_WIDE_16 vAAAA, vBBBB
51 DF_DA_WIDE | DF_UB_WIDE | DF_IS_MOVE,
52
53 // 07 OP_MOVE_OBJECT vA, vB
54 DF_DA | DF_UB | DF_IS_MOVE,
55
56 // 08 OP_MOVE_OBJECT_FROM16 vAA, vBBBB
57 DF_DA | DF_UB | DF_IS_MOVE,
58
59 // 09 OP_MOVE_OBJECT_16 vAAAA, vBBBB
60 DF_DA | DF_UB | DF_IS_MOVE,
61
62 // 0A OP_MOVE_RESULT vAA
63 DF_DA,
64
65 // 0B OP_MOVE_RESULT_WIDE vAA
66 DF_DA_WIDE,
67
68 // 0C OP_MOVE_RESULT_OBJECT vAA
69 DF_DA,
70
71 // 0D OP_MOVE_EXCEPTION vAA
72 DF_DA,
73
74 // 0E OP_RETURN_VOID
75 DF_NOP,
76
77 // 0F OP_RETURN vAA
78 DF_UA,
79
80 // 10 OP_RETURN_WIDE vAA
81 DF_UA_WIDE,
82
83 // 11 OP_RETURN_OBJECT vAA
84 DF_UA,
85
86 // 12 OP_CONST_4 vA, #+B
87 DF_DA | DF_SETS_CONST,
88
89 // 13 OP_CONST_16 vAA, #+BBBB
90 DF_DA | DF_SETS_CONST,
91
92 // 14 OP_CONST vAA, #+BBBBBBBB
93 DF_DA | DF_SETS_CONST,
94
95 // 15 OP_CONST_HIGH16 VAA, #+BBBB0000
96 DF_DA | DF_SETS_CONST,
97
98 // 16 OP_CONST_WIDE_16 vAA, #+BBBB
99 DF_DA_WIDE | DF_SETS_CONST,
100
101 // 17 OP_CONST_WIDE_32 vAA, #+BBBBBBBB
102 DF_DA_WIDE | DF_SETS_CONST,
103
104 // 18 OP_CONST_WIDE vAA, #+BBBBBBBBBBBBBBBB
105 DF_DA_WIDE | DF_SETS_CONST,
106
107 // 19 OP_CONST_WIDE_HIGH16 vAA, #+BBBB000000000000
108 DF_DA_WIDE | DF_SETS_CONST,
109
110 // 1A OP_CONST_STRING vAA, string@BBBB
111 DF_DA,
112
113 // 1B OP_CONST_STRING_JUMBO vAA, string@BBBBBBBB
114 DF_DA,
115
116 // 1C OP_CONST_CLASS vAA, type@BBBB
117 DF_DA,
118
119 // 1D OP_MONITOR_ENTER vAA
120 DF_UA,
121
122 // 1E OP_MONITOR_EXIT vAA
123 DF_UA,
124
125 // 1F OP_CHECK_CAST vAA, type@BBBB
126 DF_UA,
127
128 // 20 OP_INSTANCE_OF vA, vB, type@CCCC
129 DF_DA | DF_UB,
130
131 // 21 OP_ARRAY_LENGTH vA, vB
132 DF_DA | DF_UB,
133
134 // 22 OP_NEW_INSTANCE vAA, type@BBBB
135 DF_DA,
136
137 // 23 OP_NEW_ARRAY vA, vB, type@CCCC
138 DF_DA | DF_UB,
139
140 // 24 OP_FILLED_NEW_ARRAY {vD, vE, vF, vG, vA}
141 DF_FORMAT_35C,
142
143 // 25 OP_FILLED_NEW_ARRAY_RANGE {vCCCC .. vNNNN}, type@BBBB
144 DF_FORMAT_3RC,
145
146 // 26 OP_FILL_ARRAY_DATA vAA, +BBBBBBBB
147 DF_UA,
148
149 // 27 OP_THROW vAA
150 DF_UA,
151
152 // 28 OP_GOTO
153 DF_NOP,
154
155 // 29 OP_GOTO_16
156 DF_NOP,
157
158 // 2A OP_GOTO_32
159 DF_NOP,
160
161 // 2B OP_PACKED_SWITCH vAA, +BBBBBBBB
162 DF_UA,
163
164 // 2C OP_SPARSE_SWITCH vAA, +BBBBBBBB
165 DF_UA,
166
167 // 2D OP_CMPL_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700168 DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700169
170 // 2E OP_CMPG_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700171 DF_DA | DF_UB | DF_UC | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700172
173 // 2F OP_CMPL_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700174 DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700175
176 // 30 OP_CMPG_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700177 DF_DA | DF_UB_WIDE | DF_UC_WIDE | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700178
179 // 31 OP_CMP_LONG vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700180 DF_DA | DF_UB_WIDE | DF_UC_WIDE,
Ben Cheng4238ec22009-08-24 16:32:22 -0700181
182 // 32 OP_IF_EQ vA, vB, +CCCC
183 DF_UA | DF_UB,
184
185 // 33 OP_IF_NE vA, vB, +CCCC
186 DF_UA | DF_UB,
187
188 // 34 OP_IF_LT vA, vB, +CCCC
189 DF_UA | DF_UB,
190
191 // 35 OP_IF_GE vA, vB, +CCCC
192 DF_UA | DF_UB,
193
194 // 36 OP_IF_GT vA, vB, +CCCC
195 DF_UA | DF_UB,
196
197 // 37 OP_IF_LE vA, vB, +CCCC
198 DF_UA | DF_UB,
199
200
201 // 38 OP_IF_EQZ vAA, +BBBB
202 DF_UA,
203
204 // 39 OP_IF_NEZ vAA, +BBBB
205 DF_UA,
206
207 // 3A OP_IF_LTZ vAA, +BBBB
208 DF_UA,
209
210 // 3B OP_IF_GEZ vAA, +BBBB
211 DF_UA,
212
213 // 3C OP_IF_GTZ vAA, +BBBB
214 DF_UA,
215
216 // 3D OP_IF_LEZ vAA, +BBBB
217 DF_UA,
218
219 // 3E OP_UNUSED_3E
220 DF_NOP,
221
222 // 3F OP_UNUSED_3F
223 DF_NOP,
224
225 // 40 OP_UNUSED_40
226 DF_NOP,
227
228 // 41 OP_UNUSED_41
229 DF_NOP,
230
231 // 42 OP_UNUSED_42
232 DF_NOP,
233
234 // 43 OP_UNUSED_43
235 DF_NOP,
236
237 // 44 OP_AGET vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700238 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700239
240 // 45 OP_AGET_WIDE vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700241 DF_DA_WIDE | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700242
243 // 46 OP_AGET_OBJECT vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700244 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700245
246 // 47 OP_AGET_BOOLEAN vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700247 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700248
249 // 48 OP_AGET_BYTE vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700250 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700251
252 // 49 OP_AGET_CHAR vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700253 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700254
255 // 4A OP_AGET_SHORT vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700256 DF_DA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_0 | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700257
258 // 4B OP_APUT vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700259 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700260
261 // 4C OP_APUT_WIDE vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700262 DF_UA_WIDE | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_2 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700263
264 // 4D OP_APUT_OBJECT vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700265 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700266
267 // 4E OP_APUT_BOOLEAN vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700268 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700269
270 // 4F OP_APUT_BYTE vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700271 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700272
273 // 50 OP_APUT_CHAR vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700274 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700275
276 // 51 OP_APUT_SHORT vAA, vBB, vCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700277 DF_UA | DF_UB | DF_UC | DF_NULL_N_RANGE_CHECK_1 | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700278
279 // 52 OP_IGET vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700280 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700281
282 // 53 OP_IGET_WIDE vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700283 DF_DA_WIDE | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700284
285 // 54 OP_IGET_OBJECT vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700286 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700287
288 // 55 OP_IGET_BOOLEAN vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700289 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700290
291 // 56 OP_IGET_BYTE vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700292 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700293
294 // 57 OP_IGET_CHAR vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700295 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700296
297 // 58 OP_IGET_SHORT vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700298 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700299
300 // 59 OP_IPUT vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700301 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700302
303 // 5A OP_IPUT_WIDE vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700304 DF_UA_WIDE | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700305
306 // 5B OP_IPUT_OBJECT vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700307 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700308
309 // 5C OP_IPUT_BOOLEAN vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700310 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700311
312 // 5D OP_IPUT_BYTE vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700313 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700314
315 // 5E OP_IPUT_CHAR vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700316 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700317
318 // 5F OP_IPUT_SHORT vA, vB, field@CCCC
Ben Cheng7a2697d2010-06-07 13:44:23 -0700319 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700320
321 // 60 OP_SGET vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700322 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700323
324 // 61 OP_SGET_WIDE vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700325 DF_DA_WIDE | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700326
327 // 62 OP_SGET_OBJECT vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700328 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700329
330 // 63 OP_SGET_BOOLEAN vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700331 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700332
333 // 64 OP_SGET_BYTE vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700334 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700335
336 // 65 OP_SGET_CHAR vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700337 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700338
339 // 66 OP_SGET_SHORT vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700340 DF_DA | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700341
342 // 67 OP_SPUT vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700343 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700344
345 // 68 OP_SPUT_WIDE vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700346 DF_UA_WIDE | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700347
348 // 69 OP_SPUT_OBJECT vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700349 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700350
351 // 6A OP_SPUT_BOOLEAN vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700352 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700353
354 // 6B OP_SPUT_BYTE vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700355 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700356
357 // 6C OP_SPUT_CHAR vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700358 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700359
360 // 6D OP_SPUT_SHORT vAA, field@BBBB
Ben Cheng7a2697d2010-06-07 13:44:23 -0700361 DF_UA | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700362
363 // 6E OP_INVOKE_VIRTUAL {vD, vE, vF, vG, vA}
364 DF_FORMAT_35C,
365
366 // 6F OP_INVOKE_SUPER {vD, vE, vF, vG, vA}
367 DF_FORMAT_35C,
368
369 // 70 OP_INVOKE_DIRECT {vD, vE, vF, vG, vA}
370 DF_FORMAT_35C,
371
372 // 71 OP_INVOKE_STATIC {vD, vE, vF, vG, vA}
373 DF_FORMAT_35C,
374
375 // 72 OP_INVOKE_INTERFACE {vD, vE, vF, vG, vA}
376 DF_FORMAT_35C,
377
378 // 73 OP_UNUSED_73
379 DF_NOP,
380
381 // 74 OP_INVOKE_VIRTUAL_RANGE {vCCCC .. vNNNN}
382 DF_FORMAT_3RC,
383
384 // 75 OP_INVOKE_SUPER_RANGE {vCCCC .. vNNNN}
385 DF_FORMAT_3RC,
386
387 // 76 OP_INVOKE_DIRECT_RANGE {vCCCC .. vNNNN}
388 DF_FORMAT_3RC,
389
390 // 77 OP_INVOKE_STATIC_RANGE {vCCCC .. vNNNN}
391 DF_FORMAT_3RC,
392
393 // 78 OP_INVOKE_INTERFACE_RANGE {vCCCC .. vNNNN}
394 DF_FORMAT_3RC,
395
396 // 79 OP_UNUSED_79
397 DF_NOP,
398
399 // 7A OP_UNUSED_7A
400 DF_NOP,
401
402 // 7B OP_NEG_INT vA, vB
403 DF_DA | DF_UB,
404
405 // 7C OP_NOT_INT vA, vB
406 DF_DA | DF_UB,
407
408 // 7D OP_NEG_LONG vA, vB
409 DF_DA_WIDE | DF_UB_WIDE,
410
411 // 7E OP_NOT_LONG vA, vB
412 DF_DA_WIDE | DF_UB_WIDE,
413
414 // 7F OP_NEG_FLOAT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700415 DF_DA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700416
417 // 80 OP_NEG_DOUBLE vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700418 DF_DA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700419
420 // 81 OP_INT_TO_LONG vA, vB
421 DF_DA_WIDE | DF_UB,
422
423 // 82 OP_INT_TO_FLOAT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700424 DF_DA | DF_UB | DF_FP_A,
Ben Cheng4238ec22009-08-24 16:32:22 -0700425
426 // 83 OP_INT_TO_DOUBLE vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700427 DF_DA_WIDE | DF_UB | DF_FP_A,
Ben Cheng4238ec22009-08-24 16:32:22 -0700428
429 // 84 OP_LONG_TO_INT vA, vB
430 DF_DA | DF_UB_WIDE,
431
432 // 85 OP_LONG_TO_FLOAT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700433 DF_DA | DF_UB_WIDE | DF_FP_A,
Ben Cheng4238ec22009-08-24 16:32:22 -0700434
435 // 86 OP_LONG_TO_DOUBLE vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700436 DF_DA_WIDE | DF_UB_WIDE | DF_FP_A,
Ben Cheng4238ec22009-08-24 16:32:22 -0700437
438 // 87 OP_FLOAT_TO_INT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700439 DF_DA | DF_UB | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700440
441 // 88 OP_FLOAT_TO_LONG vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700442 DF_DA_WIDE | DF_UB | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700443
444 // 89 OP_FLOAT_TO_DOUBLE vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700445 DF_DA_WIDE | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700446
447 // 8A OP_DOUBLE_TO_INT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700448 DF_DA | DF_UB_WIDE | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700449
450 // 8B OP_DOUBLE_TO_LONG vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700451 DF_DA_WIDE | DF_UB_WIDE | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700452
453 // 8C OP_DOUBLE_TO_FLOAT vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700454 DF_DA | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700455
456 // 8D OP_INT_TO_BYTE vA, vB
457 DF_DA | DF_UB,
458
459 // 8E OP_INT_TO_CHAR vA, vB
460 DF_DA | DF_UB,
461
462 // 8F OP_INT_TO_SHORT vA, vB
463 DF_DA | DF_UB,
464
465 // 90 OP_ADD_INT vAA, vBB, vCC
466 DF_DA | DF_UB | DF_UC | DF_IS_LINEAR,
467
468 // 91 OP_SUB_INT vAA, vBB, vCC
469 DF_DA | DF_UB | DF_UC | DF_IS_LINEAR,
470
471 // 92 OP_MUL_INT vAA, vBB, vCC
472 DF_DA | DF_UB | DF_UC,
473
474 // 93 OP_DIV_INT vAA, vBB, vCC
475 DF_DA | DF_UB | DF_UC,
476
477 // 94 OP_REM_INT vAA, vBB, vCC
478 DF_DA | DF_UB | DF_UC,
479
480 // 95 OP_AND_INT vAA, vBB, vCC
481 DF_DA | DF_UB | DF_UC,
482
483 // 96 OP_OR_INT vAA, vBB, vCC
484 DF_DA | DF_UB | DF_UC,
485
486 // 97 OP_XOR_INT vAA, vBB, vCC
487 DF_DA | DF_UB | DF_UC,
488
489 // 98 OP_SHL_INT vAA, vBB, vCC
490 DF_DA | DF_UB | DF_UC,
491
492 // 99 OP_SHR_INT vAA, vBB, vCC
493 DF_DA | DF_UB | DF_UC,
494
495 // 9A OP_USHR_INT vAA, vBB, vCC
496 DF_DA | DF_UB | DF_UC,
497
498 // 9B OP_ADD_LONG vAA, vBB, vCC
499 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
500
501 // 9C OP_SUB_LONG vAA, vBB, vCC
502 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
503
504 // 9D OP_MUL_LONG vAA, vBB, vCC
505 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
506
507 // 9E OP_DIV_LONG vAA, vBB, vCC
508 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
509
510 // 9F OP_REM_LONG vAA, vBB, vCC
511 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
512
513 // A0 OP_AND_LONG vAA, vBB, vCC
514 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
515
516 // A1 OP_OR_LONG vAA, vBB, vCC
517 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
518
519 // A2 OP_XOR_LONG vAA, vBB, vCC
520 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE,
521
522 // A3 OP_SHL_LONG vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700523 DF_DA_WIDE | DF_UB_WIDE | DF_UC,
Ben Cheng4238ec22009-08-24 16:32:22 -0700524
525 // A4 OP_SHR_LONG vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700526 DF_DA_WIDE | DF_UB_WIDE | DF_UC,
Ben Cheng4238ec22009-08-24 16:32:22 -0700527
528 // A5 OP_USHR_LONG vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700529 DF_DA_WIDE | DF_UB_WIDE | DF_UC,
Ben Cheng4238ec22009-08-24 16:32:22 -0700530
531 // A6 OP_ADD_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700532 DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700533
534 // A7 OP_SUB_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700535 DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700536
537 // A8 OP_MUL_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700538 DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700539
540 // A9 OP_DIV_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700541 DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700542
543 // AA OP_REM_FLOAT vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700544 DF_DA | DF_UB | DF_UC | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700545
546 // AB OP_ADD_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700547 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700548
549 // AC OP_SUB_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700550 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700551
552 // AD OP_MUL_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700553 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700554
555 // AE OP_DIV_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700556 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700557
558 // AF OP_REM_DOUBLE vAA, vBB, vCC
Bill Buzbee1465db52009-09-23 17:17:35 -0700559 DF_DA_WIDE | DF_UB_WIDE | DF_UC_WIDE | DF_FP_A | DF_FP_B | DF_FP_C,
Ben Cheng4238ec22009-08-24 16:32:22 -0700560
561 // B0 OP_ADD_INT_2ADDR vA, vB
562 DF_DA | DF_UA | DF_UB,
563
564 // B1 OP_SUB_INT_2ADDR vA, vB
565 DF_DA | DF_UA | DF_UB,
566
567 // B2 OP_MUL_INT_2ADDR vA, vB
568 DF_DA | DF_UA | DF_UB,
569
570 // B3 OP_DIV_INT_2ADDR vA, vB
571 DF_DA | DF_UA | DF_UB,
572
573 // B4 OP_REM_INT_2ADDR vA, vB
574 DF_DA | DF_UA | DF_UB,
575
576 // B5 OP_AND_INT_2ADDR vA, vB
577 DF_DA | DF_UA | DF_UB,
578
579 // B6 OP_OR_INT_2ADDR vA, vB
580 DF_DA | DF_UA | DF_UB,
581
582 // B7 OP_XOR_INT_2ADDR vA, vB
583 DF_DA | DF_UA | DF_UB,
584
585 // B8 OP_SHL_INT_2ADDR vA, vB
586 DF_DA | DF_UA | DF_UB,
587
588 // B9 OP_SHR_INT_2ADDR vA, vB
589 DF_DA | DF_UA | DF_UB,
590
591 // BA OP_USHR_INT_2ADDR vA, vB
592 DF_DA | DF_UA | DF_UB,
593
594 // BB OP_ADD_LONG_2ADDR vA, vB
595 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
596
597 // BC OP_SUB_LONG_2ADDR vA, vB
598 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
599
600 // BD OP_MUL_LONG_2ADDR vA, vB
601 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
602
603 // BE OP_DIV_LONG_2ADDR vA, vB
604 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
605
606 // BF OP_REM_LONG_2ADDR vA, vB
607 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
608
609 // C0 OP_AND_LONG_2ADDR vA, vB
610 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
611
612 // C1 OP_OR_LONG_2ADDR vA, vB
613 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
614
615 // C2 OP_XOR_LONG_2ADDR vA, vB
616 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE,
617
618 // C3 OP_SHL_LONG_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700619 DF_DA_WIDE | DF_UA_WIDE | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700620
621 // C4 OP_SHR_LONG_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700622 DF_DA_WIDE | DF_UA_WIDE | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700623
624 // C5 OP_USHR_LONG_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700625 DF_DA_WIDE | DF_UA_WIDE | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700626
627 // C6 OP_ADD_FLOAT_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700628 DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700629
630 // C7 OP_SUB_FLOAT_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700631 DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700632
633 // C8 OP_MUL_FLOAT_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700634 DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700635
636 // C9 OP_DIV_FLOAT_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700637 DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700638
639 // CA OP_REM_FLOAT_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700640 DF_DA | DF_UA | DF_UB | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700641
642 // CB OP_ADD_DOUBLE_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700643 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700644
645 // CC OP_SUB_DOUBLE_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700646 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700647
648 // CD OP_MUL_DOUBLE_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700649 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700650
651 // CE OP_DIV_DOUBLE_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700652 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700653
654 // CF OP_REM_DOUBLE_2ADDR vA, vB
Bill Buzbee1465db52009-09-23 17:17:35 -0700655 DF_DA_WIDE | DF_UA_WIDE | DF_UB_WIDE | DF_FP_A | DF_FP_B,
Ben Cheng4238ec22009-08-24 16:32:22 -0700656
657 // D0 OP_ADD_INT_LIT16 vA, vB, #+CCCC
658 DF_DA | DF_UB,
659
660 // D1 OP_RSUB_INT vA, vB, #+CCCC
661 DF_DA | DF_UB,
662
663 // D2 OP_MUL_INT_LIT16 vA, vB, #+CCCC
664 DF_DA | DF_UB,
665
666 // D3 OP_DIV_INT_LIT16 vA, vB, #+CCCC
667 DF_DA | DF_UB,
668
669 // D4 OP_REM_INT_LIT16 vA, vB, #+CCCC
670 DF_DA | DF_UB,
671
672 // D5 OP_AND_INT_LIT16 vA, vB, #+CCCC
673 DF_DA | DF_UB,
674
675 // D6 OP_OR_INT_LIT16 vA, vB, #+CCCC
676 DF_DA | DF_UB,
677
678 // D7 OP_XOR_INT_LIT16 vA, vB, #+CCCC
679 DF_DA | DF_UB,
680
681 // D8 OP_ADD_INT_LIT8 vAA, vBB, #+CC
682 DF_DA | DF_UB | DF_IS_LINEAR,
683
684 // D9 OP_RSUB_INT_LIT8 vAA, vBB, #+CC
685 DF_DA | DF_UB,
686
687 // DA OP_MUL_INT_LIT8 vAA, vBB, #+CC
688 DF_DA | DF_UB,
689
690 // DB OP_DIV_INT_LIT8 vAA, vBB, #+CC
691 DF_DA | DF_UB,
692
693 // DC OP_REM_INT_LIT8 vAA, vBB, #+CC
694 DF_DA | DF_UB,
695
696 // DD OP_AND_INT_LIT8 vAA, vBB, #+CC
697 DF_DA | DF_UB,
698
699 // DE OP_OR_INT_LIT8 vAA, vBB, #+CC
700 DF_DA | DF_UB,
701
702 // DF OP_XOR_INT_LIT8 vAA, vBB, #+CC
703 DF_DA | DF_UB,
704
705 // E0 OP_SHL_INT_LIT8 vAA, vBB, #+CC
706 DF_DA | DF_UB,
707
708 // E1 OP_SHR_INT_LIT8 vAA, vBB, #+CC
709 DF_DA | DF_UB,
710
711 // E2 OP_USHR_INT_LIT8 vAA, vBB, #+CC
712 DF_DA | DF_UB,
713
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700714 // E3 OP_IGET_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700715 DF_DA | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700716
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700717 // E4 OP_IPUT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700718 DF_UA | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700719
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700720 // E5 OP_SGET_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700721 DF_DA,
Ben Cheng4238ec22009-08-24 16:32:22 -0700722
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700723 // E6 OP_SPUT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700724 DF_UA,
Ben Cheng4238ec22009-08-24 16:32:22 -0700725
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700726 // E7 OP_IGET_OBJECT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700727 DF_DA | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700728
Andy McFadden53878242010-03-05 07:24:27 -0800729 // E8 OP_IGET_WIDE_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700730 DF_DA_WIDE | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700731
Andy McFadden53878242010-03-05 07:24:27 -0800732 // E9 OP_IPUT_WIDE_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700733 DF_UA_WIDE | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700734
Andy McFadden53878242010-03-05 07:24:27 -0800735 // EA OP_SGET_WIDE_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700736 DF_DA_WIDE,
Ben Cheng4238ec22009-08-24 16:32:22 -0700737
Andy McFadden53878242010-03-05 07:24:27 -0800738 // EB OP_SPUT_WIDE_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700739 DF_UA_WIDE,
Ben Cheng4238ec22009-08-24 16:32:22 -0700740
Andy McFadden96516932009-10-28 17:39:02 -0700741 // EC OP_BREAKPOINT
Ben Cheng4238ec22009-08-24 16:32:22 -0700742 DF_NOP,
743
744 // ED OP_THROW_VERIFICATION_ERROR
745 DF_NOP,
746
747 // EE OP_EXECUTE_INLINE
748 DF_FORMAT_35C,
749
Andy McFaddenb0a05412009-11-19 10:23:41 -0800750 // EF OP_EXECUTE_INLINE_RANGE
Bill Buzbeece46c942009-11-20 15:41:34 -0800751 DF_FORMAT_3RC,
Ben Cheng4238ec22009-08-24 16:32:22 -0700752
753 // F0 OP_INVOKE_DIRECT_EMPTY
754 DF_NOP,
755
Andy McFadden291758c2010-09-10 08:04:52 -0700756 // F1 OP_RETURN_VOID_BARRIER
Ben Cheng4238ec22009-08-24 16:32:22 -0700757 DF_NOP,
758
759 // F2 OP_IGET_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700760 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700761
762 // F3 OP_IGET_WIDE_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700763 DF_DA_WIDE | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700764
765 // F4 OP_IGET_OBJECT_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700766 DF_DA | DF_UB | DF_IS_GETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700767
768 // F5 OP_IPUT_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700769 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700770
771 // F6 OP_IPUT_WIDE_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700772 DF_UA_WIDE | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700773
774 // F7 OP_IPUT_OBJECT_QUICK
Ben Cheng7a2697d2010-06-07 13:44:23 -0700775 DF_UA | DF_UB | DF_IS_SETTER,
Ben Cheng4238ec22009-08-24 16:32:22 -0700776
777 // F8 OP_INVOKE_VIRTUAL_QUICK
778 DF_FORMAT_35C,
779
780 // F9 OP_INVOKE_VIRTUAL_QUICK_RANGE
781 DF_FORMAT_3RC,
782
783 // FA OP_INVOKE_SUPER_QUICK
784 DF_FORMAT_35C,
785
786 // FB OP_INVOKE_SUPER_QUICK_RANGE
787 DF_FORMAT_3RC,
788
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700789 // FC OP_IPUT_OBJECT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700790 DF_UA | DF_UB,
Ben Cheng4238ec22009-08-24 16:32:22 -0700791
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700792 // FD OP_SGET_OBJECT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700793 DF_DA,
Ben Cheng4238ec22009-08-24 16:32:22 -0700794
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700795 // FE OP_SPUT_OBJECT_VOLATILE
buzbee35ff69b2010-07-29 13:17:35 -0700796 DF_UA,
Ben Cheng4238ec22009-08-24 16:32:22 -0700797
Dan Bornstein90f15432010-12-02 16:46:25 -0800798 // FF OP_DISPATCH_FF
Ben Cheng4238ec22009-08-24 16:32:22 -0700799 DF_NOP,
800
jeffhao71eee1f2011-01-04 14:18:54 -0800801 // 100 OP_CONST_CLASS_JUMBO vAAAA, type@BBBBBBBB
802 DF_DA,
Ben Cheng4238ec22009-08-24 16:32:22 -0700803
jeffhao71eee1f2011-01-04 14:18:54 -0800804 // 101 OP_CHECK_CAST_JUMBO vAAAA, type@BBBBBBBB
805 DF_UA,
806
807 // 102 OP_INSTANCE_OF_JUMBO vAAAA, vBBBB, type@CCCCCCCC
808 DF_DA | DF_UB,
809
810 // 103 OP_NEW_INSTANCE_JUMBO vAAAA, type@BBBBBBBB
811 DF_DA,
812
813 // 104 OP_NEW_ARRAY_JUMBO vAAAA, vBBBB, type@CCCCCCCC
814 DF_DA | DF_UB,
815
816 // 105 OP_FILLED_NEW_ARRAY_JUMBO {vCCCC .. vNNNN}, type@BBBBBBBB
817 DF_FORMAT_3RC,
818
819 // 106 OP_IGET_JUMBO vAAAA, vBBBB, field@CCCCCCCC
820 DF_DA | DF_UB | DF_IS_GETTER,
821
822 // 107 OP_IGET_WIDE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
823 DF_DA_WIDE | DF_UB | DF_IS_GETTER,
824
825 // 108 OP_IGET_OBJECT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
826 DF_DA | DF_UB | DF_IS_GETTER,
827
828 // 109 OP_IGET_BOOLEAN_JUMBO vAAAA, vBBBB, field@CCCCCCCC
829 DF_DA | DF_UB | DF_IS_GETTER,
830
831 // 10A OP_IGET_BYTE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
832 DF_DA | DF_UB | DF_IS_GETTER,
833
834 // 10B OP_IGET_CHAR_JUMBO vAAAA, vBBBB, field@CCCCCCCC
835 DF_DA | DF_UB | DF_IS_GETTER,
836
837 // 10C OP_IGET_SHORT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
838 DF_DA | DF_UB | DF_IS_GETTER,
839
840 // 10D OP_IPUT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
841 DF_UA | DF_UB | DF_IS_SETTER,
842
843 // 10E OP_IPUT_WIDE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
844 DF_UA_WIDE | DF_UB | DF_IS_SETTER,
845
846 // 10F OP_IPUT_OBJECT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
847 DF_UA | DF_UB | DF_IS_SETTER,
848
849 // 110 OP_IPUT_BOOLEAN_JUMBO vAAAA, vBBBB, field@CCCCCCCC
850 DF_UA | DF_UB | DF_IS_SETTER,
851
852 // 111 OP_IPUT_BYTE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
853 DF_UA | DF_UB | DF_IS_SETTER,
854
855 // 112 OP_IPUT_CHAR_JUMBO vAAAA, vBBBB, field@CCCCCCCC
856 DF_UA | DF_UB | DF_IS_SETTER,
857
858 // 113 OP_IPUT_SHORT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
859 DF_UA | DF_UB | DF_IS_SETTER,
860
861 // 114 OP_SGET_JUMBO vAAAA, vBBBB, field@CCCCCCCC
862 DF_DA | DF_IS_GETTER,
863
864 // 115 OP_SGET_WIDE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
865 DF_DA_WIDE | DF_IS_GETTER,
866
867 // 116 OP_SGET_OBJECT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
868 DF_DA | DF_IS_GETTER,
869
870 // 117 OP_SGET_BOOLEAN_JUMBO vAAAA, vBBBB, field@CCCCCCCC
871 DF_DA | DF_IS_GETTER,
872
873 // 118 OP_SGET_BYTE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
874 DF_DA | DF_IS_GETTER,
875
876 // 119 OP_SGET_CHAR_JUMBO vAAAA, vBBBB, field@CCCCCCCC
877 DF_DA | DF_IS_GETTER,
878
879 // 11A OP_SGET_SHORT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
880 DF_DA | DF_IS_GETTER,
881
882 // 11B OP_SPUT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
883 DF_UA | DF_IS_SETTER,
884
885 // 11C OP_SPUT_WIDE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
886 DF_UA_WIDE | DF_IS_SETTER,
887
888 // 11D OP_SPUT_OBJECT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
889 DF_UA | DF_IS_SETTER,
890
891 // 11E OP_SPUT_BOOLEAN_JUMBO vAAAA, vBBBB, field@CCCCCCCC
892 DF_UA | DF_IS_SETTER,
893
894 // 11F OP_SPUT_BYTE_JUMBO vAAAA, vBBBB, field@CCCCCCCC
895 DF_UA | DF_IS_SETTER,
896
897 // 120 OP_SPUT_CHAR_JUMBO vAAAA, vBBBB, field@CCCCCCCC
898 DF_UA | DF_IS_SETTER,
899
900 // 121 OP_SPUT_SHORT_JUMBO vAAAA, vBBBB, field@CCCCCCCC
901 DF_UA | DF_IS_SETTER,
902
903 // 122 OP_INVOKE_VIRTUAL_JUMBO {vCCCC .. vNNNN}, meth@BBBBBBBB
904 DF_FORMAT_3RC,
905
906 // 123 OP_INVOKE_SUPER_JUMBO {vCCCC .. vNNNN}, meth@BBBBBBBB
907 DF_FORMAT_3RC,
908
909 // 124 OP_INVOKE_DIRECT_JUMBO {vCCCC .. vNNNN}, meth@BBBBBBBB
910 DF_FORMAT_3RC,
911
912 // 125 OP_INVOKE_STATIC_JUMBO {vCCCC .. vNNNN}, meth@BBBBBBBB
913 DF_FORMAT_3RC,
914
915 // 126 OP_INVOKE_INTERFACE_JUMBO {vCCCC .. vNNNN}, meth@BBBBBBBB
916 DF_FORMAT_3RC,
917
918 // 127 OP_UNUSED_27FF
919 DF_NOP,
920
921 // 128 OP_UNUSED_28FF
922 DF_NOP,
923
924 // 129 OP_UNUSED_29FF
925 DF_NOP,
926
927 // 12A OP_UNUSED_2AFF
928 DF_NOP,
929
930 // 12B OP_UNUSED_2BFF
931 DF_NOP,
932
933 // 12C OP_UNUSED_2CFF
934 DF_NOP,
935
936 // 12D OP_UNUSED_2DFF
937 DF_NOP,
938
939 // 12E OP_UNUSED_2EFF
940 DF_NOP,
941
942 // 12F OP_UNUSED_2FFF
943 DF_NOP,
944
945 // 130 OP_UNUSED_30FF
946 DF_NOP,
947
948 // 131 OP_UNUSED_31FF
949 DF_NOP,
950
951 // 132 OP_UNUSED_32FF
952 DF_NOP,
953
954 // 133 OP_UNUSED_33FF
955 DF_NOP,
956
957 // 134 OP_UNUSED_34FF
958 DF_NOP,
959
960 // 135 OP_UNUSED_35FF
961 DF_NOP,
962
963 // 136 OP_UNUSED_36FF
964 DF_NOP,
965
966 // 137 OP_UNUSED_37FF
967 DF_NOP,
968
969 // 138 OP_UNUSED_38FF
970 DF_NOP,
971
972 // 139 OP_UNUSED_39FF
973 DF_NOP,
974
975 // 13A OP_UNUSED_3AFF
976 DF_NOP,
977
978 // 13B OP_UNUSED_3BFF
979 DF_NOP,
980
981 // 13C OP_UNUSED_3CFF
982 DF_NOP,
983
984 // 13D OP_UNUSED_3DFF
985 DF_NOP,
986
987 // 13E OP_UNUSED_3EFF
988 DF_NOP,
989
990 // 13F OP_UNUSED_3FFF
991 DF_NOP,
992
993 // 140 OP_UNUSED_40FF
994 DF_NOP,
995
996 // 141 OP_UNUSED_41FF
997 DF_NOP,
998
999 // 142 OP_UNUSED_42FF
1000 DF_NOP,
1001
1002 // 143 OP_UNUSED_43FF
1003 DF_NOP,
1004
1005 // 144 OP_UNUSED_44FF
1006 DF_NOP,
1007
1008 // 145 OP_UNUSED_45FF
1009 DF_NOP,
1010
1011 // 146 OP_UNUSED_46FF
1012 DF_NOP,
1013
1014 // 147 OP_UNUSED_47FF
1015 DF_NOP,
1016
1017 // 148 OP_UNUSED_48FF
1018 DF_NOP,
1019
1020 // 149 OP_UNUSED_49FF
1021 DF_NOP,
1022
1023 // 14A OP_UNUSED_4AFF
1024 DF_NOP,
1025
1026 // 14B OP_UNUSED_4BFF
1027 DF_NOP,
1028
1029 // 14C OP_UNUSED_4CFF
1030 DF_NOP,
1031
1032 // 14D OP_UNUSED_4DFF
1033 DF_NOP,
1034
1035 // 14E OP_UNUSED_4EFF
1036 DF_NOP,
1037
1038 // 14F OP_UNUSED_4FFF
1039 DF_NOP,
1040
1041 // 150 OP_UNUSED_50FF
1042 DF_NOP,
1043
1044 // 151 OP_UNUSED_51FF
1045 DF_NOP,
1046
1047 // 152 OP_UNUSED_52FF
1048 DF_NOP,
1049
1050 // 153 OP_UNUSED_53FF
1051 DF_NOP,
1052
1053 // 154 OP_UNUSED_54FF
1054 DF_NOP,
1055
1056 // 155 OP_UNUSED_55FF
1057 DF_NOP,
1058
1059 // 156 OP_UNUSED_56FF
1060 DF_NOP,
1061
1062 // 157 OP_UNUSED_57FF
1063 DF_NOP,
1064
1065 // 158 OP_UNUSED_58FF
1066 DF_NOP,
1067
1068 // 159 OP_UNUSED_59FF
1069 DF_NOP,
1070
1071 // 15A OP_UNUSED_5AFF
1072 DF_NOP,
1073
1074 // 15B OP_UNUSED_5BFF
1075 DF_NOP,
1076
1077 // 15C OP_UNUSED_5CFF
1078 DF_NOP,
1079
1080 // 15D OP_UNUSED_5DFF
1081 DF_NOP,
1082
1083 // 15E OP_UNUSED_5EFF
1084 DF_NOP,
1085
1086 // 15F OP_UNUSED_5FFF
1087 DF_NOP,
1088
1089 // 160 OP_UNUSED_60FF
1090 DF_NOP,
1091
1092 // 161 OP_UNUSED_61FF
1093 DF_NOP,
1094
1095 // 162 OP_UNUSED_62FF
1096 DF_NOP,
1097
1098 // 163 OP_UNUSED_63FF
1099 DF_NOP,
1100
1101 // 164 OP_UNUSED_64FF
1102 DF_NOP,
1103
1104 // 165 OP_UNUSED_65FF
1105 DF_NOP,
1106
1107 // 166 OP_UNUSED_66FF
1108 DF_NOP,
1109
1110 // 167 OP_UNUSED_67FF
1111 DF_NOP,
1112
1113 // 168 OP_UNUSED_68FF
1114 DF_NOP,
1115
1116 // 169 OP_UNUSED_69FF
1117 DF_NOP,
1118
1119 // 16A OP_UNUSED_6AFF
1120 DF_NOP,
1121
1122 // 16B OP_UNUSED_6BFF
1123 DF_NOP,
1124
1125 // 16C OP_UNUSED_6CFF
1126 DF_NOP,
1127
1128 // 16D OP_UNUSED_6DFF
1129 DF_NOP,
1130
1131 // 16E OP_UNUSED_6EFF
1132 DF_NOP,
1133
1134 // 16F OP_UNUSED_6FFF
1135 DF_NOP,
1136
1137 // 170 OP_UNUSED_70FF
1138 DF_NOP,
1139
1140 // 171 OP_UNUSED_71FF
1141 DF_NOP,
1142
1143 // 172 OP_UNUSED_72FF
1144 DF_NOP,
1145
1146 // 173 OP_UNUSED_73FF
1147 DF_NOP,
1148
1149 // 174 OP_UNUSED_74FF
1150 DF_NOP,
1151
1152 // 175 OP_UNUSED_75FF
1153 DF_NOP,
1154
1155 // 176 OP_UNUSED_76FF
1156 DF_NOP,
1157
1158 // 177 OP_UNUSED_77FF
1159 DF_NOP,
1160
1161 // 178 OP_UNUSED_78FF
1162 DF_NOP,
1163
1164 // 179 OP_UNUSED_79FF
1165 DF_NOP,
1166
1167 // 17A OP_UNUSED_7AFF
1168 DF_NOP,
1169
1170 // 17B OP_UNUSED_7BFF
1171 DF_NOP,
1172
1173 // 17C OP_UNUSED_7CFF
1174 DF_NOP,
1175
1176 // 17D OP_UNUSED_7DFF
1177 DF_NOP,
1178
1179 // 17E OP_UNUSED_7EFF
1180 DF_NOP,
1181
1182 // 17F OP_UNUSED_7FFF
1183 DF_NOP,
1184
1185 // 180 OP_UNUSED_80FF
1186 DF_NOP,
1187
1188 // 181 OP_UNUSED_81FF
1189 DF_NOP,
1190
1191 // 182 OP_UNUSED_82FF
1192 DF_NOP,
1193
1194 // 183 OP_UNUSED_83FF
1195 DF_NOP,
1196
1197 // 184 OP_UNUSED_84FF
1198 DF_NOP,
1199
1200 // 185 OP_UNUSED_85FF
1201 DF_NOP,
1202
1203 // 186 OP_UNUSED_86FF
1204 DF_NOP,
1205
1206 // 187 OP_UNUSED_87FF
1207 DF_NOP,
1208
1209 // 188 OP_UNUSED_88FF
1210 DF_NOP,
1211
1212 // 189 OP_UNUSED_89FF
1213 DF_NOP,
1214
1215 // 18A OP_UNUSED_8AFF
1216 DF_NOP,
1217
1218 // 18B OP_UNUSED_8BFF
1219 DF_NOP,
1220
1221 // 18C OP_UNUSED_8CFF
1222 DF_NOP,
1223
1224 // 18D OP_UNUSED_8DFF
1225 DF_NOP,
1226
1227 // 18E OP_UNUSED_8EFF
1228 DF_NOP,
1229
1230 // 18F OP_UNUSED_8FFF
1231 DF_NOP,
1232
1233 // 190 OP_UNUSED_90FF
1234 DF_NOP,
1235
1236 // 191 OP_UNUSED_91FF
1237 DF_NOP,
1238
1239 // 192 OP_UNUSED_92FF
1240 DF_NOP,
1241
1242 // 193 OP_UNUSED_93FF
1243 DF_NOP,
1244
1245 // 194 OP_UNUSED_94FF
1246 DF_NOP,
1247
1248 // 195 OP_UNUSED_95FF
1249 DF_NOP,
1250
1251 // 196 OP_UNUSED_96FF
1252 DF_NOP,
1253
1254 // 197 OP_UNUSED_97FF
1255 DF_NOP,
1256
1257 // 198 OP_UNUSED_98FF
1258 DF_NOP,
1259
1260 // 199 OP_UNUSED_99FF
1261 DF_NOP,
1262
1263 // 19A OP_UNUSED_9AFF
1264 DF_NOP,
1265
1266 // 19B OP_UNUSED_9BFF
1267 DF_NOP,
1268
1269 // 19C OP_UNUSED_9CFF
1270 DF_NOP,
1271
1272 // 19D OP_UNUSED_9DFF
1273 DF_NOP,
1274
1275 // 19E OP_UNUSED_9EFF
1276 DF_NOP,
1277
1278 // 19F OP_UNUSED_9FFF
1279 DF_NOP,
1280
1281 // 1A0 OP_UNUSED_A0FF
1282 DF_NOP,
1283
1284 // 1A1 OP_UNUSED_A1FF
1285 DF_NOP,
1286
1287 // 1A2 OP_UNUSED_A2FF
1288 DF_NOP,
1289
1290 // 1A3 OP_UNUSED_A3FF
1291 DF_NOP,
1292
1293 // 1A4 OP_UNUSED_A4FF
1294 DF_NOP,
1295
1296 // 1A5 OP_UNUSED_A5FF
1297 DF_NOP,
1298
1299 // 1A6 OP_UNUSED_A6FF
1300 DF_NOP,
1301
1302 // 1A7 OP_UNUSED_A7FF
1303 DF_NOP,
1304
1305 // 1A8 OP_UNUSED_A8FF
1306 DF_NOP,
1307
1308 // 1A9 OP_UNUSED_A9FF
1309 DF_NOP,
1310
1311 // 1AA OP_UNUSED_AAFF
1312 DF_NOP,
1313
1314 // 1AB OP_UNUSED_ABFF
1315 DF_NOP,
1316
1317 // 1AC OP_UNUSED_ACFF
1318 DF_NOP,
1319
1320 // 1AD OP_UNUSED_ADFF
1321 DF_NOP,
1322
1323 // 1AE OP_UNUSED_AEFF
1324 DF_NOP,
1325
1326 // 1AF OP_UNUSED_AFFF
1327 DF_NOP,
1328
1329 // 1B0 OP_UNUSED_B0FF
1330 DF_NOP,
1331
1332 // 1B1 OP_UNUSED_B1FF
1333 DF_NOP,
1334
1335 // 1B2 OP_UNUSED_B2FF
1336 DF_NOP,
1337
1338 // 1B3 OP_UNUSED_B3FF
1339 DF_NOP,
1340
1341 // 1B4 OP_UNUSED_B4FF
1342 DF_NOP,
1343
1344 // 1B5 OP_UNUSED_B5FF
1345 DF_NOP,
1346
1347 // 1B6 OP_UNUSED_B6FF
1348 DF_NOP,
1349
1350 // 1B7 OP_UNUSED_B7FF
1351 DF_NOP,
1352
1353 // 1B8 OP_UNUSED_B8FF
1354 DF_NOP,
1355
1356 // 1B9 OP_UNUSED_B9FF
1357 DF_NOP,
1358
1359 // 1BA OP_UNUSED_BAFF
1360 DF_NOP,
1361
1362 // 1BB OP_UNUSED_BBFF
1363 DF_NOP,
1364
1365 // 1BC OP_UNUSED_BCFF
1366 DF_NOP,
1367
1368 // 1BD OP_UNUSED_BDFF
1369 DF_NOP,
1370
1371 // 1BE OP_UNUSED_BEFF
1372 DF_NOP,
1373
1374 // 1BF OP_UNUSED_BFFF
1375 DF_NOP,
1376
1377 // 1C0 OP_UNUSED_C0FF
1378 DF_NOP,
1379
1380 // 1C1 OP_UNUSED_C1FF
1381 DF_NOP,
1382
1383 // 1C2 OP_UNUSED_C2FF
1384 DF_NOP,
1385
1386 // 1C3 OP_UNUSED_C3FF
1387 DF_NOP,
1388
1389 // 1C4 OP_UNUSED_C4FF
1390 DF_NOP,
1391
1392 // 1C5 OP_UNUSED_C5FF
1393 DF_NOP,
1394
1395 // 1C6 OP_UNUSED_C6FF
1396 DF_NOP,
1397
1398 // 1C7 OP_UNUSED_C7FF
1399 DF_NOP,
1400
1401 // 1C8 OP_UNUSED_C8FF
1402 DF_NOP,
1403
1404 // 1C9 OP_UNUSED_C9FF
1405 DF_NOP,
1406
1407 // 1CA OP_UNUSED_CAFF
1408 DF_NOP,
1409
1410 // 1CB OP_UNUSED_CBFF
1411 DF_NOP,
1412
1413 // 1CC OP_UNUSED_CCFF
1414 DF_NOP,
1415
1416 // 1CD OP_UNUSED_CDFF
1417 DF_NOP,
1418
1419 // 1CE OP_UNUSED_CEFF
1420 DF_NOP,
1421
1422 // 1CF OP_UNUSED_CFFF
1423 DF_NOP,
1424
1425 // 1D0 OP_UNUSED_D0FF
1426 DF_NOP,
1427
1428 // 1D1 OP_UNUSED_D1FF
1429 DF_NOP,
1430
1431 // 1D2 OP_UNUSED_D2FF
1432 DF_NOP,
1433
1434 // 1D3 OP_UNUSED_D3FF
1435 DF_NOP,
1436
1437 // 1D4 OP_UNUSED_D4FF
1438 DF_NOP,
1439
1440 // 1D5 OP_UNUSED_D5FF
1441 DF_NOP,
1442
1443 // 1D6 OP_UNUSED_D6FF
1444 DF_NOP,
1445
1446 // 1D7 OP_UNUSED_D7FF
1447 DF_NOP,
1448
1449 // 1D8 OP_UNUSED_D8FF
1450 DF_NOP,
1451
1452 // 1D9 OP_UNUSED_D9FF
1453 DF_NOP,
1454
1455 // 1DA OP_UNUSED_DAFF
1456 DF_NOP,
1457
1458 // 1DB OP_UNUSED_DBFF
1459 DF_NOP,
1460
1461 // 1DC OP_UNUSED_DCFF
1462 DF_NOP,
1463
1464 // 1DD OP_UNUSED_DDFF
1465 DF_NOP,
1466
1467 // 1DE OP_UNUSED_DEFF
1468 DF_NOP,
1469
1470 // 1DF OP_UNUSED_DFFF
1471 DF_NOP,
1472
1473 // 1E0 OP_UNUSED_E0FF
1474 DF_NOP,
1475
1476 // 1E1 OP_UNUSED_E1FF
1477 DF_NOP,
1478
1479 // 1E2 OP_UNUSED_E2FF
1480 DF_NOP,
1481
1482 // 1E3 OP_UNUSED_E3FF
1483 DF_NOP,
1484
1485 // 1E4 OP_UNUSED_E4FF
1486 DF_NOP,
1487
1488 // 1E5 OP_UNUSED_E5FF
1489 DF_NOP,
1490
1491 // 1E6 OP_UNUSED_E6FF
1492 DF_NOP,
1493
1494 // 1E7 OP_UNUSED_E7FF
1495 DF_NOP,
1496
1497 // 1E8 OP_UNUSED_E8FF
1498 DF_NOP,
1499
1500 // 1E9 OP_UNUSED_E9FF
1501 DF_NOP,
1502
1503 // 1EA OP_UNUSED_EAFF
1504 DF_NOP,
1505
1506 // 1EB OP_UNUSED_EBFF
1507 DF_NOP,
1508
1509 // 1EC OP_UNUSED_ECFF
1510 DF_NOP,
1511
1512 // 1ED OP_UNUSED_EDFF
1513 DF_NOP,
1514
1515 // 1EE OP_UNUSED_EEFF
1516 DF_NOP,
1517
1518 // 1EF OP_UNUSED_EFFF
1519 DF_NOP,
1520
1521 // 1F0 OP_UNUSED_F0FF
1522 DF_NOP,
1523
1524 // 1F1 OP_UNUSED_F1FF
1525 DF_NOP,
1526
1527 // 1F2 OP_UNUSED_F2FF
1528 DF_NOP,
1529
1530 // 1F3 OP_UNUSED_F3FF
1531 DF_NOP,
1532
1533 // 1F4 OP_UNUSED_F4FF
1534 DF_NOP,
1535
1536 // 1F5 OP_UNUSED_F5FF
1537 DF_NOP,
1538
1539 // 1F6 OP_UNUSED_F6FF
1540 DF_NOP,
1541
1542 // 1F7 OP_UNUSED_F7FF
1543 DF_NOP,
1544
1545 // 1F8 OP_UNUSED_F8FF
1546 DF_NOP,
1547
1548 // 1F9 OP_UNUSED_F9FF
1549 DF_NOP,
1550
1551 // 1FA OP_UNUSED_FAFF
1552 DF_NOP,
1553
1554 // 1FB OP_UNUSED_FBFF
1555 DF_NOP,
1556
1557 // 1FC OP_UNUSED_FCFF
1558 DF_NOP,
1559
1560 // 1FD OP_UNUSED_FDFF
1561 DF_NOP,
1562
1563 // 1FE OP_UNUSED_FEFF
1564 DF_NOP,
1565
1566 // 1FF OP_THROW_VERIFICATION_ERROR_JUMBO
1567 DF_NOP,
1568
1569 // Beginning of extended MIR opcodes
1570 // 200 OP_MIR_PHI
1571 DF_PHI | DF_DA,
Ben Cheng4238ec22009-08-24 16:32:22 -07001572 /*
1573 * For extended MIR inserted at the MIR2LIR stage, it is okay to have
1574 * undefined values here.
1575 */
1576};
1577
1578/* Return the Dalvik register/subscript pair of a given SSA register */
Ben Cheng00603072010-10-28 11:13:58 -07001579int dvmConvertSSARegToDalvik(const CompilationUnit *cUnit, int ssaReg)
Ben Cheng4238ec22009-08-24 16:32:22 -07001580{
1581 return GET_ELEM_N(cUnit->ssaToDalvikMap, int, ssaReg);
1582}
1583
1584/*
1585 * Utility function to convert encoded SSA register value into Dalvik register
1586 * and subscript pair. Each SSA register can be used to index the
1587 * ssaToDalvikMap list to get the subscript[31..16]/dalvik_reg[15..0] mapping.
1588 */
Ben Cheng00603072010-10-28 11:13:58 -07001589char *dvmCompilerGetDalvikDisassembly(const DecodedInstruction *insn,
Ben Cheng7a2697d2010-06-07 13:44:23 -07001590 char *note)
Ben Chengccd6c012009-10-15 14:52:45 -07001591{
1592 char buffer[256];
Dan Bornstein9a1f8162010-12-01 17:02:26 -08001593 int opcode = insn->opcode;
Ben Chengccd6c012009-10-15 14:52:45 -07001594 int dfAttributes = dvmCompilerDataFlowAttributes[opcode];
Ben Cheng00603072010-10-28 11:13:58 -07001595 int flags = dexGetFlagsFromOpcode(insn->opcode);
Ben Chengccd6c012009-10-15 14:52:45 -07001596 char *ret;
1597
1598 buffer[0] = 0;
Ben Cheng00603072010-10-28 11:13:58 -07001599 if (opcode >= kMirOpFirst) {
1600 if (opcode == kMirOpPhi) {
1601 strcpy(buffer, "PHI");
1602 }
1603 else {
1604 sprintf(buffer, "Opcode 0x%x", opcode);
1605 }
1606 } else {
1607 strcpy(buffer, dexGetOpcodeName(opcode));
1608 }
Ben Chengccd6c012009-10-15 14:52:45 -07001609
Ben Cheng7a2697d2010-06-07 13:44:23 -07001610 if (note)
1611 strcat(buffer, note);
1612
Ben Cheng00603072010-10-28 11:13:58 -07001613 /* For branches, decode the instructions to print out the branch targets */
1614 if (flags & kInstrCanBranch) {
1615 InstructionFormat dalvikFormat = dexGetFormatFromOpcode(insn->opcode);
1616 int offset = 0;
1617 switch (dalvikFormat) {
1618 case kFmt21t:
1619 snprintf(buffer + strlen(buffer), 256, " v%d,", insn->vA);
1620 offset = (int) insn->vB;
1621 break;
1622 case kFmt22t:
1623 snprintf(buffer + strlen(buffer), 256, " v%d, v%d,",
1624 insn->vA, insn->vB);
1625 offset = (int) insn->vC;
1626 break;
1627 case kFmt10t:
1628 case kFmt20t:
1629 case kFmt30t:
1630 offset = (int) insn->vA;
1631 break;
1632 default:
1633 LOGE("Unexpected branch format: %d", dalvikFormat);
1634 dvmAbort();
1635 break;
1636 }
1637 snprintf(buffer + strlen(buffer), 256, " (%c%x)",
1638 offset > 0 ? '+' : '-',
1639 offset > 0 ? offset : -offset);
1640 } else if (dfAttributes & DF_FORMAT_35C) {
Ben Chengccd6c012009-10-15 14:52:45 -07001641 unsigned int i;
1642 for (i = 0; i < insn->vA; i++) {
1643 if (i != 0) strcat(buffer, ",");
Ben Cheng7a2697d2010-06-07 13:44:23 -07001644 snprintf(buffer + strlen(buffer), 256, " v%d", insn->arg[i]);
Ben Chengccd6c012009-10-15 14:52:45 -07001645 }
1646 }
1647 else if (dfAttributes & DF_FORMAT_3RC) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001648 snprintf(buffer + strlen(buffer), 256,
1649 " v%d..v%d", insn->vC, insn->vC + insn->vA - 1);
Ben Chengccd6c012009-10-15 14:52:45 -07001650 }
1651 else {
1652 if (dfAttributes & DF_A_IS_REG) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001653 snprintf(buffer + strlen(buffer), 256, " v%d", insn->vA);
Ben Chengccd6c012009-10-15 14:52:45 -07001654 }
1655 if (dfAttributes & DF_B_IS_REG) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001656 snprintf(buffer + strlen(buffer), 256, ", v%d", insn->vB);
Ben Chengccd6c012009-10-15 14:52:45 -07001657 }
Ben Cheng00603072010-10-28 11:13:58 -07001658 else if (opcode < kMirOpFirst) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001659 snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn->vB);
Ben Chengccd6c012009-10-15 14:52:45 -07001660 }
1661 if (dfAttributes & DF_C_IS_REG) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001662 snprintf(buffer + strlen(buffer), 256, ", v%d", insn->vC);
Ben Chengccd6c012009-10-15 14:52:45 -07001663 }
Ben Cheng00603072010-10-28 11:13:58 -07001664 else if (opcode < kMirOpFirst) {
Ben Cheng7a2697d2010-06-07 13:44:23 -07001665 snprintf(buffer + strlen(buffer), 256, ", (#%d)", insn->vC);
Ben Chengccd6c012009-10-15 14:52:45 -07001666 }
1667 }
1668 int length = strlen(buffer) + 1;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08001669 ret = (char *)dvmCompilerNew(length, false);
Ben Chengccd6c012009-10-15 14:52:45 -07001670 memcpy(ret, buffer, length);
1671 return ret;
1672}
1673
Ben Cheng00603072010-10-28 11:13:58 -07001674char *getSSAName(const CompilationUnit *cUnit, int ssaReg, char *name)
1675{
1676 int ssa2DalvikValue = dvmConvertSSARegToDalvik(cUnit, ssaReg);
1677
1678 sprintf(name, "v%d_%d",
1679 DECODE_REG(ssa2DalvikValue), DECODE_SUB(ssa2DalvikValue));
1680 return name;
1681}
1682
1683/*
1684 * Dalvik instruction disassembler with optional SSA printing.
1685 */
1686char *dvmCompilerFullDisassembler(const CompilationUnit *cUnit,
1687 const MIR *mir)
1688{
1689 char buffer[256];
1690 char operand0[256], operand1[256];
1691 const DecodedInstruction *insn = &mir->dalvikInsn;
1692 int opcode = insn->opcode;
1693 int dfAttributes = dvmCompilerDataFlowAttributes[opcode];
1694 int flags = dexGetFlagsFromOpcode(insn->opcode);
1695 char *ret;
1696 int length;
1697
1698 buffer[0] = 0;
1699 if (opcode >= kMirOpFirst) {
1700 if (opcode == kMirOpPhi) {
1701 snprintf(buffer, 256, "PHI %s = (%s",
1702 getSSAName(cUnit, mir->ssaRep->defs[0], operand0),
1703 getSSAName(cUnit, mir->ssaRep->uses[0], operand1));
1704 int i;
1705 for (i = 1; i < mir->ssaRep->numUses; i++) {
1706 snprintf(buffer + strlen(buffer), 256, ", %s",
1707 getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
1708 }
1709 snprintf(buffer + strlen(buffer), 256, ")");
1710 }
1711 else {
1712 sprintf(buffer, "Opcode 0x%x", opcode);
1713 }
1714 goto done;
1715 } else {
1716 strcpy(buffer, dexGetOpcodeName(opcode));
1717 }
1718
1719 /* For branches, decode the instructions to print out the branch targets */
1720 if (flags & kInstrCanBranch) {
1721 InstructionFormat dalvikFormat = dexGetFormatFromOpcode(insn->opcode);
1722 int delta = 0;
1723 switch (dalvikFormat) {
1724 case kFmt21t:
1725 snprintf(buffer + strlen(buffer), 256, " %s, ",
1726 getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
1727 delta = (int) insn->vB;
1728 break;
1729 case kFmt22t:
1730 snprintf(buffer + strlen(buffer), 256, " %s, %s, ",
1731 getSSAName(cUnit, mir->ssaRep->uses[0], operand0),
1732 getSSAName(cUnit, mir->ssaRep->uses[1], operand1));
1733 delta = (int) insn->vC;
1734 break;
1735 case kFmt10t:
1736 case kFmt20t:
1737 case kFmt30t:
1738 delta = (int) insn->vA;
1739 break;
1740 default:
1741 LOGE("Unexpected branch format: %d", dalvikFormat);
1742 dvmAbort();
1743 break;
1744 }
1745 snprintf(buffer + strlen(buffer), 256, " %04x",
1746 mir->offset + delta);
1747 } else if (dfAttributes & (DF_FORMAT_35C | DF_FORMAT_3RC)) {
1748 unsigned int i;
1749 for (i = 0; i < insn->vA; i++) {
1750 if (i != 0) strcat(buffer, ",");
1751 snprintf(buffer + strlen(buffer), 256, " %s",
1752 getSSAName(cUnit, mir->ssaRep->uses[i], operand0));
1753 }
1754 } else {
1755 int udIdx;
1756 if (mir->ssaRep->numDefs) {
1757
1758 for (udIdx = 0; udIdx < mir->ssaRep->numDefs; udIdx++) {
1759 snprintf(buffer + strlen(buffer), 256, " %s",
1760 getSSAName(cUnit, mir->ssaRep->defs[udIdx], operand0));
1761 }
1762 strcat(buffer, ",");
1763 }
1764 if (mir->ssaRep->numUses) {
1765 /* No leading ',' for the first use */
1766 snprintf(buffer + strlen(buffer), 256, " %s",
1767 getSSAName(cUnit, mir->ssaRep->uses[0], operand0));
1768 for (udIdx = 1; udIdx < mir->ssaRep->numUses; udIdx++) {
1769 snprintf(buffer + strlen(buffer), 256, ", %s",
1770 getSSAName(cUnit, mir->ssaRep->uses[udIdx], operand0));
1771 }
1772 }
1773 if (opcode < kMirOpFirst) {
1774 InstructionFormat dalvikFormat = dexGetFormatFromOpcode(opcode);
1775 switch (dalvikFormat) {
1776 case kFmt11n: // op vA, #+B
1777 case kFmt21s: // op vAA, #+BBBB
1778 case kFmt21h: // op vAA, #+BBBB00000[00000000]
1779 case kFmt31i: // op vAA, #+BBBBBBBB
1780 case kFmt51l: // op vAA, #+BBBBBBBBBBBBBBBB
1781 snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vB);
1782 break;
1783 case kFmt21c: // op vAA, thing@BBBB
1784 case kFmt31c: // op vAA, thing@BBBBBBBB
1785 snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vB);
1786 break;
1787 case kFmt22b: // op vAA, vBB, #+CC
1788 case kFmt22s: // op vA, vB, #+CCCC
1789 snprintf(buffer + strlen(buffer), 256, " #%#x", insn->vC);
1790 break;
1791 case kFmt22c: // op vA, vB, thing@CCCC
1792 case kFmt22cs: // [opt] op vA, vB, field offset CCCC
1793 snprintf(buffer + strlen(buffer), 256, " @%#x", insn->vC);
1794 break;
1795 /* No need for special printing */
1796 default:
1797 break;
1798 }
1799 }
1800 }
1801
1802done:
1803 length = strlen(buffer) + 1;
1804 ret = (char *) dvmCompilerNew(length, false);
1805 memcpy(ret, buffer, length);
1806 return ret;
1807}
1808
Ben Chengccd6c012009-10-15 14:52:45 -07001809/*
1810 * Utility function to convert encoded SSA register value into Dalvik register
1811 * and subscript pair. Each SSA register can be used to index the
1812 * ssaToDalvikMap list to get the subscript[31..16]/dalvik_reg[15..0] mapping.
1813 */
Ben Cheng4238ec22009-08-24 16:32:22 -07001814char *dvmCompilerGetSSAString(CompilationUnit *cUnit, SSARepresentation *ssaRep)
1815{
1816 char buffer[256];
1817 char *ret;
1818 int i;
1819
1820 buffer[0] = 0;
1821 for (i = 0; i < ssaRep->numDefs; i++) {
1822 int ssa2DalvikValue = dvmConvertSSARegToDalvik(cUnit, ssaRep->defs[i]);
1823
1824 sprintf(buffer + strlen(buffer), "s%d(v%d_%d) ",
1825 ssaRep->defs[i], DECODE_REG(ssa2DalvikValue),
1826 DECODE_SUB(ssa2DalvikValue));
1827 }
1828
1829 if (ssaRep->numDefs) {
1830 strcat(buffer, "<- ");
1831 }
1832
1833 for (i = 0; i < ssaRep->numUses; i++) {
1834 int ssa2DalvikValue = dvmConvertSSARegToDalvik(cUnit, ssaRep->uses[i]);
1835 int len = strlen(buffer);
1836
1837 if (snprintf(buffer + len, 250 - len, "s%d(v%d_%d) ",
1838 ssaRep->uses[i], DECODE_REG(ssa2DalvikValue),
1839 DECODE_SUB(ssa2DalvikValue)) >= (250 - len)) {
1840 strcat(buffer, "...");
1841 break;
1842 }
1843 }
1844
1845 int length = strlen(buffer) + 1;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08001846 ret = (char *)dvmCompilerNew(length, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001847 memcpy(ret, buffer, length);
1848 return ret;
1849}
1850
1851/* Any register that is used before being defined is considered live-in */
1852static inline void handleLiveInUse(BitVector *useV, BitVector *defV,
1853 BitVector *liveInV, int dalvikRegId)
1854{
1855 dvmCompilerSetBit(useV, dalvikRegId);
1856 if (!dvmIsBitSet(defV, dalvikRegId)) {
1857 dvmCompilerSetBit(liveInV, dalvikRegId);
1858 }
1859}
1860
1861/* Mark a reg as being defined */
Ben Cheng00603072010-10-28 11:13:58 -07001862static inline void handleDef(BitVector *defV, int dalvikRegId)
Ben Cheng4238ec22009-08-24 16:32:22 -07001863{
1864 dvmCompilerSetBit(defV, dalvikRegId);
1865}
1866
1867/*
1868 * Find out live-in variables for natural loops. Variables that are live-in in
1869 * the main loop body are considered to be defined in the entry block.
1870 */
Ben Cheng00603072010-10-28 11:13:58 -07001871bool dvmCompilerFindLocalLiveIn(CompilationUnit *cUnit, BasicBlock *bb)
Ben Cheng4238ec22009-08-24 16:32:22 -07001872{
1873 MIR *mir;
1874 BitVector *useV, *defV, *liveInV;
1875
Ben Cheng00603072010-10-28 11:13:58 -07001876 if (bb->dataFlowInfo == NULL) return false;
Ben Cheng4238ec22009-08-24 16:32:22 -07001877
1878 useV = bb->dataFlowInfo->useV =
Ben Cheng00603072010-10-28 11:13:58 -07001879 dvmCompilerAllocBitVector(cUnit->numDalvikRegisters, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001880 defV = bb->dataFlowInfo->defV =
Ben Cheng00603072010-10-28 11:13:58 -07001881 dvmCompilerAllocBitVector(cUnit->numDalvikRegisters, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001882 liveInV = bb->dataFlowInfo->liveInV =
Ben Cheng00603072010-10-28 11:13:58 -07001883 dvmCompilerAllocBitVector(cUnit->numDalvikRegisters, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001884
1885 for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
1886 int dfAttributes =
Dan Bornstein9a1f8162010-12-01 17:02:26 -08001887 dvmCompilerDataFlowAttributes[mir->dalvikInsn.opcode];
Ben Cheng4238ec22009-08-24 16:32:22 -07001888 DecodedInstruction *dInsn = &mir->dalvikInsn;
1889
1890 if (dfAttributes & DF_HAS_USES) {
1891 if (dfAttributes & DF_UA) {
1892 handleLiveInUse(useV, defV, liveInV, dInsn->vA);
1893 } else if (dfAttributes & DF_UA_WIDE) {
1894 handleLiveInUse(useV, defV, liveInV, dInsn->vA);
1895 handleLiveInUse(useV, defV, liveInV, dInsn->vA+1);
1896 }
1897 if (dfAttributes & DF_UB) {
1898 handleLiveInUse(useV, defV, liveInV, dInsn->vB);
1899 } else if (dfAttributes & DF_UB_WIDE) {
1900 handleLiveInUse(useV, defV, liveInV, dInsn->vB);
1901 handleLiveInUse(useV, defV, liveInV, dInsn->vB+1);
1902 }
1903 if (dfAttributes & DF_UC) {
1904 handleLiveInUse(useV, defV, liveInV, dInsn->vC);
1905 } else if (dfAttributes & DF_UC_WIDE) {
1906 handleLiveInUse(useV, defV, liveInV, dInsn->vC);
1907 handleLiveInUse(useV, defV, liveInV, dInsn->vC+1);
1908 }
1909 }
1910 if (dfAttributes & DF_HAS_DEFS) {
Ben Cheng00603072010-10-28 11:13:58 -07001911 handleDef(defV, dInsn->vA);
Ben Cheng4238ec22009-08-24 16:32:22 -07001912 if (dfAttributes & DF_DA_WIDE) {
Ben Cheng00603072010-10-28 11:13:58 -07001913 handleDef(defV, dInsn->vA+1);
Ben Cheng4238ec22009-08-24 16:32:22 -07001914 }
1915 }
1916 }
Ben Cheng00603072010-10-28 11:13:58 -07001917 return true;
Ben Cheng4238ec22009-08-24 16:32:22 -07001918}
1919
1920/* Find out the latest SSA register for a given Dalvik register */
1921static void handleSSAUse(CompilationUnit *cUnit, int *uses, int dalvikReg,
1922 int regIndex)
1923{
1924 int encodedValue = cUnit->dalvikToSSAMap[dalvikReg];
1925 int ssaReg = DECODE_REG(encodedValue);
1926 uses[regIndex] = ssaReg;
1927}
1928
1929/* Setup a new SSA register for a given Dalvik register */
1930static void handleSSADef(CompilationUnit *cUnit, int *defs, int dalvikReg,
1931 int regIndex)
1932{
1933 int encodedValue = cUnit->dalvikToSSAMap[dalvikReg];
1934 int ssaReg = cUnit->numSSARegs++;
1935 /* Bump up the subscript */
1936 int dalvikSub = DECODE_SUB(encodedValue) + 1;
1937 int newD2SMapping = ENCODE_REG_SUB(ssaReg, dalvikSub);
1938
1939 cUnit->dalvikToSSAMap[dalvikReg] = newD2SMapping;
1940
1941 int newS2DMapping = ENCODE_REG_SUB(dalvikReg, dalvikSub);
Ben Cheng00603072010-10-28 11:13:58 -07001942 dvmInsertGrowableList(cUnit->ssaToDalvikMap, newS2DMapping);
Ben Cheng4238ec22009-08-24 16:32:22 -07001943
1944 defs[regIndex] = ssaReg;
1945}
1946
1947/* Loop up new SSA names for format_35c instructions */
1948static void dataFlowSSAFormat35C(CompilationUnit *cUnit, MIR *mir)
1949{
1950 DecodedInstruction *dInsn = &mir->dalvikInsn;
1951 int numUses = dInsn->vA;
1952 int i;
1953
1954 mir->ssaRep->numUses = numUses;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08001955 mir->ssaRep->uses = (int *)dvmCompilerNew(sizeof(int) * numUses, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001956
1957 for (i = 0; i < numUses; i++) {
1958 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->arg[i], i);
1959 }
1960}
1961
1962/* Loop up new SSA names for format_3rc instructions */
1963static void dataFlowSSAFormat3RC(CompilationUnit *cUnit, MIR *mir)
1964{
1965 DecodedInstruction *dInsn = &mir->dalvikInsn;
1966 int numUses = dInsn->vA;
1967 int i;
1968
1969 mir->ssaRep->numUses = numUses;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08001970 mir->ssaRep->uses = (int *)dvmCompilerNew(sizeof(int) * numUses, false);
Ben Cheng4238ec22009-08-24 16:32:22 -07001971
1972 for (i = 0; i < numUses; i++) {
1973 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+i, i);
1974 }
1975}
1976
1977/* Entry function to convert a block into SSA representation */
Ben Cheng00603072010-10-28 11:13:58 -07001978bool dvmCompilerDoSSAConversion(CompilationUnit *cUnit, BasicBlock *bb)
Ben Cheng4238ec22009-08-24 16:32:22 -07001979{
1980 MIR *mir;
1981
Ben Cheng00603072010-10-28 11:13:58 -07001982 if (bb->dataFlowInfo == NULL) return false;
Ben Cheng4238ec22009-08-24 16:32:22 -07001983
1984 for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
Carl Shapirofc75f3e2010-12-07 11:43:38 -08001985 mir->ssaRep = (struct SSARepresentation *)
1986 dvmCompilerNew(sizeof(SSARepresentation), true);
Ben Cheng4238ec22009-08-24 16:32:22 -07001987
1988 int dfAttributes =
Dan Bornstein9a1f8162010-12-01 17:02:26 -08001989 dvmCompilerDataFlowAttributes[mir->dalvikInsn.opcode];
Ben Cheng4238ec22009-08-24 16:32:22 -07001990
1991 int numUses = 0;
1992
1993 if (dfAttributes & DF_FORMAT_35C) {
1994 dataFlowSSAFormat35C(cUnit, mir);
1995 continue;
1996 }
1997
1998 if (dfAttributes & DF_FORMAT_3RC) {
1999 dataFlowSSAFormat3RC(cUnit, mir);
2000 continue;
2001 }
2002
2003 if (dfAttributes & DF_HAS_USES) {
2004 if (dfAttributes & DF_UA) {
2005 numUses++;
2006 } else if (dfAttributes & DF_UA_WIDE) {
2007 numUses += 2;
2008 }
2009 if (dfAttributes & DF_UB) {
2010 numUses++;
2011 } else if (dfAttributes & DF_UB_WIDE) {
2012 numUses += 2;
2013 }
2014 if (dfAttributes & DF_UC) {
2015 numUses++;
2016 } else if (dfAttributes & DF_UC_WIDE) {
2017 numUses += 2;
2018 }
2019 }
2020
2021 if (numUses) {
2022 mir->ssaRep->numUses = numUses;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002023 mir->ssaRep->uses = (int *)dvmCompilerNew(sizeof(int) * numUses,
2024 false);
2025 mir->ssaRep->fpUse = (bool *)dvmCompilerNew(sizeof(bool) * numUses,
2026 false);
Ben Cheng4238ec22009-08-24 16:32:22 -07002027 }
2028
2029 int numDefs = 0;
2030
2031 if (dfAttributes & DF_HAS_DEFS) {
2032 numDefs++;
2033 if (dfAttributes & DF_DA_WIDE) {
2034 numDefs++;
2035 }
2036 }
2037
2038 if (numDefs) {
2039 mir->ssaRep->numDefs = numDefs;
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002040 mir->ssaRep->defs = (int *)dvmCompilerNew(sizeof(int) * numDefs,
2041 false);
2042 mir->ssaRep->fpDef = (bool *)dvmCompilerNew(sizeof(bool) * numDefs,
2043 false);
Ben Cheng4238ec22009-08-24 16:32:22 -07002044 }
2045
2046 DecodedInstruction *dInsn = &mir->dalvikInsn;
2047
2048 if (dfAttributes & DF_HAS_USES) {
2049 numUses = 0;
2050 if (dfAttributes & DF_UA) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002051 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
Ben Cheng4238ec22009-08-24 16:32:22 -07002052 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
2053 } else if (dfAttributes & DF_UA_WIDE) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002054 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
Ben Cheng4238ec22009-08-24 16:32:22 -07002055 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA, numUses++);
Bill Buzbee1465db52009-09-23 17:17:35 -07002056 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_A;
Ben Cheng4238ec22009-08-24 16:32:22 -07002057 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vA+1, numUses++);
2058 }
2059 if (dfAttributes & DF_UB) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002060 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
Ben Cheng4238ec22009-08-24 16:32:22 -07002061 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
2062 } else if (dfAttributes & DF_UB_WIDE) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002063 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
Ben Cheng4238ec22009-08-24 16:32:22 -07002064 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB, numUses++);
Bill Buzbee1465db52009-09-23 17:17:35 -07002065 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_B;
Ben Cheng4238ec22009-08-24 16:32:22 -07002066 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vB+1, numUses++);
2067 }
2068 if (dfAttributes & DF_UC) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002069 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
Ben Cheng4238ec22009-08-24 16:32:22 -07002070 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
2071 } else if (dfAttributes & DF_UC_WIDE) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002072 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
Ben Cheng4238ec22009-08-24 16:32:22 -07002073 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC, numUses++);
Bill Buzbee1465db52009-09-23 17:17:35 -07002074 mir->ssaRep->fpUse[numUses] = dfAttributes & DF_FP_C;
Ben Cheng4238ec22009-08-24 16:32:22 -07002075 handleSSAUse(cUnit, mir->ssaRep->uses, dInsn->vC+1, numUses++);
2076 }
2077 }
2078 if (dfAttributes & DF_HAS_DEFS) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002079 mir->ssaRep->fpDef[0] = dfAttributes & DF_FP_A;
Ben Cheng4238ec22009-08-24 16:32:22 -07002080 handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA, 0);
2081 if (dfAttributes & DF_DA_WIDE) {
Bill Buzbee1465db52009-09-23 17:17:35 -07002082 mir->ssaRep->fpDef[1] = dfAttributes & DF_FP_A;
Ben Cheng4238ec22009-08-24 16:32:22 -07002083 handleSSADef(cUnit, mir->ssaRep->defs, dInsn->vA+1, 1);
2084 }
2085 }
2086 }
2087
Ben Cheng00603072010-10-28 11:13:58 -07002088 /*
2089 * Take a snapshot of Dalvik->SSA mapping at the end of each block. The
2090 * input to PHI nodes can be derived from the snapshot of all predecessor
2091 * blocks.
2092 */
Ben Cheng4238ec22009-08-24 16:32:22 -07002093 bb->dataFlowInfo->dalvikToSSAMap =
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002094 (int *)dvmCompilerNew(sizeof(int) * cUnit->method->registersSize,
2095 false);
Ben Cheng4238ec22009-08-24 16:32:22 -07002096
Ben Cheng4238ec22009-08-24 16:32:22 -07002097 memcpy(bb->dataFlowInfo->dalvikToSSAMap, cUnit->dalvikToSSAMap,
2098 sizeof(int) * cUnit->method->registersSize);
Ben Cheng00603072010-10-28 11:13:58 -07002099 return true;
Ben Cheng4238ec22009-08-24 16:32:22 -07002100}
2101
2102/* Setup a constant value for opcodes thare have the DF_SETS_CONST attribute */
2103static void setConstant(CompilationUnit *cUnit, int ssaReg, int value)
2104{
2105 dvmSetBit(cUnit->isConstantV, ssaReg);
2106 cUnit->constantValues[ssaReg] = value;
2107}
2108
Ben Cheng00603072010-10-28 11:13:58 -07002109bool dvmCompilerDoConstantPropagation(CompilationUnit *cUnit, BasicBlock *bb)
Ben Cheng4238ec22009-08-24 16:32:22 -07002110{
2111 MIR *mir;
2112 BitVector *isConstantV = cUnit->isConstantV;
2113
2114 for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
2115 int dfAttributes =
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002116 dvmCompilerDataFlowAttributes[mir->dalvikInsn.opcode];
Ben Cheng4238ec22009-08-24 16:32:22 -07002117
Ben Cheng4238ec22009-08-24 16:32:22 -07002118 DecodedInstruction *dInsn = &mir->dalvikInsn;
2119
2120 if (!(dfAttributes & DF_HAS_DEFS)) continue;
2121
2122 /* Handle instructions that set up constants directly */
2123 if (dfAttributes & DF_SETS_CONST) {
2124 if (dfAttributes & DF_DA) {
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002125 switch (dInsn->opcode) {
Ben Cheng4238ec22009-08-24 16:32:22 -07002126 case OP_CONST_4:
2127 case OP_CONST_16:
2128 case OP_CONST:
2129 setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
2130 break;
2131 case OP_CONST_HIGH16:
2132 setConstant(cUnit, mir->ssaRep->defs[0],
2133 dInsn->vB << 16);
2134 break;
2135 default:
2136 break;
2137 }
2138 } else if (dfAttributes & DF_DA_WIDE) {
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002139 switch (dInsn->opcode) {
Ben Cheng4238ec22009-08-24 16:32:22 -07002140 case OP_CONST_WIDE_16:
2141 case OP_CONST_WIDE_32:
2142 setConstant(cUnit, mir->ssaRep->defs[0], dInsn->vB);
2143 setConstant(cUnit, mir->ssaRep->defs[1], 0);
2144 break;
2145 case OP_CONST_WIDE:
2146 setConstant(cUnit, mir->ssaRep->defs[0],
2147 (int) dInsn->vB_wide);
2148 setConstant(cUnit, mir->ssaRep->defs[1],
2149 (int) (dInsn->vB_wide >> 32));
2150 break;
2151 case OP_CONST_WIDE_HIGH16:
2152 setConstant(cUnit, mir->ssaRep->defs[0], 0);
2153 setConstant(cUnit, mir->ssaRep->defs[1],
2154 dInsn->vB << 16);
2155 break;
2156 default:
2157 break;
2158 }
2159 }
2160 /* Handle instructions that set up constants directly */
2161 } else if (dfAttributes & DF_IS_MOVE) {
2162 int i;
2163
2164 for (i = 0; i < mir->ssaRep->numUses; i++) {
2165 if (!dvmIsBitSet(isConstantV, mir->ssaRep->uses[i])) break;
2166 }
2167 /* Move a register holding a constant to another register */
2168 if (i == mir->ssaRep->numUses) {
2169 setConstant(cUnit, mir->ssaRep->defs[0],
2170 cUnit->constantValues[mir->ssaRep->uses[0]]);
2171 if (dfAttributes & DF_DA_WIDE) {
2172 setConstant(cUnit, mir->ssaRep->defs[1],
2173 cUnit->constantValues[mir->ssaRep->uses[1]]);
2174 }
2175 }
2176 }
2177 }
2178 /* TODO: implement code to handle arithmetic operations */
Ben Cheng00603072010-10-28 11:13:58 -07002179 return true;
Ben Cheng4238ec22009-08-24 16:32:22 -07002180}
2181
Ben Cheng00603072010-10-28 11:13:58 -07002182bool dvmCompilerFindInductionVariables(struct CompilationUnit *cUnit,
Ben Cheng4238ec22009-08-24 16:32:22 -07002183 struct BasicBlock *bb)
2184{
2185 BitVector *isIndVarV = cUnit->loopAnalysis->isIndVarV;
2186 BitVector *isConstantV = cUnit->isConstantV;
2187 GrowableList *ivList = cUnit->loopAnalysis->ivList;
2188 MIR *mir;
2189
Bill Buzbee1465db52009-09-23 17:17:35 -07002190 if (bb->blockType != kDalvikByteCode &&
Ben Cheng7a2697d2010-06-07 13:44:23 -07002191 bb->blockType != kTraceEntryBlock) {
Ben Cheng00603072010-10-28 11:13:58 -07002192 return false;
Ben Cheng4238ec22009-08-24 16:32:22 -07002193 }
2194
2195 /* If the bb doesn't have a phi it cannot contain an induction variable */
2196 if (bb->firstMIRInsn == NULL ||
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002197 bb->firstMIRInsn->dalvikInsn.opcode != kMirOpPhi) {
Ben Cheng00603072010-10-28 11:13:58 -07002198 return false;
Ben Cheng4238ec22009-08-24 16:32:22 -07002199 }
2200
2201 /* Find basic induction variable first */
2202 for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
2203 int dfAttributes =
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002204 dvmCompilerDataFlowAttributes[mir->dalvikInsn.opcode];
Ben Cheng4238ec22009-08-24 16:32:22 -07002205
2206 if (!(dfAttributes & DF_IS_LINEAR)) continue;
2207
2208 /*
2209 * For a basic induction variable:
2210 * 1) use[0] should belong to the output of a phi node
2211 * 2) def[0] should belong to the input of the same phi node
2212 * 3) the value added/subtracted is a constant
2213 */
2214 MIR *phi;
2215 for (phi = bb->firstMIRInsn; phi; phi = phi->next) {
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002216 if (phi->dalvikInsn.opcode != kMirOpPhi) break;
Ben Cheng4238ec22009-08-24 16:32:22 -07002217
2218 if (phi->ssaRep->defs[0] == mir->ssaRep->uses[0] &&
2219 phi->ssaRep->uses[1] == mir->ssaRep->defs[0]) {
2220 bool deltaIsConstant = false;
2221 int deltaValue;
2222
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002223 switch (mir->dalvikInsn.opcode) {
Ben Cheng4238ec22009-08-24 16:32:22 -07002224 case OP_ADD_INT:
2225 if (dvmIsBitSet(isConstantV,
2226 mir->ssaRep->uses[1])) {
2227 deltaValue =
2228 cUnit->constantValues[mir->ssaRep->uses[1]];
2229 deltaIsConstant = true;
2230 }
2231 break;
2232 case OP_SUB_INT:
2233 if (dvmIsBitSet(isConstantV,
2234 mir->ssaRep->uses[1])) {
2235 deltaValue =
2236 -cUnit->constantValues[mir->ssaRep->uses[1]];
2237 deltaIsConstant = true;
2238 }
2239 break;
2240 case OP_ADD_INT_LIT8:
2241 deltaValue = mir->dalvikInsn.vC;
2242 deltaIsConstant = true;
2243 break;
2244 default:
2245 break;
2246 }
2247 if (deltaIsConstant) {
2248 dvmSetBit(isIndVarV, mir->ssaRep->uses[0]);
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002249 InductionVariableInfo *ivInfo = (InductionVariableInfo *)
Ben Cheng4238ec22009-08-24 16:32:22 -07002250 dvmCompilerNew(sizeof(InductionVariableInfo),
2251 false);
2252
2253 ivInfo->ssaReg = mir->ssaRep->uses[0];
2254 ivInfo->basicSSAReg = mir->ssaRep->uses[0];
2255 ivInfo->m = 1; // always 1 to basic iv
2256 ivInfo->c = 0; // N/A to basic iv
2257 ivInfo->inc = deltaValue;
Ben Cheng00603072010-10-28 11:13:58 -07002258 dvmInsertGrowableList(ivList, (intptr_t) ivInfo);
Ben Cheng4238ec22009-08-24 16:32:22 -07002259 cUnit->loopAnalysis->numBasicIV++;
2260 break;
2261 }
2262 }
2263 }
2264 }
2265
2266 /* Find dependent induction variable now */
2267 for (mir = bb->firstMIRInsn; mir; mir = mir->next) {
2268 int dfAttributes =
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002269 dvmCompilerDataFlowAttributes[mir->dalvikInsn.opcode];
Ben Cheng4238ec22009-08-24 16:32:22 -07002270
2271 if (!(dfAttributes & DF_IS_LINEAR)) continue;
2272
2273 /* Skip already identified induction variables */
2274 if (dvmIsBitSet(isIndVarV, mir->ssaRep->defs[0])) continue;
2275
2276 /*
2277 * For a dependent induction variable:
2278 * 1) use[0] should be an induction variable (basic/dependent)
2279 * 2) operand2 should be a constant
2280 */
2281 if (dvmIsBitSet(isIndVarV, mir->ssaRep->uses[0])) {
2282 int srcDalvikReg = dvmConvertSSARegToDalvik(cUnit,
2283 mir->ssaRep->uses[0]);
2284 int dstDalvikReg = dvmConvertSSARegToDalvik(cUnit,
2285 mir->ssaRep->defs[0]);
2286
2287 bool cIsConstant = false;
2288 int c = 0;
2289
Dan Bornstein9a1f8162010-12-01 17:02:26 -08002290 switch (mir->dalvikInsn.opcode) {
Ben Cheng4238ec22009-08-24 16:32:22 -07002291 case OP_ADD_INT:
2292 if (dvmIsBitSet(isConstantV,
2293 mir->ssaRep->uses[1])) {
2294 c = cUnit->constantValues[mir->ssaRep->uses[1]];
2295 cIsConstant = true;
2296 }
2297 break;
2298 case OP_SUB_INT:
2299 if (dvmIsBitSet(isConstantV,
2300 mir->ssaRep->uses[1])) {
2301 c = -cUnit->constantValues[mir->ssaRep->uses[1]];
2302 cIsConstant = true;
2303 }
2304 break;
2305 case OP_ADD_INT_LIT8:
2306 c = mir->dalvikInsn.vC;
2307 cIsConstant = true;
2308 break;
2309 default:
2310 break;
2311 }
2312
2313 /* Ignore the update to the basic induction variable itself */
2314 if (DECODE_REG(srcDalvikReg) == DECODE_REG(dstDalvikReg)) {
2315 cUnit->loopAnalysis->ssaBIV = mir->ssaRep->defs[0];
2316 cIsConstant = false;
2317 }
2318
2319 if (cIsConstant) {
2320 unsigned int i;
2321 dvmSetBit(isIndVarV, mir->ssaRep->defs[0]);
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002322 InductionVariableInfo *ivInfo = (InductionVariableInfo *)
Ben Cheng4238ec22009-08-24 16:32:22 -07002323 dvmCompilerNew(sizeof(InductionVariableInfo),
2324 false);
2325 InductionVariableInfo *ivInfoOld = NULL ;
2326
2327 for (i = 0; i < ivList->numUsed; i++) {
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002328 ivInfoOld = (InductionVariableInfo *) ivList->elemList[i];
Ben Cheng4238ec22009-08-24 16:32:22 -07002329 if (ivInfoOld->ssaReg == mir->ssaRep->uses[0]) break;
2330 }
2331
2332 /* Guaranteed to find an element */
2333 assert(i < ivList->numUsed);
2334
2335 ivInfo->ssaReg = mir->ssaRep->defs[0];
2336 ivInfo->basicSSAReg = ivInfoOld->basicSSAReg;
2337 ivInfo->m = ivInfoOld->m;
2338 ivInfo->c = c + ivInfoOld->c;
2339 ivInfo->inc = ivInfoOld->inc;
Ben Cheng00603072010-10-28 11:13:58 -07002340 dvmInsertGrowableList(ivList, (intptr_t) ivInfo);
Ben Cheng4238ec22009-08-24 16:32:22 -07002341 }
2342 }
2343 }
Ben Cheng00603072010-10-28 11:13:58 -07002344 return true;
Ben Cheng4238ec22009-08-24 16:32:22 -07002345}
2346
2347/* Setup the basic data structures for SSA conversion */
2348void dvmInitializeSSAConversion(CompilationUnit *cUnit)
2349{
2350 int i;
2351 int numDalvikReg = cUnit->method->registersSize;
2352
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002353 cUnit->ssaToDalvikMap = (GrowableList *)dvmCompilerNew(sizeof(GrowableList),
2354 false);
Ben Cheng4238ec22009-08-24 16:32:22 -07002355 dvmInitGrowableList(cUnit->ssaToDalvikMap, numDalvikReg);
2356
2357 /*
2358 * Initial number of SSA registers is equal to the number of Dalvik
2359 * registers.
2360 */
2361 cUnit->numSSARegs = numDalvikReg;
2362
2363 /*
2364 * Initialize the SSA2Dalvik map list. For the first numDalvikReg elements,
2365 * the subscript is 0 so we use the ENCODE_REG_SUB macro to encode the value
2366 * into "(0 << 16) | i"
2367 */
2368 for (i = 0; i < numDalvikReg; i++) {
Ben Cheng00603072010-10-28 11:13:58 -07002369 dvmInsertGrowableList(cUnit->ssaToDalvikMap, ENCODE_REG_SUB(i, 0));
Ben Cheng4238ec22009-08-24 16:32:22 -07002370 }
2371
2372 /*
2373 * Initialize the DalvikToSSAMap map. The low 16 bit is the SSA register id,
2374 * while the high 16 bit is the current subscript. The original Dalvik
2375 * register N is mapped to SSA register N with subscript 0.
2376 */
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002377 cUnit->dalvikToSSAMap = (int *)dvmCompilerNew(sizeof(int) * numDalvikReg,
2378 false);
Ben Cheng4238ec22009-08-24 16:32:22 -07002379 for (i = 0; i < numDalvikReg; i++) {
2380 cUnit->dalvikToSSAMap[i] = i;
2381 }
2382
2383 /*
2384 * Allocate the BasicBlockDataFlow structure for the entry and code blocks
2385 */
Ben Cheng00603072010-10-28 11:13:58 -07002386 GrowableListIterator iterator;
2387
2388 dvmGrowableListIteratorInit(&cUnit->blockList, &iterator);
2389
2390 while (true) {
2391 BasicBlock *bb = (BasicBlock *) dvmGrowableListIteratorNext(&iterator);
2392 if (bb == NULL) break;
Bill Buzbee1465db52009-09-23 17:17:35 -07002393 if (bb->blockType == kDalvikByteCode ||
Ben Cheng00603072010-10-28 11:13:58 -07002394 bb->blockType == kTraceEntryBlock ||
2395 bb->blockType == kMethodEntryBlock ||
2396 bb->blockType == kMethodExitBlock) {
Carl Shapirofc75f3e2010-12-07 11:43:38 -08002397 bb->dataFlowInfo = (BasicBlockDataFlow *)
2398 dvmCompilerNew(sizeof(BasicBlockDataFlow),
2399 true);
Ben Cheng4238ec22009-08-24 16:32:22 -07002400 }
2401 }
2402}
2403
Ben Cheng00603072010-10-28 11:13:58 -07002404/* Clear the visited flag for each BB */
2405bool dvmCompilerClearVisitedFlag(struct CompilationUnit *cUnit,
2406 struct BasicBlock *bb)
Ben Cheng4238ec22009-08-24 16:32:22 -07002407{
Ben Cheng00603072010-10-28 11:13:58 -07002408 bb->visited = false;
2409 return true;
2410}
2411
2412void dvmCompilerDataFlowAnalysisDispatcher(CompilationUnit *cUnit,
2413 bool (*func)(CompilationUnit *, BasicBlock *),
2414 DataFlowAnalysisMode dfaMode,
2415 bool isIterative)
2416{
2417 bool change = true;
2418
2419 while (change) {
2420 change = false;
2421
2422 /* Scan all blocks and perform the operations specified in func */
2423 if (dfaMode == kAllNodes) {
2424 GrowableListIterator iterator;
2425 dvmGrowableListIteratorInit(&cUnit->blockList, &iterator);
2426 while (true) {
2427 BasicBlock *bb =
2428 (BasicBlock *) dvmGrowableListIteratorNext(&iterator);
2429 if (bb == NULL) break;
2430 change |= (*func)(cUnit, bb);
2431 }
2432 }
2433 /*
2434 * Scan all reachable blocks and perform the operations specified in
2435 * func.
2436 */
2437 else if (dfaMode == kReachableNodes) {
2438 int numReachableBlocks = cUnit->numReachableBlocks;
2439 int idx;
2440 const GrowableList *blockList = &cUnit->blockList;
2441
2442 for (idx = 0; idx < numReachableBlocks; idx++) {
2443 int blockIdx = cUnit->dfsOrder.elemList[idx];
2444 BasicBlock *bb =
2445 (BasicBlock *) dvmGrowableListGetElement(blockList,
2446 blockIdx);
2447 change |= (*func)(cUnit, bb);
2448 }
2449 }
2450 /*
2451 * Scan all reachable blocks by the pre-order in the depth-first-search
2452 * CFG and perform the operations specified in func.
2453 */
2454 else if (dfaMode == kPreOrderDFSTraversal) {
2455 int numReachableBlocks = cUnit->numReachableBlocks;
2456 int idx;
2457 const GrowableList *blockList = &cUnit->blockList;
2458
2459 for (idx = 0; idx < numReachableBlocks; idx++) {
2460 int dfsIdx = cUnit->dfsOrder.elemList[idx];
2461 BasicBlock *bb =
2462 (BasicBlock *) dvmGrowableListGetElement(blockList, dfsIdx);
2463 change |= (*func)(cUnit, bb);
2464 }
2465 }
2466 /*
2467 * Scan all reachable blocks by the post-order in the depth-first-search
2468 * CFG and perform the operations specified in func.
2469 */
2470 else if (dfaMode == kPostOrderDFSTraversal) {
2471 int numReachableBlocks = cUnit->numReachableBlocks;
2472 int idx;
2473 const GrowableList *blockList = &cUnit->blockList;
2474
2475 for (idx = numReachableBlocks - 1; idx >= 0; idx--) {
2476 int dfsIdx = cUnit->dfsOrder.elemList[idx];
2477 BasicBlock *bb =
2478 (BasicBlock *) dvmGrowableListGetElement(blockList, dfsIdx);
2479 change |= (*func)(cUnit, bb);
2480 }
2481 }
2482 /*
2483 * Scan all reachable blocks by the post-order in the dominator tree
2484 * and perform the operations specified in func.
2485 */
2486 else if (dfaMode == kPostOrderDOMTraversal) {
2487 int numReachableBlocks = cUnit->numReachableBlocks;
2488 int idx;
2489 const GrowableList *blockList = &cUnit->blockList;
2490
2491 for (idx = 0; idx < numReachableBlocks; idx++) {
2492 int domIdx = cUnit->domPostOrderTraversal.elemList[idx];
2493 BasicBlock *bb =
2494 (BasicBlock *) dvmGrowableListGetElement(blockList, domIdx);
2495 change |= (*func)(cUnit, bb);
2496 }
2497 }
2498 /* If isIterative is false, exit the loop after the first iteration */
2499 change &= isIterative;
Ben Cheng4238ec22009-08-24 16:32:22 -07002500 }
2501}
2502
2503/* Main entry point to do SSA conversion for non-loop traces */
2504void dvmCompilerNonLoopAnalysis(CompilationUnit *cUnit)
2505{
Ben Cheng00603072010-10-28 11:13:58 -07002506 dvmCompilerDataFlowAnalysisDispatcher(cUnit, dvmCompilerDoSSAConversion,
2507 kAllNodes,
2508 false /* isIterative */);
Ben Cheng4238ec22009-08-24 16:32:22 -07002509}