@@ -51,8 +51,8 @@ unsigned int clz_32(uint32_t a) {
51
51
// RV64ZBB-LABEL: @clz_64(
52
52
// RV64ZBB-NEXT: entry:
53
53
// RV64ZBB-NEXT: [[TMP0:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A:%.*]], i1 false)
54
- // RV64ZBB-NEXT: [[CAST :%.*]] = trunc i64 [[TMP0]] to i32
55
- // RV64ZBB-NEXT: ret i32 [[CAST ]]
54
+ // RV64ZBB-NEXT: [[CAST_I :%.*]] = trunc i64 [[TMP0]] to i32
55
+ // RV64ZBB-NEXT: ret i32 [[CAST_I ]]
56
56
//
57
57
unsigned int clz_64 (uint64_t a ) {
58
58
return __riscv_clz_64 (a );
@@ -77,10 +77,36 @@ unsigned int ctz_32(uint32_t a) {
77
77
// RV64ZBB-LABEL: @ctz_64(
78
78
// RV64ZBB-NEXT: entry:
79
79
// RV64ZBB-NEXT: [[TMP0:%.*]] = call i64 @llvm.cttz.i64(i64 [[A:%.*]], i1 false)
80
- // RV64ZBB-NEXT: [[CAST :%.*]] = trunc i64 [[TMP0]] to i32
81
- // RV64ZBB-NEXT: ret i32 [[CAST ]]
80
+ // RV64ZBB-NEXT: [[CAST_I :%.*]] = trunc i64 [[TMP0]] to i32
81
+ // RV64ZBB-NEXT: ret i32 [[CAST_I ]]
82
82
//
83
83
unsigned int ctz_64 (uint64_t a ) {
84
84
return __riscv_ctz_64 (a );
85
85
}
86
86
#endif
87
+
88
+ // RV32ZBB-LABEL: @cpop_32(
89
+ // RV32ZBB-NEXT: entry:
90
+ // RV32ZBB-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[A:%.*]])
91
+ // RV32ZBB-NEXT: ret i32 [[TMP0]]
92
+ //
93
+ // RV64ZBB-LABEL: @cpop_32(
94
+ // RV64ZBB-NEXT: entry:
95
+ // RV64ZBB-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[A:%.*]])
96
+ // RV64ZBB-NEXT: ret i32 [[TMP0]]
97
+ //
98
+ unsigned int cpop_32 (uint32_t a ) {
99
+ return __riscv_cpop_32 (a );
100
+ }
101
+
102
+ #if __riscv_xlen == 64
103
+ // RV64ZBB-LABEL: @cpop_64(
104
+ // RV64ZBB-NEXT: entry:
105
+ // RV64ZBB-NEXT: [[TMP0:%.*]] = call i64 @llvm.ctpop.i64(i64 [[A:%.*]])
106
+ // RV64ZBB-NEXT: [[CAST_I:%.*]] = trunc i64 [[TMP0]] to i32
107
+ // RV64ZBB-NEXT: ret i32 [[CAST_I]]
108
+ //
109
+ unsigned int cpop_64 (uint64_t a ) {
110
+ return __riscv_cpop_64 (a );
111
+ }
112
+ #endif
0 commit comments