@@ -13,20 +13,6 @@ pub enum Requirement {
13
13
Conflict ,
14
14
}
15
15
impl Requirement {
16
- #[ inline( always) ]
17
- pub fn merge ( self , other : Requirement ) -> Requirement {
18
- match ( self , other) {
19
- ( Requirement :: Unknown , other) | ( other, Requirement :: Unknown ) => other,
20
- ( Requirement :: Conflict , _) | ( _, Requirement :: Conflict ) => Requirement :: Conflict ,
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 ,
26
- ( Requirement :: Fixed ( a) , Requirement :: Fixed ( b) ) if a == b => self ,
27
- _ => Requirement :: Conflict ,
28
- }
29
- }
30
16
#[ inline( always) ]
31
17
pub fn from_operand ( op : Operand ) -> Requirement {
32
18
match op. constraint ( ) {
@@ -39,6 +25,23 @@ impl Requirement {
39
25
}
40
26
41
27
impl < ' a , F : Function > Env < ' a , F > {
28
+ #[ inline( always) ]
29
+ pub fn merge_requirement ( & self , a : Requirement , b : Requirement ) -> Requirement {
30
+ match ( a, b) {
31
+ ( Requirement :: Unknown , other) | ( other, Requirement :: Unknown ) => other,
32
+ ( Requirement :: Conflict , _) | ( _, Requirement :: Conflict ) => Requirement :: Conflict ,
33
+ ( other, Requirement :: Any ) | ( Requirement :: Any , other) => other,
34
+ ( Requirement :: Stack , Requirement :: Stack ) => Requirement :: Stack ,
35
+ ( Requirement :: Register , Requirement :: Register ) => Requirement :: Register ,
36
+ ( Requirement :: Register , Requirement :: Fixed ( preg) )
37
+ | ( Requirement :: Fixed ( preg) , Requirement :: Register ) if !self . pregs [ preg. index ( ) ] . is_stack => Requirement :: Fixed ( preg) ,
38
+ ( Requirement :: Stack , Requirement :: Fixed ( preg) )
39
+ | ( Requirement :: Fixed ( preg) , Requirement :: Stack ) if self . pregs [ preg. index ( ) ] . is_stack => Requirement :: Fixed ( preg) ,
40
+ ( Requirement :: Fixed ( a) , Requirement :: Fixed ( b) ) if a == b => Requirement :: Fixed ( a) ,
41
+ _ => Requirement :: Conflict ,
42
+ }
43
+ }
44
+
42
45
pub fn compute_requirement ( & self , bundle : LiveBundleIndex ) -> Requirement {
43
46
let mut req = Requirement :: Unknown ;
44
47
log:: trace!( "compute_requirement: {:?}" , bundle) ;
@@ -47,7 +50,7 @@ impl<'a, F: Function> Env<'a, F> {
47
50
for u in & self . ranges [ entry. index . index ( ) ] . uses {
48
51
log:: trace!( " -> use {:?}" , u) ;
49
52
let r = Requirement :: from_operand ( u. operand ) ;
50
- req = req . merge ( r) ;
53
+ req = self . merge_requirement ( req , r) ;
51
54
log:: trace!( " -> req {:?}" , req) ;
52
55
}
53
56
}
0 commit comments