diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2014-07-28 15:40:53 +0200 |
---|---|---|
committer | mikaelpeltier <mikaelpeltier@google.com> | 2014-07-29 11:38:11 +0200 |
commit | 76e15e367ae1189b6f641ba8d16ca92bd179dac0 (patch) | |
tree | 2931d622f28bd40e467ad67996bbcb2ed50ca2e1 | |
parent | 878445a703152fb52e92c159034b738582de9aee (diff) | |
download | android_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.java | 33 | ||||
-rw-r--r-- | dx/src/com/android/dx/rop/code/RegisterSpecList.java | 24 |
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(); |