summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2014-07-28 15:40:53 +0200
committermikaelpeltier <mikaelpeltier@google.com>2014-07-29 11:38:11 +0200
commit76e15e367ae1189b6f641ba8d16ca92bd179dac0 (patch)
tree2931d622f28bd40e467ad67996bbcb2ed50ca2e1
parent878445a703152fb52e92c159034b738582de9aee (diff)
downloadandroid_dalvik-76e15e367ae1189b6f641ba8d16ca92bd179dac0.tar.gz
android_dalvik-76e15e367ae1189b6f641ba8d16ca92bd179dac0.tar.bz2
android_dalvik-76e15e367ae1189b6f641ba8d16ca92bd179dac0.zip
Do not align 64-bit registers during instruction expansion
- The reordering performs during instruction expansion is not correct for all instructions, in particular for xxx/range instructions that require sequential registers. (cherry picked from commit 26a4440a703ed98d19b2b77b4398ad42e8367f5d) Change-Id: Ida3c8a1abfb78a7b119c463b19030572d3fbc40e
-rw-r--r--dx/src/com/android/dx/dex/code/HighRegisterPrefix.java33
-rw-r--r--dx/src/com/android/dx/rop/code/RegisterSpecList.java24
2 files changed, 6 insertions, 51 deletions
diff --git a/dx/src/com/android/dx/dex/code/HighRegisterPrefix.java b/dx/src/com/android/dx/dex/code/HighRegisterPrefix.java
index cfc30324a..060743e6a 100644
--- a/dx/src/com/android/dx/dex/code/HighRegisterPrefix.java
+++ b/dx/src/com/android/dx/dex/code/HighRegisterPrefix.java
@@ -16,7 +16,6 @@
package com.android.dx.dex.code;
-import com.android.dx.dex.DexOptions;
import com.android.dx.rop.code.RegisterSpec;
import com.android.dx.rop.code.RegisterSpecList;
import com.android.dx.rop.code.SourcePosition;
@@ -89,34 +88,10 @@ public final class HighRegisterPrefix extends VariableSizeInsn {
insns = new SimpleInsn[sz];
- if (DexOptions.ALIGN_64BIT_REGS_SUPPORT) {
- int outAt = 0;
-
- // Insert mov instructions to transfer registers which are not compatible with an instruction
- // into compatible registers. Compatible registers start at 0 until registers.getWordCount().
- // 64-bit registers are low numbered in order to align them on even registers, and numbering
- // of 32-bit registers start after the last number of 64-bit register.
- for (int i = 0; i < sz; i++) {
- RegisterSpec src = registers.get(i);
- if (src.isCategory2()) {
- insns[i] = moveInsnFor(src, outAt);
- outAt += src.getCategory();
- }
- }
-
- for (int i = 0; i < sz; i++) {
- RegisterSpec src = registers.get(i);
- if (src.isCategory1()) {
- insns[i] = moveInsnFor(src, outAt);
- outAt += src.getCategory();
- }
- }
- } else {
- for (int i = 0, outAt = 0; i < sz; i++) {
- RegisterSpec src = registers.get(i);
- insns[i] = moveInsnFor(src, outAt);
- outAt += src.getCategory();
- }
+ for (int i = 0, outAt = 0; i < sz; i++) {
+ RegisterSpec src = registers.get(i);
+ insns[i] = moveInsnFor(src, outAt);
+ outAt += src.getCategory();
}
}
diff --git a/dx/src/com/android/dx/rop/code/RegisterSpecList.java b/dx/src/com/android/dx/rop/code/RegisterSpecList.java
index 2a136cab8..d89d5acb8 100644
--- a/dx/src/com/android/dx/rop/code/RegisterSpecList.java
+++ b/dx/src/com/android/dx/rop/code/RegisterSpecList.java
@@ -16,7 +16,6 @@
package com.android.dx.rop.code;
-import com.android.dx.dex.DexOptions;
import com.android.dx.rop.type.Type;
import com.android.dx.rop.type.TypeList;
import com.android.dx.util.FixedSizeList;
@@ -382,27 +381,8 @@ public final class RegisterSpecList
Expander expander = new Expander(this, compatRegs, base, duplicateFirst);
- if (DexOptions.ALIGN_64BIT_REGS_SUPPORT) {
- // Numbering done into HighRegisterPrefix starts by allocating 64-bit registers and
- // thereafter adding 32-bit registers. Since the number of the first 32-bit register is
- // unknown, 64-bit registers must be managed first.
- for (int regIdx = 0; regIdx < sz; regIdx++) {
- RegisterSpec reg = (RegisterSpec) get0(regIdx);
- if (reg.isCategory2()) {
- expander.expandRegister(regIdx, reg);
- }
- }
-
- for (int regIdx = 0; regIdx < sz; regIdx++) {
- RegisterSpec reg = (RegisterSpec) get0(regIdx);
- if (reg.isCategory1()) {
- expander.expandRegister(regIdx, reg);
- }
- }
- } else {
- for (int regIdx = 0; regIdx < sz; regIdx++) {
- expander.expandRegister(regIdx);
- }
+ for (int regIdx = 0; regIdx < sz; regIdx++) {
+ expander.expandRegister(regIdx);
}
return expander.getResult();