Add opcodes for volatile field accesses
This adds instructions for {i,s}{get,put}{,-object}-volatile, for a
total of eight new instructions.
On SMP systems, these instructions will be substituted in for existing
field access instructions, either by dexopt or during just-in-time
verification. Unlike the wide-volatile instructions, these will not be
used at all when the VM is not built for SMP.
(Ideally we'd omit the volatile instruction implementations entirely on
non-SMP builds, but that requires a little work in gen-mterp.py.)
The change defines and implements the opcodes and support methods, but
does not cause them to be used.
Also, changed dvmQuasiAtomicRead64's argument to be const.
Change-Id: I9e44fe881e87f27aa41f6c6e898ec4402cb5493e
diff --git a/vm/analysis/CodeVerify.c b/vm/analysis/CodeVerify.c
index 30670ec..4310a06 100644
--- a/vm/analysis/CodeVerify.c
+++ b/vm/analysis/CodeVerify.c
@@ -4459,6 +4459,7 @@
break;
case OP_IGET:
+ case OP_IGET_VOLATILE:
tmpType = kRegTypeInteger;
goto iget_1nr_common;
case OP_IGET_BOOLEAN:
@@ -4548,6 +4549,7 @@
}
break;
case OP_IGET_OBJECT:
+ case OP_IGET_OBJECT_VOLATILE:
{
ClassObject* fieldClass;
InstField* instField;
@@ -4577,6 +4579,7 @@
}
break;
case OP_IPUT:
+ case OP_IPUT_VOLATILE:
tmpType = kRegTypeInteger;
goto iput_1nr_common;
case OP_IPUT_BOOLEAN:
@@ -4687,6 +4690,7 @@
}
break;
case OP_IPUT_OBJECT:
+ case OP_IPUT_OBJECT_VOLATILE:
{
ClassObject* fieldClass;
ClassObject* valueClass;
@@ -4748,6 +4752,7 @@
break;
case OP_SGET:
+ case OP_SGET_VOLATILE:
tmpType = kRegTypeInteger;
goto sget_1nr_common;
case OP_SGET_BOOLEAN:
@@ -4831,6 +4836,7 @@
}
break;
case OP_SGET_OBJECT:
+ case OP_SGET_OBJECT_VOLATILE:
{
StaticField* staticField;
ClassObject* fieldClass;
@@ -4855,6 +4861,7 @@
}
break;
case OP_SPUT:
+ case OP_SPUT_VOLATILE:
tmpType = kRegTypeInteger;
goto sput_1nr_common;
case OP_SPUT_BOOLEAN:
@@ -4958,6 +4965,7 @@
}
break;
case OP_SPUT_OBJECT:
+ case OP_SPUT_OBJECT_VOLATILE:
{
ClassObject* fieldClass;
ClassObject* valueClass;
@@ -5497,16 +5505,8 @@
case OP_UNUSED_73:
case OP_UNUSED_79:
case OP_UNUSED_7A:
- case OP_UNUSED_E3:
- case OP_UNUSED_E4:
- case OP_UNUSED_E5:
- case OP_UNUSED_E6:
- case OP_UNUSED_E7:
case OP_BREAKPOINT:
case OP_UNUSED_F1:
- case OP_UNUSED_FC:
- case OP_UNUSED_FD:
- case OP_UNUSED_FE:
case OP_UNUSED_FF:
failure = VERIFY_ERROR_GENERIC;
break;