@@ -1211,3 +1211,129 @@ define i64 @ctlz_xor63_i64_true(i64 %x) {
1211
1211
%res = xor i64 %clz , 63
1212
1212
ret i64 %res
1213
1213
}
1214
+
1215
+ define i64 @ctlz_i32_sext (i32 %x ) {
1216
+ ; X86-NOCMOV-LABEL: ctlz_i32_sext:
1217
+ ; X86-NOCMOV: # %bb.0:
1218
+ ; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
1219
+ ; X86-NOCMOV-NEXT: testl %eax, %eax
1220
+ ; X86-NOCMOV-NEXT: je .LBB20_1
1221
+ ; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
1222
+ ; X86-NOCMOV-NEXT: bsrl %eax, %eax
1223
+ ; X86-NOCMOV-NEXT: xorl $31, %eax
1224
+ ; X86-NOCMOV-NEXT: jmp .LBB20_3
1225
+ ; X86-NOCMOV-NEXT: .LBB20_1:
1226
+ ; X86-NOCMOV-NEXT: movl $32, %eax
1227
+ ; X86-NOCMOV-NEXT: .LBB20_3: # %cond.end
1228
+ ; X86-NOCMOV-NEXT: xorl $31, %eax
1229
+ ; X86-NOCMOV-NEXT: xorl %edx, %edx
1230
+ ; X86-NOCMOV-NEXT: retl
1231
+ ;
1232
+ ; X86-CMOV-LABEL: ctlz_i32_sext:
1233
+ ; X86-CMOV: # %bb.0:
1234
+ ; X86-CMOV-NEXT: bsrl {{[0-9]+}}(%esp), %ecx
1235
+ ; X86-CMOV-NEXT: movl $63, %eax
1236
+ ; X86-CMOV-NEXT: cmovnel %ecx, %eax
1237
+ ; X86-CMOV-NEXT: xorl %edx, %edx
1238
+ ; X86-CMOV-NEXT: retl
1239
+ ;
1240
+ ; X64-LABEL: ctlz_i32_sext:
1241
+ ; X64: # %bb.0:
1242
+ ; X64-NEXT: bsrl %edi, %ecx
1243
+ ; X64-NEXT: movl $63, %eax
1244
+ ; X64-NEXT: cmovnel %ecx, %eax
1245
+ ; X64-NEXT: retq
1246
+ ;
1247
+ ; X86-CLZ-LABEL: ctlz_i32_sext:
1248
+ ; X86-CLZ: # %bb.0:
1249
+ ; X86-CLZ-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
1250
+ ; X86-CLZ-NEXT: xorl $31, %eax
1251
+ ; X86-CLZ-NEXT: xorl %edx, %edx
1252
+ ; X86-CLZ-NEXT: retl
1253
+ ;
1254
+ ; X64-CLZ-LABEL: ctlz_i32_sext:
1255
+ ; X64-CLZ: # %bb.0:
1256
+ ; X64-CLZ-NEXT: lzcntl %edi, %eax
1257
+ ; X64-CLZ-NEXT: xorl $31, %eax
1258
+ ; X64-CLZ-NEXT: retq
1259
+ ;
1260
+ ; X64-FASTLZCNT-LABEL: ctlz_i32_sext:
1261
+ ; X64-FASTLZCNT: # %bb.0:
1262
+ ; X64-FASTLZCNT-NEXT: lzcntl %edi, %eax
1263
+ ; X64-FASTLZCNT-NEXT: xorl $31, %eax
1264
+ ; X64-FASTLZCNT-NEXT: retq
1265
+ ;
1266
+ ; X86-FASTLZCNT-LABEL: ctlz_i32_sext:
1267
+ ; X86-FASTLZCNT: # %bb.0:
1268
+ ; X86-FASTLZCNT-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
1269
+ ; X86-FASTLZCNT-NEXT: xorl $31, %eax
1270
+ ; X86-FASTLZCNT-NEXT: xorl %edx, %edx
1271
+ ; X86-FASTLZCNT-NEXT: retl
1272
+ %tmp = call i32 @llvm.ctlz.i32 ( i32 %x , i1 false )
1273
+ %xor = xor i32 %tmp , 31
1274
+ %ext = sext i32 %xor to i64
1275
+ ret i64 %ext
1276
+ }
1277
+
1278
+ define i64 @ctlz_i32_zext (i32 %x ) {
1279
+ ; X86-NOCMOV-LABEL: ctlz_i32_zext:
1280
+ ; X86-NOCMOV: # %bb.0:
1281
+ ; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
1282
+ ; X86-NOCMOV-NEXT: testl %eax, %eax
1283
+ ; X86-NOCMOV-NEXT: je .LBB21_1
1284
+ ; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
1285
+ ; X86-NOCMOV-NEXT: bsrl %eax, %eax
1286
+ ; X86-NOCMOV-NEXT: xorl $31, %eax
1287
+ ; X86-NOCMOV-NEXT: jmp .LBB21_3
1288
+ ; X86-NOCMOV-NEXT: .LBB21_1:
1289
+ ; X86-NOCMOV-NEXT: movl $32, %eax
1290
+ ; X86-NOCMOV-NEXT: .LBB21_3: # %cond.end
1291
+ ; X86-NOCMOV-NEXT: xorl $31, %eax
1292
+ ; X86-NOCMOV-NEXT: xorl %edx, %edx
1293
+ ; X86-NOCMOV-NEXT: retl
1294
+ ;
1295
+ ; X86-CMOV-LABEL: ctlz_i32_zext:
1296
+ ; X86-CMOV: # %bb.0:
1297
+ ; X86-CMOV-NEXT: bsrl {{[0-9]+}}(%esp), %ecx
1298
+ ; X86-CMOV-NEXT: movl $63, %eax
1299
+ ; X86-CMOV-NEXT: cmovnel %ecx, %eax
1300
+ ; X86-CMOV-NEXT: xorl %edx, %edx
1301
+ ; X86-CMOV-NEXT: retl
1302
+ ;
1303
+ ; X64-LABEL: ctlz_i32_zext:
1304
+ ; X64: # %bb.0:
1305
+ ; X64-NEXT: bsrl %edi, %ecx
1306
+ ; X64-NEXT: movl $63, %eax
1307
+ ; X64-NEXT: cmovnel %ecx, %eax
1308
+ ; X64-NEXT: retq
1309
+ ;
1310
+ ; X86-CLZ-LABEL: ctlz_i32_zext:
1311
+ ; X86-CLZ: # %bb.0:
1312
+ ; X86-CLZ-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
1313
+ ; X86-CLZ-NEXT: xorl $31, %eax
1314
+ ; X86-CLZ-NEXT: xorl %edx, %edx
1315
+ ; X86-CLZ-NEXT: retl
1316
+ ;
1317
+ ; X64-CLZ-LABEL: ctlz_i32_zext:
1318
+ ; X64-CLZ: # %bb.0:
1319
+ ; X64-CLZ-NEXT: lzcntl %edi, %eax
1320
+ ; X64-CLZ-NEXT: xorl $31, %eax
1321
+ ; X64-CLZ-NEXT: retq
1322
+ ;
1323
+ ; X64-FASTLZCNT-LABEL: ctlz_i32_zext:
1324
+ ; X64-FASTLZCNT: # %bb.0:
1325
+ ; X64-FASTLZCNT-NEXT: lzcntl %edi, %eax
1326
+ ; X64-FASTLZCNT-NEXT: xorl $31, %eax
1327
+ ; X64-FASTLZCNT-NEXT: retq
1328
+ ;
1329
+ ; X86-FASTLZCNT-LABEL: ctlz_i32_zext:
1330
+ ; X86-FASTLZCNT: # %bb.0:
1331
+ ; X86-FASTLZCNT-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
1332
+ ; X86-FASTLZCNT-NEXT: xorl $31, %eax
1333
+ ; X86-FASTLZCNT-NEXT: xorl %edx, %edx
1334
+ ; X86-FASTLZCNT-NEXT: retl
1335
+ %tmp = call i32 @llvm.ctlz.i32 ( i32 %x , i1 false )
1336
+ %xor = xor i32 %tmp , 31
1337
+ %ext = zext i32 %xor to i64
1338
+ ret i64 %ext
1339
+ }
0 commit comments