@@ -99,6 +99,33 @@ inline bool genExactlyOneBit(T value)
9999 return ((value != 0 ) && genMaxOneBit (value));
100100}
101101
102+ #ifdef TARGET_ARM64
103+ inline regMaskTP genFindLowestBit (regMaskTP value)
104+ {
105+ return regMaskTP (genFindLowestBit (value.getLow ()));
106+ }
107+
108+ /* ****************************************************************************
109+ *
110+ * Return true if the given value has exactly zero or one bits set.
111+ */
112+
113+ inline bool genMaxOneBit (regMaskTP value)
114+ {
115+ return genMaxOneBit (value.getLow ());
116+ }
117+
118+ /* ****************************************************************************
119+ *
120+ * Return true if the given value has exactly one bit set.
121+ */
122+
123+ inline bool genExactlyOneBit (regMaskTP value)
124+ {
125+ return genExactlyOneBit (value.getLow ());
126+ }
127+ #endif
128+
102129/* ****************************************************************************
103130 *
104131 * Given a value that has exactly one bit set, return the position of that
@@ -147,6 +174,13 @@ inline unsigned genCountBits(uint64_t bits)
147174 return BitOperations::PopCount (bits);
148175}
149176
177+ #ifdef TARGET_ARM64
178+ inline unsigned genCountBits (regMaskTP mask)
179+ {
180+ return BitOperations::PopCount (mask.getLow ());
181+ }
182+ #endif
183+
150184/* ****************************************************************************
151185 *
152186 * A rather simple routine that counts the number of bits in a given number.
@@ -914,11 +948,18 @@ inline regNumber genRegNumFromMask(regMaskTP mask)
914948
915949 /* Convert the mask to a register number */
916950
917- regNumber regNum = (regNumber)genLog2 (mask);
951+ #ifdef TARGET_ARM64
952+ regNumber regNum = (regNumber)genLog2 (mask.getLow ());
918953
919954 /* Make sure we got it right */
955+ assert (genRegMask (regNum) == mask.getLow ());
920956
957+ #else
958+ regNumber regNum = (regNumber)genLog2 (mask);
959+
960+ /* Make sure we got it right */
921961 assert (genRegMask (regNum) == mask);
962+ #endif
922963
923964 return regNum;
924965}
@@ -940,7 +981,8 @@ inline regNumber genFirstRegNumFromMaskAndToggle(regMaskTP& mask)
940981
941982 /* Convert the mask to a register number */
942983
943- regNumber regNum = (regNumber)BitOperations::BitScanForward (mask);
984+ regNumber regNum = (regNumber)BitScanForward (mask);
985+
944986 mask ^= genRegMask (regNum);
945987
946988 return regNum;
@@ -962,7 +1004,7 @@ inline regNumber genFirstRegNumFromMask(regMaskTP mask)
9621004
9631005 /* Convert the mask to a register number */
9641006
965- regNumber regNum = (regNumber)BitOperations:: BitScanForward (mask);
1007+ regNumber regNum = (regNumber)BitScanForward (mask);
9661008
9671009 return regNum;
9681010}
@@ -4463,30 +4505,46 @@ inline void* operator new[](size_t sz, Compiler* compiler, CompMemKind cmk)
44634505
44644506inline void printRegMask (regMaskTP mask)
44654507{
4508+ #ifdef TARGET_ARM64
4509+ printf (REG_MASK_ALL_FMT, mask.getLow ());
4510+ #else
44664511 printf (REG_MASK_ALL_FMT, mask);
4512+ #endif
44674513}
44684514
44694515inline char * regMaskToString (regMaskTP mask, Compiler* context)
44704516{
44714517 const size_t cchRegMask = 24 ;
44724518 char * regmask = new (context, CMK_Unknown) char [cchRegMask];
44734519
4520+ #ifdef TARGET_ARM64
4521+ sprintf_s (regmask, cchRegMask, REG_MASK_ALL_FMT, mask.getLow ());
4522+ #else
44744523 sprintf_s (regmask, cchRegMask, REG_MASK_ALL_FMT, mask);
4524+ #endif
44754525
44764526 return regmask;
44774527}
44784528
44794529inline void printRegMaskInt (regMaskTP mask)
44804530{
4531+ #ifdef TARGET_ARM64
4532+ printf (REG_MASK_INT_FMT, (mask & RBM_ALLINT).getLow ());
4533+ #else
44814534 printf (REG_MASK_INT_FMT, (mask & RBM_ALLINT));
4535+ #endif
44824536}
44834537
44844538inline char * regMaskIntToString (regMaskTP mask, Compiler* context)
44854539{
44864540 const size_t cchRegMask = 24 ;
44874541 char * regmask = new (context, CMK_Unknown) char [cchRegMask];
44884542
4543+ #ifdef TARGET_ARM64
4544+ sprintf_s (regmask, cchRegMask, REG_MASK_INT_FMT, (mask & RBM_ALLINT).getLow ());
4545+ #else
44894546 sprintf_s (regmask, cchRegMask, REG_MASK_INT_FMT, (mask & RBM_ALLINT));
4547+ #endif
44904548
44914549 return regmask;
44924550}
0 commit comments