Register promotion support for 64-bit targets
Not sufficiently tested for 64-bit targets, but should be
fairly close.
A significant amount of refactoring could stil be done, (in
later CLs).
With this change we are not making any changes to the vmap
scheme. As a result, it is a requirement that if a vreg
is promoted to both a 32-bit view and the low half of a
64-bit view it must share the same physical register. We
may change this restriction later on to allow for more flexibility
for 32-bit Arm.
For example, if v4, v5, v4/v5 and v5/v6 are all hot enough to
promote, we'd end up with something like:
v4 (as an int) -> r10
v4/v5 (as a long) -> r10
v5 (as an int) -> r11
v5/v6 (as a long) -> r11
Fix a couple of ARM64 bugs on the way...
Change-Id: I6a152b9c164d9f1a053622266e165428045362f3
diff --git a/compiler/dex/quick/mir_to_lir.h b/compiler/dex/quick/mir_to_lir.h
index 0c00df3..8ebd64a 100644
--- a/compiler/dex/quick/mir_to_lir.h
+++ b/compiler/dex/quick/mir_to_lir.h
@@ -195,8 +195,8 @@
high_reg = (both_regs >> 8) & 0xff; \
} while (false)
-// Mask to denote sreg as the start of a double. Must not interfere with low 16 bits.
-#define STARTING_DOUBLE_SREG 0x10000
+// Mask to denote sreg as the start of a 64-bit item. Must not interfere with low 16 bits.
+#define STARTING_WIDE_SREG 0x10000
// TODO: replace these macros
#define SLOW_FIELD_PATH (cu_->enable_debug & (1 << kDebugSlowFieldPath))
@@ -487,7 +487,7 @@
RegLocationType core_location:3;
uint8_t core_reg;
RegLocationType fp_location:3;
- uint8_t FpReg;
+ uint8_t fp_reg;
bool first_in_pair;
};
@@ -740,9 +740,9 @@
int SRegToPMap(int s_reg);
void RecordCorePromotion(RegStorage reg, int s_reg);
RegStorage AllocPreservedCoreReg(int s_reg);
- void RecordSinglePromotion(RegStorage reg, int s_reg);
- void RecordDoublePromotion(RegStorage reg, int s_reg);
- RegStorage AllocPreservedSingle(int s_reg);
+ void RecordFpPromotion(RegStorage reg, int s_reg);
+ RegStorage AllocPreservedFpReg(int s_reg);
+ virtual RegStorage AllocPreservedSingle(int s_reg);
virtual RegStorage AllocPreservedDouble(int s_reg);
RegStorage AllocTempBody(GrowableArray<RegisterInfo*> ®s, int* next_temp, bool required);
virtual RegStorage AllocFreeTemp();
@@ -1175,6 +1175,13 @@
// Required for target - register utilities.
+ bool IsSameReg(RegStorage reg1, RegStorage reg2) {
+ RegisterInfo* info1 = GetRegInfo(reg1);
+ RegisterInfo* info2 = GetRegInfo(reg2);
+ return (info1->Master() == info2->Master() &&
+ (info1->StorageMask() & info2->StorageMask()) != 0);
+ }
+
/**
* @brief Portable way of getting special registers from the backend.
* @param reg Enumeration describing the purpose of the register.
@@ -1224,8 +1231,6 @@
virtual void ClobberCallerSave() = 0;
virtual void FreeCallTemps() = 0;
virtual void LockCallTemps() = 0;
- virtual void MarkPreservedSingle(int v_reg, RegStorage reg) = 0;
- virtual void MarkPreservedDouble(int v_reg, RegStorage reg) = 0;
virtual void CompilerInitializeRegAlloc() = 0;
// Required for target - miscellaneous.