Add support for jumbo volatile field access opcodes
diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java
index d90226a..b1d71a9 100644
--- a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java
+++ b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java
@@ -1098,6 +1098,20 @@
             case INVOKE_OBJECT_INIT_JUMBO:
                 analyzeInvokeObjectInitJumbo(analyzedInstruction);
                 return true;
+            case IGET_VOLATILE_JUMBO:
+            case IGET_WIDE_VOLATILE_JUMBO:
+            case IGET_OBJECT_VOLATILE_JUMBO:
+            case IPUT_VOLATILE_JUMBO:
+            case IPUT_WIDE_VOLATILE_JUMBO:
+            case IPUT_OBJECT_VOLATILE_JUMBO:
+            case SGET_VOLATILE_JUMBO:
+            case SGET_WIDE_VOLATILE_JUMBO:
+            case SGET_OBJECT_VOLATILE_JUMBO:
+            case SPUT_VOLATILE_JUMBO:
+            case SPUT_WIDE_VOLATILE_JUMBO:
+            case SPUT_OBJECT_VOLATILE_JUMBO:
+                analyzePutGetVolatile(analyzedInstruction);
+                return true;
             default:
                 assert false;
                 return true;
@@ -1593,6 +1607,18 @@
             case SGET_OBJECT_VOLATILE:
             case SPUT_OBJECT_VOLATILE:
             case INVOKE_OBJECT_INIT_JUMBO:
+            case IGET_VOLATILE_JUMBO:
+            case IGET_WIDE_VOLATILE_JUMBO:
+            case IGET_OBJECT_VOLATILE_JUMBO:
+            case IPUT_VOLATILE_JUMBO:
+            case IPUT_WIDE_VOLATILE_JUMBO:
+            case IPUT_OBJECT_VOLATILE_JUMBO:
+            case SGET_VOLATILE_JUMBO:
+            case SGET_WIDE_VOLATILE_JUMBO:
+            case SGET_OBJECT_VOLATILE_JUMBO:
+            case SPUT_VOLATILE_JUMBO:
+            case SPUT_WIDE_VOLATILE_JUMBO:
+            case SPUT_OBJECT_VOLATILE_JUMBO:
                 //TODO: throw validation exception?
             default:
                 assert false;
@@ -3627,14 +3653,23 @@
 
         if (analyzedInstruction.instruction.opcode.isOdexedStaticVolatile()) {
             SingleRegisterInstruction instruction = (SingleRegisterInstruction)analyzedInstruction.instruction;
-
-            deodexedInstruction = new Instruction21c(opcode, (byte)instruction.getRegisterA(),
-                fieldIdItem);
+            if (analyzedInstruction.instruction.opcode.format == Format.Format21c) {
+                deodexedInstruction = new Instruction21c(opcode, (byte)instruction.getRegisterA(), fieldIdItem);
+            } else {
+                assert(analyzedInstruction.instruction.opcode.format == Format.Format41c);
+                deodexedInstruction = new Instruction41c(opcode, (byte)instruction.getRegisterA(), fieldIdItem);
+            }
         } else {
             TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
 
-            deodexedInstruction = new Instruction22c(opcode, (byte)instruction.getRegisterA(),
-                (byte)instruction.getRegisterB(), fieldIdItem);
+            if (analyzedInstruction.instruction.opcode.format == Format.Format22c) {
+                deodexedInstruction = new Instruction22c(opcode, (byte)instruction.getRegisterA(),
+                    (byte)instruction.getRegisterB(), fieldIdItem);
+            } else {
+                assert(analyzedInstruction.instruction.opcode.format == Format.Format52c);
+                deodexedInstruction = new Instruction52c(opcode, (byte)instruction.getRegisterA(),
+                    (byte)instruction.getRegisterB(), fieldIdItem);
+            }
         }
 
         analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/OdexedFieldInstructionMapper.java b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/OdexedFieldInstructionMapper.java
index 2facd98..644cbd3 100644
--- a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/OdexedFieldInstructionMapper.java
+++ b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/OdexedFieldInstructionMapper.java
@@ -178,6 +178,107 @@
             }
     };
 
