[clang] [CIR][X86] Add support for `cpuid`/`cpuidex` (PR #173197)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 8 17:58:55 PST 2026


================
@@ -4282,6 +4283,68 @@ mlir::LogicalResult CIRToLLVMAwaitOpLowering::matchAndRewrite(
   return mlir::failure();
 }
 
+mlir::LogicalResult CIRToLLVMCpuIdOpLowering::matchAndRewrite(
+    cir::CpuIdOp op, OpAdaptor adaptor,
+    mlir::ConversionPatternRewriter &rewriter) const {
+  mlir::Type i32Ty = rewriter.getI32Type();
+  mlir::Type i64Ty = rewriter.getI64Type();
+  mlir::Type i32PtrTy = mlir::LLVM::LLVMPointerType::get(i32Ty.getContext(), 0);
+
+  mlir::Type cpuidRetTy = mlir::LLVM::LLVMStructType::getLiteral(
+      rewriter.getContext(), {i32Ty, i32Ty, i32Ty, i32Ty});
+
+  mlir::Value funcId = adaptor.getFuncId();
+  mlir::Value subFuncId = adaptor.getSubFuncId();
+  std::array<mlir::Value, 2> operands{funcId, subFuncId};
+
+  StringRef asmString, constraints;
+  if (const llvm::Triple &triple = lowerMod->getTarget().getTriple();
----------------
andykaylor wrote:

I'm trying to remove `lowerMod` from this pass. `createLowerModule` gets the triple exactly the way you did it before. The fact that this even needs to know the triple kind of implies that this lowering should be happening in an earlier pass but let's leave it here for now and move it when we have more target lowering implemented.

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


More information about the cfe-commits mailing list