summaryrefslogtreecommitdiffstats
path: root/dx
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2012-10-08 14:46:07 +0200
committerBrian Carlstrom <bdc@google.com>2013-05-03 17:59:03 -0700
commit9d8ae21b54d2fc38163dfe63fbd86c5c9e0ff678 (patch)
tree4a7e6d8ceaaa5903bae0b4b100922d4cc7272865 /dx
parentf7e2a54823232a9cc249f799e666547fac0ab27d (diff)
downloadandroid_dalvik-9d8ae21b54d2fc38163dfe63fbd86c5c9e0ff678.tar.gz
android_dalvik-9d8ae21b54d2fc38163dfe63fbd86c5c9e0ff678.tar.bz2
android_dalvik-9d8ae21b54d2fc38163dfe63fbd86c5c9e0ff678.zip
Fix bug on register compatibility.
- Bad register usage to compute prefix or suffix expansion. (cherry picked from commit 5bce02865087b7ec3c6321a1bef9542c18b0f90e) Change-Id: Ife9b2b07870bbc933f959c194a4a72dfa9507cfb
Diffstat (limited to 'dx')
-rw-r--r--dx/src/com/android/dx/dex/code/form/Form12x.java28
1 files changed, 26 insertions, 2 deletions
diff --git a/dx/src/com/android/dx/dex/code/form/Form12x.java b/dx/src/com/android/dx/dex/code/form/Form12x.java
index b4d5b4a5c..a2e88e338 100644
--- a/dx/src/com/android/dx/dex/code/form/Form12x.java
+++ b/dx/src/com/android/dx/dex/code/form/Form12x.java
@@ -112,9 +112,33 @@ public final class Form12x extends InsnFormat {
public BitSet compatibleRegs(DalvInsn insn) {
RegisterSpecList regs = insn.getRegisters();
BitSet bits = new BitSet(2);
+ int r0 = regs.get(0).getReg();
+ int r1 = regs.get(1).getReg();
+
+ switch (regs.size()) {
+ case 2: {
+ bits.set(0, unsignedFitsInNibble(r0));
+ bits.set(1, unsignedFitsInNibble(r1));
+ break;
+ }
+ case 3: {
+ if (r0 != r1) {
+ bits.set(0, false);
+ bits.set(1, false);
+ } else {
+ boolean dstRegComp = unsignedFitsInNibble(r1);
+ bits.set(0, dstRegComp);
+ bits.set(1, dstRegComp);
+ }
+
+ bits.set(2, unsignedFitsInNibble(regs.get(2).getReg()));
+ break;
+ }
+ default: {
+ throw new AssertionError();
+ }
+ }
- bits.set(0, unsignedFitsInNibble(regs.get(0).getReg()));
- bits.set(1, unsignedFitsInNibble(regs.get(1).getReg()));
return bits;
}