Jit: Fix for 2717275 First JIT bug reported by external developers
The JIT was incorrectly keeping a short value in a floating point
register rather than copying it to a core register before storing.
There was an assert to catch this case, but asserts don't fire in
production builds.
The fix is safe and simple - just exclude this case from the "optimization".
Change-Id: I33767c8a202b6fa36a19d918ac5b914a5e4e4de3
diff --git a/vm/compiler/codegen/arm/Thumb2/Factory.c b/vm/compiler/codegen/arm/Thumb2/Factory.c
index c7b52fd..3f1755e 100644
--- a/vm/compiler/codegen/arm/Thumb2/Factory.c
+++ b/vm/compiler/codegen/arm/Thumb2/Factory.c
@@ -748,9 +748,15 @@
if (FPREG(rSrc)) {
assert(SINGLEREG(rSrc));
- assert((size == kWord) || (size == kSingle));
- opCode = kThumb2Vstrs;
- size = kSingle;
+ if ((size != kWord) && (size != kSingle)) {
+ /* Move float value into core register */
+ int tReg = dvmCompilerAllocTemp(cUnit);
+ dvmCompilerRegCopy(cUnit, tReg, rSrc);
+ rSrc = tReg;
+ } else {
+ opCode = kThumb2Vstrs;
+ size = kSingle;
+ }
} else {
if (size == kSingle)
size = kWord;