OSDN Git Service

Add the new jumbo opcodes to dx...almost.
authorDan Bornstein <danfuzz@android.com>
Tue, 9 Nov 2010 00:28:33 +0000 (16:28 -0800)
committerDan Bornstein <danfuzz@android.com>
Tue, 9 Nov 2010 00:28:33 +0000 (16:28 -0800)
This change adds the new opcodes while simultaneously preventing
them from actually being emitted, the prevention being controlled
by a new flag in InsnFormat.

Empirically speaking, we already have latent demand for the new
opcodes -- specifically because they allow for wider register
references than their wee companions -- and so we can't actually
enable their generation until the VM is prepared to execute them.

If you're wondering why dx without the new opcodes doesn't crap out on
the register references in question, it's because there's code in dx
which will expand an instruction that has non-fitting register
references into a sequence of two or more instructions, where it
shuffles values into and out of usable registers before and/or after
the instruction. When we turn on the jumbo opcodes, at least some
of these register shuffles will immediately get to go away.

Change-Id: I3f921ab07efa4944d7526fa48534d69f508ac249

dx/etc/bytecode.txt
dx/src/com/android/dx/dex/code/DalvOps.java
dx/src/com/android/dx/dex/code/Dops.java
dx/src/com/android/dx/dex/code/InsnFormat.java
dx/src/com/android/dx/dex/code/form/Form32s.java
dx/src/com/android/dx/dex/code/form/Form33x.java
dx/src/com/android/dx/dex/code/form/Form41c.java
dx/src/com/android/dx/dex/code/form/Form52c.java
dx/src/com/android/dx/dex/code/form/Form5rc.java

index 28908be..1592ac8 100644 (file)
@@ -107,12 +107,12 @@ op 3a 21t n if-ltz
 op 3b 21t n if-gez
 op 3c 21t n if-gtz
 op 3d 21t n if-lez
-op 3e 10x n unused-3e
-op 3f 10x n unused-3f
-op 40 10x n unused-40
-op 41 10x n unused-41
-op 42 10x n unused-42
-op 43 10x n unused-43
+# unused: op 3e
+# unused: op 3f
+# unused: op 40
+# unused: op 41
+# unused: op 42
+# unused: op 43
 op 44 23x y aget
 op 45 23x y aget-wide
 op 46 23x y aget-object
@@ -160,14 +160,14 @@ op 6f 35c n invoke-super
 op 70 35c n invoke-direct
 op 71 35c n invoke-static
 op 72 35c n invoke-interface
-op 73 10x n unused-73
+# unused: op 73
 op 74 3rc n invoke-virtual/range
 op 75 3rc n invoke-super/range
 op 76 3rc n invoke-direct/range
 op 77 3rc n invoke-static/range
 op 78 3rc n invoke-interface/range
-op 79 10x n unused-79
-op 7a 10x n unused-7a
+# unused: op 79
+# unused: op 7a
 op 7b 12x y neg-int
 op 7c 12x y not-int
 op 7d 12x y neg-long
@@ -272,32 +272,43 @@ op df 22b y xor-int/lit8
 op e0 22b y shl-int/lit8
 op e1 22b y shr-int/lit8
 op e2 22b y ushr-int/lit8
