[clang] [clang]Implement the c23 stdc bit builtins (PR #185978)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 12 06:17:02 PDT 2026
================
@@ -3732,6 +3732,170 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
case Builtin::BI_rotr64:
return emitRotate(E, true);
+ case Builtin::BI__builtin_stdc_leading_zeros:
+ case Builtin::BI__builtin_stdc_leading_ones:
+ case Builtin::BI__builtin_stdc_trailing_zeros:
+ case Builtin::BI__builtin_stdc_trailing_ones:
+ case Builtin::BI__builtin_stdc_first_leading_zero:
+ case Builtin::BI__builtin_stdc_first_leading_one:
+ case Builtin::BI__builtin_stdc_first_trailing_zero:
+ case Builtin::BI__builtin_stdc_first_trailing_one:
+ case Builtin::BI__builtin_stdc_count_zeros:
+ case Builtin::BI__builtin_stdc_count_ones:
+ case Builtin::BI__builtin_stdc_has_single_bit:
+ case Builtin::BI__builtin_stdc_bit_width:
+ case Builtin::BI__builtin_stdc_bit_floor:
+ case Builtin::BI__builtin_stdc_bit_ceil: {
+ Value *ArgValue = EmitScalarExpr(E->getArg(0));
+ llvm::Type *ArgType = ArgValue->getType();
+ llvm::Type *ResultType = ConvertType(E->getType());
+ unsigned BitWidth = ArgType->getIntegerBitWidth();
+ Value *Zero = ConstantInt::get(ArgType, 0);
+ Value *One = ConstantInt::get(ArgType, 1);
+ Value *Result;
+
+ switch (BuiltinIDIfNoAsmLabel) {
----------------
erichkeane wrote:
Switching on the SAME types again is awful, we should be figuring out a way to do this better. One such way would be to do an implementation inside each of the above 'case' statements, and turn the `get arg value` stuff above, and the cleanup below into their own functions.
https://github.com/llvm/llvm-project/pull/185978
More information about the cfe-commits
mailing list