OSDN Git Service

Reharmonize the implementation with the spec.
[android-x86/dalvik.git] / libdex / OpCodeNames.c
1 /*
2  * Copyright (C) 2008 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 /*
18  * Table of Dalvik opcode names.
19  */
20 #include "OpCodeNames.h"
21
22 #include <assert.h>
23
24 /*
25  * The following two lines work, but slashes and dashes both turn into
26  * underscores, and the strings are all upper case.  The output is easier
27  * to read if we do the strings by hand (could probably write a
28  * post-processing function easily enough if maintenance becomes annoying).
29  */
30 //#define H(_op) #_op
31 //DEFINE_GOTO_TABLE(gOpNames)
32
33 /*
34  * Dalvik opcode names.
35  */
36 static const char* gOpNames[256] = {
37     /* 0x00 */
38     "nop",
39     "move",
40     "move/from16",
41     "move/16",
42     "move-wide",
43     "move-wide/from16",
44     "move-wide/16",
45     "move-object",
46     "move-object/from16",
47     "move-object/16",
48     "move-result",
49     "move-result-wide",
50     "move-result-object",
51     "move-exception",
52     "return-void",
53     "return",
54
55     /* 0x10 */
56     "return-wide",
57     "return-object",
58     "const/4",
59     "const/16",
60     "const",
61     "const/high16",
62     "const-wide/16",
63     "const-wide/32",
64     "const-wide",
65     "const-wide/high16",
66     "const-string",
67     "const-string/jumbo",
68     "const-class",
69     "monitor-enter",
70     "monitor-exit",
71     "check-cast",
72
73     /* 0x20 */
74     "instance-of",
75     "array-length",
76     "new-instance",
77     "new-array",
78     "filled-new-array",
79     "filled-new-array/range",
80     "fill-array-data",
81     "throw",
82     "goto",
83     "goto/16",
84     "goto/32",
85     "packed-switch",
86     "sparse-switch",
87     "cmpl-float",
88     "cmpg-float",
89     "cmpl-double",
90
91     /* 0x30 */
92     "cmpg-double",
93     "cmp-long",
94     "if-eq",
95     "if-ne",
96     "if-lt",
97     "if-ge",
98     "if-gt",
99     "if-le",
100     "if-eqz",
101     "if-nez",
102     "if-ltz",
103     "if-gez",
104     "if-gtz",
105     "if-lez",
106     "UNUSED",
107     "UNUSED",
108
109     /* 0x40 */
110     "UNUSED",
111     "UNUSED",
112     "UNUSED",
113     "UNUSED",
114     "aget",
115     "aget-wide",
116     "aget-object",
117     "aget-boolean",
118     "aget-byte",
119     "aget-char",
120     "aget-short",
121     "aput",
122     "aput-wide",
123     "aput-object",
124     "aput-boolean",
125     "aput-byte",
126
127     /* 0x50 */
128     "aput-char",
129     "aput-short",
130     "iget",
131     "iget-wide",
132     "iget-object",
133     "iget-boolean",
134     "iget-byte",
135     "iget-char",
136     "iget-short",
137     "iput",
138     "iput-wide",
139     "iput-object",
140     "iput-boolean",
141     "iput-byte",
142     "iput-char",
143     "iput-short",
144
145     /* 0x60 */
146     "sget",
147     "sget-wide",
148     "sget-object",
149     "sget-boolean",
150     "sget-byte",
151     "sget-char",
152     "sget-short",
153     "sput",
154     "sput-wide",
155     "sput-object",
156     "sput-boolean",
157     "sput-byte",
158     "sput-char",
159     "sput-short",
160     "invoke-virtual",
161     "invoke-super",
162
163     /* 0x70 */
164     "invoke-direct",
165     "invoke-static",
166     "invoke-interface",
167     "UNUSED",
168     "invoke-virtual/range",
169     "invoke-super/range",
170     "invoke-direct/range",
171     "invoke-static/range",
172     "invoke-interface/range",
173     "UNUSED",
174     "UNUSED",
175     "neg-int",
176     "not-int",
177     "neg-long",
178     "not-long",
179     "neg-float",
180
181     /* 0x80 */
182     "neg-double",
183     "int-to-long",
184     "int-to-float",
185     "int-to-double",
186     "long-to-int",
187     "long-to-float",
188     "long-to-double",
189     "float-to-int",
190     "float-to-long",
191     "float-to-double",
192     "double-to-int",
193     "double-to-long",
194     "double-to-float",
195     "int-to-byte",
196     "int-to-char",
197     "int-to-short",
198
199     /* 0x90 */
200     "add-int",
201     "sub-int",
202     "mul-int",
203     "div-int",
204     "rem-int",
205     "and-int",
206     "or-int",
207     "xor-int",
208     "shl-int",
209     "shr-int",
210     "ushr-int",
211     "add-long",
212     "sub-long",
213     "mul-long",
214     "div-long",
215     "rem-long",
216
217     /* 0xa0 */
218     "and-long",
219     "or-long",
220     "xor-long",
221     "shl-long",
222     "shr-long",
223     "ushr-long",
224     "add-float",
225     "sub-float",
226     "mul-float",
227     "div-float",
228     "rem-float",
229     "add-double",
230     "sub-double",
231     "mul-double",
232     "div-double",
233     "rem-double",
234
235     /* 0xb0 */
236     "add-int/2addr",
237     "sub-int/2addr",
238     "mul-int/2addr",
239     "div-int/2addr",
240     "rem-int/2addr",
241     "and-int/2addr",
242     "or-int/2addr",
243     "xor-int/2addr",
244     "shl-int/2addr",
245     "shr-int/2addr",
246     "ushr-int/2addr",
247     "add-long/2addr",
248     "sub-long/2addr",
249     "mul-long/2addr",
250     "div-long/2addr",
251     "rem-long/2addr",
252
253     /* 0xc0 */
254     "and-long/2addr",
255     "or-long/2addr",
256     "xor-long/2addr",
257     "shl-long/2addr",
258     "shr-long/2addr",
259     "ushr-long/2addr",
260     "add-float/2addr",
261     "sub-float/2addr",
262     "mul-float/2addr",
263     "div-float/2addr",
264     "rem-float/2addr",
265     "add-double/2addr",
266     "sub-double/2addr",
267     "mul-double/2addr",
268     "div-double/2addr",
269     "rem-double/2addr",
270
271     /* 0xd0 */
272     "add-int/lit16",
273     "rsub-int",
274     "mul-int/lit16",
275     "div-int/lit16",
276     "rem-int/lit16",
277     "and-int/lit16",
278     "or-int/lit16",
279     "xor-int/lit16",
280     "add-int/lit8",
281     "rsub-int/lit8",
282     "mul-int/lit8",
283     "div-int/lit8",
284     "rem-int/lit8",
285     "and-int/lit8",
286     "or-int/lit8",
287     "xor-int/lit8",
288
289     /* 0xe0 */
290     "shl-int/lit8",
291     "shr-int/lit8",
292     "ushr-int/lit8",
293     "+iget-volatile",
294     "+iput-volatile",
295     "+sget-volatile",
296     "+sput-volatile",
297     "+iget-object-volatile",
298     "+iget-wide-volatile",
299     "+iput-wide-volatile",
300     "+sget-wide-volatile",
301     "+sput-wide-volatile",
302     "^breakpoint",                  // does not appear in DEX files
303     "^throw-verification-error",    // does not appear in DEX files
304     "+execute-inline",
305     "+execute-inline/range",
306
307     /* 0xf0 */
308     "+invoke-direct-empty",
309     "+return-void-barrier",
310     "+iget-quick",
311     "+iget-wide-quick",
312     "+iget-object-quick",
313     "+iput-quick",
314     "+iput-wide-quick",
315     "+iput-object-quick",
316     "+invoke-virtual-quick",
317     "+invoke-virtual-quick/range",
318     "+invoke-super-quick",
319     "+invoke-super-quick/range",
320     "+iput-object-volatile",
321     "+sget-object-volatile",
322     "+sput-object-volatile",
323     "UNUSED",
324 };
325
326 /*
327  * Return the name of an opcode.
328  */
329 const char* dexGetOpcodeName(OpCode op)
330 {
331     assert(op >= 0 && op < kNumDalvikInstructions);
332     return gOpNames[op];
333 }