@@ -58,27 +58,74 @@ static bool isLDADD(const MachineInstr *FirstMI, const MachineInstr &SecondMI) {
58
58
return checkRegisters (FirstMI->getOperand (0 ).getReg (), SecondMI);
59
59
}
60
60
61
- // Fuse these patterns:
62
- //
63
- // slli rd, rs1, 32
64
- // srli rd, rd, x
65
- // where 0 <= x <= 32
66
- //
67
- // and
68
- //
61
+ // Fuse zero extension of halfword:
69
62
// slli rd, rs1, 48
63
+ // srli rd, rd, 48
64
+ static bool isZExtH (const MachineInstr *FirstMI, const MachineInstr &SecondMI) {
65
+ if (SecondMI.getOpcode () != RISCV::SRLI)
66
+ return false ;
67
+
68
+ if (!SecondMI.getOperand (2 ).isImm ())
69
+ return false ;
70
+
71
+ if (SecondMI.getOperand (2 ).getImm () != 48 )
72
+ return false ;
73
+
74
+ // Given SecondMI, when FirstMI is unspecified, we must return
75
+ // if SecondMI may be part of a fused pair at all.
76
+ if (!FirstMI)
77
+ return true ;
78
+
79
+ if (FirstMI->getOpcode () != RISCV::SLLI)
80
+ return false ;
81
+
82
+ if (FirstMI->getOperand (2 ).getImm () != 48 )
83
+ return false ;
84
+
85
+ return checkRegisters (FirstMI->getOperand (0 ).getReg (), SecondMI);
86
+ }
87
+
88
+ // Fuse zero extension of word:
89
+ // slli rd, rs1, 32
90
+ // srli rd, rd, 32
91
+ static bool isZExtW (const MachineInstr *FirstMI, const MachineInstr &SecondMI) {
92
+ if (SecondMI.getOpcode () != RISCV::SRLI)
93
+ return false ;
94
+
95
+ if (!SecondMI.getOperand (2 ).isImm ())
96
+ return false ;
97
+
98
+ if (SecondMI.getOperand (2 ).getImm () != 32 )
99
+ return false ;
100
+
101
+ // Given SecondMI, when FirstMI is unspecified, we must return
102
+ // if SecondMI may be part of a fused pair at all.
103
+ if (!FirstMI)
104
+ return true ;
105
+
106
+ if (FirstMI->getOpcode () != RISCV::SLLI)
107
+ return false ;
108
+
109
+ if (FirstMI->getOperand (2 ).getImm () != 32 )
110
+ return false ;
111
+
112
+ return checkRegisters (FirstMI->getOperand (0 ).getReg (), SecondMI);
113
+ }
114
+
115
+ // Fuse shifted zero extension of word:
116
+ // slli rd, rs1, 32
70
117
// srli rd, rd, x
71
- static bool isShiftedZExt (const MachineInstr *FirstMI,
72
- const MachineInstr &SecondMI) {
118
+ // where 0 <= x < 32
119
+ static bool isShiftedZExtW (const MachineInstr *FirstMI,
120
+ const MachineInstr &SecondMI) {
73
121
if (SecondMI.getOpcode () != RISCV::SRLI)
74
122
return false ;
75
123
76
124
if (!SecondMI.getOperand (2 ).isImm ())
77
125
return false ;
78
126
79
127
unsigned SRLIImm = SecondMI.getOperand (2 ).getImm ();
80
- bool IsShiftBy48 = SRLIImm == 48 ;
81
- if (SRLIImm > 32 && !IsShiftBy48)
128
+ if (SRLIImm >= 32 )
82
129
return false ;
83
130
84
131
// Given SecondMI, when FirstMI is unspecified, we must return
@@ -89,8 +136,7 @@ static bool isShiftedZExt(const MachineInstr *FirstMI,
89
136
if (FirstMI->getOpcode () != RISCV::SLLI)
90
137
return false ;
91
138
92
- unsigned SLLIImm = FirstMI->getOperand (2 ).getImm ();
93
- if (IsShiftBy48 ? (SLLIImm != 48 ) : (SLLIImm != 32 ))
139
+ if (FirstMI->getOperand (2 ).getImm () != 32 )
94
140
return false ;
95
141
96
142
return checkRegisters (FirstMI->getOperand (0 ).getReg (), SecondMI);
@@ -144,7 +190,13 @@ static bool shouldScheduleAdjacent(const TargetInstrInfo &TII,
144
190
if (ST.hasAUIPCADDIFusion () && isAUIPCADDI (FirstMI, SecondMI))
145
191
return true ;
146
192
147
- if (ST.hasShiftedZExtFusion () && isShiftedZExt (FirstMI, SecondMI))
193
+ if (ST.hasZExtHFusion () && isZExtH (FirstMI, SecondMI))
194
+ return true ;
195
+
196
+ if (ST.hasZExtWFusion () && isZExtW (FirstMI, SecondMI))
197
+ return true ;
198
+
199
+ if (ST.hasShiftedZExtWFusion () && isShiftedZExtW (FirstMI, SecondMI))
148
200
return true ;
149
201
150
202
if (ST.hasLDADDFusion () && isLDADD (FirstMI, SecondMI))
0 commit comments