@@ -1194,6 +1194,42 @@ define <2 x i64> @vector_i128_i64(<2 x i64> %x, <2 x i64> %y, ptr %divdst) nounw
1194
1194
ret <2 x i64 > %t2
1195
1195
}
1196
1196
1197
+ define i32 @scalar_i32_const_pow2_divisor (i32 %0 , ptr %1 ) minsize nounwind {
1198
+ ; X86-LABEL: scalar_i32_const_pow2_divisor:
1199
+ ; X86: # %bb.0:
1200
+ ; X86-NEXT: pushl %edi
1201
+ ; X86-NEXT: pushl %esi
1202
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
1203
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1204
+ ; X86-NEXT: movl $256, %edi # imm = 0x100
1205
+ ; X86-NEXT: movl %ecx, %eax
1206
+ ; X86-NEXT: cltd
1207
+ ; X86-NEXT: idivl %edi
1208
+ ; X86-NEXT: movl %eax, %edx
1209
+ ; X86-NEXT: shll $8, %edx
1210
+ ; X86-NEXT: subl %edx, %ecx
1211
+ ; X86-NEXT: movl %ecx, (%esi)
1212
+ ; X86-NEXT: popl %esi
1213
+ ; X86-NEXT: popl %edi
1214
+ ; X86-NEXT: retl
1215
+ ;
1216
+ ; X64-LABEL: scalar_i32_const_pow2_divisor:
1217
+ ; X64: # %bb.0:
1218
+ ; X64-NEXT: movl $256, %ecx # imm = 0x100
1219
+ ; X64-NEXT: movl %edi, %eax
1220
+ ; X64-NEXT: cltd
1221
+ ; X64-NEXT: idivl %ecx
1222
+ ; X64-NEXT: movl %eax, %ecx
1223
+ ; X64-NEXT: shll $8, %ecx
1224
+ ; X64-NEXT: subl %ecx, %edi
1225
+ ; X64-NEXT: movl %edi, (%rsi)
1226
+ ; X64-NEXT: retq
1227
+ %3 = srem i32 %0 , 256
1228
+ store i32 %3 , ptr %1 , align 4
1229
+ %4 = sdiv i32 %0 , 256
1230
+ ret i32 %4
1231
+ }
1232
+
1197
1233
; Special tests.
1198
1234
1199
1235
define i32 @scalar_i32_commutative (i32 %x , ptr %ysrc , ptr %divdst ) nounwind {
@@ -1296,14 +1332,14 @@ define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_srem, ptr
1296
1332
; X86-NEXT: idivl %esi
1297
1333
; X86-NEXT: movl %eax, (%edi)
1298
1334
; X86-NEXT: testb %bl, %bl
1299
- ; X86-NEXT: je .LBB11_2
1335
+ ; X86-NEXT: je .LBB12_2
1300
1336
; X86-NEXT: # %bb.1: # %do_srem
1301
1337
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
1302
1338
; X86-NEXT: movl %eax, %edi
1303
1339
; X86-NEXT: imull %esi, %edi
1304
1340
; X86-NEXT: subl %edi, %ecx
1305
1341
; X86-NEXT: movl %ecx, (%edx)
1306
- ; X86-NEXT: .LBB11_2 : # %end
1342
+ ; X86-NEXT: .LBB12_2 : # %end
1307
1343
; X86-NEXT: popl %esi
1308
1344
; X86-NEXT: popl %edi
1309
1345
; X86-NEXT: popl %ebx
@@ -1317,13 +1353,13 @@ define i32 @multiple_bb(i32 %x, i32 %y, ptr %divdst, i1 zeroext %store_srem, ptr
1317
1353
; X64-NEXT: idivl %esi
1318
1354
; X64-NEXT: movl %eax, (%r9)
1319
1355
; X64-NEXT: testl %ecx, %ecx
1320
- ; X64-NEXT: je .LBB11_2
1356
+ ; X64-NEXT: je .LBB12_2
1321
1357
; X64-NEXT: # %bb.1: # %do_srem
1322
1358
; X64-NEXT: movl %eax, %ecx
1323
1359
; X64-NEXT: imull %esi, %ecx
1324
1360
; X64-NEXT: subl %ecx, %edi
1325
1361
; X64-NEXT: movl %edi, (%r8)
1326
- ; X64-NEXT: .LBB11_2 : # %end
1362
+ ; X64-NEXT: .LBB12_2 : # %end
1327
1363
; X64-NEXT: retq
1328
1364
%div = sdiv i32 %x , %y
1329
1365
store i32 %div , ptr %divdst , align 4
0 commit comments