1 /*
2 * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.openjdk.asmtools.jasm;
24
25 import java.util.HashMap;
26
27 /**
28 *
29 * OpcodeTables
30 *
31 * The OpcodeTables class follows a Singleton Pattern. This class contains Enums, that are
32 * contained in private hash maps (lookup tables and reverse lookup tables). These hash
33 * maps all have public accessors, which clients use to look-up opcodes.
34 *
35 * Tokens in this table carry no external state, and are typically treated as constants.
36 * They do not need to be reset.
37 *
38 */
39 public class OpcodeTables {
40
41 /**
42 * Initialized keyword and token Hash Maps (and Reverse Tables)
43 */
44 static private final int MaxOpcodes = 301;
45 static private HashMap<Integer, Opcode> IntToNormalOpcodes = new HashMap<>(MaxOpcodes);
46 static private HashMap<Integer, Opcode> IntToAllOpcodes = new HashMap<>(MaxOpcodes);
47 static private HashMap<String, Opcode> mnemocodes = new HashMap<>(MaxOpcodes);
48
49 static private HashMap<Integer, Opcode> IntToPrivOpcode = new HashMap<>(MaxOpcodes);
50 static private HashMap<String, Opcode> PrivMnemocodes = new HashMap<>(MaxOpcodes);
51
52 static private HashMap<Integer, Opcode> IntToNonPrivOpcode = new HashMap<>(MaxOpcodes);
53 static private HashMap<String, Opcode> NonPrivMnemocodes = new HashMap<>(MaxOpcodes);
54
55 static {
56 // register all of the tokens
57 for (Opcode opc : Opcode.values()) {
58 registerOpcode(opc);
59 }
60
61 }
62
63 private static void registerOpcode(Opcode opc) {
64 IntToAllOpcodes.put(opc.value, opc);
65 mnemocodes.put(opc.parsekey, opc);
66 if (opc.alias != null) {
67 mnemocodes.put(opc.alias, opc);
68 }
69
70 if (opc.type == OpcodeType.PRIVELEGED) {
71 PrivMnemocodes.put(opc.parsekey, opc);
72 IntToPrivOpcode.put(opc.baseVal, opc);
73 } else if (opc.type == OpcodeType.NONPRIVELEGED) {
74 NonPrivMnemocodes.put(opc.parsekey, opc);
75 IntToNonPrivOpcode.put(opc.baseVal, opc);
76 }
77
78 }
79
80 public static Opcode opcode(String mnemonic) {
81 return mnemocodes.get(mnemonic);
82 }
83
84 public static Opcode opcode(Integer mnem_code) {
85 return IntToAllOpcodes.get(mnem_code);
86 }
87
88 /*-------------------------------------------------------- */
89 /**
90 * Marker: describes the type of Opcode.
91 *
92 * certain types of Opcodes will be added to specific lookup tables.
93 */
94 static public enum OpcodeType {
95 NORMAL (0, "Normal"),
96 NONPRIVELEGED (1, "NonPriv"),
97 PRIVELEGED (2, "Priv"),
98 WIDE (3, "Wide");
99
100 private final Integer value;
101 private final String printval;
102
103 OpcodeType(Integer val, String print) {
104 value = val;
105 printval = print;
106 }
107
108 public String printval() {
109 return printval;
110 }
111
112 }
113
114 /*-------------------------------------------------------- */
115 /* Opcode Enums */
116 static public enum Opcode {
117 /* Opcodes */
118 opc_dead (-2, " opc_dead", 0),
119 opc_label (-1, "opc_label", 0),
120 opc_nop (0, "nop", 1),
121 opc_aconst_null (1, "aconst_null", 1),
122 opc_iconst_m1 (2, "iconst_m1", 1),
123 opc_iconst_0 (3, "iconst_0", 1),
124 opc_iconst_1 (4, "iconst_1", 1),
125 opc_iconst_2 (5, "iconst_2", 1),
126 opc_iconst_3 (6, "iconst_3", 1),
127 opc_iconst_4 (7, "iconst_4", 1),
128 opc_iconst_5 (8, "iconst_5", 1),
129 opc_lconst_0 (9, "lconst_0", 1),
130 opc_lconst_1 (10, "lconst_1", 1),
131 opc_fconst_0 (11, "fconst_0", 1),
132 opc_fconst_1 (12, "fconst_1", 1),
133 opc_fconst_2 (13, "fconst_2", 1),
134 opc_dconst_0 (14, "dconst_0", 1),
135 opc_dconst_1 (15, "dconst_1", 1),
136 opc_bipush (16, "bipush", 2),
137 opc_sipush (17, "sipush", 3),
138 opc_ldc (18, "ldc", 2),
139 opc_ldc_w (19, "ldc_w", 3),
140 opc_ldc2_w (20, "ldc2_w", 3),
141 opc_iload (21, "iload", 2),
142 opc_lload (22, "lload", 2),
143 opc_fload (23, "fload", 2),
144 opc_dload (24, "dload", 2),
145 opc_aload (25, "aload", 2),
146 opc_iload_0 (26, "iload_0", 1),
147 opc_iload_1 (27, "iload_1", 1),
148 opc_iload_2 (28, "iload_2", 1),
149 opc_iload_3 (29, "iload_3", 1),
150 opc_lload_0 (30, "lload_0", 1),
151 opc_lload_1 (31, "lload_1", 1),
152 opc_lload_2 (32, "lload_2", 1),
153 opc_lload_3 (33, "lload_3", 1),
154 opc_fload_0 (34, "fload_0", 1),
155 opc_fload_1 (35, "fload_1", 1),
156 opc_fload_2 (36, "fload_2", 1),
157 opc_fload_3 (37, "fload_3", 1),
158 opc_dload_0 (38, "dload_0", 1),
159 opc_dload_1 (39, "dload_1", 1),
160 opc_dload_2 (40, "dload_2", 1),
161 opc_dload_3 (41, "dload_3", 1),
162 opc_aload_0 (42, "aload_0", 1),
163 opc_aload_1 (43, "aload_1", 1),
164 opc_aload_2 (44, "aload_2", 1),
165 opc_aload_3 (45, "aload_3", 1),
166 opc_iaload (46, "iaload", 1),
167 opc_laload (47, "laload", 1),
168 opc_faload (48, "faload", 1),
169 opc_daload (49, "daload", 1),
170 opc_aaload (50, "aaload", 1),
171 opc_baload (51, "baload", 1),
172 opc_caload (52, "caload", 1),
173 opc_saload (53, "saload", 1),
174 opc_istore (54, "istore", 2),
175 opc_lstore (55, "lstore", 2),
176 opc_fstore (56, "fstore", 2),
177 opc_dstore (57, "dstore", 2),
178 opc_astore (58, "astore", 2),
179 opc_istore_0 (59, "istore_0", 1),
180 opc_istore_1 (60, "istore_1", 1),
181 opc_istore_2 (61, "istore_2", 1),
182 opc_istore_3 (62, "istore_3", 1),
183 opc_lstore_0 (63, "lstore_0", 1),
184 opc_lstore_1 (64, "lstore_1", 1),
185 opc_lstore_2 (65, "lstore_2", 1),
186 opc_lstore_3 (66, "lstore_3", 1),
187 opc_fstore_0 (67, "fstore_0", 1),
188 opc_fstore_1 (68, "fstore_1", 1),
189 opc_fstore_2 (69, "fstore_2", 1),
190 opc_fstore_3 (70, "fstore_3", 1),
191 opc_dstore_0 (71, "dstore_0", 1),
192 opc_dstore_1 (72, "dstore_1", 1),
193 opc_dstore_2 (73, "dstore_2", 1),
194 opc_dstore_3 (74, "dstore_3", 1),
195 opc_astore_0 (75, "astore_0", 1),
196 opc_astore_1 (76, "astore_1", 1),
197 opc_astore_2 (77, "astore_2", 1),
198 opc_astore_3 (78, "astore_3", 1),
199 opc_iastore (79, "iastore", 1),
200 opc_lastore (80, "lastore", 1),
201 opc_fastore (81, "fastore", 1),
202 opc_dastore (82, "dastore", 1),
203 opc_aastore (83, "aastore", 1),
204 opc_bastore (84, "bastore", 1),
205 opc_castore (85, "castore", 1),
206 opc_sastore (86, "sastore", 1),
207 opc_pop (87, "pop", 1),
208 opc_pop2 (88, "pop2", 1),
209 opc_dup (89, "dup", 1),
210 opc_dup_x1 (90, "dup_x1", 1),
211 opc_dup_x2 (91, "dup_x2", 1),
212 opc_dup2 (92, "dup2", 1),
213 opc_dup2_x1 (93, "dup2_x1", 1),
214 opc_dup2_x2 (94, "dup2_x2", 1),
215 opc_swap (95, "swap", 1),
216 opc_iadd (96, "iadd", 1),
217 opc_ladd (97, "ladd", 1),
218 opc_fadd (98, "fadd", 1),
219 opc_dadd (99, "dadd", 1),
220 opc_isub (100, "isub", 1),
221 opc_lsub (101, "lsub", 1),
222 opc_fsub (102, "fsub", 1),
223 opc_dsub (103, "dsub", 1),
224 opc_imul (104, "imul", 1),
225 opc_lmul (105, "lmul", 1),
226 opc_fmul (106, "fmul", 1),
227 opc_dmul (107, "dmul", 1),
228 opc_idiv (108, "idiv", 1),
229 opc_ldiv (109, "ldiv", 1),
230 opc_fdiv (110, "fdiv", 1),
231 opc_ddiv (111, "ddiv", 1),
232 opc_irem (112, "irem", 1),
233 opc_lrem (113, "lrem", 1),
234 opc_frem (114, "frem", 1),
235 opc_drem (115, "drem", 1),
236 opc_ineg (116, "ineg", 1),
237 opc_lneg (117, "lneg", 1),
238 opc_fneg (118, "fneg", 1),
239 opc_dneg (119, "dneg", 1),
240 opc_ishl (120, "ishl", 1),
241 opc_lshl (121, "lshl", 1),
242 opc_ishr (122, "ishr", 1),
243 opc_lshr (123, "lshr", 1),
244 opc_iushr (124, "iushr", 1),
245 opc_lushr (125, "lushr", 1),
246 opc_iand (126, "iand", 1),
247 opc_land (127, "land", 1),
248 opc_ior (128, "ior", 1),
249 opc_lor (129, "lor", 1),
250 opc_ixor (130, "ixor", 1),
251 opc_lxor (131, "lxor", 1),
252 opc_iinc (132, "iinc", 3),
253 opc_i2l (133, "i2l", 1),
254 opc_i2f (134, "i2f", 1),
255 opc_i2d (135, "i2d", 1),
256 opc_l2i (136, "l2i", 1),
257 opc_l2f (137, "l2f", 1),
258 opc_l2d (138, "l2d", 1),
259 opc_f2i (139, "f2i", 1),
260 opc_f2l (140, "f2l", 1),
261 opc_f2d (141, "f2d", 1),
262 opc_d2i (142, "d2i", 1),
263 opc_d2l (143, "d2l", 1),
264 opc_d2f (144, "d2f", 1),
265 opc_i2b (145, "i2b", 1),
266 opc_i2c (146, "i2c", 1),
267 opc_i2s (147, "i2s", 1),
268 opc_lcmp (148, "lcmp", 1),
269 opc_fcmpl (149, "fcmpl", 1),
270 opc_fcmpg (150, "fcmpg", 1),
271 opc_dcmpl (151, "dcmpl", 1),
272 opc_dcmpg (152, "dcmpg", 1),
273 opc_ifeq (153, "ifeq", 3),
274 opc_ifne (154, "ifne", 3),
275 opc_iflt (155, "iflt", 3),
276 opc_ifge (156, "ifge", 3),
277 opc_ifgt (157, "ifgt", 3),
278 opc_ifle (158, "ifle", 3),
279 opc_if_icmpeq (159, "if_icmpeq", 3),
280 opc_if_icmpne (160, "if_icmpne", 3),
281 opc_if_icmplt (161, "if_icmplt", 3),
282 opc_if_icmpge (162, "if_icmpge", 3),
283 opc_if_icmpgt (163, "if_icmpgt", 3),
284 opc_if_icmple (164, "if_icmple", 3),
285 opc_if_acmpeq (165, "if_acmpeq", 3),
286 opc_if_acmpne (166, "if_acmpne", 3),
287 opc_goto (167, "goto", 3),
288 opc_jsr (168, "jsr", 3),
289 opc_ret (169, "ret", 2),
290 opc_tableswitch (170, "tableswitch", 99),
291 opc_lookupswitch (171, "lookupswitch", 99),
292 opc_ireturn (172, "ireturn", 1),
293 opc_lreturn (173, "lreturn", 1),
294 opc_freturn (174, "freturn", 1),
295 opc_dreturn (175, "dreturn", 1),
296 opc_areturn (176, "areturn", 1),
297 opc_return (177, "return", 1),
298 opc_getstatic (178, "getstatic", 3),
299 opc_putstatic (179, "putstatic", 3),
300 opc_getfield (180, "getfield", 3),
301 opc_putfield (181, "putfield", 3),
302 opc_invokevirtual (182, "invokevirtual", 3),
303 opc_invokespecial (183, "invokespecial", "invokenonvirtual", 3),
304 opc_invokestatic (184, "invokestatic", 3),
305 opc_invokeinterface (185, "invokeinterface", 5),
306 opc_invokedynamic (186, "invokedynamic", 5),
307 opc_new (187, "new", 3),
308 opc_newarray (188, "newarray", 2),
309 opc_anewarray (189, "anewarray", 3),
310 opc_arraylength (190, "arraylength", 1),
311 opc_athrow (191, "athrow", 1),
312 opc_checkcast (192, "checkcast", 3),
313 opc_instanceof (193, "instanceof", 3),
314 opc_monitorenter (194, "monitorenter", 1),
315 opc_monitorexit (195, "monitorexit", 1),
316
317 // Wide Marker (not really an opcode)
318 opc_wide (196, null, 0),
319 opc_multianewarray (197, "multianewarray", 4),
320 opc_ifnull (198, "ifnull", 3),
321 opc_ifnonnull (199, "ifnonnull", 3),
322 opc_goto_w (200, "goto_w", 5),
323 opc_jsr_w (201, "jsr_w", 5),
324 opc_aconst_init (203, "aconst_init", 3),
325 opc_withfield (204, "withfield", 3),
326
327 /* Pseudo-instructions */
328 opc_bytecode (210, "bytecode", 1),
329 opc_try (211, "try", 0),
330 opc_endtry (212, "endtry", 0),
331 opc_catch (213, "catch", 0),
332 opc_var (214, "var", 0),
333 opc_endvar (215, "endvar", 0),
334 opc_locals_map (216, "locals_map", 0),
335 opc_stack_map (217, "stack_map", 0),
336 opc_stack_frame_type (218, "stack_frame_type", 0),
337
338
339 // Priv/NonPriv Marker (not really an opcode)
340 opc_nonpriv (254, "priv", 0),
341 opc_priv (255, "nonpriv", 0),
342
343
344 /* Wide instructions */
345 opc_iload_w (opc_iload.value, "iload_w", 4, OpcodeType.WIDE),
346 opc_lload_w (opc_lload.value, "lload_w", 4, OpcodeType.WIDE),
347 opc_fload_w (opc_fload.value, "fload_w", 4, OpcodeType.WIDE),
348 opc_dload_w (opc_dload.value, "dload_w", 4, OpcodeType.WIDE),
349 opc_aload_w (opc_aload.value, "aload_w", 4, OpcodeType.WIDE),
350 opc_istore_w (opc_istore.value, "istore_w", 4, OpcodeType.WIDE),
351 opc_lstore_w (opc_lstore.value, "lstore_w", 4, OpcodeType.WIDE),
352 opc_fstore_w (opc_fstore.value, "fstore_w", 4, OpcodeType.WIDE),
353 opc_dstore_w (opc_dstore.value, "dstore_w", 4, OpcodeType.WIDE),
354 opc_astore_w (opc_astore.value, "astore_w", 4, OpcodeType.WIDE),
355 opc_ret_w (opc_ret.value, "ret_w", 4, OpcodeType.WIDE),
356 opc_iinc_w (opc_iinc.value, "iinc_w", 6, OpcodeType.WIDE),
357
358
359 /* Priveleged instructions */
360 opc_load_ubyte (0, "load_ubyte", OpcodeType.NONPRIVELEGED),
361 opc_priv_load_ubyte (0, "priv_load_ubyte", OpcodeType.PRIVELEGED),
362 opc_load_byte (1, "load_byte", OpcodeType.NONPRIVELEGED),
363 opc_priv_load_byte (1, "priv_load_byte", OpcodeType.PRIVELEGED),
364 opc_load_char (2, "load_char", OpcodeType.NONPRIVELEGED),
365 opc_priv_load_char (2, "priv_load_char", OpcodeType.PRIVELEGED),
366 opc_load_short (3, "load_short", OpcodeType.NONPRIVELEGED),
367 opc_priv_load_short (3, "priv_load_short", OpcodeType.PRIVELEGED),
368 opc_load_word (4, "load_word", OpcodeType.NONPRIVELEGED),
369 opc_priv_load_word (4, "priv_load_word", OpcodeType.PRIVELEGED),
370 opc_load_char_oe (10, "load_char_oe", OpcodeType.NONPRIVELEGED),
371 opc_priv_load_char_oe (10, "priv_load_char_oe", OpcodeType.PRIVELEGED),
372 opc_load_short_oe (11, "load_short_oe", OpcodeType.NONPRIVELEGED),
373 opc_priv_load_short_oe (11, "priv_load_short_oe", OpcodeType.PRIVELEGED),
374 opc_load_word_oe (12, "load_word_oe", OpcodeType.NONPRIVELEGED),
375 opc_priv_load_word_oe (12, "priv_load_word_oe", OpcodeType.PRIVELEGED),
376 opc_ncload_ubyte (16, "ncload_ubyte", OpcodeType.NONPRIVELEGED),
377 opc_priv_ncload_ubyte (16, "priv_ncload_ubyte", OpcodeType.PRIVELEGED),
378 opc_ncload_byte (17, "ncload_byte", OpcodeType.NONPRIVELEGED),
379 opc_priv_ncload_byte (17, "priv_ncload_byte", OpcodeType.PRIVELEGED),
380 opc_ncload_char (18, "ncload_char", OpcodeType.NONPRIVELEGED),
381 opc_priv_ncload_char (18, "priv_ncload_char", OpcodeType.PRIVELEGED),
382 opc_ncload_short (19, "ncload_short", OpcodeType.NONPRIVELEGED),
383 opc_priv_ncload_short (19, "priv_ncload_short", OpcodeType.PRIVELEGED),
384 opc_ncload_word (20, "ncload_word", OpcodeType.NONPRIVELEGED),
385 opc_priv_ncload_word (20, "priv_ncload_word", OpcodeType.PRIVELEGED),
386 opc_ncload_char_oe (26, "ncload_char_oe", OpcodeType.NONPRIVELEGED),
387 opc_priv_ncload_char_oe (26, "priv_ncload_char_oe", OpcodeType.PRIVELEGED),
388 opc_ncload_short_oe (27, "ncload_short_oe", OpcodeType.NONPRIVELEGED),
389 opc_priv_ncload_short_oe (27, "priv_ncload_short_oe", OpcodeType.PRIVELEGED),
390 opc_ncload_word_oe (28, "ncload_word_oe", OpcodeType.NONPRIVELEGED),
391 opc_priv_ncload_word_oe (28, "priv_ncload_word_oe", OpcodeType.PRIVELEGED),
392 opc_cache_flush (30, "cache_flush", OpcodeType.NONPRIVELEGED),
393 opc_priv_cache_flush (30, "priv_cache_flush", OpcodeType.PRIVELEGED),
394 opc_store_byte (32, "store_byte", OpcodeType.NONPRIVELEGED),
395 opc_priv_store_byte (32, "priv_store_byte", OpcodeType.PRIVELEGED),
396 opc_store_short (34, "store_short", OpcodeType.NONPRIVELEGED),
397 opc_priv_store_short (34, "priv_store_short", OpcodeType.PRIVELEGED),
398 opc_store_word (36, "store_word", OpcodeType.NONPRIVELEGED),
399 opc_priv_store_word (36, "priv_store_word", OpcodeType.PRIVELEGED),
400 opc_store_short_oe (42, "store_short_oe", OpcodeType.NONPRIVELEGED),
401 opc_priv_store_short_oe (42, "priv_store_short_oe", OpcodeType.PRIVELEGED),
402 opc_store_word_oe (44, "store_word_oe", OpcodeType.NONPRIVELEGED),
403 opc_priv_store_word_oe (44, "priv_store_word_oe", OpcodeType.PRIVELEGED),
404 opc_ncstore_byte (48, "ncstore_byte", OpcodeType.NONPRIVELEGED),
405 opc_priv_ncstore_byte (48, "priv_ncstore_byte", OpcodeType.PRIVELEGED),
406 opc_ncstore_short (50, "ncstore_short", OpcodeType.NONPRIVELEGED),
407 opc_priv_ncstore_short (50, "priv_ncstore_short", OpcodeType.PRIVELEGED),
408 opc_ncstore_word (52, "ncstore_word", OpcodeType.NONPRIVELEGED),
409 opc_priv_ncstore_word (52, "priv_ncstore_word", OpcodeType.PRIVELEGED),
410 opc_ncstore_short_oe (58, "ncstore_short_oe", OpcodeType.NONPRIVELEGED),
411 opc_priv_ncstore_short_oe (58, "priv_ncstore_short_oe", OpcodeType.PRIVELEGED),
412 opc_ncstore_word_oe (60, "ncstore_word_oe", OpcodeType.NONPRIVELEGED),
413 opc_priv_ncstore_word_oe (60, "priv_ncstore_word_oe", OpcodeType.PRIVELEGED),
414 opc_zero_line (62, "zero_line", OpcodeType.NONPRIVELEGED),
415 opc_priv_zero_line (62, "priv_zero_line", OpcodeType.PRIVELEGED),
416 opc_ret_from_sub (5, "ret_from_sub", OpcodeType.NONPRIVELEGED),
417 opc_enter_sync_method (63, "enter_sync_method", OpcodeType.NONPRIVELEGED),
418 opc_priv_ret_from_trap (5, "priv_ret_from_trap", OpcodeType.PRIVELEGED),
419 opc_priv_read_dcache_tag (6, "priv_read_dcache_tag", OpcodeType.PRIVELEGED),
420 opc_priv_read_dcache_data (7, "priv_read_dcache_data", OpcodeType.PRIVELEGED),
421 opc_priv_read_icache_tag (14, "priv_read_icache_tag", OpcodeType.PRIVELEGED),
422 opc_priv_read_icache_data (15, "priv_read_icache_data", OpcodeType.PRIVELEGED),
423 opc_priv_powerdown (22, "priv_powerdown", OpcodeType.PRIVELEGED),
424 opc_priv_read_scache_data (23, "priv_read_scache_data", OpcodeType.PRIVELEGED),
425 opc_priv_cache_index_flush (31, "priv_cache_index_flush", OpcodeType.PRIVELEGED),
426 opc_priv_write_dcache_tag (38, "priv_write_dcache_tag", OpcodeType.PRIVELEGED),
427 opc_priv_write_dcache_data (39, "priv_write_dcache_data", OpcodeType.PRIVELEGED),
428 opc_priv_write_icache_tag (46, "priv_write_icache_tag", OpcodeType.PRIVELEGED),
429 opc_priv_write_icache_data (47, "priv_write_icache_data", OpcodeType.PRIVELEGED),
430 opc_priv_reset (54, "priv_reset", OpcodeType.PRIVELEGED),
431 opc_priv_write_scache_data (55, "priv_write_scache_data", OpcodeType.PRIVELEGED),
432 opc_priv_read_reg_0 (64, "priv_read_reg_0", OpcodeType.PRIVELEGED),
433 opc_priv_read_reg_1 (65, "priv_read_reg_1", OpcodeType.PRIVELEGED),
434 opc_priv_read_reg_2 (66, "priv_read_reg_2", OpcodeType.PRIVELEGED),
435 opc_priv_read_reg_3 (67, "priv_read_reg_3", OpcodeType.PRIVELEGED),
436 opc_priv_read_reg_4 (68, "priv_read_reg_4", OpcodeType.PRIVELEGED),
437 opc_priv_read_reg_5 (69, "priv_read_reg_5", OpcodeType.PRIVELEGED),
438 opc_priv_read_reg_6 (70, "priv_read_reg_6", OpcodeType.PRIVELEGED),
439 opc_priv_read_reg_7 (71, "priv_read_reg_7", OpcodeType.PRIVELEGED),
440 opc_priv_read_reg_8 (72, "priv_read_reg_8", OpcodeType.PRIVELEGED),
441 opc_priv_read_reg_9 (73, "priv_read_reg_9", OpcodeType.PRIVELEGED),
442 opc_priv_read_reg_10 (74, "priv_read_reg_10", OpcodeType.PRIVELEGED),
443 opc_priv_read_reg_11 (75, "priv_read_reg_11", OpcodeType.PRIVELEGED),
444 opc_priv_read_reg_12 (76, "priv_read_reg_12", OpcodeType.PRIVELEGED),
445 opc_priv_read_reg_13 (77, "priv_read_reg_13", OpcodeType.PRIVELEGED),
446 opc_priv_read_reg_14 (78, "priv_read_reg_14", OpcodeType.PRIVELEGED),
447 opc_priv_read_reg_15 (79, "priv_read_reg_15", OpcodeType.PRIVELEGED),
448 opc_priv_read_reg_16 (80, "priv_read_reg_16", OpcodeType.PRIVELEGED),
449 opc_priv_read_reg_17 (81, "priv_read_reg_17", OpcodeType.PRIVELEGED),
450 opc_priv_read_reg_18 (82, "priv_read_reg_18", OpcodeType.PRIVELEGED),
451 opc_priv_read_reg_19 (83, "priv_read_reg_19", OpcodeType.PRIVELEGED),
452 opc_priv_read_reg_20 (84, "priv_read_reg_20", OpcodeType.PRIVELEGED),
453 opc_priv_read_reg_21 (85, "priv_read_reg_21", OpcodeType.PRIVELEGED),
454 opc_priv_read_reg_22 (86, "priv_read_reg_22", OpcodeType.PRIVELEGED),
455 opc_priv_read_reg_23 (87, "priv_read_reg_23", OpcodeType.PRIVELEGED),
456 opc_priv_read_reg_24 (88, "priv_read_reg_24", OpcodeType.PRIVELEGED),
457 opc_priv_read_reg_25 (89, "priv_read_reg_25", OpcodeType.PRIVELEGED),
458 opc_priv_read_reg_26 (90, "priv_read_reg_26", OpcodeType.PRIVELEGED),
459 opc_priv_read_reg_27 (91, "priv_read_reg_27", OpcodeType.PRIVELEGED),
460 opc_priv_read_reg_28 (92, "priv_read_reg_28", OpcodeType.PRIVELEGED),
461 opc_priv_read_reg_29 (93, "priv_read_reg_29", OpcodeType.PRIVELEGED),
462 opc_priv_read_reg_30 (94, "priv_read_reg_30", OpcodeType.PRIVELEGED),
463 opc_priv_read_reg_31 (95, "priv_read_reg_31", OpcodeType.PRIVELEGED),
464 opc_priv_write_reg_0 (96, "priv_write_reg_0", OpcodeType.PRIVELEGED),
465 opc_priv_write_reg_1 (97, "priv_write_reg_1", OpcodeType.PRIVELEGED),
466 opc_priv_write_reg_2 (98, "priv_write_reg_2", OpcodeType.PRIVELEGED),
467 opc_priv_write_reg_3 (99, "priv_write_reg_3", OpcodeType.PRIVELEGED),
468 opc_priv_write_reg_4 (100, "priv_write_reg_4", OpcodeType.PRIVELEGED),
469 opc_priv_write_reg_5 (101, "priv_write_reg_5", OpcodeType.PRIVELEGED),
470 opc_priv_write_reg_6 (102, "priv_write_reg_6", OpcodeType.PRIVELEGED),
471 opc_priv_write_reg_7 (103, "priv_write_reg_7", OpcodeType.PRIVELEGED),
472 opc_priv_write_reg_8 (104, "priv_write_reg_8", OpcodeType.PRIVELEGED),
473 opc_priv_write_reg_9 (105, "priv_write_reg_9", OpcodeType.PRIVELEGED),
474 opc_priv_write_reg_10 (106, "priv_write_reg_10", OpcodeType.PRIVELEGED),
475 opc_priv_write_reg_11 (107, "priv_write_reg_11", OpcodeType.PRIVELEGED),
476 opc_priv_write_reg_12 (108, "priv_write_reg_12", OpcodeType.PRIVELEGED),
477 opc_priv_write_reg_13 (109, "priv_write_reg_13", OpcodeType.PRIVELEGED),
478 opc_priv_write_reg_14 (110, "priv_write_reg_14", OpcodeType.PRIVELEGED),
479 opc_priv_write_reg_15 (111, "priv_write_reg_15", OpcodeType.PRIVELEGED),
480 opc_priv_write_reg_16 (112, "priv_write_reg_16", OpcodeType.PRIVELEGED),
481 opc_priv_write_reg_17 (113, "priv_write_reg_17", OpcodeType.PRIVELEGED),
482 opc_priv_write_reg_18 (114, "priv_write_reg_18", OpcodeType.PRIVELEGED),
483 opc_priv_write_reg_19 (115, "priv_write_reg_19", OpcodeType.PRIVELEGED),
484 opc_priv_write_reg_20 (116, "priv_write_reg_20", OpcodeType.PRIVELEGED),
485 opc_priv_write_reg_21 (117, "priv_write_reg_21", OpcodeType.PRIVELEGED),
486 opc_priv_write_reg_22 (118, "priv_write_reg_22", OpcodeType.PRIVELEGED),
487 opc_priv_write_reg_23 (119, "priv_write_reg_23", OpcodeType.PRIVELEGED),
488 opc_priv_write_reg_24 (120, "priv_write_reg_24", OpcodeType.PRIVELEGED),
489 opc_priv_write_reg_25 (121, "priv_write_reg_25", OpcodeType.PRIVELEGED),
490 opc_priv_write_reg_26 (122, "priv_write_reg_26", OpcodeType.PRIVELEGED),
491 opc_priv_write_reg_27 (123, "priv_write_reg_27", OpcodeType.PRIVELEGED),
492 opc_priv_write_reg_28 (124, "priv_write_reg_28", OpcodeType.PRIVELEGED),
493 opc_priv_write_reg_29 (125, "priv_write_reg_29", OpcodeType.PRIVELEGED),
494 opc_priv_write_reg_30 (126, "priv_write_reg_30", OpcodeType.PRIVELEGED),
495 opc_priv_write_reg_31 (127, "priv_write_reg_31", OpcodeType.PRIVELEGED);
496
497 private Integer value;
498 private String parsekey;
499 private String alias;
500 private Integer length;
501 private Integer baseVal;
502 private OpcodeType type;
503
504 Opcode(Integer val, String parse, OpcodeType tp) {
505 init(val, parse, null, 2, tp);
506 }
507
508 Opcode(Integer val, String parse, int len, OpcodeType tp) {
509 init(val, parse, null, len, tp);
510 }
511
512 Opcode(Integer val, String parse) {
513 init(val, parse, null, 2, OpcodeType.NORMAL);
514 }
515
516 Opcode(Integer val, String parse, int len) {
517 init(val, parse, null, len, OpcodeType.NORMAL);
518 }
519
520 Opcode(Integer val, String parse, String als, int len) {
521 init(val, parse, als, len, OpcodeType.NORMAL);
522 }
523
524 Opcode(Integer val, String parse, String als, int len, OpcodeType tp) {
525 init(val, parse, als, len, tp);
526 }
527
528 private void init(Integer val, String parse, String als, int len, OpcodeType tp) {
529 type = tp;
530 baseVal = null;
531 switch (tp) {
532 case NORMAL:
533 value = val;
534 break;
535 case WIDE:
536 value = (opc_wide.value << 8) | val;
537 break;
538 case PRIVELEGED:
539 value = (opc_priv.value * 0xFF) + val;
540 baseVal = val;
541 break;
542 case NONPRIVELEGED:
543 value = (opc_nonpriv.value * 0xFF) + val;
544 baseVal = val;
545 break;
546 }
547 parsekey = parse;
548 alias = als;
549 length = len;
550 }
551
552 public Integer value() {
553 return value;
554 }
555
556 public int length() {
557 return length;
558 }
559
560 public String parsekey() {
561 return parsekey;
562 }
563
564 public OpcodeType type() {
565 return type;
566 }
567 }
568
569 }