[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