|
27 | 27 | // "Zicond" Extension for Integer Conditional Operations |
28 | 28 | // Optimize specific patterns based on the unified OR(CZEROEQZ, CZERONEZ) form |
29 | 29 | // (x == 0) ? x : y -> CZEROEQZ y x (when x is the condition) |
30 | | -(OR (CZEROEQZ <t> x (SEQZ x)) (CZERONEZ <t> y (SEQZ x))) && buildcfg.GORISCV64 >= 23 => (CZEROEQZ <t> y x) |
| 30 | +(OR (CZERONEZ <t> x x) (CZEROEQZ <t> y x)) => (CZEROEQZ <t> y x) |
31 | 31 |
|
32 | 32 | // (z == 0) ? ((OP x y)) : x => (OP x (CZERONEZ y z)) |
33 | | -(OR (CZEROEQZ <t> ((ADD|SUB|OR|XOR|SUBW) x y) (SEQZ z)) (CZERONEZ <t> x (SEQZ z))) && buildcfg.GORISCV64 >= 23 |
34 | | - => ((ADD|SUB|OR|XOR|SUBW) x (CZERONEZ <t> y z)) |
| 33 | +(OR (CZERONEZ <t> ((ADD|SUB|OR|XOR|SUBW) x y) z) (CZEROEQZ <t> x z)) => ((ADD|SUB|OR|XOR|SUBW) x (CZERONEZ <t> y z)) |
35 | 34 | // (z != 0) ? ((OP x y)) : x => (OP x (CZEROEQZ y z)) |
36 | | -(OR (CZEROEQZ <t> ((ADD|SUB|OR|XOR|SUBW) x y) (SNEZ z)) (CZERONEZ <t> x (SNEZ z))) && buildcfg.GORISCV64 >= 23 |
37 | | - => ((ADD|SUB|OR|XOR|SUBW) x (CZEROEQZ <t> y z)) |
| 35 | +(OR (CZEROEQZ <t> ((ADD|SUB|OR|XOR|SUBW) x y) z) (CZERONEZ <t> x z)) => ((ADD|SUB|OR|XOR|SUBW) x (CZEROEQZ <t> y z)) |
38 | 36 |
|
39 | 37 | // (z == 0) ? (x & y) : x => OR(AND x y, CZEROEQZ x z) |
40 | | -(OR (CZEROEQZ <t> (AND x y) (SEQZ z)) (CZERONEZ <t> x (SEQZ z))) && buildcfg.GORISCV64 >= 23 |
41 | | - => (OR (AND <t> x y) (CZEROEQZ <t> x z)) |
| 38 | +(OR (CZERONEZ <t> (AND x y) z) (CZEROEQZ <t> x z)) => (OR (AND <t> x y) (CZEROEQZ <t> x z)) |
42 | 39 | // (z != 0) ? (x & y) : x => OR(AND x y, CZERONEZ x z) |
43 | | -(OR (CZEROEQZ <t> (AND x y) (SNEZ z)) (CZERONEZ <t> x (SNEZ z))) && buildcfg.GORISCV64 >= 23 |
44 | | - => (OR (AND <t> x y) (CZERONEZ <t> x z)) |
| 40 | +(OR (CZEROEQZ <t> (AND x y) z) (CZERONEZ <t> x z)) => (OR (AND <t> x y) (CZERONEZ <t> x z)) |
45 | 41 |
|
46 | 42 | // (z == 0) ? (x & c) : x => OR(AND x c, CZEROEQZ x z) |
47 | | -(OR (CZEROEQZ <t> (ANDI [c] x) (SEQZ z)) (CZERONEZ <t> x (SEQZ z))) && buildcfg.GORISCV64 >= 23 |
48 | | - => (OR (AND <t> x (MOVDconst [c])) (CZEROEQZ <t> x z)) |
| 43 | +(OR (CZERONEZ <t> (ANDI [c] x) z) (CZEROEQZ <t> x z)) => (OR (AND <t> x (MOVDconst [c])) (CZEROEQZ <t> x z)) |
49 | 44 | // (z != 0) ? (x & c) : x => OR(AND x c, CZERONEZ x z) |
50 | | -(OR (CZEROEQZ <t> (ANDI [c] x) (SNEZ z)) (CZERONEZ <t> x (SNEZ z))) && buildcfg.GORISCV64 >= 23 |
51 | | - => (OR (AND <t> x (MOVDconst [c])) (CZERONEZ <t> x z)) |
| 45 | +(OR (CZEROEQZ <t> (ANDI [c] x) z) (CZERONEZ <t> x z)) => (OR (AND <t> x (MOVDconst [c])) (CZERONEZ <t> x z)) |
52 | 46 |
|
53 | 47 | // (z == 0) ? ((OPI [c] x)) : x => (OP x (CZERONEZ c z)) |
54 | | -(OR (CZEROEQZ <t> ((ADDI|ORI|XORI) [c] x) (SEQZ z)) (CZERONEZ <t> x (SEQZ z))) && buildcfg.GORISCV64 >= 23 |
55 | | - => ((ADD|OR|XOR) x (CZERONEZ <t> (MOVDconst [c]) z)) |
| 48 | +(OR (CZERONEZ <t> ((ADDI|ORI|XORI) [c] x) z) (CZEROEQZ <t> x z)) => ((ADD|OR|XOR) x (CZERONEZ <t> (MOVDconst [c]) z)) |
56 | 49 | // (z != 0) ? ((OPI [c] x)) : x => (OP x (CZEROEQZ c z)) |
57 | | -(OR (CZEROEQZ <t> ((ADDI|ORI|XORI) [c] x) (SNEZ z)) (CZERONEZ <t> x (SNEZ z))) && buildcfg.GORISCV64 >= 23 |
58 | | - => ((ADD|OR|XOR) x (CZEROEQZ <t> (MOVDconst [c]) z)) |
| 50 | +(OR (CZEROEQZ <t> ((ADDI|ORI|XORI) [c] x) z) (CZERONEZ <t> x z)) => ((ADD|OR|XOR) x (CZEROEQZ <t> (MOVDconst [c]) z)) |
59 | 51 |
|
60 | 52 | // (z == 0) ? (ADDIW [c] x) : x |
61 | | -(OR (CZEROEQZ <t> (ADDIW [c] x) (SEQZ z)) (CZERONEZ <t> x (SEQZ z))) && buildcfg.GORISCV64 >= 23 |
62 | | - => (ADD x (CZERONEZ <t> (MOVDconst [int64(int32(c))]) z)) |
| 53 | +(OR (CZERONEZ <t> (ADDIW [c] x) z) (CZEROEQZ <t> x z)) => (ADD x (CZERONEZ <t> (MOVDconst [int64(int32(c))]) z)) |
63 | 54 | // (z != 0) ? (ADDIW [c] x) : x |
64 | | -(OR (CZEROEQZ <t> (ADDIW [c] x) (SNEZ z)) (CZERONEZ <t> x (SNEZ z))) && buildcfg.GORISCV64 >= 23 |
65 | | - => (ADD x (CZEROEQZ <t> (MOVDconst [int64(int32(c))]) z)) |
| 55 | +(OR (CZEROEQZ <t> (ADDIW [c] x) z) (CZERONEZ <t> x z)) => (ADD x (CZEROEQZ <t> (MOVDconst [int64(int32(c))]) z)) |
66 | 56 |
|
67 | 57 | // (cond == 0) ? 0 : const => CZERONEZ const cond |
68 | | -(OR (CZEROEQZ <t> (MOVDconst [0]) (SEQZ cond)) (CZERONEZ <t> (MOVDconst [c]) (SEQZ cond))) && buildcfg.GORISCV64 >= 23 |
69 | | - => (CZERONEZ <t> (MOVDconst [c]) cond) |
| 58 | +(OR (CZERONEZ <t> (MOVDconst [0]) cond) (CZEROEQZ <t> (MOVDconst [c]) cond)) => (CZERONEZ <t> (MOVDconst [c]) cond) |
70 | 59 | // (cond != 0) ? 0 : const => CZEROEQZ const cond |
71 | | -(OR (CZEROEQZ <t> (MOVDconst [0]) (SNEZ cond)) (CZERONEZ <t> (MOVDconst [c]) (SNEZ cond))) && buildcfg.GORISCV64 >= 23 |
72 | | - => (CZEROEQZ <t> (MOVDconst [c]) cond) |
73 | | - |
74 | | -// Constant propagation through CZERO(EQ|NE)Z |
75 | | -(CZERO(EQ|NE)Z <t> (MOVDconst [0]) _) && buildcfg.GORISCV64 >= 23 => (MOVDconst <t> [0]) |
| 60 | +(OR (CZEROEQZ <t> (MOVDconst [0]) cond) (CZERONEZ <t> (MOVDconst [c]) cond)) => (CZEROEQZ <t> (MOVDconst [c]) cond) |
0 commit comments