diff options
| author | Andy McFadden <fadden@android.com> | 2011-03-10 14:12:48 -0800 |
|---|---|---|
| committer | Andy McFadden <fadden@android.com> | 2011-03-10 16:02:48 -0800 |
| commit | 24bd4c50bb3ea13be4f049710967961f0546fb2c (patch) | |
| tree | 6e472f5a7dfb1a54da3cb667c6777ec870988295 | |
| parent | af06c40f24a00e0662899405d24b2813cc0690a4 (diff) | |
| download | android_dalvik-24bd4c50bb3ea13be4f049710967961f0546fb2c.tar.gz android_dalvik-24bd4c50bb3ea13be4f049710967961f0546fb2c.tar.bz2 android_dalvik-24bd4c50bb3ea13be4f049710967961f0546fb2c.zip | |
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
113 files changed, 3542 insertions, 1029 deletions
diff --git a/libdex/DexOpcodes.c b/libdex/DexOpcodes.c index b7a34144c..50254a7e6 100644 --- a/libdex/DexOpcodes.c +++ b/libdex/DexOpcodes.c @@ -528,19 +528,19 @@ static const char* gOpNames[kNumPackedOpcodes] = { "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 10fd8a118..07188b2d0 100644 --- a/libdex/DexOpcodes.h +++ b/libdex/DexOpcodes.h @@ -566,19 +566,19 @@ typedef enum Opcode { 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 @@ typedef enum Opcode { 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 7355301f8..0e72d435d 100644 --- a/libdex/InstrUtils.c +++ b/libdex/InstrUtils.c @@ -63,7 +63,7 @@ static InstructionWidth gInstructionWidthTable[kNumPackedOpcodes] = { 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 @@ static u1 gOpcodeFlagsTable[kNumPackedOpcodes] = { 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 @@ static u1 gInstructionFormatTable[kNumPackedOpcodes] = { 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 @@ static u1 gInstructionIndexTypeTable[kNumPackedOpcodes] = { 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 6fd57dbdb..7f6921433 100644 --- a/opcode-gen/bytecode.txt +++ b/opcode-gen/bytecode.txt @@ -393,10 +393,25 @@ op 24ff invoke-direct/jumbo 5rc n method-ref continue|throw|invoke 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 1894d5d8e..1ddc71391 100644 --- a/vm/analysis/CodeVerify.c +++ b/vm/analysis/CodeVerify.c @@ -4744,6 +4744,7 @@ aput_1nr_common: 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 @@ iget_1nr_common: 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 @@ iget_1nr_common: 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 @@ iget_1nr_common: 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 @@ iput_1nr_common: 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 @@ iput_1nr_common: 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 @@ iput_1nr_common: 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 @@ sget_1nr_common: 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 @@ sget_1nr_common: 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 @@ sget_1nr_common: 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 @@ sput_1nr_common: 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 @@ sput_1nr_common: 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 @@ sput_1nr_common: 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 @@ sput_1nr_common: 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 ce536e5ad..7f0632071 100644 --- a/vm/analysis/DexVerify.c +++ b/vm/analysis/DexVerify.c @@ -1192,12 +1192,25 @@ static bool verifyInstructions(VerifierData* vdata) 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 @@ static bool verifyInstructions(VerifierData* vdata) 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 04dfa019e..2e607802e 100644 --- a/vm/analysis/Liveness.c +++ b/vm/analysis/Liveness.c @@ -361,6 +361,7 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 @@ static bool processInstruction(VerifierData* vdata, u4 insnIdx, 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 38f822cb2..76744bd3d 100644 --- a/vm/compiler/Dataflow.c +++ b/vm/compiler/Dataflow.c @@ -1524,44 +1524,44 @@ int dvmCompilerDataFlowAttributes[kMirOpLast] = { // 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 000000000..fb4bf6354 --- /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 000000000..6d2b5ffb7 --- /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 edba5e1bd..40a6a96c7 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 000000000..c38a73d5a --- /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 000000000..47e3a4a85 --- /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 d91c6d14d..67a3cc785 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 000000000..0d27fe59d --- /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 000000000..af7d9ebb9 --- /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 c8151fc88..a371f1c37 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 000000000..53b103075 --- /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 000000000..bebc805d5 --- /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 000000000..9075c2832 --- /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 6479a67df..c1f5cc750 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 000000000..1e4b2de93 --- /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 000000000..78fe07b17 --- /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 000000000..7049fc645 --- /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 87abc580a..2bfeae127 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 000000000..c1b099156 --- /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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 faa7246f5..000000000 --- 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 d40cab53a..9d379d919 100644 --- a/vm/mterp/armv5te/header.S +++ b/vm/mterp/armv5te/header.S @@ -117,14 +117,14 @@ unspecified registers or condition codes. * 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 @@ unspecified registers or condition codes. * * 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 000000000..705aefd05 --- /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 000000000..462279a3d --- /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 000000000..5285a3191 --- /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 000000000..3f9d052bd --- /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 f2b623faf..da0d762eb 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 000000000..0af17e34d --- /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 000000000..82216c624 --- /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 000000000..f4a214011 --- /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 000000000..b96ef5d05 --- /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 000000000..5cf8975a4 --- /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 000000000..4b75c753c --- /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 000000000..4f60a5d86 --- /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 000000000..845cc833a --- /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 000000000..3a862948d --- /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 e0f8c6c4f..a3a65d7fb 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 a95718b5f..000000000 --- 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 deeade0b5..000000000 --- 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 0d0c42ee5..000000000 --- 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 48d41655e..000000000 --- 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 83129c919..000000000 --- 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 f61472d10..000000000 --- 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 6c0454a01..000000000 --- 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 271d7a56f..000000000 --- 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 8431c24c5..000000000 --- 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 2d552c737..000000000 --- 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 8c200726c..000000000 --- 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 d58661505..000000000 --- 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 8f604ae76..000000000 --- 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 fc7d9a29e..0cb3547b1 100644 --- a/vm/mterp/c/opcommon.c +++ b/vm/mterp/c/opcommon.c @@ -669,7 +669,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 5a054f06d..a99e5a720 100644 --- a/vm/mterp/config-x86 +++ b/vm/mterp/config-x86 @@ -44,6 +44,20 @@ op-start x86 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 f99a4d29e..4a13d7a88 100644 --- a/vm/mterp/config-x86-atom +++ b/vm/mterp/config-x86-atom @@ -292,6 +292,20 @@ op OP_SGET_WIDE_VOLATILE c 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 bc58367b8..a287d3818 100644 --- a/vm/mterp/out/InterpAsm-armv5te-vfp.S +++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S @@ -124,14 +124,14 @@ unspecified registers or condition codes. * 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 @@ unspecified registers or condition codes. * * 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 @@ dalvik_inst: * 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: /* ------------------------------ */ .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 @@ d2l_doconv: 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 @@ d2l_doconv: 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: 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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 47a1cbfea..c657e9eb2 100644 --- a/vm/mterp/out/InterpAsm-armv5te.S +++ b/vm/mterp/out/InterpAsm-armv5te.S @@ -124,14 +124,14 @@ unspecified registers or condition codes. * 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 @@ unspecified registers or condition codes. * * 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 @@ d2i_doconv: * 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 @@ d2i_doconv: 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 @@ d2i_doconv: 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 @@ d2i_doconv: 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 @@ d2i_doconv: 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 @@ d2i_doconv: /* ------------------------------ */ .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 @@ d2l_doconv: 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 @@ d2l_doconv: 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: 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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 d0bb6c377..c5acc08ba 100644 --- a/vm/mterp/out/InterpAsm-armv7-a-neon.S +++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S @@ -124,14 +124,14 @@ unspecified registers or condition codes. * 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 @@ unspecified registers or condition codes. * * 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 @@ dalvik_inst: * 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: /* ------------------------------ */ .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 @@ d2l_doconv: 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 @@ d2l_doconv: 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: 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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 d5dfb48e1..db207a1b6 100644 --- a/vm/mterp/out/InterpAsm-armv7-a.S +++ b/vm/mterp/out/InterpAsm-armv7-a.S @@ -124,14 +124,14 @@ unspecified registers or condition codes. * 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 @@ unspecified registers or condition codes. * * 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 @@ dalvik_inst: * 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: 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 @@ dalvik_inst: /* ------------------------------ */ .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 @@ d2l_doconv: 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 @@ d2l_doconv: 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: /* * 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 @@ d2l_doconv: 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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 @@ dvmAsmAltInstructionStart: /* ------------------------------ */ .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 b92c63446..19cb60343 100644 --- a/vm/mterp/out/InterpAsm-x86-atom.S +++ b/vm/mterp/out/InterpAsm-x86-atom.S @@ -24281,9 +24281,7 @@ OP_IF_LEZ_2f: /* ------------------------------ */ .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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 @@ OP_IF_LEZ_2f: */ /* - * 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 e401224f4..c2c0e65dd 100644 --- a/vm/mterp/out/InterpAsm-x86.S +++ b/vm/mterp/out/InterpAsm-x86.S @@ -11328,96 +11328,148 @@ dvmAsmInstructionStartCode = .L_OP_NOP /* ------------------------------ */ -.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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmAltInstructionStartCode: 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 @@ dvmAsmInstructionStart: .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 @@ dvmAsmAltInstructionStart: .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 c59223a1b..30c83c86f 100644 --- a/vm/mterp/out/InterpC-allstubs.c +++ b/vm/mterp/out/InterpC-allstubs.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 @@ OP_END /* 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 e40583f47..a0894d2f9 100644 --- a/vm/mterp/out/InterpC-armv5te-vfp.c +++ b/vm/mterp/out/InterpC-armv5te-vfp.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 9cd05803a..e189ca3d6 100644 --- a/vm/mterp/out/InterpC-armv5te.c +++ b/vm/mterp/out/InterpC-armv5te.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 00259c1d9..e63e57726 100644 --- a/vm/mterp/out/InterpC-armv7-a-neon.c +++ b/vm/mterp/out/InterpC-armv7-a-neon.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 c443bb34d..f978a7e60 100644 --- a/vm/mterp/out/InterpC-armv7-a.c +++ b/vm/mterp/out/InterpC-armv7-a.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 5a4eac9c3..001ebc3f5 100644 --- a/vm/mterp/out/InterpC-portdbg.c +++ b/vm/mterp/out/InterpC-portdbg.c @@ -1204,7 +1204,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 @@ OP_END /* 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 f8404c64f..b95f8471e 100644 --- a/vm/mterp/out/InterpC-portstd.c +++ b/vm/mterp/out/InterpC-portstd.c @@ -1195,7 +1195,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 @@ OP_END /* 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 ce698c008..7d9c1af10 100644 --- a/vm/mterp/out/InterpC-x86-atom.c +++ b/vm/mterp/out/InterpC-x86-atom.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 @@ OP_END 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 f9008455d..5152e85be 100644 --- a/vm/mterp/out/InterpC-x86.c +++ b/vm/mterp/out/InterpC-x86.c @@ -1212,7 +1212,7 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ GOTO_TARGET_DECL(exceptionThrown); 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 @@ HANDLE_OPCODE(OP_INVOKE_OBJECT_INIT_RANGE /*{vCCCC..v(CCCC+AA-1)}, meth@BBBB*/) } #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 @@ HANDLE_OPCODE(OP_RETURN_VOID_BARRIER /**/) 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 ebae8b71e..000000000 --- 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 da14adcbd..009f31463 100644 --- a/vm/mterp/x86-atom/TODO.txt +++ b/vm/mterp/x86-atom/TODO.txt @@ -8,7 +8,6 @@ Items requiring attention: 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 @@ Items requiring attention: (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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- 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 31d98c1f3..000000000 --- a/vm/mterp/x86/OP_UNUSED_FEFF.S +++ /dev/null @@ -1 +0,0 @@ -%include "x86/unused.S" |
