================ @@ -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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits