[clang] [aarch64] Add more MSVC intrinsics (PR #194632)
Adhemerval Zanella via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 05:09:18 PDT 2026
================
@@ -4823,9 +4824,45 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
- llvm::Function *F =
- CGM.getIntrinsic(Intrinsic::read_register, {Int64Ty});
- return Builder.CreateCall(F, Metadata);
+ CallInst *CI;
+ if (BuiltinID == clang::AArch64::BI__getReg) {
+ llvm::Function *F = CGM.getIntrinsic(Intrinsic::read_register, {Int64Ty});
+ CI = Builder.CreateCall(F, Metadata);
+ } else {
+ llvm::Function *F =
+ CGM.getIntrinsic(Intrinsic::write_register, {Int64Ty});
+ CI = Builder.CreateCall(F, {Metadata, EmitScalarExpr(E->getArg(1))});
+ }
+ return CI;
+ }
+
+ if (BuiltinID == clang::AArch64::BI__getRegFp ||
+ BuiltinID == clang::AArch64::BI__setRegFp) {
+ Expr::EvalResult Result;
+ if (!E->getArg(0)->EvaluateAsInt(Result, CGM.getContext()))
+ llvm_unreachable("Sema will ensure that the parameter is constant");
+
+ llvm::APSInt Value = Result.Val.getInt();
+ LLVMContext &Context = CGM.getLLVMContext();
+ std::string Reg = "d" + toString(Value, 10);
+
+ llvm::Metadata *Ops[] = {llvm::MDString::get(Context, Reg)};
+ llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
+ llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
+
+ llvm::Value *Ret;
+ if (BuiltinID == clang::AArch64::BI__getRegFp) {
+ llvm::Function *F = CGM.getIntrinsic(Intrinsic::read_register, {Int64Ty});
+ llvm::Value *Bits = Builder.CreateCall(F, Metadata);
+ Ret = Builder.CreateBitCast(Bits, llvm::Type::getDoubleTy(Context));
----------------
zatrazz wrote:
Ack, I will check this out.
https://github.com/llvm/llvm-project/pull/194632
More information about the cfe-commits
mailing list