5
5
6
6
struct regMaskTP ;
7
7
8
+
9
+ // ------------------------------------------------------------------------
10
+ // encodeForRegisterIndex: Shifts the high-32 bits of float to low-32 bits
11
+ // and return. For gpr and predicate registers, it returns the same value.
12
+ //
13
+ // Parameters:
14
+ // index - Register type index
15
+ // value - value to encode
16
+ //
17
+ /* static */ RegSet32 regMaskTP::encodeForRegisterIndex (int index, regMaskSmall value)
18
+ {
19
+ int shiftAmount = 32 * (index == 1 );
20
+ return (RegSet32)(value >> shiftAmount);
21
+ }
22
+
23
+ // ------------------------------------------------------------------------
24
+ // decodeForRegisterIndex: Shifts the low-32 bits of float to high-32 bits
25
+ // and return. For gpr and predicate registers, it returns the same value.
26
+ //
27
+ // Parameters:
28
+ // index - Register type index
29
+ // value - value to encode
30
+ //
31
+ /* static */ regMaskSmall regMaskTP::decodeForRegisterIndex (int index, RegSet32 value)
32
+ {
33
+ int shiftAmount = 32 * (index == 1 );
34
+ return ((regMaskSmall)value << shiftAmount);
35
+ }
36
+
37
+
8
38
// ------------------------------------------------------------------------
9
39
// RemoveRegNumFromMask: Removes `reg` from the mask
10
40
//
@@ -13,7 +43,13 @@ struct regMaskTP;
13
43
//
14
44
void regMaskTP::RemoveRegNumFromMask (regNumber reg)
15
45
{
16
- low &= ~genSingleTypeRegMask (reg);
46
+ SingleTypeRegSet value = genSingleTypeRegMask (reg);
47
+ #ifdef HAS_MORE_THAN_64_REGISTERS
48
+ int index = getRegisterTypeIndex (reg);
49
+ _registers[index ] &= ~encodeForRegisterIndex (index, value);
50
+ #else
51
+ low &= ~value;
52
+ #endif
17
53
}
18
54
19
55
// ------------------------------------------------------------------------
@@ -24,10 +60,16 @@ void regMaskTP::RemoveRegNumFromMask(regNumber reg)
24
60
//
25
61
bool regMaskTP::IsRegNumInMask (regNumber reg)
26
62
{
27
- return (low & genRegMask (reg)) != 0 ;
63
+ SingleTypeRegSet value = genSingleTypeRegMask (reg);
64
+ #ifdef HAS_MORE_THAN_64_REGISTERS
65
+ int index = getRegisterTypeIndex (reg);
66
+ return (_registers[index ] & encodeForRegisterIndex (index , value)) != RBM_NONE;
67
+ #else
68
+ return (low & value) != RBM_NONE;
69
+ #endif
28
70
}
29
71
30
- /* static */ const int regMaskTP::getRegisterTypeIndex (regNumber reg)
72
+ /* static */ int regMaskTP::getRegisterTypeIndex (regNumber reg)
31
73
{
32
74
static const BYTE _registerTypeIndex[] = {
33
75
#ifdef TARGET_ARM64
0 commit comments