[clang] [clang] Add typed variants for C23 stdbit.h builtins (PR #192718)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 17 17:10:11 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: NagaChaitanya Vellanki (chaitanyav)
<details>
<summary>Changes</summary>
stdc_leading_zeros_{uc,us,ui,ul,ull}
stdc_leading_ones_{uc,us,ui,ul,ull}
stdc_trailing_zeros_{uc,us,ui,ul,ull}
stdc_trailing_ones_{uc,us,ui,ul,ull}
stdc_first_leading_zero_{uc,us,ui,ul,ull}
stdc_first_leading_one_{uc,us,ui,ul,ull}
stdc_first_trailing_zero_{uc,us,ui,ul,ull}
stdc_first_trailing_one_{uc,us,ui,ul,ull}
stdc_count_zeros_{uc,us,ui,ul,ull}
stdc_count_ones_{uc,us,ui,ul,ull}
stdc_has_single_bit_{uc,us,ui,ul,ull}
stdc_bit_width_{uc,us,ui,ul,ull}
stdc_bit_floor_{uc,us,ui,ul,ull}
stdc_bit_ceil_{uc,us,ui,ul,ull}
Lower type-specific <stdbit.h> functions to LLVM intrinsics (ctlz/cttz/ctpop). Includes constant expression support and tests for Sema, CodeGen, and constant evaluation.
Followup:#<!-- -->79630
---
Patch is 57.01 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/192718.diff
10 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+17)
- (modified) clang/include/clang/Basic/Builtins.td (+94)
- (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+70)
- (modified) clang/lib/AST/ExprConstant.cpp (+154)
- (modified) clang/lib/CodeGen/CGBuiltin.cpp (+70)
- (modified) clang/lib/Sema/SemaChecking.cpp (+70)
- (modified) clang/test/CodeGen/Inputs/stdbit.h (+84)
- (modified) clang/test/CodeGen/builtin-stdc-bit-functions.c (+289-1)
- (modified) clang/test/Sema/Inputs/stdbit.h (+84)
- (modified) clang/test/Sema/builtin-stdc-bit-functions.c (+73)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 46dc5bb97463e..2b26f32d66e8e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -189,6 +189,23 @@ Non-comprehensive list of changes in this release
``__builtin_stdc_has_single_bit``, ``__builtin_stdc_bit_width``,
``__builtin_stdc_bit_floor``, and ``__builtin_stdc_bit_ceil``.
+- Implemented the type-specific C23 ``<stdbit.h>`` functions with constexpr
+ evaluation support:
+ ``stdc_leading_zeros_{uc,us,ui,ul,ull}``,
+ ``stdc_leading_ones_{uc,us,ui,ul,ull}``,
+ ``stdc_trailing_zeros_{uc,us,ui,ul,ull}``,
+ ``stdc_trailing_ones_{uc,us,ui,ul,ull}``,
+ ``stdc_first_leading_zero_{uc,us,ui,ul,ull}``,
+ ``stdc_first_leading_one_{uc,us,ui,ul,ull}``,
+ ``stdc_first_trailing_zero_{uc,us,ui,ul,ull}``,
+ ``stdc_first_trailing_one_{uc,us,ui,ul,ull}``,
+ ``stdc_count_zeros_{uc,us,ui,ul,ull}``,
+ ``stdc_count_ones_{uc,us,ui,ul,ull}``,
+ ``stdc_has_single_bit_{uc,us,ui,ul,ull}``,
+ ``stdc_bit_width_{uc,us,ui,ul,ull}``,
+ ``stdc_bit_floor_{uc,us,ui,ul,ull}``, and
+ ``stdc_bit_ceil_{uc,us,ui,ul,ull}``.
+
- A new generic bit-reverse builtin function ``__builtin_bitreverseg`` that
extends bit-reversal support to all standard integers type, including
``_BitInt``
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 5b6e45de14994..5397c51742901 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -29,6 +29,11 @@ class F16F128MathTemplate : Template<["__fp16", "__float128"],
class IntMathTemplate : Template<["int", "long int", "long long int"],
["", "l", "ll"], /*AsPrefix=*/1>;
+class IntBitUtilTemplate : Template<
+ ["unsigned char", "unsigned short", "unsigned int",
+ "unsigned long int", "unsigned long long int"],
+ ["_uc", "_us", "_ui", "_ul", "_ull"]>;
+
class MSInt8_16_32Template : Template<["char", "short", "msint32_t"],
["8", "16", ""]>;
@@ -965,6 +970,95 @@ def StdcBitCeilLib: LibBuiltin<"stdbit.h", "C23_LANG"> {
let Prototype = "void(...)";
}
+// Typed variants of the C23 stdbit.h builtins (e.g. stdc_leading_zeros_uc).
+// IntBitUtilTemplate generates the _uc/_us/_ui/_ul/_ull spellings with
+// concrete prototypes so the compiler can match the <stdbit.h> declarations.
+
+def StdcLeadingZerosTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_leading_zeros"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcLeadingOnesTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_leading_ones"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcTrailingZerosTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_trailing_zeros"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcTrailingOnesTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_trailing_ones"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcFirstLeadingZeroTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_first_leading_zero"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcFirstLeadingOneTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_first_leading_one"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcFirstTrailingZeroTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_first_trailing_zero"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcFirstTrailingOneTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_first_trailing_one"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcCountZerosTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_count_zeros"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcCountOnesTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_count_ones"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcBitWidthTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_bit_width"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "unsigned int(T)";
+}
+
+def StdcHasSingleBitTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_has_single_bit"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "bool(T)";
+}
+
+def StdcBitFloorTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_bit_floor"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "T(T)";
+}
+
+def StdcBitCeilTyped : LibBuiltin<"stdbit.h", "C23_LANG">, IntBitUtilTemplate {
+ let Spellings = ["stdc_bit_ceil"];
+ let Attributes = [NoThrow, Const, Constexpr];
+ let Prototype = "T(T)";
+}
+
+
// Random GCC builtins
// FIXME: The builtins marked FunctionWithBuiltinPrefix below should be
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index e8336b91b515d..dc5e74aaebd01 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -4413,6 +4413,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_leading_zeros_uc:
+ case Builtin::BIstdc_leading_zeros_us:
+ case Builtin::BIstdc_leading_zeros_ui:
+ case Builtin::BIstdc_leading_zeros_ul:
+ case Builtin::BIstdc_leading_zeros_ull:
case Builtin::BIstdc_leading_zeros:
case Builtin::BI__builtin_stdc_leading_zeros: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4422,6 +4427,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_leading_ones_uc:
+ case Builtin::BIstdc_leading_ones_us:
+ case Builtin::BIstdc_leading_ones_ui:
+ case Builtin::BIstdc_leading_ones_ul:
+ case Builtin::BIstdc_leading_ones_ull:
case Builtin::BIstdc_leading_ones:
case Builtin::BI__builtin_stdc_leading_ones: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4431,6 +4441,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_trailing_zeros_uc:
+ case Builtin::BIstdc_trailing_zeros_us:
+ case Builtin::BIstdc_trailing_zeros_ui:
+ case Builtin::BIstdc_trailing_zeros_ul:
+ case Builtin::BIstdc_trailing_zeros_ull:
case Builtin::BIstdc_trailing_zeros:
case Builtin::BI__builtin_stdc_trailing_zeros: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4440,6 +4455,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_trailing_ones_uc:
+ case Builtin::BIstdc_trailing_ones_us:
+ case Builtin::BIstdc_trailing_ones_ui:
+ case Builtin::BIstdc_trailing_ones_ul:
+ case Builtin::BIstdc_trailing_ones_ull:
case Builtin::BIstdc_trailing_ones:
case Builtin::BI__builtin_stdc_trailing_ones: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4449,6 +4469,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_first_leading_zero_uc:
+ case Builtin::BIstdc_first_leading_zero_us:
+ case Builtin::BIstdc_first_leading_zero_ui:
+ case Builtin::BIstdc_first_leading_zero_ul:
+ case Builtin::BIstdc_first_leading_zero_ull:
case Builtin::BIstdc_first_leading_zero:
case Builtin::BI__builtin_stdc_first_leading_zero: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4458,6 +4483,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_first_leading_one_uc:
+ case Builtin::BIstdc_first_leading_one_us:
+ case Builtin::BIstdc_first_leading_one_ui:
+ case Builtin::BIstdc_first_leading_one_ul:
+ case Builtin::BIstdc_first_leading_one_ull:
case Builtin::BIstdc_first_leading_one:
case Builtin::BI__builtin_stdc_first_leading_one: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4467,6 +4497,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_first_trailing_zero_uc:
+ case Builtin::BIstdc_first_trailing_zero_us:
+ case Builtin::BIstdc_first_trailing_zero_ui:
+ case Builtin::BIstdc_first_trailing_zero_ul:
+ case Builtin::BIstdc_first_trailing_zero_ull:
case Builtin::BIstdc_first_trailing_zero:
case Builtin::BI__builtin_stdc_first_trailing_zero: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4476,6 +4511,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_first_trailing_one_uc:
+ case Builtin::BIstdc_first_trailing_one_us:
+ case Builtin::BIstdc_first_trailing_one_ui:
+ case Builtin::BIstdc_first_trailing_one_ul:
+ case Builtin::BIstdc_first_trailing_one_ull:
case Builtin::BIstdc_first_trailing_one:
case Builtin::BI__builtin_stdc_first_trailing_one: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4485,6 +4525,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_count_zeros_uc:
+ case Builtin::BIstdc_count_zeros_us:
+ case Builtin::BIstdc_count_zeros_ui:
+ case Builtin::BIstdc_count_zeros_ul:
+ case Builtin::BIstdc_count_zeros_ull:
case Builtin::BIstdc_count_zeros:
case Builtin::BI__builtin_stdc_count_zeros: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4495,6 +4540,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_count_ones_uc:
+ case Builtin::BIstdc_count_ones_us:
+ case Builtin::BIstdc_count_ones_ui:
+ case Builtin::BIstdc_count_ones_ul:
+ case Builtin::BIstdc_count_ones_ull:
case Builtin::BIstdc_count_ones:
case Builtin::BI__builtin_stdc_count_ones: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4504,6 +4554,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_has_single_bit_uc:
+ case Builtin::BIstdc_has_single_bit_us:
+ case Builtin::BIstdc_has_single_bit_ui:
+ case Builtin::BIstdc_has_single_bit_ul:
+ case Builtin::BIstdc_has_single_bit_ull:
case Builtin::BIstdc_has_single_bit:
case Builtin::BI__builtin_stdc_has_single_bit: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4513,6 +4568,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_bit_width_uc:
+ case Builtin::BIstdc_bit_width_us:
+ case Builtin::BIstdc_bit_width_ui:
+ case Builtin::BIstdc_bit_width_ul:
+ case Builtin::BIstdc_bit_width_ull:
case Builtin::BIstdc_bit_width:
case Builtin::BI__builtin_stdc_bit_width: {
unsigned ResWidth = S.getASTContext().getIntWidth(Call->getType());
@@ -4523,6 +4583,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
});
}
+ case Builtin::BIstdc_bit_floor_uc:
+ case Builtin::BIstdc_bit_floor_us:
+ case Builtin::BIstdc_bit_floor_ui:
+ case Builtin::BIstdc_bit_floor_ul:
+ case Builtin::BIstdc_bit_floor_ull:
case Builtin::BIstdc_bit_floor:
case Builtin::BI__builtin_stdc_bit_floor:
return interp__builtin_elementwise_int_unaryop(
@@ -4534,6 +4599,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
BitWidth - Val.countl_zero() - 1);
});
+ case Builtin::BIstdc_bit_ceil_uc:
+ case Builtin::BIstdc_bit_ceil_us:
+ case Builtin::BIstdc_bit_ceil_ui:
+ case Builtin::BIstdc_bit_ceil_ul:
+ case Builtin::BIstdc_bit_ceil_ull:
case Builtin::BIstdc_bit_ceil:
case Builtin::BI__builtin_stdc_bit_ceil:
return interp__builtin_elementwise_int_unaryop(
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index f2f9aeaec2588..5eaf0d0244b6d 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -16829,6 +16829,76 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
}
}
+ case Builtin::BIstdc_leading_zeros_uc:
+ case Builtin::BIstdc_leading_zeros_us:
+ case Builtin::BIstdc_leading_zeros_ui:
+ case Builtin::BIstdc_leading_zeros_ul:
+ case Builtin::BIstdc_leading_zeros_ull:
+ case Builtin::BIstdc_leading_ones_uc:
+ case Builtin::BIstdc_leading_ones_us:
+ case Builtin::BIstdc_leading_ones_ui:
+ case Builtin::BIstdc_leading_ones_ul:
+ case Builtin::BIstdc_leading_ones_ull:
+ case Builtin::BIstdc_trailing_zeros_uc:
+ case Builtin::BIstdc_trailing_zeros_us:
+ case Builtin::BIstdc_trailing_zeros_ui:
+ case Builtin::BIstdc_trailing_zeros_ul:
+ case Builtin::BIstdc_trailing_zeros_ull:
+ case Builtin::BIstdc_trailing_ones_uc:
+ case Builtin::BIstdc_trailing_ones_us:
+ case Builtin::BIstdc_trailing_ones_ui:
+ case Builtin::BIstdc_trailing_ones_ul:
+ case Builtin::BIstdc_trailing_ones_ull:
+ case Builtin::BIstdc_first_leading_zero_uc:
+ case Builtin::BIstdc_first_leading_zero_us:
+ case Builtin::BIstdc_first_leading_zero_ui:
+ case Builtin::BIstdc_first_leading_zero_ul:
+ case Builtin::BIstdc_first_leading_zero_ull:
+ case Builtin::BIstdc_first_leading_one_uc:
+ case Builtin::BIstdc_first_leading_one_us:
+ case Builtin::BIstdc_first_leading_one_ui:
+ case Builtin::BIstdc_first_leading_one_ul:
+ case Builtin::BIstdc_first_leading_one_ull:
+ case Builtin::BIstdc_first_trailing_zero_uc:
+ case Builtin::BIstdc_first_trailing_zero_us:
+ case Builtin::BIstdc_first_trailing_zero_ui:
+ case Builtin::BIstdc_first_trailing_zero_ul:
+ case Builtin::BIstdc_first_trailing_zero_ull:
+ case Builtin::BIstdc_first_trailing_one_uc:
+ case Builtin::BIstdc_first_trailing_one_us:
+ case Builtin::BIstdc_first_trailing_one_ui:
+ case Builtin::BIstdc_first_trailing_one_ul:
+ case Builtin::BIstdc_first_trailing_one_ull:
+ case Builtin::BIstdc_count_zeros_uc:
+ case Builtin::BIstdc_count_zeros_us:
+ case Builtin::BIstdc_count_zeros_ui:
+ case Builtin::BIstdc_count_zeros_ul:
+ case Builtin::BIstdc_count_zeros_ull:
+ case Builtin::BIstdc_count_ones_uc:
+ case Builtin::BIstdc_count_ones_us:
+ case Builtin::BIstdc_count_ones_ui:
+ case Builtin::BIstdc_count_ones_ul:
+ case Builtin::BIstdc_count_ones_ull:
+ case Builtin::BIstdc_has_single_bit_uc:
+ case Builtin::BIstdc_has_single_bit_us:
+ case Builtin::BIstdc_has_single_bit_ui:
+ case Builtin::BIstdc_has_single_bit_ul:
+ case Builtin::BIstdc_has_single_bit_ull:
+ case Builtin::BIstdc_bit_width_uc:
+ case Builtin::BIstdc_bit_width_us:
+ case Builtin::BIstdc_bit_width_ui:
+ case Builtin::BIstdc_bit_width_ul:
+ case Builtin::BIstdc_bit_width_ull:
+ case Builtin::BIstdc_bit_floor_uc:
+ case Builtin::BIstdc_bit_floor_us:
+ case Builtin::BIstdc_bit_floor_ui:
+ case Builtin::BIstdc_bit_floor_ul:
+ case Builtin::BIstdc_bit_floor_ull:
+ case Builtin::BIstdc_bit_ceil_uc:
+ case Builtin::BIstdc_bit_ceil_us:
+ case Builtin::BIstdc_bit_ceil_ui:
+ case Builtin::BIstdc_bit_ceil_ul:
+ case Builtin::BIstdc_bit_ceil_ull:
case Builtin::BIstdc_leading_zeros:
case Builtin::BIstdc_leading_ones:
case Builtin::BIstdc_trailing_zeros:
@@ -16865,40 +16935,118 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
const unsigned ResBitWidth = Info.Ctx.getIntWidth(E->getType());
switch (BuiltinOp) {
+ case Builtin::BIstdc_leading_zeros_uc:
+ case Builtin::BIstdc_leading_zeros_us:
+ case Builtin::BIstdc_leading_zeros_ui:
+ case Builtin::BIstdc_leading_zeros_ul:
+ case Builtin::BIstdc_leading_zeros_ull:
+ case Builtin::BIstdc_leading_zeros:
case Builtin::BI__builtin_stdc_leading_zeros:
return Success(APInt(ResBitWidth, Val.countl_zero()), E);
+ case Builtin::BIstdc_leading_ones_uc:
+ case Builtin::BIstdc_leading_ones_us:
+ case Builtin::BIstdc_leading_ones_ui:
+ case Builtin::BIstdc_leading_ones_ul:
+ case Builtin::BIstdc_leading_ones_ull:
+ case Builtin::BIstdc_leading_ones:
case Builtin::BI__builtin_stdc_leading_ones:
return Success(APInt(ResBitWidth, Val.countl_one()), E);
+ case Builtin::BIstdc_trailing_zeros_uc:
+ case Builtin::BIstdc_trailing_zeros_us:
+ case Builtin::BIstdc_trailing_zeros_ui:
+ case Builtin::BIstdc_trailing_zeros_ul:
+ case Builtin::BIstdc_trailing_zeros_ull:
+ case Builtin::BIstdc_trailing_zeros:
case Builtin::BI__builtin_stdc_trailing_zeros:
return Success(APInt(ResBitWidth, Val.countr_zero()), E);
+ case Builtin::BIstdc_trailing_ones_uc:
+ case Builtin::BIstdc_trailing_ones_us:
+ case Builtin::BIstdc_trailing_ones_ui:
+ case Builtin::BIstdc_trailing_ones_ul:
+ case Builtin::BIstdc_trailing_ones_ull:
+ case Builtin::BIstdc_trailing_ones:
case Builtin::BI__builtin_stdc_trailing_ones:
return Success(APInt(ResBitWidth, Val.countr_one()), E);
+ case Builtin::BIstdc_first_leading_zero_uc:
+ case Builtin::BIstdc_first_leading_zero_us:
+ case Builtin::BIstdc_first_leading_zero_ui:
+ case Builtin::BIstdc_first_leading_zero_ul:
+ case Builtin::BIstdc_first_leading_zero_ull:
+ case Builtin::BIstdc_first_leading_zero:
case Builtin::BI__builtin_stdc_first_leading_zero:
return Success(
APInt(ResBitWidth, Val.isAllOnes() ? 0 : Val.countl_one() + 1), E);
+ case Builtin::BIstdc_first_leading_one_uc:
+ case Builtin::BIstdc_first_leading_one_us:
+ case Builtin::BIstdc_first_leading_one_ui:
+ case Builtin::BIstdc_first_leading_one_ul:
+ case Builtin::BIstdc_first_leading_one_ull:
+ case Builtin::BIstdc_first_leading_one:
case Builtin::BI__builtin_stdc_first_leading_one:
return Success(
APInt(ResBitWidth, Val.isZero() ? 0 : Val.countl_zero() + 1), E);
+ case Builtin::BIstdc_first_trailing_zero_uc:
+ case Builtin::BIstdc_first_trailing_zero_us:
+ case Builtin::BIstdc_first_trailing_zero_ui:
+ case Builtin::BIstdc_first_trailing_zero_ul:
+ case Builtin::BIstdc_first_trailing_zero_ull:
+ case Builtin::BIstdc_first_trailing_zero:
case Builtin::BI__builtin_stdc_first_trailing_zero:
return Success(
APInt(ResBitWidth, Val.isAllOnes() ? 0 : Val.countr_one() + 1), E);
+ case Builtin::BIstdc_first_trailing_one_uc:
+ case Builtin::BIstdc_first_trailing_one_us:
+ case Builtin::BIstdc_first_trailing_one_ui:
+ case Builtin::BIstdc_first_trailing_one_ul:
+ case Builtin::BIstdc_first_trailing_one_ull:
+ case Builtin::BIstdc_first_trailing_one:
case Builtin::BI__builtin_stdc_first_trailing_one:
return Success(
APInt(ResBitWidth, Val.isZero() ? 0 : Val.countr_zero() + 1), E);
+ case Builtin::BIstdc_count_zeros_uc:
+ case Builtin::BIstdc_count_zeros_us:
+ case Builtin::BIstdc_count_zeros_ui:
+ case Builtin::BIstdc_count_zeros_ul:
+ case Builtin::BIstdc_count_zeros_ull:
+ case Builtin::BIstdc_count_zeros:
case Builtin::BI__builtin_stdc_count_zeros: {
APInt Cnt(ResBitWidth, BitWidth - Val.popcount());
return Success(APSInt(Cnt, /*IsUnsigned*/ true), E);
}
+ case Builtin::BIstdc_count_ones_uc:
+ case Builtin::BIstdc_count_ones_us:
+ case Builtin::BIstdc_count_ones_ui:
+ case Builtin::BIstdc_count_ones_ul:
+ case Builtin::BIstdc_count_ones_ull:
+ case Builtin::BIstdc_count_ones:
case Builtin::BI__builtin_stdc_count_ones: {
APInt Cnt(ResBitWidth, Val.popcount());
return Success(APSInt(Cnt, /*IsUnsigned*/ true), E);
}
+ case Builtin::BIstdc_ha...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/192718
More information about the cfe-commits
mailing list