-op e3 10x n unused-e3
-op e4 10x n unused-e4
-op e5 10x n unused-e5
-op e6 10x n unused-e6
-op e7 10x n unused-e7
-op e8 10x n unused-e8
-op e9 10x n unused-e9
-op ea 10x n unused-ea
-op eb 10x n unused-eb
-op ec 10x n unused-ec
-op ed 10x n unused-ed
-op ee 10x n unused-ee
-op ef 10x n unused-ef
-op f0 10x n unused-f0
-op f1 10x n unused-f1
-op f2 10x n unused-f2
-op f3 10x n unused-f3
-op f4 10x n unused-f4
-op f5 10x n unused-f5
-op f6 10x n unused-f6
-op f7 10x n unused-f7
-op f8 10x n unused-f8
-op f9 10x n unused-f9
-op fa 10x n unused-fa
-op fb 10x n unused-fb
-op fc 10x n unused-fc
-op fd 10x n unused-fd
-op fe 10x n unused-fe
-op ff 10x n unused-ff
+# unused: op e3..fe
+op 00ff 41c n check-cast/jumbo
+op 01ff 52c y instance-of/jumbo
+op 02ff 41c y new-instance/jumbo
+op 03ff 52c y new-array/jumbo
+op 04ff 5rc n filled-new-array/jumbo
+op 05ff 52c y iget/jumbo
+op 06ff 52c y iget-wide/jumbo
+op 07ff 52c y iget-object/jumbo
+op 08ff 52c y iget-boolean/jumbo
+op 09ff 52c y iget-byte/jumbo
+op 0aff 52c y iget-char/jumbo
+op 0bff 52c y iget-short/jumbo
+op 0cff 52c n iput/jumbo
+op 0dff 52c n iput-wide/jumbo
+op 0eff 52c n iput-object/jumbo
+op 0fff 52c n iput-boolean/jumbo
+op 10ff 52c n iput-byte/jumbo
+op 11ff 52c n iput-char/jumbo
+op 12ff 52c n iput-short/jumbo
+op 13ff 41c y sget/jumbo
+op 14ff 41c y sget-wide/jumbo
+op 15ff 41c y sget-object/jumbo
+op 16ff 41c y sget-boolean/jumbo
+op 17ff 41c y sget-byte/jumbo
+op 18ff 41c y sget-char/jumbo
+op 19ff 41c y sget-short/jumbo
+op 1aff 41c n sput/jumbo
+op 1bff 41c n sput-wide/jumbo
+op 1cff 41c n sput-object/jumbo
+op 1dff 41c n sput-boolean/jumbo
+op 1eff 41c n sput-byte/jumbo
+op 1fff 41c n sput-char/jumbo
+op 20ff 41c n sput-short/jumbo
+op 21ff 5rc n invoke-virtual/jumbo
+op 22ff 5rc n invoke-super/jumbo
+op 23ff 5rc n invoke-direct/jumbo
+op 24ff 5rc n invoke-static/jumbo
+op 25ff 5rc n invoke-interface/jumbo
+# unused: op 26ff..ffff
index f57089b..6c67fb8 100644 (file)
@@ -31,7 +31,7 @@ public final class DalvOps {
     public static final int MIN_VALUE = -1;
 
     /** maximum valid opcode value */
-    public static final int MAX_VALUE = 0xff;
+    public static final int MAX_VALUE = 0xffff;
 
     // BEGIN(opcodes); GENERATED AUTOMATICALLY BY opcode-gen
     public static final int NOP = 0x00;
@@ -96,12 +96,6 @@ public final class DalvOps {
     public static final int IF_GEZ = 0x3b;
     public static final int IF_GTZ = 0x3c;
     public static final int IF_LEZ = 0x3d;
-    public static final int UNUSED_3E = 0x3e;
-    public static final int UNUSED_3F = 0x3f;
-    public static final int UNUSED_40 = 0x40;
-    public static final int UNUSED_41 = 0x41;
-    public static final int UNUSED_42 = 0x42;
-    public static final int UNUSED_43 = 0x43;
     public static final int AGET = 0x44;
     public static final int AGET_WIDE = 0x45;
     public static final int AGET_OBJECT = 0x46;
@@ -149,14 +143,11 @@ public final class DalvOps {
     public static final int INVOKE_DIRECT = 0x70;
     public static final int INVOKE_STATIC = 0x71;
     public static final int INVOKE_INTERFACE = 0x72;
-    public static final int UNUSED_73 = 0x73;
     public static final int INVOKE_VIRTUAL_RANGE = 0x74;
     public static final int INVOKE_SUPER_RANGE = 0x75;
     public static final int INVOKE_DIRECT_RANGE = 0x76;
     public static final int INVOKE_STATIC_RANGE = 0x77;
     public static final int INVOKE_INTERFACE_RANGE = 0x78;
-    public static final int UNUSED_79 = 0x79;
-    public static final int UNUSED_7A = 0x7a;
     public static final int NEG_INT = 0x7b;
     public static final int NOT_INT = 0x7c;
     public static final int NEG_LONG = 0x7d;
@@ -261,35 +252,44 @@ public final class DalvOps {
     public static final int SHL_INT_LIT8 = 0xe0;
     public static final int SHR_INT_LIT8 = 0xe1;
     public static final int USHR_INT_LIT8 = 0xe2;
-    public static final int UNUSED_E3 = 0xe3;
-    public static final int UNUSED_E4 = 0xe4;
-    public static final int UNUSED_E5 = 0xe5;
-    public static final int UNUSED_E6 = 0xe6;
-    public static final int UNUSED_E7 = 0xe7;
-    public static final int UNUSED_E8 = 0xe8;
-    public static final int UNUSED_E9 = 0xe9;
-    public static final int UNUSED_EA = 0xea;
-    public static final int UNUSED_EB = 0xeb;
-    public static final int UNUSED_EC = 0xec;
-    public static final int UNUSED_ED = 0xed;
-    public static final int UNUSED_EE = 0xee;
-    public static final int UNUSED_EF = 0xef;
-    public static final int UNUSED_F0 = 0xf0;
-    public static final int UNUSED_F1 = 0xf1;
-    public static final int UNUSED_F2 = 0xf2;
-    public static final int UNUSED_F3 = 0xf3;
-    public static final int UNUSED_F4 = 0xf4;
-    public static final int UNUSED_F5 = 0xf5;
-    public static final int UNUSED_F6 = 0xf6;
-    public static final int UNUSED_F7 = 0xf7;
-    public static final int UNUSED_F8 = 0xf8;
-    public static final int UNUSED_F9 = 0xf9;
-    public static final int UNUSED_FA = 0xfa;
-    public static final int UNUSED_FB = 0xfb;
-    public static final int UNUSED_FC = 0xfc;
-    public static final int UNUSED_FD = 0xfd;
-    public static final int UNUSED_FE = 0xfe;
-    public static final int UNUSED_FF = 0xff;
+    public static final int CHECK_CAST_JUMBO = 0x00ff;
+    public static final int INSTANCE_OF_JUMBO = 0x01ff;
+    public static final int NEW_INSTANCE_JUMBO = 0x02ff;
+    public static final int NEW_ARRAY_JUMBO = 0x03ff;
+    public static final int FILLED_NEW_ARRAY_JUMBO = 0x04ff;
+    public static final int IGET_JUMBO = 0x05ff;
+    public static final int IGET_WIDE_JUMBO = 0x06ff;
+    public static final int IGET_OBJECT_JUMBO = 0x07ff;
+    public static final int IGET_BOOLEAN_JUMBO = 0x08ff;
+    public static final int IGET_BYTE_JUMBO = 0x09ff;
+    public static final int IGET_CHAR_JUMBO = 0x0aff;
+    public static final int IGET_SHORT_JUMBO = 0x0bff;
+    public static final int IPUT_JUMBO = 0x0cff;
+    public static final int IPUT_WIDE_JUMBO = 0x0dff;
+    public static final int IPUT_OBJECT_JUMBO = 0x0eff;
+    public static final int IPUT_BOOLEAN_JUMBO = 0x0fff;
+    public static final int IPUT_BYTE_JUMBO = 0x10ff;
+    public static final int IPUT_CHAR_JUMBO = 0x11ff;
+    public static final int IPUT_SHORT_JUMBO = 0x12ff;
+    public static final int SGET_JUMBO = 0x13ff;
+    public static final int SGET_WIDE_JUMBO = 0x14ff;
+    public static final int SGET_OBJECT_JUMBO = 0x15ff;
+    public static final int SGET_BOOLEAN_JUMBO = 0x16ff;
+    public static final int SGET_BYTE_JUMBO = 0x17ff;
+    public static final int SGET_CHAR_JUMBO = 0x18ff;
+    public static final int SGET_SHORT_JUMBO = 0x19ff;
+    public static final int SPUT_JUMBO = 0x1aff;
+    public static final int SPUT_WIDE_JUMBO = 0x1bff;
+    public static final int SPUT_OBJECT_JUMBO = 0x1cff;
+    public static final int SPUT_BOOLEAN_JUMBO = 0x1dff;
+    public static final int SPUT_BYTE_JUMBO = 0x1eff;
+    public static final int SPUT_CHAR_JUMBO = 0x1fff;
+    public static final int SPUT_SHORT_JUMBO = 0x20ff;
+    public static final int INVOKE_VIRTUAL_JUMBO = 0x21ff;
+    public static final int INVOKE_SUPER_JUMBO = 0x22ff;
+    public static final int INVOKE_DIRECT_JUMBO = 0x23ff;
+    public static final int INVOKE_STATIC_JUMBO = 0x24ff;
+    public static final int INVOKE_INTERFACE_JUMBO = 0x25ff;
     // END(opcodes)
 
     /**
index 417c1f1..01b245d 100644 (file)
@@ -39,7 +39,10 @@ import com.android.dx.dex.code.form.Form31t;
 import com.android.dx.dex.code.form.Form32x;
 import com.android.dx.dex.code.form.Form35c;
 import com.android.dx.dex.code.form.Form3rc;
+import com.android.dx.dex.code.form.Form41c;
 import com.android.dx.dex.code.form.Form51l;
+import com.android.dx.dex.code.form.Form52c;
+import com.android.dx.dex.code.form.Form5rc;
 import com.android.dx.dex.code.form.SpecialFormat;
 
 /**
@@ -217,12 +220,12 @@ public final class Dops {
 
     public static final Dop CHECK_CAST =
         new Dop(DalvOps.CHECK_CAST, DalvOps.CHECK_CAST,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.CHECK_CAST_JUMBO, Form21c.THE_ONE, true,
             "check-cast");
 
     public static final Dop INSTANCE_OF =
         new Dop(DalvOps.INSTANCE_OF, DalvOps.INSTANCE_OF,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.INSTANCE_OF_JUMBO, Form22c.THE_ONE, true,
             "instance-of");
 
     public static final Dop ARRAY_LENGTH =
@@ -232,12 +235,12 @@ public final class Dops {
 
     public static final Dop NEW_INSTANCE =
         new Dop(DalvOps.NEW_INSTANCE, DalvOps.NEW_INSTANCE,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.NEW_INSTANCE_JUMBO, Form21c.THE_ONE, true,
             "new-instance");
 
     public static final Dop NEW_ARRAY =
         new Dop(DalvOps.NEW_ARRAY, DalvOps.NEW_ARRAY,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.NEW_ARRAY_JUMBO, Form22c.THE_ONE, true,
             "new-array");
 
     public static final Dop FILLED_NEW_ARRAY =
@@ -247,7 +250,7 @@ public final class Dops {
 
     public static final Dop FILLED_NEW_ARRAY_RANGE =
         new Dop(DalvOps.FILLED_NEW_ARRAY_RANGE, DalvOps.FILLED_NEW_ARRAY,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.FILLED_NEW_ARRAY_JUMBO, Form3rc.THE_ONE, false,
             "filled-new-array/range");
 
     public static final Dop FILL_ARRAY_DATA =
@@ -442,142 +445,142 @@ public final class Dops {
 
     public static final Dop IGET =
         new Dop(DalvOps.IGET, DalvOps.IGET,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_JUMBO, Form22c.THE_ONE, true,
             "iget");
 
     public static final Dop IGET_WIDE =
         new Dop(DalvOps.IGET_WIDE, DalvOps.IGET_WIDE,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_WIDE_JUMBO, Form22c.THE_ONE, true,
             "iget-wide");
 
     public static final Dop IGET_OBJECT =
         new Dop(DalvOps.IGET_OBJECT, DalvOps.IGET_OBJECT,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_OBJECT_JUMBO, Form22c.THE_ONE, true,
             "iget-object");
 
     public static final Dop IGET_BOOLEAN =
         new Dop(DalvOps.IGET_BOOLEAN, DalvOps.IGET_BOOLEAN,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_BOOLEAN_JUMBO, Form22c.THE_ONE, true,
             "iget-boolean");
 
     public static final Dop IGET_BYTE =
         new Dop(DalvOps.IGET_BYTE, DalvOps.IGET_BYTE,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_BYTE_JUMBO, Form22c.THE_ONE, true,
             "iget-byte");
 
     public static final Dop IGET_CHAR =
         new Dop(DalvOps.IGET_CHAR, DalvOps.IGET_CHAR,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_CHAR_JUMBO, Form22c.THE_ONE, true,
             "iget-char");
 
     public static final Dop IGET_SHORT =
         new Dop(DalvOps.IGET_SHORT, DalvOps.IGET_SHORT,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, true,
+            DalvOps.IGET_SHORT_JUMBO, Form22c.THE_ONE, true,
             "iget-short");
 
     public static final Dop IPUT =
         new Dop(DalvOps.IPUT, DalvOps.IPUT,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_JUMBO, Form22c.THE_ONE, false,
             "iput");
 
     public static final Dop IPUT_WIDE =
         new Dop(DalvOps.IPUT_WIDE, DalvOps.IPUT_WIDE,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_WIDE_JUMBO, Form22c.THE_ONE, false,
             "iput-wide");
 
     public static final Dop IPUT_OBJECT =
         new Dop(DalvOps.IPUT_OBJECT, DalvOps.IPUT_OBJECT,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_OBJECT_JUMBO, Form22c.THE_ONE, false,
             "iput-object");
 
     public static final Dop IPUT_BOOLEAN =
         new Dop(DalvOps.IPUT_BOOLEAN, DalvOps.IPUT_BOOLEAN,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_BOOLEAN_JUMBO, Form22c.THE_ONE, false,
             "iput-boolean");
 
     public static final Dop IPUT_BYTE =
         new Dop(DalvOps.IPUT_BYTE, DalvOps.IPUT_BYTE,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_BYTE_JUMBO, Form22c.THE_ONE, false,
             "iput-byte");
 
     public static final Dop IPUT_CHAR =
         new Dop(DalvOps.IPUT_CHAR, DalvOps.IPUT_CHAR,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_CHAR_JUMBO, Form22c.THE_ONE, false,
             "iput-char");
 
     public static final Dop IPUT_SHORT =
         new Dop(DalvOps.IPUT_SHORT, DalvOps.IPUT_SHORT,
-            DalvOps.NO_NEXT, Form22c.THE_ONE, false,
+            DalvOps.IPUT_SHORT_JUMBO, Form22c.THE_ONE, false,
             "iput-short");
 
     public static final Dop SGET =
         new Dop(DalvOps.SGET, DalvOps.SGET,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_JUMBO, Form21c.THE_ONE, true,
             "sget");
 
     public static final Dop SGET_WIDE =
         new Dop(DalvOps.SGET_WIDE, DalvOps.SGET_WIDE,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_WIDE_JUMBO, Form21c.THE_ONE, true,
             "sget-wide");
 
     public static final Dop SGET_OBJECT =
         new Dop(DalvOps.SGET_OBJECT, DalvOps.SGET_OBJECT,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_OBJECT_JUMBO, Form21c.THE_ONE, true,
             "sget-object");
 
     public static final Dop SGET_BOOLEAN =
         new Dop(DalvOps.SGET_BOOLEAN, DalvOps.SGET_BOOLEAN,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_BOOLEAN_JUMBO, Form21c.THE_ONE, true,
             "sget-boolean");
 
     public static final Dop SGET_BYTE =
         new Dop(DalvOps.SGET_BYTE, DalvOps.SGET_BYTE,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_BYTE_JUMBO, Form21c.THE_ONE, true,
             "sget-byte");
 
     public static final Dop SGET_CHAR =
         new Dop(DalvOps.SGET_CHAR, DalvOps.SGET_CHAR,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_CHAR_JUMBO, Form21c.THE_ONE, true,
             "sget-char");
 
     public static final Dop SGET_SHORT =
         new Dop(DalvOps.SGET_SHORT, DalvOps.SGET_SHORT,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, true,
+            DalvOps.SGET_SHORT_JUMBO, Form21c.THE_ONE, true,
             "sget-short");
 
     public static final Dop SPUT =
         new Dop(DalvOps.SPUT, DalvOps.SPUT,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_JUMBO, Form21c.THE_ONE, false,
             "sput");
 
     public static final Dop SPUT_WIDE =
         new Dop(DalvOps.SPUT_WIDE, DalvOps.SPUT_WIDE,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_WIDE_JUMBO, Form21c.THE_ONE, false,
             "sput-wide");
 
     public static final Dop SPUT_OBJECT =
         new Dop(DalvOps.SPUT_OBJECT, DalvOps.SPUT_OBJECT,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_OBJECT_JUMBO, Form21c.THE_ONE, false,
             "sput-object");
 
     public static final Dop SPUT_BOOLEAN =
         new Dop(DalvOps.SPUT_BOOLEAN, DalvOps.SPUT_BOOLEAN,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_BOOLEAN_JUMBO, Form21c.THE_ONE, false,
             "sput-boolean");
 
     public static final Dop SPUT_BYTE =
         new Dop(DalvOps.SPUT_BYTE, DalvOps.SPUT_BYTE,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_BYTE_JUMBO, Form21c.THE_ONE, false,
             "sput-byte");
 
     public static final Dop SPUT_CHAR =
         new Dop(DalvOps.SPUT_CHAR, DalvOps.SPUT_CHAR,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_CHAR_JUMBO, Form21c.THE_ONE, false,
             "sput-char");
 
     public static final Dop SPUT_SHORT =
         new Dop(DalvOps.SPUT_SHORT, DalvOps.SPUT_SHORT,
-            DalvOps.NO_NEXT, Form21c.THE_ONE, false,
+            DalvOps.SPUT_SHORT_JUMBO, Form21c.THE_ONE, false,
             "sput-short");
 
     public static final Dop INVOKE_VIRTUAL =
@@ -607,27 +610,27 @@ public final class Dops {
 
     public static final Dop INVOKE_VIRTUAL_RANGE =
         new Dop(DalvOps.INVOKE_VIRTUAL_RANGE, DalvOps.INVOKE_VIRTUAL,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.INVOKE_VIRTUAL_JUMBO, Form3rc.THE_ONE, false,
             "invoke-virtual/range");
 
     public static final Dop INVOKE_SUPER_RANGE =
         new Dop(DalvOps.INVOKE_SUPER_RANGE, DalvOps.INVOKE_SUPER,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.INVOKE_SUPER_JUMBO, Form3rc.THE_ONE, false,
             "invoke-super/range");
 
     public static final Dop INVOKE_DIRECT_RANGE =
         new Dop(DalvOps.INVOKE_DIRECT_RANGE, DalvOps.INVOKE_DIRECT,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.INVOKE_DIRECT_JUMBO, Form3rc.THE_ONE, false,
             "invoke-direct/range");
 
     public static final Dop INVOKE_STATIC_RANGE =
         new Dop(DalvOps.INVOKE_STATIC_RANGE, DalvOps.INVOKE_STATIC,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.INVOKE_STATIC_JUMBO, Form3rc.THE_ONE, false,
             "invoke-static/range");
 
     public static final Dop INVOKE_INTERFACE_RANGE =
         new Dop(DalvOps.INVOKE_INTERFACE_RANGE, DalvOps.INVOKE_INTERFACE,
-            DalvOps.NO_NEXT, Form3rc.THE_ONE, false,
+            DalvOps.INVOKE_INTERFACE_JUMBO, Form3rc.THE_ONE, false,
             "invoke-interface/range");
 
     public static final Dop NEG_INT =
@@ -1150,6 +1153,196 @@ public final class Dops {
             DalvOps.NO_NEXT, Form22b.THE_ONE, true,
             "ushr-int/lit8");
 
+    public static final Dop CHECK_CAST_JUMBO =
+        new Dop(DalvOps.CHECK_CAST_JUMBO, DalvOps.CHECK_CAST,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "check-cast/jumbo");
+
+    public static final Dop INSTANCE_OF_JUMBO =
+        new Dop(DalvOps.INSTANCE_OF_JUMBO, DalvOps.INSTANCE_OF,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "instance-of/jumbo");
+
+    public static final Dop NEW_INSTANCE_JUMBO =
+        new Dop(DalvOps.NEW_INSTANCE_JUMBO, DalvOps.NEW_INSTANCE,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "new-instance/jumbo");
+
+    public static final Dop NEW_ARRAY_JUMBO =
+        new Dop(DalvOps.NEW_ARRAY_JUMBO, DalvOps.NEW_ARRAY,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "new-array/jumbo");
+
+    public static final Dop FILLED_NEW_ARRAY_JUMBO =
+        new Dop(DalvOps.FILLED_NEW_ARRAY_JUMBO, DalvOps.FILLED_NEW_ARRAY,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "filled-new-array/jumbo");
+
+    public static final Dop IGET_JUMBO =
+        new Dop(DalvOps.IGET_JUMBO, DalvOps.IGET,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget/jumbo");
+
+    public static final Dop IGET_WIDE_JUMBO =
+        new Dop(DalvOps.IGET_WIDE_JUMBO, DalvOps.IGET_WIDE,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-wide/jumbo");
+
+    public static final Dop IGET_OBJECT_JUMBO =
+        new Dop(DalvOps.IGET_OBJECT_JUMBO, DalvOps.IGET_OBJECT,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-object/jumbo");
+
+    public static final Dop IGET_BOOLEAN_JUMBO =
+        new Dop(DalvOps.IGET_BOOLEAN_JUMBO, DalvOps.IGET_BOOLEAN,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-boolean/jumbo");
+
+    public static final Dop IGET_BYTE_JUMBO =
+        new Dop(DalvOps.IGET_BYTE_JUMBO, DalvOps.IGET_BYTE,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-byte/jumbo");
+
+    public static final Dop IGET_CHAR_JUMBO =
+        new Dop(DalvOps.IGET_CHAR_JUMBO, DalvOps.IGET_CHAR,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-char/jumbo");
+
+    public static final Dop IGET_SHORT_JUMBO =
+        new Dop(DalvOps.IGET_SHORT_JUMBO, DalvOps.IGET_SHORT,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, true,
+            "iget-short/jumbo");
+
+    public static final Dop IPUT_JUMBO =
+        new Dop(DalvOps.IPUT_JUMBO, DalvOps.IPUT,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput/jumbo");
+
+    public static final Dop IPUT_WIDE_JUMBO =
+        new Dop(DalvOps.IPUT_WIDE_JUMBO, DalvOps.IPUT_WIDE,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-wide/jumbo");
+
+    public static final Dop IPUT_OBJECT_JUMBO =
+        new Dop(DalvOps.IPUT_OBJECT_JUMBO, DalvOps.IPUT_OBJECT,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-object/jumbo");
+
+    public static final Dop IPUT_BOOLEAN_JUMBO =
+        new Dop(DalvOps.IPUT_BOOLEAN_JUMBO, DalvOps.IPUT_BOOLEAN,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-boolean/jumbo");
+
+    public static final Dop IPUT_BYTE_JUMBO =
+        new Dop(DalvOps.IPUT_BYTE_JUMBO, DalvOps.IPUT_BYTE,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-byte/jumbo");
+
+    public static final Dop IPUT_CHAR_JUMBO =
+        new Dop(DalvOps.IPUT_CHAR_JUMBO, DalvOps.IPUT_CHAR,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-char/jumbo");
+
+    public static final Dop IPUT_SHORT_JUMBO =
+        new Dop(DalvOps.IPUT_SHORT_JUMBO, DalvOps.IPUT_SHORT,
+            DalvOps.NO_NEXT, Form52c.THE_ONE, false,
+            "iput-short/jumbo");
+
+    public static final Dop SGET_JUMBO =
+        new Dop(DalvOps.SGET_JUMBO, DalvOps.SGET,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget/jumbo");
+
+    public static final Dop SGET_WIDE_JUMBO =
+        new Dop(DalvOps.SGET_WIDE_JUMBO, DalvOps.SGET_WIDE,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-wide/jumbo");
+
+    public static final Dop SGET_OBJECT_JUMBO =
+        new Dop(DalvOps.SGET_OBJECT_JUMBO, DalvOps.SGET_OBJECT,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-object/jumbo");
+
+    public static final Dop SGET_BOOLEAN_JUMBO =
+        new Dop(DalvOps.SGET_BOOLEAN_JUMBO, DalvOps.SGET_BOOLEAN,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-boolean/jumbo");
+
+    public static final Dop SGET_BYTE_JUMBO =
+        new Dop(DalvOps.SGET_BYTE_JUMBO, DalvOps.SGET_BYTE,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-byte/jumbo");
+
+    public static final Dop SGET_CHAR_JUMBO =
+        new Dop(DalvOps.SGET_CHAR_JUMBO, DalvOps.SGET_CHAR,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-char/jumbo");
+
+    public static final Dop SGET_SHORT_JUMBO =
+        new Dop(DalvOps.SGET_SHORT_JUMBO, DalvOps.SGET_SHORT,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, true,
+            "sget-short/jumbo");
+
+    public static final Dop SPUT_JUMBO =
+        new Dop(DalvOps.SPUT_JUMBO, DalvOps.SPUT,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput/jumbo");
+
+    public static final Dop SPUT_WIDE_JUMBO =
+        new Dop(DalvOps.SPUT_WIDE_JUMBO, DalvOps.SPUT_WIDE,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-wide/jumbo");
+
+    public static final Dop SPUT_OBJECT_JUMBO =
+        new Dop(DalvOps.SPUT_OBJECT_JUMBO, DalvOps.SPUT_OBJECT,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-object/jumbo");
+
+    public static final Dop SPUT_BOOLEAN_JUMBO =
+        new Dop(DalvOps.SPUT_BOOLEAN_JUMBO, DalvOps.SPUT_BOOLEAN,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-boolean/jumbo");
+
+    public static final Dop SPUT_BYTE_JUMBO =
+        new Dop(DalvOps.SPUT_BYTE_JUMBO, DalvOps.SPUT_BYTE,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-byte/jumbo");
+
+    public static final Dop SPUT_CHAR_JUMBO =
+        new Dop(DalvOps.SPUT_CHAR_JUMBO, DalvOps.SPUT_CHAR,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-char/jumbo");
+
+    public static final Dop SPUT_SHORT_JUMBO =
+        new Dop(DalvOps.SPUT_SHORT_JUMBO, DalvOps.SPUT_SHORT,
+            DalvOps.NO_NEXT, Form41c.THE_ONE, false,
+            "sput-short/jumbo");
+
+    public static final Dop INVOKE_VIRTUAL_JUMBO =
+        new Dop(DalvOps.INVOKE_VIRTUAL_JUMBO, DalvOps.INVOKE_VIRTUAL,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "invoke-virtual/jumbo");
+
+    public static final Dop INVOKE_SUPER_JUMBO =
+        new Dop(DalvOps.INVOKE_SUPER_JUMBO, DalvOps.INVOKE_SUPER,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "invoke-super/jumbo");
+
+    public static final Dop INVOKE_DIRECT_JUMBO =
+        new Dop(DalvOps.INVOKE_DIRECT_JUMBO, DalvOps.INVOKE_DIRECT,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "invoke-direct/jumbo");
+
+    public static final Dop INVOKE_STATIC_JUMBO =
+        new Dop(DalvOps.INVOKE_STATIC_JUMBO, DalvOps.INVOKE_STATIC,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "invoke-static/jumbo");
+
+    public static final Dop INVOKE_INTERFACE_JUMBO =
+        new Dop(DalvOps.INVOKE_INTERFACE_JUMBO, DalvOps.INVOKE_INTERFACE,
+            DalvOps.NO_NEXT, Form5rc.THE_ONE, false,
+            "invoke-interface/jumbo");
+
     // END(dops)
 
     // Static initialization.
@@ -1377,6 +1570,44 @@ public final class Dops {
         set(SHL_INT_LIT8);
         set(SHR_INT_LIT8);
         set(USHR_INT_LIT8);
+        set(CHECK_CAST_JUMBO);
+        set(INSTANCE_OF_JUMBO);
+        set(NEW_INSTANCE_JUMBO);
+        set(NEW_ARRAY_JUMBO);
+        set(FILLED_NEW_ARRAY_JUMBO);
+        set(IGET_JUMBO);
+        set(IGET_WIDE_JUMBO);
+        set(IGET_OBJECT_JUMBO);
+        set(IGET_BOOLEAN_JUMBO);
+        set(IGET_BYTE_JUMBO);
+        set(IGET_CHAR_JUMBO);
+        set(IGET_SHORT_JUMBO);
+        set(IPUT_JUMBO);
+        set(IPUT_WIDE_JUMBO);
+        set(IPUT_OBJECT_JUMBO);
+        set(IPUT_BOOLEAN_JUMBO);
+        set(IPUT_BYTE_JUMBO);
+        set(IPUT_CHAR_JUMBO);
+        set(IPUT_SHORT_JUMBO);
+        set(SGET_JUMBO);
+        set(SGET_WIDE_JUMBO);
+        set(SGET_OBJECT_JUMBO);
+        set(SGET_BOOLEAN_JUMBO);
+        set(SGET_BYTE_JUMBO);
+        set(SGET_CHAR_JUMBO);
+        set(SGET_SHORT_JUMBO);
+        set(SPUT_JUMBO);
+        set(SPUT_WIDE_JUMBO);
+        set(SPUT_OBJECT_JUMBO);
+        set(SPUT_BOOLEAN_JUMBO);
+        set(SPUT_BYTE_JUMBO);
+        set(SPUT_CHAR_JUMBO);
+        set(SPUT_SHORT_JUMBO);
+        set(INVOKE_VIRTUAL_JUMBO);
+        set(INVOKE_SUPER_JUMBO);
+        set(INVOKE_DIRECT_JUMBO);
+        set(INVOKE_STATIC_JUMBO);
+        set(INVOKE_INTERFACE_JUMBO);
         // END(dops-init)
     }
 
index 19b2151..0db25c2 100644 (file)
@@ -34,6 +34,13 @@ import com.android.dx.util.Hex;
  */
 public abstract class InsnFormat {
     /**
+     * flag to enable/disable the new extended opcode formats; meant as a
+     * temporary measure until VM support for the salient opcodes is
+     * added. TODO: Remove this declaration when the VM can deal.
+     */
+    public static boolean ALLOW_EXTENDED_OPCODES = false;
+
+    /**
      * Returns the string form, suitable for inclusion in a listing
      * dump, of the given instruction. The instruction must be of this
      * instance's format for proper operation.
index f55922e..18e40e2 100644 (file)
@@ -66,6 +66,10 @@ public final class Form32s extends InsnFormat {
     /** {@inheritDoc} */
     @Override
     public boolean isCompatible(DalvInsn insn) {
+        if (! ALLOW_EXTENDED_OPCODES) {
+            return false;
+        }
+
         RegisterSpecList regs = insn.getRegisters();
         if (!((insn instanceof CstInsn) &&
               (regs.size() == 2) &&
index a8ea3af..96c57eb 100644 (file)
@@ -62,6 +62,10 @@ public final class Form33x extends InsnFormat {
     /** {@inheritDoc} */
     @Override
     public boolean isCompatible(DalvInsn insn) {
+        if (! ALLOW_EXTENDED_OPCODES) {
+            return false;
+        }
+
         RegisterSpecList regs = insn.getRegisters();
 
         return (insn instanceof SimpleInsn) &&
index 1f02cb2..aecddcd 100644 (file)
@@ -69,6 +69,10 @@ public final class Form41c extends InsnFormat {
     /** {@inheritDoc} */
     @Override
     public boolean isCompatible(DalvInsn insn) {
+        if (! ALLOW_EXTENDED_OPCODES) {
+            return false;
+        }
+
         if (!(insn instanceof CstInsn)) {
             return false;
         }
index 4fd3e66..9e03c56 100644 (file)
@@ -69,6 +69,10 @@ public final class Form52c extends InsnFormat {
     /** {@inheritDoc} */
     @Override
     public boolean isCompatible(DalvInsn insn) {
+        if (! ALLOW_EXTENDED_OPCODES) {
+            return false;
+        }
+
         RegisterSpecList regs = insn.getRegisters();
         if (!((insn instanceof CstInsn) &&
               (regs.size() == 2) &&
index 668ef21..de2becb 100644 (file)
@@ -68,6 +68,10 @@ public final class Form5rc extends InsnFormat {
     /** {@inheritDoc} */
     @Override
     public boolean isCompatible(DalvInsn insn) {
+        if (! ALLOW_EXTENDED_OPCODES) {
+            return false;
+        }
+
         if (!(insn instanceof CstInsn)) {
             return false;
         }