@@ -940,4 +940,47 @@ void test_builtin_os_log_long_double(void *buf, long double ld) {
940940// CHECK: %[[V3:.*]] = load i128, ptr %[[ARG0_ADDR]], align 16
941941// CHECK: store i128 %[[V3]], ptr %[[ARGDATA]], align 1
942942
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+
943986#endif
0 commit comments