[clang] [aarch64] Add more MSVC intrinsics (PR #194632)

Adhemerval Zanella via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 29 05:09:00 PDT 2026


================
@@ -5235,6 +5272,18 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
     return Result;
   }
 
+  if (BuiltinID == AArch64::BI_CountTrailingZeros ||
+      BuiltinID == AArch64::BI_CountTrailingZeros64) {
+    Value *ArgValue = EmitScalarExpr(E->getArg(0));
+    llvm::Type *ArgType = ArgValue->getType();
+    Function *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType);
+
+    Value *Result = Builder.CreateCall(F, {ArgValue, Builder.getInt1(false)});
+    if (BuiltinID == AArch64::BI_CountTrailingZeros64)
+      Result = Builder.CreateTrunc(Result, Builder.getInt32Ty());
----------------
zatrazz wrote:

With /O2 is essentially the same:

> cat ..\test_counttrailingzeros.c
#include <intrin.h>

unsigned int test_CountTrailingZeros(unsigned long x)
{
    return _CountTrailingZeros (x);
}

unsigned int test_CountTrailingZeros64(unsigned __int64 x)
{
    return _CountTrailingZeros64 (x);
}
> cl -c /W4 /O2 /arch:armv8.0 ..\test_counttrailingzeros.c
> dumpbin /DISASM test_counttrailingzeros.obj
[...]
test_CountTrailingZeros:
  0000000000000000: 5AC00008  rbit        w8,w0
  0000000000000004: 5AC01100  clz         w0,w8
  0000000000000008: D65F03C0  ret

test_CountTrailingZeros64:
  0000000000000000: DAC00008  rbit        x8,x0
  0000000000000004: DAC01100  clz         x0,x8
  0000000000000008: D65F03C0  ret
[...]

https://github.com/llvm/llvm-project/pull/194632


More information about the cfe-commits mailing list