+    private static Opcode[][][][] jumboOpcodeMap = new Opcode[][][][] {
+            //get opcodes
+            new Opcode[][][] {
+                    //iget volatile
+                    new Opcode[][] {
+                            //odexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.IGET_VOLATILE_JUMBO,
+                                /*B*/   Opcode.IGET_VOLATILE_JUMBO,
+                                /*S*/   Opcode.IGET_VOLATILE_JUMBO,
+                                /*C*/   Opcode.IGET_VOLATILE_JUMBO,
+                                /*I,F*/ Opcode.IGET_VOLATILE_JUMBO,
+                                /*J,D*/ Opcode.IGET_WIDE_VOLATILE_JUMBO,
+                                /*L,[*/ Opcode.IGET_OBJECT_VOLATILE_JUMBO
+                            },
+                            //deodexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.IGET_BOOLEAN_JUMBO,
+                                /*B*/   Opcode.IGET_BYTE_JUMBO,
+                                /*S*/   Opcode.IGET_SHORT_JUMBO,
+                                /*C*/   Opcode.IGET_CHAR_JUMBO,
+                                /*I,F*/ Opcode.IGET_JUMBO,
+                                /*J,D*/ Opcode.IGET_WIDE_JUMBO,
+                                /*L,[*/ Opcode.IGET_OBJECT_JUMBO
+                            }
+                    },
+                    //sget volatile
+                    new Opcode[][] {
+                            //odexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.SGET_VOLATILE_JUMBO,
+                                /*B*/   Opcode.SGET_VOLATILE_JUMBO,
+                                /*S*/   Opcode.SGET_VOLATILE_JUMBO,
+                                /*C*/   Opcode.SGET_VOLATILE_JUMBO,
+                                /*I,F*/ Opcode.SGET_VOLATILE_JUMBO,
+                                /*J,D*/ Opcode.SGET_WIDE_VOLATILE_JUMBO,
+                                /*L,[*/ Opcode.SGET_OBJECT_VOLATILE_JUMBO
+                            },
+                            //deodexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.SGET_BOOLEAN_JUMBO,
+                                /*B*/   Opcode.SGET_BYTE_JUMBO,
+                                /*S*/   Opcode.SGET_SHORT_JUMBO,
+                                /*C*/   Opcode.SGET_CHAR_JUMBO,
+                                /*I,F*/ Opcode.SGET_JUMBO,
+                                /*J,D*/ Opcode.SGET_WIDE_JUMBO,
+                                /*L,[*/ Opcode.SGET_OBJECT_JUMBO
+                            }
+                    }
+            },
+            //put opcodes
+            new Opcode[][][] {
+                    //iput volatile
+                    new Opcode[][] {
+                            //odexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.IPUT_VOLATILE_JUMBO,
+                                /*B*/   Opcode.IPUT_VOLATILE_JUMBO,
+                                /*S*/   Opcode.IPUT_VOLATILE_JUMBO,
+                                /*C*/   Opcode.IPUT_VOLATILE_JUMBO,
+                                /*I,F*/ Opcode.IPUT_VOLATILE_JUMBO,
+                                /*J,D*/ Opcode.IPUT_WIDE_VOLATILE_JUMBO,
+                                /*L,[*/ Opcode.IPUT_OBJECT_VOLATILE_JUMBO
+                            },
+                            //deodexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.IPUT_BOOLEAN_JUMBO,
+                                /*B*/   Opcode.IPUT_BYTE_JUMBO,
+                                /*S*/   Opcode.IPUT_SHORT_JUMBO,
+                                /*C*/   Opcode.IPUT_CHAR_JUMBO,
+                                /*I,F*/ Opcode.IPUT_JUMBO,
+                                /*J,D*/ Opcode.IPUT_WIDE_JUMBO,
+                                /*L,[*/ Opcode.IPUT_OBJECT_JUMBO
+                            }
+                    },
+                    //sput volatile
+                    new Opcode[][] {
+                            //odexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.SPUT_VOLATILE_JUMBO,
+                                /*B*/   Opcode.SPUT_VOLATILE_JUMBO,
+                                /*S*/   Opcode.SPUT_VOLATILE_JUMBO,
+                                /*C*/   Opcode.SPUT_VOLATILE_JUMBO,
+                                /*I,F*/ Opcode.SPUT_VOLATILE_JUMBO,
+                                /*J,D*/ Opcode.SPUT_WIDE_VOLATILE_JUMBO,
+                                /*L,[*/ Opcode.SPUT_OBJECT_VOLATILE_JUMBO
+                            },
+                            //deodexed
+                            new Opcode[] {
+                                /*Z*/   Opcode.SPUT_BOOLEAN_JUMBO,
+                                /*B*/   Opcode.SPUT_BYTE_JUMBO,
+                                /*S*/   Opcode.SPUT_SHORT_JUMBO,
+                                /*C*/   Opcode.SPUT_CHAR_JUMBO,
+                                /*I,F*/ Opcode.SPUT_JUMBO,
+                                /*J,D*/ Opcode.SPUT_WIDE_JUMBO,
+                                /*L,[*/ Opcode.SPUT_OBJECT_JUMBO
+                            }
+                    }
+            }
+    };
+
     private static int getTypeIndex(char type) {
         switch (type) {
             case 'Z':
@@ -214,12 +315,20 @@
     }
 
     static Opcode getAndCheckDeodexedOpcodeForOdexedOpcode(String fieldType, Opcode odexedOpcode) {
+        boolean jumbo = odexedOpcode.isJumboOpcode();
         int opcodeType = odexedOpcode.setsRegister()?0:1;
         int opcodeSubType = getOpcodeSubtype(odexedOpcode);
         int typeIndex = getTypeIndex(fieldType.charAt(0));
 
-        Opcode correctOdexedOpcode = opcodeMap[opcodeType][opcodeSubType][0][typeIndex];
-        Opcode deodexedOpcode = opcodeMap[opcodeType][opcodeSubType][1][typeIndex];
+        Opcode correctOdexedOpcode, deodexedOpcode;
+
+        if (jumbo) {
+            correctOdexedOpcode = jumboOpcodeMap[opcodeType][opcodeSubType-1][0][typeIndex];
+            deodexedOpcode = jumboOpcodeMap[opcodeType][opcodeSubType-1][1][typeIndex];
+        } else {
+            correctOdexedOpcode = opcodeMap[opcodeType][opcodeSubType][0][typeIndex];
+            deodexedOpcode = opcodeMap[opcodeType][opcodeSubType][1][typeIndex];
+        }
 
         if (correctOdexedOpcode != odexedOpcode) {
             throw new ValidationException(String.format("Incorrect field type \"%s\" for %s", fieldType,
diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Opcode.java b/dexlib/src/main/java/org/jf/dexlib/Code/Opcode.java
index 92b82ab..d1abc88 100644
--- a/dexlib/src/main/java/org/jf/dexlib/Code/Opcode.java
+++ b/dexlib/src/main/java/org/jf/dexlib/Code/Opcode.java
@@ -325,6 +325,18 @@
     INVOKE_INTERFACE_JUMBO((short)0xff26, "invoke-interface/jumbo", ReferenceType.method, Format.Format5rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.JUMBO_OPCODE),
 
     INVOKE_OBJECT_INIT_JUMBO((short)0xfff2, "invoke-object-init/jumbo", ReferenceType.method,  Format.Format5rc, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.JUMBO_OPCODE),
+    IGET_VOLATILE_JUMBO((short)0xfff3, "iget-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.JUMBO_OPCODE),
+    IGET_WIDE_VOLATILE_JUMBO((short)0xfff4, "iget-wide-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER | Opcode.JUMBO_OPCODE),
+    IGET_OBJECT_VOLATILE_JUMBO((short)0xfff5, "iget-object-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.JUMBO_OPCODE),
+    IPUT_VOLATILE_JUMBO((short)0xfff6, "iput-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE),
+    IPUT_WIDE_VOLATILE_JUMBO((short)0xfff7, "iput-wide-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE),
+    IPUT_OBJECT_VOLATILE_JUMBO((short)0xfff8, "iput-object-volatile/jumbo", ReferenceType.field, Format.Format52c, Opcode.ODEX_ONLY | Opcode.ODEXED_INSTANCE_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE),
+    SGET_VOLATILE_JUMBO((short)0xfff9, "sget-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.JUMBO_OPCODE),
+    SGET_WIDE_VOLATILE_JUMBO((short)0xfffa, "sget-wide-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER | Opcode.JUMBO_OPCODE),
+    SGET_OBJECT_VOLATILE_JUMBO((short)0xfffb, "sget-object-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.JUMBO_OPCODE),
+    SPUT_VOLATILE_JUMBO((short)0xfffc, "sput-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE),
+    SPUT_WIDE_VOLATILE_JUMBO((short)0xfffd, "sput-wide-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE),
+    SPUT_OBJECT_VOLATILE_JUMBO((short)0xfffe, "sput-object-volatile/jumbo", ReferenceType.field, Format.Format41c, Opcode.ODEX_ONLY | Opcode.ODEXED_STATIC_VOLATILE | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.JUMBO_OPCODE);
 
     private static Opcode[] opcodesByValue;
     private static Opcode[] expandedOpcodesByValue;
@@ -436,7 +448,11 @@
                     SGET_CHAR_JUMBO, SGET_SHORT_JUMBO, SPUT_JUMBO, SPUT_WIDE_JUMBO, SPUT_OBJECT_JUMBO,
                     SPUT_BOOLEAN_JUMBO, SPUT_BYTE_JUMBO, SPUT_CHAR_JUMBO, SPUT_SHORT_JUMBO, INVOKE_VIRTUAL_JUMBO,
                     INVOKE_SUPER_JUMBO, INVOKE_DIRECT_JUMBO, INVOKE_STATIC_JUMBO, INVOKE_INTERFACE_JUMBO,
-                    INVOKE_OBJECT_INIT_RANGE, INVOKE_OBJECT_INIT_JUMBO);
+                    INVOKE_OBJECT_INIT_RANGE, INVOKE_OBJECT_INIT_JUMBO, IGET_VOLATILE_JUMBO, IGET_WIDE_VOLATILE_JUMBO,
+                    IGET_OBJECT_VOLATILE_JUMBO, IPUT_VOLATILE_JUMBO, IPUT_WIDE_VOLATILE_JUMBO,
+                    IPUT_OBJECT_VOLATILE_JUMBO, SGET_VOLATILE_JUMBO, SGET_WIDE_VOLATILE_JUMBO,
+                    SGET_OBJECT_VOLATILE_JUMBO, SPUT_VOLATILE_JUMBO, SPUT_WIDE_VOLATILE_JUMBO,
+                    SPUT_OBJECT_VOLATILE_JUMBO);
             addOpcodes(INVOKE_DIRECT_EMPTY);
         }
     }
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
index 882744b..3d7949e 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
@@ -717,6 +717,14 @@
 	|	'sput-char/jumbo'
 	|	'sput-short/jumbo';
 
+INSTRUCTION_FORMAT41c_FIELD_ODEX
+	:	'sget-volatile/jumbo'
+	|	'sget-wide-volatile/jumbo'
+	|	'sget-object-volatile/jumbo'
+	|	'sput-volatile/jumbo'
+	|	'sput-wide-volatile/jumbo'
+	|	'sput-object-volatile/jumbo';
+
 INSTRUCTION_FORMAT51l
 	:	'const-wide';
 
@@ -740,6 +748,14 @@
 	|	'iput-char/jumbo'
 	|	'iput-short/jumbo';
 
+INSTRUCTION_FORMAT52c_FIELD_ODEX
+	:	'iget-volatile/jumbo'
+	|	'iget-wide-volatile/jumbo'
+	|	'iget-object-volatile/jumbo'
+	|	'iput-volatile/jumbo'
+	|	'iput-wide-volatile/jumbo'
+	|	'iput-object-volatile/jumbo';
+
 INSTRUCTION_FORMAT5rc_METHOD
 	:	'invoke-virtual/jumbo'
 	|	'invoke-super/jumbo'
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
index acf6064..1d957c5 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -857,6 +857,11 @@
 	|	//e.g. sget-object/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
 		INSTRUCTION_FORMAT41c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
 		-> ^(I_STATEMENT_FORMAT41c_FIELD[$start, "I_STATEMENT_FORMAT41c_FIELD"] INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field)
+	|	//e.g. sget-object-volatile/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+		INSTRUCTION_FORMAT41c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
+		{
+			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT41c_FIELD_ODEX.text);
+		}
 	|	//e.g. const-wide v0, 5000000000L
 		INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;}
 		-> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal)
@@ -866,6 +871,11 @@
 	|	//e.g. iput-object/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
 		INSTRUCTION_FORMAT52c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
 		-> ^(I_STATEMENT_FORMAT52c_FIELD[$start, "I_STATEMENT_FORMAT52c_FIELD"] INSTRUCTION_FORMAT52c_FIELD REGISTER REGISTER fully_qualified_field)
+	|	//e.g. iput-object-volatile/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
+		INSTRUCTION_FORMAT52c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
+		{
+			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT52c_FIELD_ODEX.text);
+		}
 	|	//e.g. invoke-virtual/jumbo {v25..v26}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
 		INSTRUCTION_FORMAT5rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
 		-> ^(I_STATEMENT_FORMAT5rc_METHOD[$start, "I_STATEMENT_FORMAT5rc_METHOD"] INSTRUCTION_FORMAT5rc_METHOD register_range fully_qualified_method)
diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex
index 9713916..5fba139 100644
--- a/smali/src/main/jflex/smaliLexer.flex
+++ b/smali/src/main/jflex/smaliLexer.flex
@@ -580,6 +580,11 @@
         return newToken(INSTRUCTION_FORMAT41c_FIELD);
     }
 
+    "sget-volatile/jumbo" | "sget-wide-volatile/jumbo" | "sget-object-volatile/jumbo" | "sput-volatile/jumbo" |
+    "sput-wide-volatile/jumbo" | "sput-object-volatile/jumbo" {
+        return newToken(INSTRUCTION_FORMAT41c_FIELD_ODEX);
+    }
+
     "const-wide" {
         return newToken(INSTRUCTION_FORMAT51l);
     }
@@ -594,6 +599,11 @@
         return newToken(INSTRUCTION_FORMAT52c_FIELD);
     }
 
+    "iget-volatile/jumbo" | "iget-wide-volatile/jumbo" | "iget-object-volatile/jumbo" | "iput-volatile/jumbo" |
+    "iput-wide-volatile/jumbo" | "iput-object-volatile/jumbo" {
+        return newToken(INSTRUCTION_FORMAT52c_FIELD_ODEX);
+    }
+
     "invoke-virtual/jumbo" | "invoke-super/jumbo" | "invoke-direct/jumbo" | "invoke-static/jumbo" |
     "invoke-interface/jumbo" {
         return newToken(INSTRUCTION_FORMAT5rc_METHOD);
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali
index 47cc6d6..8b45834 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.smali
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -265,4 +265,16 @@
 invoke-static/jumbo
 invoke-interface/jumbo
 filled-new-array/jumbo
-invoke-object-init/jumbo
\ No newline at end of file
+invoke-object-init/jumbo
+iget-volatile/jumbo
+iget-wide-volatile/jumbo
+iget-object-volatile/jumbo
+iput-volatile/jumbo
+iput-wide-volatile/jumbo
+iput-object-volatile/jumbo
+sget-volatile/jumbo
+sget-wide-volatile/jumbo
+sget-object-volatile/jumbo
+sput-volatile/jumbo
+sput-wide-volatile/jumbo
+sput-object-volatile/jumbo
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens
index 1de5aad..457ceeb 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.tokens
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -265,4 +265,16 @@
 INSTRUCTION_FORMAT5rc_METHOD("invoke-static/jumbo")
 INSTRUCTION_FORMAT5rc_METHOD("invoke-interface/jumbo")
 INSTRUCTION_FORMAT5rc_TYPE("filled-new-array/jumbo")
-INSTRUCTION_FORMAT5rc_METHOD_ODEX("invoke-object-init/jumbo")
\ No newline at end of file
+INSTRUCTION_FORMAT5rc_METHOD_ODEX("invoke-object-init/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-wide-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-object-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-wide-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-object-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-wide-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-object-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-wide-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-object-volatile/jumbo")