1
1
//! Requirements computation.
2
2
3
3
use super :: { Env , LiveBundleIndex } ;
4
- use crate :: { Function , Operand , OperandConstraint , PReg , RegClass } ;
4
+ use crate :: { Function , Operand , OperandConstraint , PReg } ;
5
5
6
6
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
7
7
pub enum Requirement {
8
8
Unknown ,
9
9
Fixed ( PReg ) ,
10
- Register ( RegClass ) ,
11
- Stack ( RegClass ) ,
12
- Any ( RegClass ) ,
10
+ Register ,
11
+ Stack ,
12
+ Any ,
13
13
Conflict ,
14
14
}
15
15
impl Requirement {
16
- #[ inline( always) ]
17
- pub fn class ( self ) -> RegClass {
18
- match self {
19
- Requirement :: Unknown => panic ! ( "No class for unknown Requirement" ) ,
20
- Requirement :: Fixed ( preg) => preg. class ( ) ,
21
- Requirement :: Register ( class) | Requirement :: Any ( class) | Requirement :: Stack ( class) => {
22
- class
23
- }
24
- Requirement :: Conflict => panic ! ( "No class for conflicted Requirement" ) ,
25
- }
26
- }
27
16
#[ inline( always) ]
28
17
pub fn merge ( self , other : Requirement ) -> Requirement {
29
18
match ( self , other) {
30
19
( Requirement :: Unknown , other) | ( other, Requirement :: Unknown ) => other,
31
20
( Requirement :: Conflict , _) | ( _, Requirement :: Conflict ) => Requirement :: Conflict ,
32
- ( other, Requirement :: Any ( rc) ) | ( Requirement :: Any ( rc) , other) => {
33
- if other. class ( ) == rc {
34
- other
35
- } else {
36
- Requirement :: Conflict
37
- }
38
- }
39
- ( Requirement :: Stack ( rc1) , Requirement :: Stack ( rc2) ) => {
40
- if rc1 == rc2 {
41
- self
42
- } else {
43
- Requirement :: Conflict
44
- }
45
- }
46
- ( Requirement :: Register ( rc) , Requirement :: Fixed ( preg) )
47
- | ( Requirement :: Fixed ( preg) , Requirement :: Register ( rc) ) => {
48
- if rc == preg. class ( ) {
49
- Requirement :: Fixed ( preg)
50
- } else {
51
- Requirement :: Conflict
52
- }
53
- }
54
- ( Requirement :: Register ( rc1) , Requirement :: Register ( rc2) ) => {
55
- if rc1 == rc2 {
56
- self
57
- } else {
58
- Requirement :: Conflict
59
- }
60
- }
21
+ ( other, Requirement :: Any ) | ( Requirement :: Any , other) => other,
22
+ ( Requirement :: Stack , Requirement :: Stack ) => self ,
23
+ ( Requirement :: Register , Requirement :: Fixed ( preg) )
24
+ | ( Requirement :: Fixed ( preg) , Requirement :: Register ) => Requirement :: Fixed ( preg) ,
25
+ ( Requirement :: Register , Requirement :: Register ) => self ,
61
26
( Requirement :: Fixed ( a) , Requirement :: Fixed ( b) ) if a == b => self ,
62
27
_ => Requirement :: Conflict ,
63
28
}
@@ -67,10 +32,10 @@ impl Requirement {
67
32
match op. constraint ( ) {
68
33
OperandConstraint :: FixedReg ( preg) => Requirement :: Fixed ( preg) ,
69
34
OperandConstraint :: Reg | OperandConstraint :: Reuse ( _) => {
70
- Requirement :: Register ( op . class ( ) )
35
+ Requirement :: Register
71
36
}
72
- OperandConstraint :: Stack => Requirement :: Stack ( op . class ( ) ) ,
73
- _ => Requirement :: Any ( op . class ( ) ) ,
37
+ OperandConstraint :: Stack => Requirement :: Stack ,
38
+ _ => Requirement :: Any ,
74
39
}
75
40
}
76
41
}
0 commit comments