Add volatile/jumbo opcodes
This adds 12 dexopt-generated "volatile/jumbo" instructions, to
be used for replacing appropriate get/put ops, plus a jumbo
replacement for invoke-object-init/range.
The new instructions are defined but not yet used. For x86 and
x86-atom, C stubs are selected.
Also, guarded macro args used in arithmetic expressions in header.S.
Bug 3403118
Change-Id: I283cea053d1cee1d70c3715df3e71177e8b8d3b2
diff --git a/libdex/DexOpcodes.c b/libdex/DexOpcodes.c
index b7a3414..50254a7 100644
--- a/libdex/DexOpcodes.c
+++ b/libdex/DexOpcodes.c
@@ -528,19 +528,19 @@
"unused-efff",
"unused-f0ff",
"unused-f1ff",
- "unused-f2ff",
- "unused-f3ff",
- "unused-f4ff",
- "unused-f5ff",
- "unused-f6ff",
- "unused-f7ff",
- "unused-f8ff",
- "unused-f9ff",
- "unused-faff",
- "unused-fbff",
- "unused-fcff",
- "unused-fdff",
- "unused-feff",
+ "+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",
"^throw-verification-error/jumbo",
// END(libdex-opcode-names)
};
diff --git a/libdex/DexOpcodes.h b/libdex/DexOpcodes.h
index 10fd8a1..07188b2 100644
--- a/libdex/DexOpcodes.h
+++ b/libdex/DexOpcodes.h
@@ -566,19 +566,19 @@
OP_UNUSED_EFFF = 0x1ef,
OP_UNUSED_F0FF = 0x1f0,
OP_UNUSED_F1FF = 0x1f1,
- OP_UNUSED_F2FF = 0x1f2,
- OP_UNUSED_F3FF = 0x1f3,
- OP_UNUSED_F4FF = 0x1f4,
- OP_UNUSED_F5FF = 0x1f5,
- OP_UNUSED_F6FF = 0x1f6,
- OP_UNUSED_F7FF = 0x1f7,
- OP_UNUSED_F8FF = 0x1f8,
- OP_UNUSED_F9FF = 0x1f9,
- OP_UNUSED_FAFF = 0x1fa,
- OP_UNUSED_FBFF = 0x1fb,
- OP_UNUSED_FCFF = 0x1fc,
- OP_UNUSED_FDFF = 0x1fd,
- OP_UNUSED_FEFF = 0x1fe,
+ OP_INVOKE_OBJECT_INIT_JUMBO = 0x1f2,
+ OP_IGET_VOLATILE_JUMBO = 0x1f3,
+ OP_IGET_WIDE_VOLATILE_JUMBO = 0x1f4,
+ OP_IGET_OBJECT_VOLATILE_JUMBO = 0x1f5,
+ OP_IPUT_VOLATILE_JUMBO = 0x1f6,
+ OP_IPUT_WIDE_VOLATILE_JUMBO = 0x1f7,
+ OP_IPUT_OBJECT_VOLATILE_JUMBO = 0x1f8,
+ OP_SGET_VOLATILE_JUMBO = 0x1f9,
+ OP_SGET_WIDE_VOLATILE_JUMBO = 0x1fa,
+ OP_SGET_OBJECT_VOLATILE_JUMBO = 0x1fb,
+ OP_SPUT_VOLATILE_JUMBO = 0x1fc,
+ OP_SPUT_WIDE_VOLATILE_JUMBO = 0x1fd,
+ OP_SPUT_OBJECT_VOLATILE_JUMBO = 0x1fe,
OP_THROW_VERIFICATION_ERROR_JUMBO = 0x1ff,
// END(libdex-opcode-enum)
} Opcode;
@@ -1088,19 +1088,19 @@
H(OP_UNUSED_EFFF), \
H(OP_UNUSED_F0FF), \
H(OP_UNUSED_F1FF), \
- H(OP_UNUSED_F2FF), \
- H(OP_UNUSED_F3FF), \
- H(OP_UNUSED_F4FF), \
- H(OP_UNUSED_F5FF), \
- H(OP_UNUSED_F6FF), \
- H(OP_UNUSED_F7FF), \
- H(OP_UNUSED_F8FF), \
- H(OP_UNUSED_F9FF), \
- H(OP_UNUSED_FAFF), \
- H(OP_UNUSED_FBFF), \
- H(OP_UNUSED_FCFF), \
- H(OP_UNUSED_FDFF), \
- H(OP_UNUSED_FEFF), \
+ H(OP_INVOKE_OBJECT_INIT_JUMBO), \
+ H(OP_IGET_VOLATILE_JUMBO), \
+ H(OP_IGET_WIDE_VOLATILE_JUMBO), \
+ H(OP_IGET_OBJECT_VOLATILE_JUMBO), \
+ H(OP_IPUT_VOLATILE_JUMBO), \
+ H(OP_IPUT_WIDE_VOLATILE_JUMBO), \
+ H(OP_IPUT_OBJECT_VOLATILE_JUMBO), \
+ H(OP_SGET_VOLATILE_JUMBO), \
+ H(OP_SGET_WIDE_VOLATILE_JUMBO), \
+ H(OP_SGET_OBJECT_VOLATILE_JUMBO), \
+ H(OP_SPUT_VOLATILE_JUMBO), \
+ H(OP_SPUT_WIDE_VOLATILE_JUMBO), \
+ H(OP_SPUT_OBJECT_VOLATILE_JUMBO), \
H(OP_THROW_VERIFICATION_ERROR_JUMBO), \
/* END(libdex-goto-table) */ \
};
diff --git a/libdex/InstrUtils.c b/libdex/InstrUtils.c
index 7355301..0e72d43 100644
--- a/libdex/InstrUtils.c
+++ b/libdex/InstrUtils.c
@@ -63,7 +63,7 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
+ 0, 0, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4,
// END(libdex-widths)
};
@@ -571,19 +571,19 @@
0,
0,
0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
+ kInstrCanContinue,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
+ kInstrCanContinue|kInstrCanThrow,
kInstrCanThrow,
// END(libdex-flags)
};
@@ -665,8 +665,8 @@
kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
- kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
- kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
+ kFmt00x, kFmt5rc, kFmt52c, kFmt52c, kFmt52c, kFmt52c, kFmt52c,
+ kFmt52c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c,
kFmt40sc,
// END(libdex-formats)
};
@@ -843,11 +843,11 @@
kIndexUnknown, kIndexUnknown, kIndexUnknown,
kIndexUnknown, kIndexUnknown, kIndexUnknown,
kIndexUnknown, kIndexUnknown, kIndexUnknown,
- kIndexUnknown, kIndexUnknown, kIndexUnknown,
- kIndexUnknown, kIndexUnknown, kIndexUnknown,
- kIndexUnknown, kIndexUnknown, kIndexUnknown,
- kIndexUnknown, kIndexUnknown, kIndexUnknown,
- kIndexUnknown, kIndexVaries,
+ kIndexMethodRef, kIndexFieldRef, kIndexFieldRef,
+ kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
+ kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
+ kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
+ kIndexFieldRef, kIndexVaries,
// END(libdex-index-types)
};
diff --git a/opcode-gen/bytecode.txt b/opcode-gen/bytecode.txt
index 6fd57db..7f69214 100644
--- a/opcode-gen/bytecode.txt
+++ b/opcode-gen/bytecode.txt
@@ -393,10 +393,25 @@
op 25ff invoke-static/jumbo 5rc n method-ref continue|throw|invoke
op 26ff invoke-interface/jumbo 5rc n method-ref continue|throw|invoke
-# unused: op 27ff..feff
+# unused: op 27ff..f1ff
#
# Optimized opcodes (not valid in an unoptimized dex file)
#
-op ffff ^throw-verification-error/jumbo 40sc n varies optimized|throw
+# See notes above invoke-object-init re: no "throw" or "invoke"
+op f2ff +invoke-object-init/jumbo 5rc n method-ref optimized|continue
+
+op f3ff +iget-volatile/jumbo 52c y field-ref optimized|continue|throw
+op f4ff +iget-wide-volatile/jumbo 52c y field-ref optimized|continue|throw
+op f5ff +iget-object-volatile/jumbo 52c y field-ref optimized|continue|throw
+op f6ff +iput-volatile/jumbo 52c n field-ref optimized|continue|throw
+op f7ff +iput-wide-volatile/jumbo 52c n field-ref optimized|continue|throw
+op f8ff +iput-object-volatile/jumbo 52c n field-ref optimized|continue|throw
+op f9ff +sget-volatile/jumbo 41c y field-ref optimized|continue|throw
+op faff +sget-wide-volatile/jumbo 41c y field-ref optimized|continue|throw
+op fbff +sget-object-volatile/jumbo 41c y field-ref optimized|continue|throw
+op fcff +sput-volatile/jumbo 41c n field-ref optimized|continue|throw
+op fdff +sput-wide-volatile/jumbo 41c n field-ref optimized|continue|throw
+op feff +sput-object-volatile/jumbo 41c n field-ref optimized|continue|throw
+op ffff ^throw-verification-error/jumbo 40sc n varies optimized|throw
diff --git a/vm/analysis/CodeVerify.c b/vm/analysis/CodeVerify.c
index 1894d5d..1ddc713 100644
--- a/vm/analysis/CodeVerify.c
+++ b/vm/analysis/CodeVerify.c
@@ -4744,6 +4744,7 @@
case OP_IGET:
case OP_IGET_VOLATILE:
case OP_IGET_JUMBO:
+ case OP_IGET_VOLATILE_JUMBO:
tmpType = kRegTypeInteger;
goto iget_1nr_common;
case OP_IGET_BOOLEAN:
@@ -4791,6 +4792,7 @@
case OP_IGET_WIDE:
case OP_IGET_WIDE_VOLATILE:
case OP_IGET_WIDE_JUMBO:
+ case OP_IGET_WIDE_VOLATILE_JUMBO:
{
RegType dstType;
InstField* instField;
@@ -4825,6 +4827,7 @@
case OP_IGET_OBJECT:
case OP_IGET_OBJECT_VOLATILE:
case OP_IGET_OBJECT_JUMBO:
+ case OP_IGET_OBJECT_VOLATILE_JUMBO:
{
ClassObject* fieldClass;
InstField* instField;
@@ -4853,6 +4856,7 @@
case OP_IPUT:
case OP_IPUT_VOLATILE:
case OP_IPUT_JUMBO:
+ case OP_IPUT_VOLATILE_JUMBO:
tmpType = kRegTypeInteger;
goto iput_1nr_common;
case OP_IPUT_BOOLEAN:
@@ -4918,6 +4922,7 @@
case OP_IPUT_WIDE:
case OP_IPUT_WIDE_VOLATILE:
case OP_IPUT_WIDE_JUMBO:
+ case OP_IPUT_WIDE_VOLATILE_JUMBO:
tmpType = getRegisterType(workLine, decInsn.vA);
{
RegType typeHi = getRegisterType(workLine, decInsn.vA+1);
@@ -4955,6 +4960,7 @@
case OP_IPUT_OBJECT:
case OP_IPUT_OBJECT_VOLATILE:
case OP_IPUT_OBJECT_JUMBO:
+ case OP_IPUT_OBJECT_VOLATILE_JUMBO:
{
ClassObject* fieldClass;
ClassObject* valueClass;
@@ -5012,6 +5018,7 @@
case OP_SGET:
case OP_SGET_VOLATILE:
case OP_SGET_JUMBO:
+ case OP_SGET_VOLATILE_JUMBO:
tmpType = kRegTypeInteger;
goto sget_1nr_common;
case OP_SGET_BOOLEAN:
@@ -5062,6 +5069,7 @@
case OP_SGET_WIDE:
case OP_SGET_WIDE_VOLATILE:
case OP_SGET_WIDE_JUMBO:
+ case OP_SGET_WIDE_VOLATILE_JUMBO:
{
StaticField* staticField;
RegType dstType;
@@ -5093,6 +5101,7 @@
case OP_SGET_OBJECT:
case OP_SGET_OBJECT_VOLATILE:
case OP_SGET_OBJECT_JUMBO:
+ case OP_SGET_OBJECT_VOLATILE_JUMBO:
{
StaticField* staticField;
ClassObject* fieldClass;
@@ -5118,6 +5127,7 @@
case OP_SPUT:
case OP_SPUT_VOLATILE:
case OP_SPUT_JUMBO:
+ case OP_SPUT_VOLATILE_JUMBO:
tmpType = kRegTypeInteger;
goto sput_1nr_common;
case OP_SPUT_BOOLEAN:
@@ -5185,6 +5195,7 @@
case OP_SPUT_WIDE:
case OP_SPUT_WIDE_VOLATILE:
case OP_SPUT_WIDE_JUMBO:
+ case OP_SPUT_WIDE_VOLATILE_JUMBO:
tmpType = getRegisterType(workLine, decInsn.vA);
{
RegType typeHi = getRegisterType(workLine, decInsn.vA+1);
@@ -5219,6 +5230,7 @@
case OP_SPUT_OBJECT:
case OP_SPUT_OBJECT_VOLATILE:
case OP_SPUT_OBJECT_JUMBO:
+ case OP_SPUT_OBJECT_VOLATILE_JUMBO:
{
ClassObject* fieldClass;
ClassObject* valueClass;
@@ -5741,6 +5753,7 @@
case OP_EXECUTE_INLINE:
case OP_EXECUTE_INLINE_RANGE:
case OP_INVOKE_OBJECT_INIT_RANGE:
+ case OP_INVOKE_OBJECT_INIT_JUMBO:
case OP_IGET_QUICK:
case OP_IGET_WIDE_QUICK:
case OP_IGET_OBJECT_QUICK:
@@ -5970,19 +5983,6 @@
case OP_UNUSED_EFFF:
case OP_UNUSED_F0FF:
case OP_UNUSED_F1FF:
- case OP_UNUSED_F2FF:
- case OP_UNUSED_F3FF:
- case OP_UNUSED_F4FF:
- case OP_UNUSED_F5FF:
- case OP_UNUSED_F6FF:
- case OP_UNUSED_F7FF:
- case OP_UNUSED_F8FF:
- case OP_UNUSED_F9FF:
- case OP_UNUSED_FAFF:
- case OP_UNUSED_FBFF:
- case OP_UNUSED_FCFF:
- case OP_UNUSED_FDFF:
- case OP_UNUSED_FEFF:
failure = VERIFY_ERROR_GENERIC;
break;
diff --git a/vm/analysis/DexVerify.c b/vm/analysis/DexVerify.c
index ce536e5..7f06320 100644
--- a/vm/analysis/DexVerify.c
+++ b/vm/analysis/DexVerify.c
@@ -1192,12 +1192,25 @@
case OP_IPUT_WIDE_VOLATILE:
case OP_SGET_WIDE_VOLATILE:
case OP_SPUT_WIDE_VOLATILE:
+ case OP_IGET_VOLATILE_JUMBO:
+ case OP_IPUT_VOLATILE_JUMBO:
+ case OP_SGET_VOLATILE_JUMBO:
+ case OP_SPUT_VOLATILE_JUMBO:
+ case OP_IGET_OBJECT_VOLATILE_JUMBO:
+ case OP_IPUT_OBJECT_VOLATILE_JUMBO:
+ case OP_SGET_OBJECT_VOLATILE_JUMBO:
+ case OP_SPUT_OBJECT_VOLATILE_JUMBO:
+ case OP_IGET_WIDE_VOLATILE_JUMBO:
+ case OP_IPUT_WIDE_VOLATILE_JUMBO:
+ case OP_SGET_WIDE_VOLATILE_JUMBO:
+ case OP_SPUT_WIDE_VOLATILE_JUMBO:
case OP_BREAKPOINT:
case OP_THROW_VERIFICATION_ERROR:
case OP_THROW_VERIFICATION_ERROR_JUMBO:
case OP_EXECUTE_INLINE:
case OP_EXECUTE_INLINE_RANGE:
case OP_INVOKE_OBJECT_INIT_RANGE:
+ case OP_INVOKE_OBJECT_INIT_JUMBO:
case OP_RETURN_VOID_BARRIER:
case OP_IGET_QUICK:
case OP_IGET_WIDE_QUICK:
@@ -1422,19 +1435,6 @@
case OP_UNUSED_EFFF:
case OP_UNUSED_F0FF:
case OP_UNUSED_F1FF:
- case OP_UNUSED_F2FF:
- case OP_UNUSED_F3FF:
- case OP_UNUSED_F4FF:
- case OP_UNUSED_F5FF:
- case OP_UNUSED_F6FF:
- case OP_UNUSED_F7FF:
- case OP_UNUSED_F8FF:
- case OP_UNUSED_F9FF:
- case OP_UNUSED_FAFF:
- case OP_UNUSED_FBFF:
- case OP_UNUSED_FCFF:
- case OP_UNUSED_FDFF:
- case OP_UNUSED_FEFF:
LOGE("VFY: unexpected opcode %02x\n", decInsn.opcode);
okay = false;
break;
diff --git a/vm/analysis/Liveness.c b/vm/analysis/Liveness.c
index 04dfa01..2e60780 100644
--- a/vm/analysis/Liveness.c
+++ b/vm/analysis/Liveness.c
@@ -361,6 +361,7 @@
case OP_SPUT:
case OP_SPUT_VOLATILE:
case OP_SPUT_JUMBO:
+ case OP_SPUT_VOLATILE_JUMBO:
case OP_SPUT_BOOLEAN:
case OP_SPUT_BOOLEAN_JUMBO:
case OP_SPUT_BYTE:
@@ -372,6 +373,7 @@
case OP_SPUT_OBJECT:
case OP_SPUT_OBJECT_VOLATILE:
case OP_SPUT_OBJECT_JUMBO:
+ case OP_SPUT_OBJECT_VOLATILE_JUMBO:
/* action <- vA */
GEN(workBits, decInsn.vA);
break;
@@ -380,6 +382,7 @@
case OP_SPUT_WIDE:
case OP_SPUT_WIDE_VOLATILE:
case OP_SPUT_WIDE_JUMBO:
+ case OP_SPUT_WIDE_VOLATILE_JUMBO:
/* action <- vA(wide) */
GENW(workBits, decInsn.vA);
break;
@@ -393,6 +396,7 @@
case OP_IPUT:
case OP_IPUT_VOLATILE:
case OP_IPUT_JUMBO:
+ case OP_IPUT_VOLATILE_JUMBO:
case OP_IPUT_BOOLEAN:
case OP_IPUT_BOOLEAN_JUMBO:
case OP_IPUT_BYTE:
@@ -404,6 +408,7 @@
case OP_IPUT_OBJECT:
case OP_IPUT_OBJECT_VOLATILE:
case OP_IPUT_OBJECT_JUMBO:
+ case OP_IPUT_OBJECT_VOLATILE_JUMBO:
/* action <- vA, vB */
GEN(workBits, decInsn.vA);
GEN(workBits, decInsn.vB);
@@ -412,6 +417,7 @@
case OP_IPUT_WIDE:
case OP_IPUT_WIDE_VOLATILE:
case OP_IPUT_WIDE_JUMBO:
+ case OP_IPUT_WIDE_VOLATILE_JUMBO:
/* action <- vA(wide), vB */
GENW(workBits, decInsn.vA);
GEN(workBits, decInsn.vB);
@@ -489,6 +495,7 @@
case OP_SGET:
case OP_SGET_VOLATILE:
case OP_SGET_JUMBO:
+ case OP_SGET_VOLATILE_JUMBO:
case OP_SGET_BOOLEAN:
case OP_SGET_BOOLEAN_JUMBO:
case OP_SGET_BYTE:
@@ -500,6 +507,7 @@
case OP_SGET_OBJECT:
case OP_SGET_OBJECT_VOLATILE:
case OP_SGET_OBJECT_JUMBO:
+ case OP_SGET_OBJECT_VOLATILE_JUMBO:
/* vA <- value */
KILL(workBits, decInsn.vA);
break;
@@ -511,6 +519,7 @@
case OP_SGET_WIDE:
case OP_SGET_WIDE_VOLATILE:
case OP_SGET_WIDE_JUMBO:
+ case OP_SGET_WIDE_VOLATILE_JUMBO:
/* vA(wide) <- value */
KILLW(workBits, decInsn.vA);
break;
@@ -529,6 +538,7 @@
case OP_IGET:
case OP_IGET_VOLATILE:
case OP_IGET_JUMBO:
+ case OP_IGET_VOLATILE_JUMBO:
case OP_IGET_BOOLEAN:
case OP_IGET_BOOLEAN_JUMBO:
case OP_IGET_BYTE:
@@ -540,6 +550,7 @@
case OP_IGET_OBJECT:
case OP_IGET_OBJECT_VOLATILE:
case OP_IGET_OBJECT_JUMBO:
+ case OP_IGET_OBJECT_VOLATILE_JUMBO:
case OP_NEG_INT:
case OP_NOT_INT:
case OP_NEG_FLOAT:
@@ -575,6 +586,7 @@
case OP_IGET_WIDE:
case OP_IGET_WIDE_VOLATILE:
case OP_IGET_WIDE_JUMBO:
+ case OP_IGET_WIDE_VOLATILE_JUMBO:
case OP_INT_TO_LONG:
case OP_INT_TO_DOUBLE:
case OP_FLOAT_TO_LONG:
@@ -740,6 +752,7 @@
case OP_EXECUTE_INLINE:
case OP_EXECUTE_INLINE_RANGE:
case OP_INVOKE_OBJECT_INIT_RANGE:
+ case OP_INVOKE_OBJECT_INIT_JUMBO:
case OP_IGET_QUICK:
case OP_IGET_WIDE_QUICK:
case OP_IGET_OBJECT_QUICK:
@@ -968,19 +981,6 @@
case OP_UNUSED_EFFF:
case OP_UNUSED_F0FF:
case OP_UNUSED_F1FF:
- case OP_UNUSED_F2FF:
- case OP_UNUSED_F3FF:
- case OP_UNUSED_F4FF:
- case OP_UNUSED_F5FF:
- case OP_UNUSED_F6FF:
- case OP_UNUSED_F7FF:
- case OP_UNUSED_F8FF:
- case OP_UNUSED_F9FF:
- case OP_UNUSED_FAFF:
- case OP_UNUSED_FBFF:
- case OP_UNUSED_FCFF:
- case OP_UNUSED_FDFF:
- case OP_UNUSED_FEFF:
return false;
}
diff --git a/vm/compiler/Dataflow.c b/vm/compiler/Dataflow.c
index 38f822c..76744bd 100644
--- a/vm/compiler/Dataflow.c
+++ b/vm/compiler/Dataflow.c
@@ -1524,44 +1524,44 @@
// 1F1 OP_UNUSED_F1FF
DF_NOP,
- // 1F2 OP_UNUSED_F2FF
+ // 1F2 OP_INVOKE_OBJECT_INIT_JUMBO
DF_NOP,
- // 1F3 OP_UNUSED_F3FF
- DF_NOP,
+ // 1F3 OP_IGET_VOLATILE_JUMBO
+ DF_DA | DF_UB,
- // 1F4 OP_UNUSED_F4FF
- DF_NOP,
+ // 1F4 OP_IGET_WIDE_VOLATILE_JUMBO
+ DF_DA_WIDE | DF_UB,
- // 1F5 OP_UNUSED_F5FF
- DF_NOP,
+ // 1F5 OP_IGET_OBJECT_VOLATILE_JUMBO
+ DF_DA | DF_UB,
- // 1F6 OP_UNUSED_F6FF
- DF_NOP,
+ // 1F6 OP_IPUT_VOLATILE_JUMBO
+ DF_UA | DF_UB,
- // 1F7 OP_UNUSED_F7FF
- DF_NOP,
+ // 1F7 OP_IPUT_WIDE_VOLATILE_JUMBO
+ DF_UA_WIDE | DF_UB,
- // 1F8 OP_UNUSED_F8FF
- DF_NOP,
+ // 1F8 OP_IPUT_OBJECT_VOLATILE_JUMBO
+ DF_UA | DF_UB,
- // 1F9 OP_UNUSED_F9FF
- DF_NOP,
+ // 1F9 OP_SGET_VOLATILE_JUMBO
+ DF_DA,
- // 1FA OP_UNUSED_FAFF
- DF_NOP,
+ // 1FA OP_SGET_WIDE_VOLATILE_JUMBO
+ DF_DA_WIDE,
- // 1FB OP_UNUSED_FBFF
- DF_NOP,
+ // 1FB OP_SGET_OBJECT_VOLATILE_JUMBO
+ DF_DA,
- // 1FC OP_UNUSED_FCFF
- DF_NOP,
+ // 1FC OP_SPUT_VOLATILE_JUMBO
+ DF_UA,
- // 1FD OP_UNUSED_FDFF
- DF_NOP,
+ // 1FD OP_SPUT_WIDE_VOLATILE_JUMBO
+ DF_UA_WIDE,
- // 1FE OP_UNUSED_FEFF
- DF_NOP,
+ // 1FE OP_SPUT_OBJECT_VOLATILE_JUMBO
+ DF_UA,
// 1FF OP_THROW_VERIFICATION_ERROR_JUMBO
DF_NOP,
diff --git a/vm/mterp/armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..fb4bf63
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IGET_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_IGET_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IGET_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..6d2b5ff
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IGET_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IGET_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_IGET_WIDE_JUMBO.S b/vm/mterp/armv5te/OP_IGET_WIDE_JUMBO.S
index edba5e1..40a6a96 100644
--- a/vm/mterp/armv5te/OP_IGET_WIDE_JUMBO.S
+++ b/vm/mterp/armv5te/OP_IGET_WIDE_JUMBO.S
@@ -1,3 +1,4 @@
+%default {"volatile":"0"}
%verify "executed"
%verify "null object"
%verify "field already resolved"
@@ -17,7 +18,7 @@
ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
cmp r0, #0 @ is resolved entry null?
bne .L${opcode}_finish @ no, already resolved
-8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw
ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveInstField @ r0<- resolved InstField ptr
@@ -43,7 +44,12 @@
cmp r9, #0 @ check object for null
ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
beq common_errNullObject @ object was null
+ .if $volatile
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
FETCH(r2, 3) @ r2<- BBBB
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
diff --git a/vm/mterp/armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..c38a73d
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IGET_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S
new file mode 100644
index 0000000..47e3a4a
--- /dev/null
+++ b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S" {"cccc":"4"}
diff --git a/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
index d91c6d1..67a3cc7 100644
--- a/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
+++ b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
@@ -1,3 +1,4 @@
+%default { "cccc":"2" }
%verify "executed"
%verify "finalizable class"
/*
@@ -5,7 +6,7 @@
* Object's nullary constructor doesn't do anything, so we just
* skip it (we know a debugger isn't active).
*/
- FETCH(r1, 2) @ r1<- CCCC
+ FETCH(r1, ${cccc}) @ r1<- CCCC
GET_VREG(r0, r1) @ r0<- "this" ptr
cmp r0, #0 @ check for NULL
beq common_errNullObject @ export PC and throw NPE
@@ -14,6 +15,6 @@
tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
beq 1f @ nope, done
bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
-1: FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST
+1: FETCH_ADVANCE_INST(${cccc}+1) @ advance to next instr, load rINST
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
GOTO_OPCODE(ip) @ execute it
diff --git a/vm/mterp/armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..0d27fe5
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IPUT_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_IPUT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IPUT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..af7d9eb
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IPUT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IPUT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_IPUT_WIDE_JUMBO.S b/vm/mterp/armv5te/OP_IPUT_WIDE_JUMBO.S
index c8151fc..a371f1c 100644
--- a/vm/mterp/armv5te/OP_IPUT_WIDE_JUMBO.S
+++ b/vm/mterp/armv5te/OP_IPUT_WIDE_JUMBO.S
@@ -1,3 +1,4 @@
+%default {"volatile":"0"}
%verify "executed"
%verify "null object"
%verify "field already resolved"
@@ -45,5 +46,10 @@
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if $volatile
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..53b1030
--- /dev/null
+++ b/vm/mterp/armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_IPUT_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..bebc805
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SGET_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_SGET_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SGET_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..9075c28
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SGET_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SGET_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_SGET_WIDE_JUMBO.S b/vm/mterp/armv5te/OP_SGET_WIDE_JUMBO.S
index 6479a67..c1f5cc7 100644
--- a/vm/mterp/armv5te/OP_SGET_WIDE_JUMBO.S
+++ b/vm/mterp/armv5te/OP_SGET_WIDE_JUMBO.S
@@ -1,3 +1,4 @@
+%default {"volatile":"0"}
%verify "executed"
%verify "field already resolved"
%verify "field not yet resolved"
@@ -16,7 +17,12 @@
beq .L${opcode}_resolve @ yes, do resolve
.L${opcode}_finish:
FETCH(r9, 3) @ r9<- BBBB
+ .if $volatile
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
@@ -26,7 +32,7 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
+ * r1: AAAAAAAA field ref
*
* Returns StaticField pointer in r0.
*/
diff --git a/vm/mterp/armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..1e4b2de
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SGET_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..78fe07b
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SPUT_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_SPUT_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SPUT_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..7049fc6
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SPUT_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SPUT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/armv5te/OP_SPUT_WIDE_JUMBO.S b/vm/mterp/armv5te/OP_SPUT_WIDE_JUMBO.S
index 87abc58..2bfeae1 100644
--- a/vm/mterp/armv5te/OP_SPUT_WIDE_JUMBO.S
+++ b/vm/mterp/armv5te/OP_SPUT_WIDE_JUMBO.S
@@ -1,3 +1,4 @@
+%default {"volatile":"0"}
%verify "executed"
%verify "field already resolved"
%verify "field not yet resolved"
@@ -20,14 +21,19 @@
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if $volatile
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
%break
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
- * r9: &fp[AA]
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
*
* Returns StaticField pointer in r2.
*/
diff --git a/vm/mterp/armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S b/vm/mterp/armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S
new file mode 100644
index 0000000..c1b0991
--- /dev/null
+++ b/vm/mterp/armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S
@@ -0,0 +1,2 @@
+%verify "executed"
+%include "armv5te/OP_SPUT_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/armv5te/OP_UNUSED_F2FF.S b/vm/mterp/armv5te/OP_UNUSED_F2FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F3FF.S b/vm/mterp/armv5te/OP_UNUSED_F3FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F4FF.S b/vm/mterp/armv5te/OP_UNUSED_F4FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F5FF.S b/vm/mterp/armv5te/OP_UNUSED_F5FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F6FF.S b/vm/mterp/armv5te/OP_UNUSED_F6FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F7FF.S b/vm/mterp/armv5te/OP_UNUSED_F7FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F8FF.S b/vm/mterp/armv5te/OP_UNUSED_F8FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_F9FF.S b/vm/mterp/armv5te/OP_UNUSED_F9FF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_F9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_FAFF.S b/vm/mterp/armv5te/OP_UNUSED_FAFF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_FAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_FBFF.S b/vm/mterp/armv5te/OP_UNUSED_FBFF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_FBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_FCFF.S b/vm/mterp/armv5te/OP_UNUSED_FCFF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_FCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_FDFF.S b/vm/mterp/armv5te/OP_UNUSED_FDFF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_FDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/OP_UNUSED_FEFF.S b/vm/mterp/armv5te/OP_UNUSED_FEFF.S
deleted file mode 100644
index faa7246..0000000
--- a/vm/mterp/armv5te/OP_UNUSED_FEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "armv5te/unused.S"
diff --git a/vm/mterp/armv5te/header.S b/vm/mterp/armv5te/header.S
index d40cab5..9d379d9 100644
--- a/vm/mterp/armv5te/header.S
+++ b/vm/mterp/armv5te/header.S
@@ -117,14 +117,14 @@
* exception catch may miss. (This also implies that it must come after
* EXPORT_PC().)
*/
-#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]!
+#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]!
/*
* The operation performed here is similar to FETCH_ADVANCE_INST, except the
* src and dest registers are parameterized (not hard-wired to rPC and rINST).
*/
#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
- ldrh _dreg, [_sreg, #(_count*2)]!
+ ldrh _dreg, [_sreg, #((_count)*2)]!
/*
* Fetch the next instruction from an offset specified by _reg. Updates
@@ -144,15 +144,15 @@
*
* The "_S" variant works the same but treats the value as signed.
*/
-#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)]
-#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)]
+#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)]
+#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)]
/*
* Fetch one byte from an offset past the current PC. Pass in the same
* "_count" as you would for FETCH, and an additional 0/1 indicating which
* byte of the halfword you want (lo/hi).
*/
-#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)]
+#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))]
/*
* Put the instruction's opcode field into the specified register.
diff --git a/vm/mterp/c/OP_IGET_OBJECT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IGET_OBJECT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..705aefd
--- /dev/null
+++ b/vm/mterp/c/OP_IGET_OBJECT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
diff --git a/vm/mterp/c/OP_IGET_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IGET_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..462279a
--- /dev/null
+++ b/vm/mterp/c/OP_IGET_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
diff --git a/vm/mterp/c/OP_IGET_WIDE_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IGET_WIDE_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..5285a31
--- /dev/null
+++ b/vm/mterp/c/OP_IGET_WIDE_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
diff --git a/vm/mterp/c/OP_INVOKE_OBJECT_INIT_JUMBO.c b/vm/mterp/c/OP_INVOKE_OBJECT_INIT_JUMBO.c
new file mode 100644
index 0000000..3f9d052
--- /dev/null
+++ b/vm/mterp/c/OP_INVOKE_OBJECT_INIT_JUMBO.c
@@ -0,0 +1,28 @@
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
+OP_END
diff --git a/vm/mterp/c/OP_INVOKE_OBJECT_INIT_RANGE.c b/vm/mterp/c/OP_INVOKE_OBJECT_INIT_RANGE.c
index f2b623f..da0d762 100644
--- a/vm/mterp/c/OP_INVOKE_OBJECT_INIT_RANGE.c
+++ b/vm/mterp/c/OP_INVOKE_OBJECT_INIT_RANGE.c
@@ -18,16 +18,11 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
diff --git a/vm/mterp/c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..0af17e3
--- /dev/null
+++ b/vm/mterp/c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
diff --git a/vm/mterp/c/OP_IPUT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IPUT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..82216c6
--- /dev/null
+++ b/vm/mterp/c/OP_IPUT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
diff --git a/vm/mterp/c/OP_IPUT_WIDE_VOLATILE_JUMBO.c b/vm/mterp/c/OP_IPUT_WIDE_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..f4a2140
--- /dev/null
+++ b/vm/mterp/c/OP_IPUT_WIDE_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
diff --git a/vm/mterp/c/OP_SGET_OBJECT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SGET_OBJECT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..b96ef5d
--- /dev/null
+++ b/vm/mterp/c/OP_SGET_OBJECT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
diff --git a/vm/mterp/c/OP_SGET_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SGET_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..5cf8975
--- /dev/null
+++ b/vm/mterp/c/OP_SGET_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
diff --git a/vm/mterp/c/OP_SGET_WIDE_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SGET_WIDE_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..4b75c75
--- /dev/null
+++ b/vm/mterp/c/OP_SGET_WIDE_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
diff --git a/vm/mterp/c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..4f60a5d
--- /dev/null
+++ b/vm/mterp/c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
diff --git a/vm/mterp/c/OP_SPUT_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SPUT_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..845cc83
--- /dev/null
+++ b/vm/mterp/c/OP_SPUT_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
+OP_END
diff --git a/vm/mterp/c/OP_SPUT_WIDE_VOLATILE_JUMBO.c b/vm/mterp/c/OP_SPUT_WIDE_VOLATILE_JUMBO.c
new file mode 100644
index 0000000..3a86294
--- /dev/null
+++ b/vm/mterp/c/OP_SPUT_WIDE_VOLATILE_JUMBO.c
@@ -0,0 +1,2 @@
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F1FF.c b/vm/mterp/c/OP_UNUSED_F1FF.c
index e0f8c6c..a3a65d7 100644
--- a/vm/mterp/c/OP_UNUSED_F1FF.c
+++ b/vm/mterp/c/OP_UNUSED_F1FF.c
@@ -1,2 +1,8 @@
HANDLE_OPCODE(OP_UNUSED_F1FF)
+ /*
+ * In portable interp, most unused opcodes will fall through to here.
+ */
+ LOGE("unknown opcode 0x%04x\n", inst);
+ dvmAbort();
+ FINISH(1);
OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F2FF.c b/vm/mterp/c/OP_UNUSED_F2FF.c
deleted file mode 100644
index a95718b..0000000
--- a/vm/mterp/c/OP_UNUSED_F2FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F2FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F3FF.c b/vm/mterp/c/OP_UNUSED_F3FF.c
deleted file mode 100644
index deeade0..0000000
--- a/vm/mterp/c/OP_UNUSED_F3FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F3FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F4FF.c b/vm/mterp/c/OP_UNUSED_F4FF.c
deleted file mode 100644
index 0d0c42e..0000000
--- a/vm/mterp/c/OP_UNUSED_F4FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F4FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F5FF.c b/vm/mterp/c/OP_UNUSED_F5FF.c
deleted file mode 100644
index 48d4165..0000000
--- a/vm/mterp/c/OP_UNUSED_F5FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F5FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F6FF.c b/vm/mterp/c/OP_UNUSED_F6FF.c
deleted file mode 100644
index 83129c9..0000000
--- a/vm/mterp/c/OP_UNUSED_F6FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F6FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F7FF.c b/vm/mterp/c/OP_UNUSED_F7FF.c
deleted file mode 100644
index f61472d..0000000
--- a/vm/mterp/c/OP_UNUSED_F7FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F7FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F8FF.c b/vm/mterp/c/OP_UNUSED_F8FF.c
deleted file mode 100644
index 6c0454a..0000000
--- a/vm/mterp/c/OP_UNUSED_F8FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F8FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_F9FF.c b/vm/mterp/c/OP_UNUSED_F9FF.c
deleted file mode 100644
index 271d7a5..0000000
--- a/vm/mterp/c/OP_UNUSED_F9FF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_F9FF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_FAFF.c b/vm/mterp/c/OP_UNUSED_FAFF.c
deleted file mode 100644
index 8431c24..0000000
--- a/vm/mterp/c/OP_UNUSED_FAFF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_FAFF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_FBFF.c b/vm/mterp/c/OP_UNUSED_FBFF.c
deleted file mode 100644
index 2d552c7..0000000
--- a/vm/mterp/c/OP_UNUSED_FBFF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_FBFF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_FCFF.c b/vm/mterp/c/OP_UNUSED_FCFF.c
deleted file mode 100644
index 8c20072..0000000
--- a/vm/mterp/c/OP_UNUSED_FCFF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_FCFF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_FDFF.c b/vm/mterp/c/OP_UNUSED_FDFF.c
deleted file mode 100644
index d586615..0000000
--- a/vm/mterp/c/OP_UNUSED_FDFF.c
+++ /dev/null
@@ -1,2 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_FDFF)
-OP_END
diff --git a/vm/mterp/c/OP_UNUSED_FEFF.c b/vm/mterp/c/OP_UNUSED_FEFF.c
deleted file mode 100644
index 8f604ae..0000000
--- a/vm/mterp/c/OP_UNUSED_FEFF.c
+++ /dev/null
@@ -1,8 +0,0 @@
-HANDLE_OPCODE(OP_UNUSED_FEFF)
- /*
- * In portable interp, most unused opcodes will fall through to here.
- */
- LOGE("unknown opcode 0x%04x\n", INST_INST(inst));
- dvmAbort();
- FINISH(1);
-OP_END
diff --git a/vm/mterp/c/opcommon.c b/vm/mterp/c/opcommon.c
index fc7d9a2..0cb3547 100644
--- a/vm/mterp/c/opcommon.c
+++ b/vm/mterp/c/opcommon.c
@@ -669,7 +669,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -693,7 +693,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -717,7 +717,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -741,7 +741,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
diff --git a/vm/mterp/config-x86 b/vm/mterp/config-x86
index 5a054f0..a99e5a7 100644
--- a/vm/mterp/config-x86
+++ b/vm/mterp/config-x86
@@ -44,6 +44,20 @@
op OP_SPUT_WIDE_VOLATILE c
op OP_RETURN_VOID_BARRIER c
op OP_INVOKE_OBJECT_INIT_RANGE c
+
+ op OP_INVOKE_OBJECT_INIT_JUMBO c
+ op OP_IGET_VOLATILE_JUMBO c
+ op OP_IPUT_VOLATILE_JUMBO c
+ op OP_SGET_VOLATILE_JUMBO c
+ op OP_SPUT_VOLATILE_JUMBO c
+ op OP_IGET_OBJECT_VOLATILE_JUMBO c
+ op OP_IPUT_OBJECT_VOLATILE_JUMBO c
+ op OP_SGET_OBJECT_VOLATILE_JUMBO c
+ op OP_SPUT_OBJECT_VOLATILE_JUMBO c
+ op OP_IGET_WIDE_VOLATILE_JUMBO c
+ op OP_IPUT_WIDE_VOLATILE_JUMBO c
+ op OP_SGET_WIDE_VOLATILE_JUMBO c
+ op OP_SPUT_WIDE_VOLATILE_JUMBO c
op-end
# arch-specific entry point to interpreter
diff --git a/vm/mterp/config-x86-atom b/vm/mterp/config-x86-atom
index f99a4d2..4a13d7a 100644
--- a/vm/mterp/config-x86-atom
+++ b/vm/mterp/config-x86-atom
@@ -292,6 +292,20 @@
op OP_SPUT_WIDE_VOLATILE c
op OP_RETURN_VOID_BARRIER c
op OP_INVOKE_OBJECT_INIT_RANGE c
+
+op OP_INVOKE_OBJECT_INIT_JUMBO c
+op OP_IGET_VOLATILE_JUMBO c
+op OP_IPUT_VOLATILE_JUMBO c
+op OP_SGET_VOLATILE_JUMBO c
+op OP_SPUT_VOLATILE_JUMBO c
+op OP_IGET_OBJECT_VOLATILE_JUMBO c
+op OP_IPUT_OBJECT_VOLATILE_JUMBO c
+op OP_SGET_OBJECT_VOLATILE_JUMBO c
+op OP_SPUT_OBJECT_VOLATILE_JUMBO c
+op OP_IGET_WIDE_VOLATILE_JUMBO c
+op OP_IPUT_WIDE_VOLATILE_JUMBO c
+op OP_SGET_WIDE_VOLATILE_JUMBO c
+op OP_SPUT_WIDE_VOLATILE_JUMBO c
op-end
# arch-specific entry point to interpreter
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index bc58367..a287d38 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -124,14 +124,14 @@
* exception catch may miss. (This also implies that it must come after
* EXPORT_PC().)
*/
-#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]!
+#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]!
/*
* The operation performed here is similar to FETCH_ADVANCE_INST, except the
* src and dest registers are parameterized (not hard-wired to rPC and rINST).
*/
#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
- ldrh _dreg, [_sreg, #(_count*2)]!
+ ldrh _dreg, [_sreg, #((_count)*2)]!
/*
* Fetch the next instruction from an offset specified by _reg. Updates
@@ -151,15 +151,15 @@
*
* The "_S" variant works the same but treats the value as signed.
*/
-#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)]
-#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)]
+#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)]
+#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)]
/*
* Fetch one byte from an offset past the current PC. Pass in the same
* "_count" as you would for FETCH, and an additional 0/1 indicating which
* byte of the halfword you want (lo/hi).
*/
-#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)]
+#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))]
/*
* Put the instruction's opcode field into the specified register.
@@ -7413,7 +7413,7 @@
* Object's nullary constructor doesn't do anything, so we just
* skip it (we know a debugger isn't active).
*/
- FETCH(r1, 2) @ r1<- CCCC
+ FETCH(r1, 2) @ r1<- CCCC
GET_VREG(r0, r1) @ r0<- "this" ptr
cmp r0, #0 @ check for NULL
beq common_errNullObject @ export PC and throw NPE
@@ -7422,7 +7422,7 @@
tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
beq 1f @ nope, done
bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
-1: FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST
+1: FETCH_ADVANCE_INST(2+1) @ advance to next instr, load rINST
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
GOTO_OPCODE(ip) @ execute it
@@ -7952,7 +7952,7 @@
ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
cmp r0, #0 @ is resolved entry null?
bne .LOP_IGET_WIDE_JUMBO_finish @ no, already resolved
-8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw
ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveInstField @ r0<- resolved InstField ptr
@@ -8345,7 +8345,12 @@
beq .LOP_SGET_WIDE_JUMBO_resolve @ yes, do resolve
.LOP_SGET_WIDE_JUMBO_finish:
FETCH(r9, 3) @ r9<- BBBB
+ .if 0
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
@@ -8552,7 +8557,12 @@
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
@@ -10454,106 +10464,372 @@
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: armv5te/OP_UNUSED_F2FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
+ /*
+ * Invoke Object.<init> on an object. In practice we know that
+ * Object's nullary constructor doesn't do anything, so we just
+ * skip it (we know a debugger isn't active).
+ */
+ FETCH(r1, 4) @ r1<- CCCC
+ GET_VREG(r0, r1) @ r0<- "this" ptr
+ cmp r0, #0 @ check for NULL
+ beq common_errNullObject @ export PC and throw NPE
+ ldr r1, [r0, #offObject_clazz] @ r1<- obj->clazz
+ ldr r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
+ tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
+ beq 1f @ nope, done
+ bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
+1: FETCH_ADVANCE_INST(4+1) @ advance to next instr, load rINST
+ GET_INST_OPCODE(ip) @ ip<- opcode from rINST
+ GOTO_OPCODE(ip) @ execute it
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: armv5te/OP_UNUSED_F3FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
+/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: armv5te/OP_UNUSED_F4FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
+/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit instance field get.
+ */
+ /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: armv5te/OP_UNUSED_F5FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
+/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: armv5te/OP_UNUSED_F6FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
+/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ *
+ * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
+ * iput-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: armv5te/OP_UNUSED_F7FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
+/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
+ /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[B], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: armv5te/OP_UNUSED_F8FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
+/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ */
+ /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: armv5te/OP_UNUSED_F9FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
+/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: armv5te/OP_UNUSED_FAFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
+/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SGET handler.
+ */
+ /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
+ FETCH(r9, 3) @ r9<- BBBB
+ .if 1
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: armv5te/OP_UNUSED_FBFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
+/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: armv5te/OP_UNUSED_FCFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
+/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler.
+ *
+ * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
+ * sput-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SPUT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: armv5te/OP_UNUSED_FDFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
+/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SPUT handler.
+ */
+ /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r0, [rSELF, #offThread_methodClassDex] @ r0<- DvmDex
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ FETCH(r9, 3) @ r9<- BBBB
+ ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ cmp r2, #0 @ is resolved entry null?
+ beq .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: armv5te/OP_UNUSED_FEFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
+/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler for objects
+ */
+ /* sput-object/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ no, continue
+ ldr r9, [rSELF, #offThread_method] @ r9<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
/* ------------------------------ */
@@ -12487,7 +12763,12 @@
cmp r9, #0 @ check object for null
ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
beq common_errNullObject @ object was null
+ .if 0
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
FETCH(r2, 3) @ r2<- BBBB
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
@@ -12701,7 +12982,12 @@
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* continuation for OP_IPUT_OBJECT_JUMBO */
@@ -12876,7 +13162,7 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
+ * r1: AAAAAAAA field ref
*
* Returns StaticField pointer in r0.
*/
@@ -12983,8 +13269,8 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
- * r9: &fp[AA]
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
*
* Returns StaticField pointer in r2.
*/
@@ -13141,6 +13427,293 @@
bne .LOP_INVOKE_DIRECT_JUMBO_finish @ no, continue
b common_exceptionThrown @ yes, handle exception
+/* continuation for OP_IGET_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ .if 1
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ stmia r3, {r0-r1} @ fp[BBBB]<- r0/r1
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ FETCH(r2, 3) @ r1<- BBBB
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ add r2, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
+
+/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
+ cmp r0, #0 @ stored a null reference?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_SGET_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ *
+ * Returns StaticField pointer in r0.
+ */
+.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SPUT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
+ *
+ * Returns StaticField pointer in r2.
+ */
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ mov r2, r0 @ copy to r2
+ bne .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
+
+.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ cmp r1, #0 @ stored a null object?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
+ GOTO_OPCODE(ip) @ jump to next instruction
+
.size dvmAsmSisterStart, .-dvmAsmSisterStart
.global dvmAsmSisterEnd
dvmAsmSisterEnd:
@@ -20125,7 +20698,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
+.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20139,7 +20712,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
+.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20153,7 +20726,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
+.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20167,7 +20740,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
+.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20181,7 +20754,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
+.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20195,7 +20768,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
+.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20209,7 +20782,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
+.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20223,7 +20796,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
+.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20237,7 +20810,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
+.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20251,7 +20824,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
+.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20265,7 +20838,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
+.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20279,7 +20852,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
+.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20293,7 +20866,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
+.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index 47a1cbf..c657e9e 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -124,14 +124,14 @@
* exception catch may miss. (This also implies that it must come after
* EXPORT_PC().)
*/
-#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]!
+#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]!
/*
* The operation performed here is similar to FETCH_ADVANCE_INST, except the
* src and dest registers are parameterized (not hard-wired to rPC and rINST).
*/
#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
- ldrh _dreg, [_sreg, #(_count*2)]!
+ ldrh _dreg, [_sreg, #((_count)*2)]!
/*
* Fetch the next instruction from an offset specified by _reg. Updates
@@ -151,15 +151,15 @@
*
* The "_S" variant works the same but treats the value as signed.
*/
-#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)]
-#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)]
+#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)]
+#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)]
/*
* Fetch one byte from an offset past the current PC. Pass in the same
* "_count" as you would for FETCH, and an additional 0/1 indicating which
* byte of the halfword you want (lo/hi).
*/
-#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)]
+#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))]
/*
* Put the instruction's opcode field into the specified register.
@@ -7735,7 +7735,7 @@
* Object's nullary constructor doesn't do anything, so we just
* skip it (we know a debugger isn't active).
*/
- FETCH(r1, 2) @ r1<- CCCC
+ FETCH(r1, 2) @ r1<- CCCC
GET_VREG(r0, r1) @ r0<- "this" ptr
cmp r0, #0 @ check for NULL
beq common_errNullObject @ export PC and throw NPE
@@ -7744,7 +7744,7 @@
tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
beq 1f @ nope, done
bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
-1: FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST
+1: FETCH_ADVANCE_INST(2+1) @ advance to next instr, load rINST
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
GOTO_OPCODE(ip) @ execute it
@@ -8274,7 +8274,7 @@
ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
cmp r0, #0 @ is resolved entry null?
bne .LOP_IGET_WIDE_JUMBO_finish @ no, already resolved
-8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw
ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveInstField @ r0<- resolved InstField ptr
@@ -8667,7 +8667,12 @@
beq .LOP_SGET_WIDE_JUMBO_resolve @ yes, do resolve
.LOP_SGET_WIDE_JUMBO_finish:
FETCH(r9, 3) @ r9<- BBBB
+ .if 0
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
@@ -8874,7 +8879,12 @@
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
@@ -10776,106 +10786,372 @@
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: armv5te/OP_UNUSED_F2FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
+ /*
+ * Invoke Object.<init> on an object. In practice we know that
+ * Object's nullary constructor doesn't do anything, so we just
+ * skip it (we know a debugger isn't active).
+ */
+ FETCH(r1, 4) @ r1<- CCCC
+ GET_VREG(r0, r1) @ r0<- "this" ptr
+ cmp r0, #0 @ check for NULL
+ beq common_errNullObject @ export PC and throw NPE
+ ldr r1, [r0, #offObject_clazz] @ r1<- obj->clazz
+ ldr r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
+ tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
+ beq 1f @ nope, done
+ bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
+1: FETCH_ADVANCE_INST(4+1) @ advance to next instr, load rINST
+ GET_INST_OPCODE(ip) @ ip<- opcode from rINST
+ GOTO_OPCODE(ip) @ execute it
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: armv5te/OP_UNUSED_F3FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
+/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: armv5te/OP_UNUSED_F4FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
+/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit instance field get.
+ */
+ /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: armv5te/OP_UNUSED_F5FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
+/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: armv5te/OP_UNUSED_F6FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
+/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ *
+ * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
+ * iput-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: armv5te/OP_UNUSED_F7FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
+/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
+ /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[B], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: armv5te/OP_UNUSED_F8FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
+/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ */
+ /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: armv5te/OP_UNUSED_F9FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
+/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: armv5te/OP_UNUSED_FAFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
+/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SGET handler.
+ */
+ /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
+ FETCH(r9, 3) @ r9<- BBBB
+ .if 1
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: armv5te/OP_UNUSED_FBFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
+/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: armv5te/OP_UNUSED_FCFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
+/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler.
+ *
+ * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
+ * sput-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SPUT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: armv5te/OP_UNUSED_FDFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
+/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SPUT handler.
+ */
+ /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r0, [rSELF, #offThread_methodClassDex] @ r0<- DvmDex
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ FETCH(r9, 3) @ r9<- BBBB
+ ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ cmp r2, #0 @ is resolved entry null?
+ beq .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: armv5te/OP_UNUSED_FEFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
+/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler for objects
+ */
+ /* sput-object/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ no, continue
+ ldr r9, [rSELF, #offThread_method] @ r9<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
/* ------------------------------ */
@@ -12945,7 +13221,12 @@
cmp r9, #0 @ check object for null
ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
beq common_errNullObject @ object was null
+ .if 0
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
FETCH(r2, 3) @ r2<- BBBB
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
@@ -13159,7 +13440,12 @@
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* continuation for OP_IPUT_OBJECT_JUMBO */
@@ -13334,7 +13620,7 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
+ * r1: AAAAAAAA field ref
*
* Returns StaticField pointer in r0.
*/
@@ -13441,8 +13727,8 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
- * r9: &fp[AA]
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
*
* Returns StaticField pointer in r2.
*/
@@ -13599,6 +13885,293 @@
bne .LOP_INVOKE_DIRECT_JUMBO_finish @ no, continue
b common_exceptionThrown @ yes, handle exception
+/* continuation for OP_IGET_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ .if 1
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ stmia r3, {r0-r1} @ fp[BBBB]<- r0/r1
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ FETCH(r2, 3) @ r1<- BBBB
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ add r2, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
+
+/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
+ cmp r0, #0 @ stored a null reference?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_SGET_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ *
+ * Returns StaticField pointer in r0.
+ */
+.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SPUT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
+ *
+ * Returns StaticField pointer in r2.
+ */
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ mov r2, r0 @ copy to r2
+ bne .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
+
+.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ cmp r1, #0 @ stored a null object?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
+ GOTO_OPCODE(ip) @ jump to next instruction
+
.size dvmAsmSisterStart, .-dvmAsmSisterStart
.global dvmAsmSisterEnd
dvmAsmSisterEnd:
@@ -20583,7 +21156,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
+.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20597,7 +21170,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
+.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20611,7 +21184,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
+.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20625,7 +21198,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
+.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20639,7 +21212,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
+.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20653,7 +21226,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
+.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20667,7 +21240,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
+.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20681,7 +21254,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
+.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20695,7 +21268,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
+.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20709,7 +21282,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
+.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20723,7 +21296,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
+.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20737,7 +21310,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
+.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20751,7 +21324,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
+.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index d0bb6c3..c5acc08 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -124,14 +124,14 @@
* exception catch may miss. (This also implies that it must come after
* EXPORT_PC().)
*/
-#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]!
+#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]!
/*
* The operation performed here is similar to FETCH_ADVANCE_INST, except the
* src and dest registers are parameterized (not hard-wired to rPC and rINST).
*/
#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
- ldrh _dreg, [_sreg, #(_count*2)]!
+ ldrh _dreg, [_sreg, #((_count)*2)]!
/*
* Fetch the next instruction from an offset specified by _reg. Updates
@@ -151,15 +151,15 @@
*
* The "_S" variant works the same but treats the value as signed.
*/
-#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)]
-#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)]
+#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)]
+#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)]
/*
* Fetch one byte from an offset past the current PC. Pass in the same
* "_count" as you would for FETCH, and an additional 0/1 indicating which
* byte of the halfword you want (lo/hi).
*/
-#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)]
+#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))]
/*
* Put the instruction's opcode field into the specified register.
@@ -7371,7 +7371,7 @@
* Object's nullary constructor doesn't do anything, so we just
* skip it (we know a debugger isn't active).
*/
- FETCH(r1, 2) @ r1<- CCCC
+ FETCH(r1, 2) @ r1<- CCCC
GET_VREG(r0, r1) @ r0<- "this" ptr
cmp r0, #0 @ check for NULL
beq common_errNullObject @ export PC and throw NPE
@@ -7380,7 +7380,7 @@
tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
beq 1f @ nope, done
bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
-1: FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST
+1: FETCH_ADVANCE_INST(2+1) @ advance to next instr, load rINST
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
GOTO_OPCODE(ip) @ execute it
@@ -7906,7 +7906,7 @@
ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
cmp r0, #0 @ is resolved entry null?
bne .LOP_IGET_WIDE_JUMBO_finish @ no, already resolved
-8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw
ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveInstField @ r0<- resolved InstField ptr
@@ -8299,7 +8299,12 @@
beq .LOP_SGET_WIDE_JUMBO_resolve @ yes, do resolve
.LOP_SGET_WIDE_JUMBO_finish:
FETCH(r9, 3) @ r9<- BBBB
+ .if 0
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
@@ -8506,7 +8511,12 @@
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
@@ -10408,106 +10418,372 @@
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: armv5te/OP_UNUSED_F2FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
+ /*
+ * Invoke Object.<init> on an object. In practice we know that
+ * Object's nullary constructor doesn't do anything, so we just
+ * skip it (we know a debugger isn't active).
+ */
+ FETCH(r1, 4) @ r1<- CCCC
+ GET_VREG(r0, r1) @ r0<- "this" ptr
+ cmp r0, #0 @ check for NULL
+ beq common_errNullObject @ export PC and throw NPE
+ ldr r1, [r0, #offObject_clazz] @ r1<- obj->clazz
+ ldr r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
+ tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
+ beq 1f @ nope, done
+ bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
+1: FETCH_ADVANCE_INST(4+1) @ advance to next instr, load rINST
+ GET_INST_OPCODE(ip) @ ip<- opcode from rINST
+ GOTO_OPCODE(ip) @ execute it
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: armv5te/OP_UNUSED_F3FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
+/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: armv5te/OP_UNUSED_F4FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
+/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit instance field get.
+ */
+ /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: armv5te/OP_UNUSED_F5FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
+/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: armv5te/OP_UNUSED_F6FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
+/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ *
+ * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
+ * iput-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: armv5te/OP_UNUSED_F7FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
+/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
+ /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[B], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: armv5te/OP_UNUSED_F8FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
+/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ */
+ /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: armv5te/OP_UNUSED_F9FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
+/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: armv5te/OP_UNUSED_FAFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
+/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SGET handler.
+ */
+ /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
+ FETCH(r9, 3) @ r9<- BBBB
+ .if 1
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: armv5te/OP_UNUSED_FBFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
+/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: armv5te/OP_UNUSED_FCFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
+/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler.
+ *
+ * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
+ * sput-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SPUT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: armv5te/OP_UNUSED_FDFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
+/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SPUT handler.
+ */
+ /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r0, [rSELF, #offThread_methodClassDex] @ r0<- DvmDex
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ FETCH(r9, 3) @ r9<- BBBB
+ ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ cmp r2, #0 @ is resolved entry null?
+ beq .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: armv5te/OP_UNUSED_FEFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
+/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler for objects
+ */
+ /* sput-object/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ no, continue
+ ldr r9, [rSELF, #offThread_method] @ r9<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
/* ------------------------------ */
@@ -12425,7 +12701,12 @@
cmp r9, #0 @ check object for null
ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
beq common_errNullObject @ object was null
+ .if 0
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
FETCH(r2, 3) @ r2<- BBBB
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
@@ -12639,7 +12920,12 @@
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* continuation for OP_IPUT_OBJECT_JUMBO */
@@ -12814,7 +13100,7 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
+ * r1: AAAAAAAA field ref
*
* Returns StaticField pointer in r0.
*/
@@ -12921,8 +13207,8 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
- * r9: &fp[AA]
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
*
* Returns StaticField pointer in r2.
*/
@@ -13079,6 +13365,293 @@
bne .LOP_INVOKE_DIRECT_JUMBO_finish @ no, continue
b common_exceptionThrown @ yes, handle exception
+/* continuation for OP_IGET_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ .if 1
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ stmia r3, {r0-r1} @ fp[BBBB]<- r0/r1
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ FETCH(r2, 3) @ r1<- BBBB
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ add r2, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
+
+/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
+ cmp r0, #0 @ stored a null reference?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_SGET_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ *
+ * Returns StaticField pointer in r0.
+ */
+.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SPUT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
+ *
+ * Returns StaticField pointer in r2.
+ */
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ mov r2, r0 @ copy to r2
+ bne .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
+
+.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ cmp r1, #0 @ stored a null object?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
+ GOTO_OPCODE(ip) @ jump to next instruction
+
.size dvmAsmSisterStart, .-dvmAsmSisterStart
.global dvmAsmSisterEnd
dvmAsmSisterEnd:
@@ -20063,7 +20636,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
+.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20077,7 +20650,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
+.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20091,7 +20664,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
+.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20105,7 +20678,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
+.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20119,7 +20692,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
+.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20133,7 +20706,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
+.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20147,7 +20720,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
+.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20161,7 +20734,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
+.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20175,7 +20748,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
+.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20189,7 +20762,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
+.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20203,7 +20776,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
+.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20217,7 +20790,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
+.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20231,7 +20804,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
+.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index d5dfb48..db207a1 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -124,14 +124,14 @@
* exception catch may miss. (This also implies that it must come after
* EXPORT_PC().)
*/
-#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #(_count*2)]!
+#define FETCH_ADVANCE_INST(_count) ldrh rINST, [rPC, #((_count)*2)]!
/*
* The operation performed here is similar to FETCH_ADVANCE_INST, except the
* src and dest registers are parameterized (not hard-wired to rPC and rINST).
*/
#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
- ldrh _dreg, [_sreg, #(_count*2)]!
+ ldrh _dreg, [_sreg, #((_count)*2)]!
/*
* Fetch the next instruction from an offset specified by _reg. Updates
@@ -151,15 +151,15 @@
*
* The "_S" variant works the same but treats the value as signed.
*/
-#define FETCH(_reg, _count) ldrh _reg, [rPC, #(_count*2)]
-#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #(_count*2)]
+#define FETCH(_reg, _count) ldrh _reg, [rPC, #((_count)*2)]
+#define FETCH_S(_reg, _count) ldrsh _reg, [rPC, #((_count)*2)]
/*
* Fetch one byte from an offset past the current PC. Pass in the same
* "_count" as you would for FETCH, and an additional 0/1 indicating which
* byte of the halfword you want (lo/hi).
*/
-#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #(_count*2+_byte)]
+#define FETCH_B(_reg, _count, _byte) ldrb _reg, [rPC, #((_count)*2+(_byte))]
/*
* Put the instruction's opcode field into the specified register.
@@ -7371,7 +7371,7 @@
* Object's nullary constructor doesn't do anything, so we just
* skip it (we know a debugger isn't active).
*/
- FETCH(r1, 2) @ r1<- CCCC
+ FETCH(r1, 2) @ r1<- CCCC
GET_VREG(r0, r1) @ r0<- "this" ptr
cmp r0, #0 @ check for NULL
beq common_errNullObject @ export PC and throw NPE
@@ -7380,7 +7380,7 @@
tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
beq 1f @ nope, done
bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
-1: FETCH_ADVANCE_INST(3) @ advance to next instr, load rINST
+1: FETCH_ADVANCE_INST(2+1) @ advance to next instr, load rINST
GET_INST_OPCODE(ip) @ ip<- opcode from rINST
GOTO_OPCODE(ip) @ execute it
@@ -7906,7 +7906,7 @@
ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
cmp r0, #0 @ is resolved entry null?
bne .LOP_IGET_WIDE_JUMBO_finish @ no, already resolved
-8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
EXPORT_PC() @ resolve() could throw
ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
bl dvmResolveInstField @ r0<- resolved InstField ptr
@@ -8299,7 +8299,12 @@
beq .LOP_SGET_WIDE_JUMBO_resolve @ yes, do resolve
.LOP_SGET_WIDE_JUMBO_finish:
FETCH(r9, 3) @ r9<- BBBB
+ .if 0
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
@@ -8506,7 +8511,12 @@
FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
@@ -10408,106 +10418,372 @@
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: armv5te/OP_UNUSED_F2FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
+/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
+ /*
+ * Invoke Object.<init> on an object. In practice we know that
+ * Object's nullary constructor doesn't do anything, so we just
+ * skip it (we know a debugger isn't active).
+ */
+ FETCH(r1, 4) @ r1<- CCCC
+ GET_VREG(r0, r1) @ r0<- "this" ptr
+ cmp r0, #0 @ check for NULL
+ beq common_errNullObject @ export PC and throw NPE
+ ldr r1, [r0, #offObject_clazz] @ r1<- obj->clazz
+ ldr r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
+ tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable?
+ beq 1f @ nope, done
+ bl dvmSetFinalizable @ call dvmSetFinalizable(obj)
+1: FETCH_ADVANCE_INST(4+1) @ advance to next instr, load rINST
+ GET_INST_OPCODE(ip) @ ip<- opcode from rINST
+ GOTO_OPCODE(ip) @ execute it
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: armv5te/OP_UNUSED_F3FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
+/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: armv5te/OP_UNUSED_F4FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
+/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit instance field get.
+ */
+ /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: armv5te/OP_UNUSED_F5FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
+/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_IGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field get.
+ *
+ * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
+ * iget-char/jumbo, iget-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: armv5te/OP_UNUSED_F6FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
+/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ *
+ * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
+ * iput-short/jumbo
+ */
+ /* exop vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: armv5te/OP_UNUSED_F7FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
+/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
+ /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
+ GET_VREG(r9, r0) @ r9<- fp[B], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: armv5te/OP_UNUSED_F8FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
+/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit instance field put.
+ */
+ /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ FETCH(r0, 4) @ r0<- CCCC
+ ldr r3, [rSELF, #offThread_methodClassDex] @ r3<- DvmDex
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
+ GET_VREG(r9, r0) @ r9<- fp[CCCC], the object pointer
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish @ no, already resolved
+8: ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveInstField @ r0<- resolved InstField ptr
+ b .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved @ resolved, continue
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: armv5te/OP_UNUSED_F9FF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
+/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: armv5te/OP_UNUSED_FAFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
+/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SGET handler.
+ */
+ /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
+ FETCH(r9, 3) @ r9<- BBBB
+ .if 1
+ add r0, r0, #offStaticField_value @ r0<- pointer to data
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
+ .endif
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ stmia r9, {r0-r1} @ vBBBB/vBBBB+1<- r0/r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: armv5te/OP_UNUSED_FBFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
+/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
+/* File: armv5te/OP_SGET_JUMBO.S */
+ /*
+ * Jumbo 32-bit SGET handler.
+ *
+ * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
+ * sget-char/jumbo, sget-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ ldr r1, [r0, #offStaticField_value] @ r1<- field value
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ SET_VREG(r1, r2) @ fp[BBBB]<- r1
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: armv5te/OP_UNUSED_FCFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
+/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler.
+ *
+ * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
+ * sput-short/jumbo
+ */
+ /* exop vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ beq .LOP_SPUT_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ GOTO_OPCODE(ip) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: armv5te/OP_UNUSED_FDFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
+/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
+ /*
+ * Jumbo 64-bit SPUT handler.
+ */
+ /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
+ ldr r0, [rSELF, #offThread_methodClassDex] @ r0<- DvmDex
+ FETCH(r1, 1) @ r1<- aaaa (lo)
+ FETCH(r2, 2) @ r2<- AAAA (hi)
+ ldr r0, [r0, #offDvmDex_pResFields] @ r0<- dvmDex->pResFields
+ orr r1, r1, r2, lsl #16 @ r1<- AAAAaaaa
+ FETCH(r9, 3) @ r9<- BBBB
+ ldr r2, [r0, r1, lsl #2] @ r2<- resolved StaticField ptr
+ add r9, rFP, r9, lsl #2 @ r9<- &fp[BBBB]
+ cmp r2, #0 @ is resolved entry null?
+ beq .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve @ yes, do resolve
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ ldmia r9, {r0-r1} @ r0/r1<- vBBBB/vBBBB+1
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r2, #offStaticField_value @ r2<- pointer to data
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: armv5te/OP_UNUSED_FEFF.S */
-/* File: armv5te/unused.S */
- bl common_abort
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
+/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
+/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
+ /*
+ * Jumbo 32-bit SPUT handler for objects
+ */
+ /* sput-object/jumbo vBBBB, field@AAAAAAAA */
+ ldr r2, [rSELF, #offThread_methodClassDex] @ r2<- DvmDex
+ FETCH(r0, 1) @ r0<- aaaa (lo)
+ FETCH(r1, 2) @ r1<- AAAA (hi)
+ ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
+ orr r1, r0, r1, lsl #16 @ r1<- AAAAaaaa
+ ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ is resolved entry null?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ no, continue
+ ldr r9, [rSELF, #offThread_method] @ r9<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r9, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
/* ------------------------------ */
@@ -12425,7 +12701,12 @@
cmp r9, #0 @ check object for null
ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
beq common_errNullObject @ object was null
+ .if 0
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
FETCH(r2, 3) @ r2<- BBBB
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
@@ -12639,7 +12920,12 @@
FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 0
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
GOTO_OPCODE(r10) @ jump to next instruction
/* continuation for OP_IPUT_OBJECT_JUMBO */
@@ -12814,7 +13100,7 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
+ * r1: AAAAAAAA field ref
*
* Returns StaticField pointer in r0.
*/
@@ -12921,8 +13207,8 @@
/*
* Continuation if the field has not yet been resolved.
- * r1: BBBB field ref
- * r9: &fp[AA]
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
*
* Returns StaticField pointer in r2.
*/
@@ -13079,6 +13365,293 @@
bne .LOP_INVOKE_DIRECT_JUMBO_finish @ no, continue
b common_exceptionThrown @ yes, handle exception
+/* continuation for OP_IGET_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ .if 1
+ add r0, r9, r3 @ r0<- address of field
+ bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field
+ .else
+ ldrd r0, [r9, r3] @ r0/r1<- obj.field (64-bit align ok)
+ .endif
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ add r3, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ stmia r3, {r0-r1} @ fp[BBBB]<- r0/r1
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ cmp r9, #0 @ check object for null
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ beq common_errNullObject @ object was null
+ ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits)
+ SMP_DMB @ acquiring load
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ SET_VREG(r0, r2) @ fp[BBBB]<- r0
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
+ cmp r9, #0 @ check object for null
+ FETCH(r2, 3) @ r1<- BBBB
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ add r2, rFP, r2, lsl #2 @ r3<- &fp[BBBB]
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ ldmia r2, {r0-r1} @ r0/r1<- fp[BBBB]
+ GET_INST_OPCODE(r10) @ extract opcode from rINST
+ .if 1
+ add r2, r9, r3 @ r2<- target address
+ bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2
+ .else
+ strd r0, [r9, r3] @ obj.field (64 bits, aligned)<- r0/r1
+ .endif
+ GOTO_OPCODE(r10) @ jump to next instruction
+
+/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
+ cmp r0, #0 @ resolution unsuccessful?
+ beq common_exceptionThrown @ yes, throw exception
+ @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
+
+ /*
+ * Currently:
+ * r0 holds resolved field
+ * r9 holds object
+ */
+.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
+ @bl common_squeak0
+ ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field
+ FETCH(r1, 3) @ r1<- BBBB
+ cmp r9, #0 @ check object for null
+ GET_VREG(r0, r1) @ r0<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ beq common_errNullObject @ object was null
+ FETCH_ADVANCE_INST(5) @ advance rPC, load rINST
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r0, [r9, r3] @ obj.field (32 bits)<- r0
+ cmp r0, #0 @ stored a null reference?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card if not
+ GOTO_OPCODE(ip) @ jump to next instruction
+
+/* continuation for OP_SGET_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ *
+ * Returns StaticField pointer in r0.
+ */
+.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ */
+.LOP_SPUT_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ bne .LOP_SPUT_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
+
+ /*
+ * Continuation if the field has not yet been resolved.
+ * r1: AAAAAAAA field ref
+ * r9: &fp[BBBB]
+ *
+ * Returns StaticField pointer in r2.
+ */
+.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
+ ldr r2, [rSELF, #offThread_method] @ r2<- current method
+ EXPORT_PC() @ resolve() could throw, so export now
+ ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz
+ bl dvmResolveStaticField @ r0<- resolved StaticField ptr
+ cmp r0, #0 @ success?
+ mov r2, r0 @ copy to r2
+ bne .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish @ yes, finish
+ b common_exceptionThrown @ no, handle exception
+
+/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
+
+.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
+ FETCH(r2, 3) @ r2<- BBBB
+ FETCH_ADVANCE_INST(4) @ advance rPC, load rINST
+ GET_VREG(r1, r2) @ r1<- fp[BBBB]
+ ldr r2, [rSELF, #offThread_cardTable] @ r2<- card table base
+ ldr r9, [r0, #offField_clazz] @ r9<- field->clazz
+ GET_INST_OPCODE(ip) @ extract opcode from rINST
+ SMP_DMB @ releasing store
+ str r1, [r0, #offStaticField_value] @ field<- vBBBB
+ cmp r1, #0 @ stored a null object?
+ strneb r2, [r2, r9, lsr #GC_CARD_SHIFT] @ mark card based on obj head
+ GOTO_OPCODE(ip) @ jump to next instruction
+
.size dvmAsmSisterStart, .-dvmAsmSisterStart
.global dvmAsmSisterEnd
dvmAsmSisterEnd:
@@ -20063,7 +20636,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
+.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20077,7 +20650,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
+.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20091,7 +20664,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
+.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20105,7 +20678,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
+.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20119,7 +20692,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
+.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20133,7 +20706,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
+.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20147,7 +20720,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
+.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20161,7 +20734,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
+.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20175,7 +20748,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
+.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20189,7 +20762,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
+.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20203,7 +20776,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
+.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20217,7 +20790,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
+.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20231,7 +20804,7 @@
/* ------------------------------ */
.balign 64
-.L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
+.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* File: armv5te/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
diff --git a/vm/mterp/out/InterpAsm-x86-atom.S b/vm/mterp/out/InterpAsm-x86-atom.S
index b92c634..19cb603 100644
--- a/vm/mterp/out/InterpAsm-x86-atom.S
+++ b/vm/mterp/out/InterpAsm-x86-atom.S
@@ -24281,9 +24281,7 @@
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: x86-atom/OP_UNUSED_F2FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24300,27 +24298,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_INVOKE_OBJECT_INIT_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: x86-atom/OP_UNUSED_F3FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24337,27 +24326,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IGET_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: x86-atom/OP_UNUSED_F4FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24374,27 +24354,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IGET_WIDE_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: x86-atom/OP_UNUSED_F5FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24411,27 +24382,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IGET_OBJECT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: x86-atom/OP_UNUSED_F6FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24448,27 +24410,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IPUT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: x86-atom/OP_UNUSED_F7FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24485,27 +24438,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IPUT_WIDE_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: x86-atom/OP_UNUSED_F8FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24522,27 +24466,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_IPUT_OBJECT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: x86-atom/OP_UNUSED_F9FF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24559,27 +24494,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SGET_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: x86-atom/OP_UNUSED_FAFF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24596,27 +24522,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SGET_WIDE_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: x86-atom/OP_UNUSED_FBFF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24633,27 +24550,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SGET_OBJECT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: x86-atom/OP_UNUSED_FCFF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24670,27 +24578,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SPUT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: x86-atom/OP_UNUSED_FDFF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24707,27 +24606,18 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SPUT_WIDE_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: x86-atom/OP_UNUSED_FEFF.S */
-/* File: x86-atom/unused.S */
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24744,22 +24634,15 @@
*/
/*
- * File: unused.S
- *
- * Code: Common code for unused bytecodes. Uses no subtitutions.
- *
- * For: all unused bytecodes
- *
- * Description: aborts if executed.
- *
- * Format: ØØ|op (10x)
- *
- * Syntax: op
+ * File: stub.S
*/
- call common_abort
-
-
+ SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer
+ pushl rGLUE # push parameter glue
+ call dvmMterp_OP_SPUT_OBJECT_VOLATILE_JUMBO # call c-based implementation
+ lea 4(%esp), %esp
+ LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer
+ FINISH_A # jump to next instruction
/* ------------------------------ */
.balign 64
.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index e401224..c2c0e65 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -11328,96 +11328,148 @@
/* ------------------------------ */
-.L_OP_UNUSED_F2FF: /* 0x1f2 */
-/* File: x86/OP_UNUSED_F2FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_INVOKE_OBJECT_INIT_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F3FF: /* 0x1f3 */
-/* File: x86/OP_UNUSED_F3FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IGET_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F4FF: /* 0x1f4 */
-/* File: x86/OP_UNUSED_F4FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IGET_WIDE_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F5FF: /* 0x1f5 */
-/* File: x86/OP_UNUSED_F5FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IGET_OBJECT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F6FF: /* 0x1f6 */
-/* File: x86/OP_UNUSED_F6FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IPUT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F7FF: /* 0x1f7 */
-/* File: x86/OP_UNUSED_F7FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IPUT_WIDE_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F8FF: /* 0x1f8 */
-/* File: x86/OP_UNUSED_F8FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_IPUT_OBJECT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_F9FF: /* 0x1f9 */
-/* File: x86/OP_UNUSED_F9FF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SGET_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_FAFF: /* 0x1fa */
-/* File: x86/OP_UNUSED_FAFF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SGET_WIDE_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_FBFF: /* 0x1fb */
-/* File: x86/OP_UNUSED_FBFF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SGET_OBJECT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_FCFF: /* 0x1fc */
-/* File: x86/OP_UNUSED_FCFF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SPUT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_FDFF: /* 0x1fd */
-/* File: x86/OP_UNUSED_FDFF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SPUT_WIDE_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
-.L_OP_UNUSED_FEFF: /* 0x1fe */
-/* File: x86/OP_UNUSED_FEFF.S */
-/* File: x86/unused.S */
- jmp common_abort
-
-
+.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
+ /* (stub) */
+ SAVE_PC_FP_TO_SELF %ecx # leaves rSELF in %ecx
+ movl %ecx,OUT_ARG0(%esp) # self is first arg to function
+ call dvmMterp_OP_SPUT_OBJECT_VOLATILE_JUMBO # do the real work
+ movl rSELF,%ecx
+ LOAD_PC_FP_FROM_SELF # retrieve updated values
+ movl offThread_curHandlerTable(%ecx),rIBASE # set up rIBASE
+ FETCH_INST
+ GOTO_NEXT
/* ------------------------------ */
.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
/* File: x86/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
@@ -19913,7 +19965,7 @@
jmp *dvmAsmInstructionStart+(497*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F2FF: /* 0x1f2 */
+.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -19930,7 +19982,7 @@
jmp *dvmAsmInstructionStart+(498*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F3FF: /* 0x1f3 */
+.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -19947,7 +19999,7 @@
jmp *dvmAsmInstructionStart+(499*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F4FF: /* 0x1f4 */
+.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -19964,7 +20016,7 @@
jmp *dvmAsmInstructionStart+(500*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F5FF: /* 0x1f5 */
+.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -19981,7 +20033,7 @@
jmp *dvmAsmInstructionStart+(501*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F6FF: /* 0x1f6 */
+.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -19998,7 +20050,7 @@
jmp *dvmAsmInstructionStart+(502*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F7FF: /* 0x1f7 */
+.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20015,7 +20067,7 @@
jmp *dvmAsmInstructionStart+(503*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F8FF: /* 0x1f8 */
+.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20032,7 +20084,7 @@
jmp *dvmAsmInstructionStart+(504*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_F9FF: /* 0x1f9 */
+.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20049,7 +20101,7 @@
jmp *dvmAsmInstructionStart+(505*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_FAFF: /* 0x1fa */
+.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20066,7 +20118,7 @@
jmp *dvmAsmInstructionStart+(506*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_FBFF: /* 0x1fb */
+.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20083,7 +20135,7 @@
jmp *dvmAsmInstructionStart+(507*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_FCFF: /* 0x1fc */
+.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20100,7 +20152,7 @@
jmp *dvmAsmInstructionStart+(508*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_FDFF: /* 0x1fd */
+.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20117,7 +20169,7 @@
jmp *dvmAsmInstructionStart+(509*4)
/* ------------------------------ */
-.L_ALT_OP_UNUSED_FEFF: /* 0x1fe */
+.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
/* File: x86/alt_stub.S */
/*
* Inter-instruction transfer stub. Call out to dvmCheckInst to handle
@@ -20655,19 +20707,19 @@
.long .L_OP_UNUSED_EFFF /* 0x1ef */
.long .L_OP_UNUSED_F0FF /* 0x1f0 */
.long .L_OP_UNUSED_F1FF /* 0x1f1 */
- .long .L_OP_UNUSED_F2FF /* 0x1f2 */
- .long .L_OP_UNUSED_F3FF /* 0x1f3 */
- .long .L_OP_UNUSED_F4FF /* 0x1f4 */
- .long .L_OP_UNUSED_F5FF /* 0x1f5 */
- .long .L_OP_UNUSED_F6FF /* 0x1f6 */
- .long .L_OP_UNUSED_F7FF /* 0x1f7 */
- .long .L_OP_UNUSED_F8FF /* 0x1f8 */
- .long .L_OP_UNUSED_F9FF /* 0x1f9 */
- .long .L_OP_UNUSED_FAFF /* 0x1fa */
- .long .L_OP_UNUSED_FBFF /* 0x1fb */
- .long .L_OP_UNUSED_FCFF /* 0x1fc */
- .long .L_OP_UNUSED_FDFF /* 0x1fd */
- .long .L_OP_UNUSED_FEFF /* 0x1fe */
+ .long .L_OP_INVOKE_OBJECT_INIT_JUMBO /* 0x1f2 */
+ .long .L_OP_IGET_VOLATILE_JUMBO /* 0x1f3 */
+ .long .L_OP_IGET_WIDE_VOLATILE_JUMBO /* 0x1f4 */
+ .long .L_OP_IGET_OBJECT_VOLATILE_JUMBO /* 0x1f5 */
+ .long .L_OP_IPUT_VOLATILE_JUMBO /* 0x1f6 */
+ .long .L_OP_IPUT_WIDE_VOLATILE_JUMBO /* 0x1f7 */
+ .long .L_OP_IPUT_OBJECT_VOLATILE_JUMBO /* 0x1f8 */
+ .long .L_OP_SGET_VOLATILE_JUMBO /* 0x1f9 */
+ .long .L_OP_SGET_WIDE_VOLATILE_JUMBO /* 0x1fa */
+ .long .L_OP_SGET_OBJECT_VOLATILE_JUMBO /* 0x1fb */
+ .long .L_OP_SPUT_VOLATILE_JUMBO /* 0x1fc */
+ .long .L_OP_SPUT_WIDE_VOLATILE_JUMBO /* 0x1fd */
+ .long .L_OP_SPUT_OBJECT_VOLATILE_JUMBO /* 0x1fe */
.long .L_OP_THROW_VERIFICATION_ERROR_JUMBO /* 0x1ff */
.global dvmAsmAltInstructionStart
@@ -21171,19 +21223,19 @@
.long .L_ALT_OP_UNUSED_EFFF /* 0x1ef */
.long .L_ALT_OP_UNUSED_F0FF /* 0x1f0 */
.long .L_ALT_OP_UNUSED_F1FF /* 0x1f1 */
- .long .L_ALT_OP_UNUSED_F2FF /* 0x1f2 */
- .long .L_ALT_OP_UNUSED_F3FF /* 0x1f3 */
- .long .L_ALT_OP_UNUSED_F4FF /* 0x1f4 */
- .long .L_ALT_OP_UNUSED_F5FF /* 0x1f5 */
- .long .L_ALT_OP_UNUSED_F6FF /* 0x1f6 */
- .long .L_ALT_OP_UNUSED_F7FF /* 0x1f7 */
- .long .L_ALT_OP_UNUSED_F8FF /* 0x1f8 */
- .long .L_ALT_OP_UNUSED_F9FF /* 0x1f9 */
- .long .L_ALT_OP_UNUSED_FAFF /* 0x1fa */
- .long .L_ALT_OP_UNUSED_FBFF /* 0x1fb */
- .long .L_ALT_OP_UNUSED_FCFF /* 0x1fc */
- .long .L_ALT_OP_UNUSED_FDFF /* 0x1fd */
- .long .L_ALT_OP_UNUSED_FEFF /* 0x1fe */
+ .long .L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO /* 0x1f2 */
+ .long .L_ALT_OP_IGET_VOLATILE_JUMBO /* 0x1f3 */
+ .long .L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO /* 0x1f4 */
+ .long .L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO /* 0x1f5 */
+ .long .L_ALT_OP_IPUT_VOLATILE_JUMBO /* 0x1f6 */
+ .long .L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO /* 0x1f7 */
+ .long .L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO /* 0x1f8 */
+ .long .L_ALT_OP_SGET_VOLATILE_JUMBO /* 0x1f9 */
+ .long .L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO /* 0x1fa */
+ .long .L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO /* 0x1fb */
+ .long .L_ALT_OP_SPUT_VOLATILE_JUMBO /* 0x1fc */
+ .long .L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO /* 0x1fd */
+ .long .L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO /* 0x1fe */
.long .L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO /* 0x1ff */
/* File: x86/entry.S */
/*
diff --git a/vm/mterp/out/InterpC-allstubs.c b/vm/mterp/out/InterpC-allstubs.c
index c59223a..30c83c8 100644
--- a/vm/mterp/out/InterpC-allstubs.c
+++ b/vm/mterp/out/InterpC-allstubs.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -3068,17 +3068,12 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
@@ -4288,64 +4283,90 @@
/* File: c/OP_UNUSED_F1FF.c */
HANDLE_OPCODE(OP_UNUSED_F1FF)
+ /*
+ * In portable interp, most unused opcodes will fall through to here.
+ */
+ LOGE("unknown opcode 0x%04x\n", inst);
+ dvmAbort();
+ FINISH(1);
OP_END
-/* File: c/OP_UNUSED_F2FF.c */
-HANDLE_OPCODE(OP_UNUSED_F2FF)
+/* File: c/OP_INVOKE_OBJECT_INIT_JUMBO.c */
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
OP_END
-/* File: c/OP_UNUSED_F3FF.c */
-HANDLE_OPCODE(OP_UNUSED_F3FF)
+/* File: c/OP_IGET_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F4FF.c */
-HANDLE_OPCODE(OP_UNUSED_F4FF)
+/* File: c/OP_IGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F5FF.c */
-HANDLE_OPCODE(OP_UNUSED_F5FF)
+/* File: c/OP_IGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F6FF.c */
-HANDLE_OPCODE(OP_UNUSED_F6FF)
+/* File: c/OP_IPUT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F7FF.c */
-HANDLE_OPCODE(OP_UNUSED_F7FF)
+/* File: c/OP_IPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F8FF.c */
-HANDLE_OPCODE(OP_UNUSED_F8FF)
+/* File: c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F9FF.c */
-HANDLE_OPCODE(OP_UNUSED_F9FF)
+/* File: c/OP_SGET_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FAFF.c */
-HANDLE_OPCODE(OP_UNUSED_FAFF)
+/* File: c/OP_SGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FBFF.c */
-HANDLE_OPCODE(OP_UNUSED_FBFF)
+/* File: c/OP_SGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_FCFF.c */
-HANDLE_OPCODE(OP_UNUSED_FCFF)
+/* File: c/OP_SPUT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FDFF.c */
-HANDLE_OPCODE(OP_UNUSED_FDFF)
+/* File: c/OP_SPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FEFF.c */
-HANDLE_OPCODE(OP_UNUSED_FEFF)
- /*
- * In portable interp, most unused opcodes will fall through to here.
- */
- LOGE("unknown opcode 0x%04x\n", INST_INST(inst));
- dvmAbort();
- FINISH(1);
+/* File: c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
/* File: c/OP_THROW_VERIFICATION_ERROR_JUMBO.c */
diff --git a/vm/mterp/out/InterpC-armv5te-vfp.c b/vm/mterp/out/InterpC-armv5te-vfp.c
index e40583f..a0894d2 100644
--- a/vm/mterp/out/InterpC-armv5te-vfp.c
+++ b/vm/mterp/out/InterpC-armv5te-vfp.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
diff --git a/vm/mterp/out/InterpC-armv5te.c b/vm/mterp/out/InterpC-armv5te.c
index 9cd0580..e189ca3 100644
--- a/vm/mterp/out/InterpC-armv5te.c
+++ b/vm/mterp/out/InterpC-armv5te.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
diff --git a/vm/mterp/out/InterpC-armv7-a-neon.c b/vm/mterp/out/InterpC-armv7-a-neon.c
index 00259c1..e63e577 100644
--- a/vm/mterp/out/InterpC-armv7-a-neon.c
+++ b/vm/mterp/out/InterpC-armv7-a-neon.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
diff --git a/vm/mterp/out/InterpC-armv7-a.c b/vm/mterp/out/InterpC-armv7-a.c
index c443bb3..f978a7e 100644
--- a/vm/mterp/out/InterpC-armv7-a.c
+++ b/vm/mterp/out/InterpC-armv7-a.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
diff --git a/vm/mterp/out/InterpC-portdbg.c b/vm/mterp/out/InterpC-portdbg.c
index 5a4eac9..001ebc3 100644
--- a/vm/mterp/out/InterpC-portdbg.c
+++ b/vm/mterp/out/InterpC-portdbg.c
@@ -1204,7 +1204,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1228,7 +1228,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1252,7 +1252,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1276,7 +1276,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -3431,17 +3431,12 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
@@ -4651,64 +4646,90 @@
/* File: c/OP_UNUSED_F1FF.c */
HANDLE_OPCODE(OP_UNUSED_F1FF)
+ /*
+ * In portable interp, most unused opcodes will fall through to here.
+ */
+ LOGE("unknown opcode 0x%04x\n", inst);
+ dvmAbort();
+ FINISH(1);
OP_END
-/* File: c/OP_UNUSED_F2FF.c */
-HANDLE_OPCODE(OP_UNUSED_F2FF)
+/* File: c/OP_INVOKE_OBJECT_INIT_JUMBO.c */
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
OP_END
-/* File: c/OP_UNUSED_F3FF.c */
-HANDLE_OPCODE(OP_UNUSED_F3FF)
+/* File: c/OP_IGET_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F4FF.c */
-HANDLE_OPCODE(OP_UNUSED_F4FF)
+/* File: c/OP_IGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F5FF.c */
-HANDLE_OPCODE(OP_UNUSED_F5FF)
+/* File: c/OP_IGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F6FF.c */
-HANDLE_OPCODE(OP_UNUSED_F6FF)
+/* File: c/OP_IPUT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F7FF.c */
-HANDLE_OPCODE(OP_UNUSED_F7FF)
+/* File: c/OP_IPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F8FF.c */
-HANDLE_OPCODE(OP_UNUSED_F8FF)
+/* File: c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F9FF.c */
-HANDLE_OPCODE(OP_UNUSED_F9FF)
+/* File: c/OP_SGET_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FAFF.c */
-HANDLE_OPCODE(OP_UNUSED_FAFF)
+/* File: c/OP_SGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FBFF.c */
-HANDLE_OPCODE(OP_UNUSED_FBFF)
+/* File: c/OP_SGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_FCFF.c */
-HANDLE_OPCODE(OP_UNUSED_FCFF)
+/* File: c/OP_SPUT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FDFF.c */
-HANDLE_OPCODE(OP_UNUSED_FDFF)
+/* File: c/OP_SPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FEFF.c */
-HANDLE_OPCODE(OP_UNUSED_FEFF)
- /*
- * In portable interp, most unused opcodes will fall through to here.
- */
- LOGE("unknown opcode 0x%04x\n", INST_INST(inst));
- dvmAbort();
- FINISH(1);
+/* File: c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
/* File: c/OP_THROW_VERIFICATION_ERROR_JUMBO.c */
diff --git a/vm/mterp/out/InterpC-portstd.c b/vm/mterp/out/InterpC-portstd.c
index f8404c6..b95f847 100644
--- a/vm/mterp/out/InterpC-portstd.c
+++ b/vm/mterp/out/InterpC-portstd.c
@@ -1195,7 +1195,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1219,7 +1219,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1243,7 +1243,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1267,7 +1267,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -3181,17 +3181,12 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
@@ -4401,64 +4396,90 @@
/* File: c/OP_UNUSED_F1FF.c */
HANDLE_OPCODE(OP_UNUSED_F1FF)
+ /*
+ * In portable interp, most unused opcodes will fall through to here.
+ */
+ LOGE("unknown opcode 0x%04x\n", inst);
+ dvmAbort();
+ FINISH(1);
OP_END
-/* File: c/OP_UNUSED_F2FF.c */
-HANDLE_OPCODE(OP_UNUSED_F2FF)
+/* File: c/OP_INVOKE_OBJECT_INIT_JUMBO.c */
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
OP_END
-/* File: c/OP_UNUSED_F3FF.c */
-HANDLE_OPCODE(OP_UNUSED_F3FF)
+/* File: c/OP_IGET_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F4FF.c */
-HANDLE_OPCODE(OP_UNUSED_F4FF)
+/* File: c/OP_IGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F5FF.c */
-HANDLE_OPCODE(OP_UNUSED_F5FF)
+/* File: c/OP_IGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F6FF.c */
-HANDLE_OPCODE(OP_UNUSED_F6FF)
+/* File: c/OP_IPUT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_F7FF.c */
-HANDLE_OPCODE(OP_UNUSED_F7FF)
+/* File: c/OP_IPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_F8FF.c */
-HANDLE_OPCODE(OP_UNUSED_F8FF)
+/* File: c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_F9FF.c */
-HANDLE_OPCODE(OP_UNUSED_F9FF)
+/* File: c/OP_SGET_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FAFF.c */
-HANDLE_OPCODE(OP_UNUSED_FAFF)
+/* File: c/OP_SGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FBFF.c */
-HANDLE_OPCODE(OP_UNUSED_FBFF)
+/* File: c/OP_SGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
-/* File: c/OP_UNUSED_FCFF.c */
-HANDLE_OPCODE(OP_UNUSED_FCFF)
+/* File: c/OP_SPUT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
OP_END
-/* File: c/OP_UNUSED_FDFF.c */
-HANDLE_OPCODE(OP_UNUSED_FDFF)
+/* File: c/OP_SPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
OP_END
-/* File: c/OP_UNUSED_FEFF.c */
-HANDLE_OPCODE(OP_UNUSED_FEFF)
- /*
- * In portable interp, most unused opcodes will fall through to here.
- */
- LOGE("unknown opcode 0x%04x\n", INST_INST(inst));
- dvmAbort();
- FINISH(1);
+/* File: c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
OP_END
/* File: c/OP_THROW_VERIFICATION_ERROR_JUMBO.c */
diff --git a/vm/mterp/out/InterpC-x86-atom.c b/vm/mterp/out/InterpC-x86-atom.c
index ce698c0..7d9c1af 100644
--- a/vm/mterp/out/InterpC-x86-atom.c
+++ b/vm/mterp/out/InterpC-x86-atom.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1427,17 +1427,12 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
@@ -1463,6 +1458,84 @@
HANDLE_SPUT_X(OP_SPUT_OBJECT_VOLATILE, "-object-volatile", ObjectVolatile, _AS_OBJECT)
OP_END
+/* File: c/OP_INVOKE_OBJECT_INIT_JUMBO.c */
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
+OP_END
+
+/* File: c/OP_IGET_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_IGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_IGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_IPUT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_IPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_SGET_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_SGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_SGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_SPUT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
+OP_END
+
+/* File: c/OP_SPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
/* File: c/gotoTargets.c */
/*
* C footer. This has some common code shared by the various targets.
diff --git a/vm/mterp/out/InterpC-x86.c b/vm/mterp/out/InterpC-x86.c
index f900845..5152e85 100644
--- a/vm/mterp/out/InterpC-x86.c
+++ b/vm/mterp/out/InterpC-x86.c
@@ -1212,7 +1212,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1236,7 +1236,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
SET_REGISTER##_regsize(vdst, dvmGetStaticField##_ftype(sfield)); \
@@ -1260,7 +1260,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1284,7 +1284,7 @@
if (sfield == NULL) \
GOTO_exceptionThrown(); \
if (dvmDexGetResolvedField(methodClassDex, ref) == NULL) { \
- END_JIT_TSELECT(); \
+ END_JIT_TSELECT(); \
} \
} \
dvmSetStaticField##_ftype(sfield, GET_REGISTER##_regsize(vdst)); \
@@ -1376,17 +1376,12 @@
}
#if INTERP_TYPE == INTERP_DBG
- if (!DEBUGGER_ACTIVE) {
- /* skip method invocation */
- FINISH(3);
- } else {
+ if (DEBUGGER_ACTIVE) {
/* behave like OP_INVOKE_DIRECT_RANGE */
GOTO_invoke(invokeDirect, true, false);
}
-#else
- /* debugger can't be attached, skip method invocation */
- FINISH(3);
#endif
+ FINISH(3);
}
OP_END
@@ -1400,6 +1395,84 @@
GOTO_returnFromMethod();
OP_END
+/* File: c/OP_INVOKE_OBJECT_INIT_JUMBO.c */
+HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_JUMBO /*{vCCCC..vNNNN}, meth@AAAAAAAA*/)
+ {
+ Object* obj;
+
+ vsrc1 = FETCH(4); /* reg number of "this" pointer */
+ obj = GET_REGISTER_AS_OBJECT(vsrc1);
+
+ if (!checkForNullExportPC(obj, fp, pc))
+ GOTO_exceptionThrown();
+
+ /*
+ * The object should be marked "finalizable" when Object.<init>
+ * completes normally. We're going to assume it does complete
+ * (by virtue of being nothing but a return-void) and set it now.
+ */
+ if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISFINALIZABLE)) {
+ dvmSetFinalizable(obj);
+ }
+
+#if INTERP_TYPE == INTERP_DBG
+ if (DEBUGGER_ACTIVE) {
+ /* behave like OP_INVOKE_DIRECT_RANGE */
+ GOTO_invoke(invokeDirect, true, true);
+ }
+#endif
+ FINISH(5);
+ }
+OP_END
+
+/* File: c/OP_IGET_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_IGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_IGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IGET_X_JUMBO(OP_IGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_IPUT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_IPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_IPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_IPUT_X_JUMBO(OP_IPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_SGET_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_VOLATILE_JUMBO, "-volatile/jumbo", IntVolatile, )
+OP_END
+
+/* File: c/OP_SGET_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_SGET_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SGET_X_JUMBO(OP_SGET_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
+/* File: c/OP_SPUT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_VOLATILE_JUMBO, "-volatile", IntVolatile, )
+OP_END
+
+/* File: c/OP_SPUT_WIDE_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_WIDE_VOLATILE_JUMBO, "-wide-volatile/jumbo", LongVolatile, _WIDE)
+OP_END
+
+/* File: c/OP_SPUT_OBJECT_VOLATILE_JUMBO.c */
+HANDLE_SPUT_X_JUMBO(OP_SPUT_OBJECT_VOLATILE_JUMBO, "-object-volatile/jumbo", ObjectVolatile, _AS_OBJECT)
+OP_END
+
/* File: c/gotoTargets.c */
/*
* C footer. This has some common code shared by the various targets.
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F2FF.S b/vm/mterp/x86-atom/OP_UNUSED_F2FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F3FF.S b/vm/mterp/x86-atom/OP_UNUSED_F3FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F4FF.S b/vm/mterp/x86-atom/OP_UNUSED_F4FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F5FF.S b/vm/mterp/x86-atom/OP_UNUSED_F5FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F6FF.S b/vm/mterp/x86-atom/OP_UNUSED_F6FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F7FF.S b/vm/mterp/x86-atom/OP_UNUSED_F7FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F8FF.S b/vm/mterp/x86-atom/OP_UNUSED_F8FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_F9FF.S b/vm/mterp/x86-atom/OP_UNUSED_F9FF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_F9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_FAFF.S b/vm/mterp/x86-atom/OP_UNUSED_FAFF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_FAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_FBFF.S b/vm/mterp/x86-atom/OP_UNUSED_FBFF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_FBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_FCFF.S b/vm/mterp/x86-atom/OP_UNUSED_FCFF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_FCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_FDFF.S b/vm/mterp/x86-atom/OP_UNUSED_FDFF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_FDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/OP_UNUSED_FEFF.S b/vm/mterp/x86-atom/OP_UNUSED_FEFF.S
deleted file mode 100644
index ebae8b7..0000000
--- a/vm/mterp/x86-atom/OP_UNUSED_FEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86-atom/unused.S"
diff --git a/vm/mterp/x86-atom/TODO.txt b/vm/mterp/x86-atom/TODO.txt
index da14adc..009f314 100644
--- a/vm/mterp/x86-atom/TODO.txt
+++ b/vm/mterp/x86-atom/TODO.txt
@@ -8,7 +8,6 @@
skip a memory load when debugger support is completely disabled)
(hi) WITH_DEBUGGER and WITH_PROFILER are no longer defined (but are
assumed to be enabled)
-(hi) Add implementations for jumbo opcodes (40 instructions)
(hi) Implement OP_DISPATCH_FF for real. (Right now it's treated as
an unused instruction.)
(hi) Rename dvmJitGetCodeAddr to dvmJitGetTraceAddr.
@@ -17,6 +16,8 @@
(hi) Rework interpreter to co-exist the new switching model which
elminiates a separate debug interpreter.
+(md) Add implementations for jumbo opcodes (40 instructions) and
+ their volatile variants (13 instructions)
(md) Correct OP_MONITOR_EXIT (need to adjust PC before throw)
(md) OP_THROW needs to export the PC
(md) Use dvmThrowArrayIndexOutOfBoundsException(length, index) for
diff --git a/vm/mterp/x86/OP_UNUSED_F2FF.S b/vm/mterp/x86/OP_UNUSED_F2FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F3FF.S b/vm/mterp/x86/OP_UNUSED_F3FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F4FF.S b/vm/mterp/x86/OP_UNUSED_F4FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F5FF.S b/vm/mterp/x86/OP_UNUSED_F5FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F6FF.S b/vm/mterp/x86/OP_UNUSED_F6FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F7FF.S b/vm/mterp/x86/OP_UNUSED_F7FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F8FF.S b/vm/mterp/x86/OP_UNUSED_F8FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_F9FF.S b/vm/mterp/x86/OP_UNUSED_F9FF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_F9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_FAFF.S b/vm/mterp/x86/OP_UNUSED_FAFF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_FAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_FBFF.S b/vm/mterp/x86/OP_UNUSED_FBFF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_FBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_FCFF.S b/vm/mterp/x86/OP_UNUSED_FCFF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_FCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_FDFF.S b/vm/mterp/x86/OP_UNUSED_FDFF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_FDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"
diff --git a/vm/mterp/x86/OP_UNUSED_FEFF.S b/vm/mterp/x86/OP_UNUSED_FEFF.S
deleted file mode 100644
index 31d98c1..0000000
--- a/vm/mterp/x86/OP_UNUSED_FEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "x86/unused.S"