@@ -150,6 +150,51 @@ define i64 @and_i32_shl_zext_add_i64(i64 %t0, i32 %t1) {
150
150
ret i64 %t6
151
151
}
152
152
153
+ define i64 @shl_and_i8_zext_add_i64 (i64 %t0 , i8 %t1 ) {
154
+ ; CHECK-LABEL: shl_and_i8_zext_add_i64:
155
+ ; CHECK: # %bb.0:
156
+ ; CHECK-NEXT: shlb $2, %sil
157
+ ; CHECK-NEXT: andb $60, %sil
158
+ ; CHECK-NEXT: movzbl %sil, %eax
159
+ ; CHECK-NEXT: addq %rdi, %rax
160
+ ; CHECK-NEXT: retq
161
+ %s = shl i8 %t1 , 2
162
+ %m = and i8 %s , 60
163
+ %z = zext i8 %m to i64
164
+ %a = add i64 %t0 , %z
165
+ ret i64 %a
166
+ }
167
+
168
+ define i64 @shl_and_i16_zext_add_i64 (i64 %t0 , i16 %t1 ) {
169
+ ; CHECK-LABEL: shl_and_i16_zext_add_i64:
170
+ ; CHECK: # %bb.0:
171
+ ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
172
+ ; CHECK-NEXT: leal (%rsi,%rsi), %eax
173
+ ; CHECK-NEXT: andl $16, %eax
174
+ ; CHECK-NEXT: addq %rdi, %rax
175
+ ; CHECK-NEXT: retq
176
+ %s = shl i16 %t1 , 1
177
+ %m = and i16 %s , 17
178
+ %z = zext i16 %m to i64
179
+ %a = add i64 %t0 , %z
180
+ ret i64 %a
181
+ }
182
+
183
+ define i64 @shl_and_i32_zext_add_i64 (i64 %t0 , i32 %t1 ) {
184
+ ; CHECK-LABEL: shl_and_i32_zext_add_i64:
185
+ ; CHECK: # %bb.0:
186
+ ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
187
+ ; CHECK-NEXT: leal (,%rsi,8), %eax
188
+ ; CHECK-NEXT: andl $5992, %eax # imm = 0x1768
189
+ ; CHECK-NEXT: addq %rdi, %rax
190
+ ; CHECK-NEXT: retq
191
+ %s = shl i32 %t1 , 3
192
+ %m = and i32 %s , 5999
193
+ %z = zext i32 %m to i64
194
+ %a = add i64 %t0 , %z
195
+ ret i64 %a
196
+ }
197
+
153
198
; Negative test - shift can't be converted to scale factor.
154
199
155
200
define i64 @and_i32_zext_shl_add_i64_overshift (i64 %t0 , i32 %t1 ) {
0 commit comments