@@ -940,4 +940,47 @@ void test_builtin_os_log_long_double(void *buf, long double ld) {
940
940
// CHECK: %[[V3:.*]] = load i128, ptr %[[ARG0_ADDR]], align 16
941
941
// CHECK: store i128 %[[V3]], ptr %[[ARGDATA]], align 1
942
942
943
+ // CHECK-LABEL: define{{.*}} void @test_builtin_popcountg
944
+ void test_builtin_popcountg (unsigned char uc , unsigned short us ,
945
+ unsigned int ui , unsigned long ul ,
946
+ unsigned long long ull , unsigned __int128 ui128 ,
947
+ unsigned _BitInt (128 ) ubi128 ) {
948
+ volatile int pop ;
949
+ pop = __builtin_popcountg (uc );
950
+ // CHECK: %1 = load i8, ptr %uc.addr, align 1
951
+ // CHECK-NEXT: %conv = zext i8 %1 to i32
952
+ // CHECK-NEXT: %2 = call i32 @llvm.ctpop.i32(i32 %conv)
953
+ // CHECK-NEXT: store volatile i32 %2, ptr %pop, align 4
954
+ pop = __builtin_popcountg (us );
955
+ // CHECK-NEXT: %3 = load i16, ptr %us.addr, align 2
956
+ // CHECK-NEXT: %conv1 = zext i16 %3 to i32
957
+ // CHECK-NEXT: %4 = call i32 @llvm.ctpop.i32(i32 %conv1)
958
+ // CHECK-NEXT: store volatile i32 %4, ptr %pop, align 4
959
+ pop = __builtin_popcountg (ui );
960
+ // CHECK-NEXT: %5 = load i32, ptr %ui.addr, align 4
961
+ // CHECK-NEXT: %6 = call i32 @llvm.ctpop.i32(i32 %5)
962
+ // CHECK-NEXT: store volatile i32 %6, ptr %pop, align 4
963
+ pop = __builtin_popcountg (ul );
964
+ // CHECK-NEXT: %7 = load i64, ptr %ul.addr, align 8
965
+ // CHECK-NEXT: %8 = call i64 @llvm.ctpop.i64(i64 %7)
966
+ // CHECK-NEXT: %cast = trunc i64 %8 to i32
967
+ // CHECK-NEXT: store volatile i32 %cast, ptr %pop, align 4
968
+ pop = __builtin_popcountg (ull );
969
+ // CHECK-NEXT: %9 = load i64, ptr %ull.addr, align 8
970
+ // CHECK-NEXT: %10 = call i64 @llvm.ctpop.i64(i64 %9)
971
+ // CHECK-NEXT: %cast2 = trunc i64 %10 to i32
972
+ // CHECK-NEXT: store volatile i32 %cast2, ptr %pop, align 4
973
+ pop = __builtin_popcountg (ui128 );
974
+ // CHECK-NEXT: %11 = load i128, ptr %ui128.addr, align 16
975
+ // CHECK-NEXT: %12 = call i128 @llvm.ctpop.i128(i128 %11)
976
+ // CHECK-NEXT: %cast3 = trunc i128 %12 to i32
977
+ // CHECK-NEXT: store volatile i32 %cast3, ptr %pop, align 4
978
+ pop = __builtin_popcountg (ubi128 );
979
+ // CHECK-NEXT: %13 = load i128, ptr %ubi128.addr, align 8
980
+ // CHECK-NEXT: %14 = call i128 @llvm.ctpop.i128(i128 %13)
981
+ // CHECK-NEXT: %cast4 = trunc i128 %14 to i32
982
+ // CHECK-NEXT: store volatile i32 %cast4, ptr %pop, align 4
983
+ // CHECK-NEXT: ret void
984
+ }
985
+
943
986
#endif
0 commit comments