@@ -1211,3 +1211,129 @@ define i64 @ctlz_xor63_i64_true(i64 %x) {
12111211 %res = xor i64 %clz , 63
12121212 ret i64 %res
12131213}
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