Minor interpreter cleanup.
- Removes useless cast
- Improves calculation of FILL_ARRAY_DATA's payload pointer.
- Make some "cast" instructions handling code consistent with some "cmp"
instructions.
Change-Id: Ib7af78b4bab146f2b48ba5ac8e4723002c8c1f60
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 0e9bc78..0345fd2 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -1069,7 +1069,7 @@
case Instruction::CONST_4: {
PREAMBLE();
uint32_t dst = inst->VRegA_11n();
- int32_t val = static_cast<int32_t>(inst->VRegB_11n() << 28) >> 28;
+ int32_t val = inst->VRegB_11n();
shadow_frame.SetVReg(dst, val);
if (val == 0) {
shadow_frame.SetVRegReference(dst, NULL);
@@ -1080,7 +1080,7 @@
case Instruction::CONST_16: {
PREAMBLE();
uint32_t dst = inst->VRegA_21s();
- int32_t val = static_cast<int16_t>(inst->VRegB_21s());
+ int32_t val = inst->VRegB_21s();
shadow_frame.SetVReg(dst, val);
if (val == 0) {
shadow_frame.SetVRegReference(dst, NULL);
@@ -1102,7 +1102,7 @@
case Instruction::CONST_HIGH16: {
PREAMBLE();
uint32_t dst = inst->VRegA_21h();
- int32_t val = inst->VRegB_21h() << 16;
+ int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
shadow_frame.SetVReg(dst, val);
if (val == 0) {
shadow_frame.SetVRegReference(dst, NULL);
@@ -1112,14 +1112,12 @@
}
case Instruction::CONST_WIDE_16:
PREAMBLE();
- shadow_frame.SetVRegLong(inst->VRegA_21s(),
- static_cast<int16_t>(inst->VRegB_21s()));
+ shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s());
inst = inst->Next_2xx();
break;
case Instruction::CONST_WIDE_32:
PREAMBLE();
- shadow_frame.SetVRegLong(inst->VRegA_31i(),
- static_cast<int32_t>(inst->VRegB_31i()));
+ shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i());
inst = inst->Next_3xx();
break;
case Instruction::CONST_WIDE:
@@ -1226,10 +1224,10 @@
if (UNLIKELY(array == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow());
HANDLE_PENDING_EXCEPTION();
- break;
+ } else {
+ shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength());
+ inst = inst->Next_1xx();
}
- shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength());
- inst = inst->Next_1xx();
break;
}
case Instruction::NEW_INSTANCE: {
@@ -1363,8 +1361,9 @@
}
Array* array = obj->AsArray();
DCHECK(array->IsArrayInstance() && !array->IsObjectArray());
+ const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t();
const Instruction::ArrayDataPayload* payload =
- reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + inst->GetDexPc(insns) + inst->VRegB_31t());
+ reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr);
if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) {
self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(),
"Ljava/lang/ArrayIndexOutOfBoundsException;",
@@ -2193,33 +2192,35 @@
break;
case Instruction::FLOAT_TO_INT: {
PREAMBLE();
- uint32_t dst = inst->VRegA_12x();
float val = shadow_frame.GetVRegFloat(inst->VRegB_12x());
+ int32_t result;
if (val != val) {
- shadow_frame.SetVReg(dst, 0);
+ result = 0;
} else if (val > static_cast<float>(kMaxInt)) {
- shadow_frame.SetVReg(dst, kMaxInt);
+ result = kMaxInt;
} else if (val < static_cast<float>(kMinInt)) {
- shadow_frame.SetVReg(dst, kMinInt);
+ result = kMinInt;
} else {
- shadow_frame.SetVReg(dst, val);
+ result = val;
}
+ shadow_frame.SetVReg(inst->VRegA_12x(), result);
inst = inst->Next_1xx();
break;
}
case Instruction::FLOAT_TO_LONG: {
PREAMBLE();
- uint32_t dst = inst->VRegA_12x();
float val = shadow_frame.GetVRegFloat(inst->VRegB_12x());
+ int64_t result;
if (val != val) {
- shadow_frame.SetVRegLong(dst, 0);
+ result = 0;
} else if (val > static_cast<float>(kMaxLong)) {
- shadow_frame.SetVRegLong(dst, kMaxLong);
+ result = kMaxLong;
} else if (val < static_cast<float>(kMinLong)) {
- shadow_frame.SetVRegLong(dst, kMinLong);
+ result = kMinLong;
} else {
- shadow_frame.SetVRegLong(dst, val);
+ result = val;
}
+ shadow_frame.SetVRegLong(inst->VRegA_12x(), result);
inst = inst->Next_1xx();
break;
}
@@ -2230,33 +2231,35 @@
break;
case Instruction::DOUBLE_TO_INT: {
PREAMBLE();
- uint32_t dst = inst->VRegA_12x();
double val = shadow_frame.GetVRegDouble(inst->VRegB_12x());
+ int32_t result;
if (val != val) {
- shadow_frame.SetVReg(dst, 0);
+ result = 0;
} else if (val > static_cast<double>(kMaxInt)) {
- shadow_frame.SetVReg(dst, kMaxInt);
+ result = kMaxInt;
} else if (val < static_cast<double>(kMinInt)) {
- shadow_frame.SetVReg(dst, kMinInt);
+ result = kMinInt;
} else {
- shadow_frame.SetVReg(dst, val);
+ result = val;
}
+ shadow_frame.SetVReg(inst->VRegA_12x(), result);
inst = inst->Next_1xx();
break;
}
case Instruction::DOUBLE_TO_LONG: {
PREAMBLE();
- uint32_t dst = inst->VRegA_12x();
double val = shadow_frame.GetVRegDouble(inst->VRegB_12x());
+ int64_t result;
if (val != val) {
- shadow_frame.SetVRegLong(dst, 0);
+ result = 0;
} else if (val > static_cast<double>(kMaxLong)) {
- shadow_frame.SetVRegLong(dst, kMaxLong);
+ result = kMaxLong;
} else if (val < static_cast<double>(kMinLong)) {
- shadow_frame.SetVRegLong(dst, kMinLong);
+ result = kMinLong;
} else {
- shadow_frame.SetVRegLong(dst, val);
+ result = val;
}
+ shadow_frame.SetVRegLong(inst->VRegA_12x(), result);
inst = inst->Next_1xx();
break;
}