[clang] [CIR][X86] Add support for roundpd, roundps, roundsd, roundss builtins (PR #215787)
Borys Perski via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 19 11:10:01 PDT 2026
================
@@ -1145,6 +1165,77 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) {
// Return timestamp (element 0 of the returned struct)
return cir::ExtractMemberOp::create(builder, loc, i64Ty, result, 0);
}
+ case X86::BI__builtin_ia32_roundps:
+ case X86::BI__builtin_ia32_roundpd:
+ case X86::BI__builtin_ia32_roundps256:
+ case X86::BI__builtin_ia32_roundpd256: {
+ unsigned m =
+ ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
+ constexpr unsigned mxcsrMask = 0b100;
+ constexpr unsigned fRoundNoExcMask = 0b1000;
+ unsigned useMXCSR = mxcsrMask & m;
+ unsigned fRoundNoExc = fRoundNoExcMask & m;
+
+ mlir::Location loc = getLoc(expr->getExprLoc());
+
+ if (useMXCSR || !fRoundNoExc) {
+ StringRef intrinsicName;
+ switch (builtinID) {
+ default:
+ llvm_unreachable("Unexpected builtin");
+ case X86::BI__builtin_ia32_roundps:
+ intrinsicName = "x86.sse41.round.ps";
+ break;
+ case X86::BI__builtin_ia32_roundpd:
+ intrinsicName = "x86.sse41.round.pd";
+ break;
+ case X86::BI__builtin_ia32_roundps256:
+ intrinsicName = "x86.avx.round.ps.256";
+ break;
+ case X86::BI__builtin_ia32_roundpd256:
+ intrinsicName = "x86.avx.round.pd.256";
+ break;
+ }
+
+ mlir::Type resTy = ops[0].getType();
+ return builder.emitIntrinsicCallOp(loc, intrinsicName, resTy, ops);
+ }
+
+ return emitX86RoundImmediate(builder, loc, ops[0], m);
+ }
+ case X86::BI__builtin_ia32_roundss:
+ case X86::BI__builtin_ia32_roundsd: {
----------------
borysperski wrote:
Thanks, done.
https://github.com/llvm/llvm-project/pull/215787
More information about the cfe-commits
mailing list