Skip to content

Commit 24740ec

Browse files
committed
[X86] Add BSR/BSF tests to check for implicit zero extension
1 parent 8ab6140 commit 24740ec

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed

llvm/test/CodeGen/X86/ctlz.ll

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

llvm/test/CodeGen/X86/cttz.ll

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,3 +661,118 @@ define i32 @cttz_i32_msize(i32 %x) minsize {
661661
%tmp = call i32 @llvm.cttz.i32( i32 %x, i1 true)
662662
ret i32 %tmp
663663
}
664+
665+
define i64 @cttz_i32_sext(i32 %x) {
666+
; X86-NOCMOV-LABEL: cttz_i32_sext:
667+
; X86-NOCMOV: # %bb.0:
668+
; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
669+
; X86-NOCMOV-NEXT: testl %eax, %eax
670+
; X86-NOCMOV-NEXT: je .LBB12_1
671+
; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
672+
; X86-NOCMOV-NEXT: rep bsfl %eax, %eax
673+
; X86-NOCMOV-NEXT: xorl %edx, %edx
674+
; X86-NOCMOV-NEXT: retl
675+
; X86-NOCMOV-NEXT: .LBB12_1:
676+
; X86-NOCMOV-NEXT: movl $32, %eax
677+
; X86-NOCMOV-NEXT: xorl %edx, %edx
678+
; X86-NOCMOV-NEXT: retl
679+
;
680+
; X86-CMOV-LABEL: cttz_i32_sext:
681+
; X86-CMOV: # %bb.0:
682+
; X86-CMOV-NEXT: bsfl {{[0-9]+}}(%esp), %ecx
683+
; X86-CMOV-NEXT: movl $32, %eax
684+
; X86-CMOV-NEXT: cmovnel %ecx, %eax
685+
; X86-CMOV-NEXT: xorl %edx, %edx
686+
; X86-CMOV-NEXT: retl
687+
;
688+
; X64-LABEL: cttz_i32_sext:
689+
; X64: # %bb.0:
690+
; X64-NEXT: # kill: def $edi killed $edi def $rdi
691+
; X64-NEXT: movabsq $4294967296, %rax # imm = 0x100000000
692+
; X64-NEXT: orq %rdi, %rax
693+
; X64-NEXT: rep bsfq %rax, %rax
694+
; X64-NEXT: retq
695+
;
696+
; X86-CLZ-LABEL: cttz_i32_sext:
697+
; X86-CLZ: # %bb.0:
698+
; X86-CLZ-NEXT: tzcntl {{[0-9]+}}(%esp), %eax
699+
; X86-CLZ-NEXT: xorl %edx, %edx
700+
; X86-CLZ-NEXT: retl
701+
;
702+
; X64-CLZ-LABEL: cttz_i32_sext:
703+
; X64-CLZ: # %bb.0:
704+
; X64-CLZ-NEXT: tzcntl %edi, %eax
705+
; X64-CLZ-NEXT: retq
706+
;
707+
; X64-FASTLZCNT-LABEL: cttz_i32_sext:
708+
; X64-FASTLZCNT: # %bb.0:
709+
; X64-FASTLZCNT-NEXT: tzcntl %edi, %eax
710+
; X64-FASTLZCNT-NEXT: retq
711+
;
712+
; X86-FASTLZCNT-LABEL: cttz_i32_sext:
713+
; X86-FASTLZCNT: # %bb.0:
714+
; X86-FASTLZCNT-NEXT: tzcntl {{[0-9]+}}(%esp), %eax
715+
; X86-FASTLZCNT-NEXT: xorl %edx, %edx
716+
; X86-FASTLZCNT-NEXT: retl
717+
%tmp = call i32 @llvm.cttz.i32( i32 %x, i1 false)
718+
%ext = sext i32 %tmp to i64
719+
ret i64 %ext
720+
}
721+
722+
define i64 @cttz_i32_zext(i32 %x) {
723+
; X86-NOCMOV-LABEL: cttz_i32_zext:
724+
; X86-NOCMOV: # %bb.0:
725+
; X86-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax
726+
; X86-NOCMOV-NEXT: testl %eax, %eax
727+
; X86-NOCMOV-NEXT: je .LBB13_1
728+
; X86-NOCMOV-NEXT: # %bb.2: # %cond.false
729+
; X86-NOCMOV-NEXT: rep bsfl %eax, %eax
730+
; X86-NOCMOV-NEXT: xorl %edx, %edx
731+
; X86-NOCMOV-NEXT: retl
732+
; X86-NOCMOV-NEXT: .LBB13_1:
733+
; X86-NOCMOV-NEXT: movl $32, %eax
734+
; X86-NOCMOV-NEXT: xorl %edx, %edx
735+
; X86-NOCMOV-NEXT: retl
736+
;
737+
; X86-CMOV-LABEL: cttz_i32_zext:
738+
; X86-CMOV: # %bb.0:
739+
; X86-CMOV-NEXT: bsfl {{[0-9]+}}(%esp), %ecx
740+
; X86-CMOV-NEXT: movl $32, %eax
741+
; X86-CMOV-NEXT: cmovnel %ecx, %eax
742+
; X86-CMOV-NEXT: xorl %edx, %edx
743+
; X86-CMOV-NEXT: retl
744+
;
745+
; X64-LABEL: cttz_i32_zext:
746+
; X64: # %bb.0:
747+
; X64-NEXT: # kill: def $edi killed $edi def $rdi
748+
; X64-NEXT: movabsq $4294967296, %rax # imm = 0x100000000
749+
; X64-NEXT: orq %rdi, %rax
750+
; X64-NEXT: rep bsfq %rax, %rax
751+
; X64-NEXT: retq
752+
;
753+
; X86-CLZ-LABEL: cttz_i32_zext:
754+
; X86-CLZ: # %bb.0:
755+
; X86-CLZ-NEXT: tzcntl {{[0-9]+}}(%esp), %eax
756+
; X86-CLZ-NEXT: xorl %edx, %edx
757+
; X86-CLZ-NEXT: retl
758+
;
759+
; X64-CLZ-LABEL: cttz_i32_zext:
760+
; X64-CLZ: # %bb.0:
761+
; X64-CLZ-NEXT: tzcntl %edi, %eax
762+
; X64-CLZ-NEXT: retq
763+
;
764+
; X64-FASTLZCNT-LABEL: cttz_i32_zext:
765+
; X64-FASTLZCNT: # %bb.0:
766+
; X64-FASTLZCNT-NEXT: tzcntl %edi, %eax
767+
; X64-FASTLZCNT-NEXT: retq
768+
;
769+
; X86-FASTLZCNT-LABEL: cttz_i32_zext:
770+
; X86-FASTLZCNT: # %bb.0:
771+
; X86-FASTLZCNT-NEXT: tzcntl {{[0-9]+}}(%esp), %eax
772+
; X86-FASTLZCNT-NEXT: xorl %edx, %edx
773+
; X86-FASTLZCNT-NEXT: retl
774+
%tmp = call i32 @llvm.cttz.i32( i32 %x, i1 false)
775+
%ext = zext i32 %tmp to i64
776+
ret i64 %ext
777+
}
778+

0 commit comments

Comments
 (0)