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

Reply via email to