[llvm-branch-commits] [clang] [llvm] [RISCV] Support __builtin_cpu_is (PR #116231)
Pengcheng Wang via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Nov 14 22:24:57 PST 2024
================
@@ -22505,6 +22506,57 @@ Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
return nullptr;
}
+Value *CodeGenFunction::EmitRISCVCpuIs(const CallExpr *E) {
+ const Expr *CPUExpr = E->getArg(0)->IgnoreParenCasts();
+ StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
+ return EmitRISCVCpuIs(CPUStr);
+}
+
+Value *CodeGenFunction::EmitRISCVCpuIs(StringRef CPUStr) {
+ llvm::Type *Int32Ty = Builder.getInt32Ty();
+ llvm::Type *Int64Ty = Builder.getInt64Ty();
+ llvm::Type *MXLenType =
+ CGM.getTarget().getTriple().isArch32Bit() ? Int32Ty : Int64Ty;
+
+ llvm::Type *StructTy = llvm::StructType::get(Int32Ty, MXLenType, MXLenType);
+ llvm::Constant *RISCVCPUModel =
+ CGM.CreateRuntimeVariable(StructTy, "__riscv_cpu_model");
+ cast<llvm::GlobalValue>(RISCVCPUModel)->setDSOLocal(true);
+
+ auto loadRISCVCPUID = [&](unsigned Index, llvm::Type *ValueTy,
+ CGBuilderTy &Builder, CodeGenModule &CGM) {
+ llvm::Value *GEPIndices[] = {Builder.getInt32(0),
+ llvm::ConstantInt::get(Int32Ty, Index)};
+ Value *Ptr = Builder.CreateInBoundsGEP(StructTy, RISCVCPUModel, GEPIndices);
+ Value *CPUID = Builder.CreateAlignedLoad(
+ ValueTy, Ptr,
+ CharUnits::fromQuantity(ValueTy->getScalarSizeInBits() / 8));
+ return CPUID;
+ };
+
+ // Compare mvendorid.
+ Value *VendorID = loadRISCVCPUID(0, Int32Ty, Builder, CGM);
+ Value *Result = Builder.CreateICmpEQ(
+ VendorID,
+ llvm::ConstantInt::get(Int32Ty, llvm::RISCV::getVendorID(CPUStr)));
+
+ // Compare marchid.
+ Value *ArchID = loadRISCVCPUID(1, MXLenType, Builder, CGM);
+ Result = Builder.CreateAnd(
+ Result, Builder.CreateICmpEQ(
+ ArchID, llvm::ConstantInt::get(
+ MXLenType, llvm::RISCV::getArchID(CPUStr))));
+
+ // Compare mimplid.
+ Value *ImplID = loadRISCVCPUID(2, MXLenType, Builder, CGM);
+ Result = Builder.CreateAnd(
+ Result, Builder.CreateICmpEQ(
+ ImplID, llvm::ConstantInt::get(
+ MXLenType, llvm::RISCV::getImplID(CPUStr))));
----------------
wangpc-pp wrote:
Currently this implementation just reports an error when there is no non-zero values in CPU definitions (done in `validateCpuIs`). This should matches PPC/X86. PPC supports CPUs with valid `Linux_SUPPORT_METHOD` or `AIX_SUPPORT_METHOD` value; X86 supports a set of defined CPUs.
https://github.com/llvm/llvm-project/pull/116231
More information about the llvm-branch-commits
mailing list