================
@@ -4119,6 +4119,229 @@ static bool interp__builtin_ia32_gfni_mul(InterpState 
&S, CodePtr OpPC,
   return true;
 }
 
+static bool interp__builtin_x86_comi(InterpState &S, CodePtr OpPC,
+                                     const InterpFrame *Frame,
+                                     const CallExpr *Call, unsigned ID) {
+  uint32_t Predicate;
+  switch (ID) {
+  case X86::BI__builtin_ia32_comieq:
+  case X86::BI__builtin_ia32_ucomieq:
+  case X86::BI__builtin_ia32_comisdeq:
+  case X86::BI__builtin_ia32_ucomisdeq:
+    Predicate = X86CmpImm::CMP_EQ_OQ;
+    break;
+  case X86::BI__builtin_ia32_comilt:
+  case X86::BI__builtin_ia32_ucomilt:
+  case X86::BI__builtin_ia32_comisdlt:
+  case X86::BI__builtin_ia32_ucomisdlt:
+    Predicate = X86CmpImm::CMP_LT_OQ;
+    break;
+  case X86::BI__builtin_ia32_comile:
+  case X86::BI__builtin_ia32_ucomile:
+  case X86::BI__builtin_ia32_comisdle:
+  case X86::BI__builtin_ia32_ucomisdle:
+    Predicate = X86CmpImm::CMP_LE_OQ;
+    break;
+  case X86::BI__builtin_ia32_comigt:
+  case X86::BI__builtin_ia32_ucomigt:
+  case X86::BI__builtin_ia32_comisdgt:
+  case X86::BI__builtin_ia32_ucomisdgt:
+    Predicate = X86CmpImm::CMP_GT_OQ;
+    break;
+  case X86::BI__builtin_ia32_comige:
+  case X86::BI__builtin_ia32_ucomige:
+  case X86::BI__builtin_ia32_comisdge:
+  case X86::BI__builtin_ia32_ucomisdge:
+    Predicate = X86CmpImm::CMP_GE_OQ;
+    break;
+  case X86::BI__builtin_ia32_comineq:
+  case X86::BI__builtin_ia32_ucomineq:
+  case X86::BI__builtin_ia32_comisdneq:
+  case X86::BI__builtin_ia32_ucomisdneq:
+    Predicate = X86CmpImm::CMP_NEQ_UQ;
+    break;
+  case X86::BI__builtin_ia32_vcomish: {
+    discard(S.Stk, *S.getContext().classify(Call->getArg(3)));
+    Predicate = popToUInt64(S, Call->getArg(2));
+    break;
+  }
+  default:
+    llvm_unreachable("unhandled x86 comi builtin");
+  }
+
+  const Pointer &VectorB = S.Stk.pop<Pointer>();
+  const Pointer &VectorA = S.Stk.pop<Pointer>();
+
+  if (VectorA.getNumElems() == 0 ||
+      VectorA.getNumElems() != VectorB.getNumElems())
+    return false;
+
+  llvm::APFloat A = VectorA.elem<Floating>(0).getAPFloat();
+  llvm::APFloat B = VectorB.elem<Floating>(0).getAPFloat();
+  bool Matches = MatchesPredicate(Predicate, A.compare(B));
+  pushInteger(S, Matches, Call->getType());
+  return true;
+}
+
+static bool interp__builtin_x86_cmp(InterpState &S, CodePtr OpPC,
+                                    const InterpFrame *Frame,
+                                    const CallExpr *Call, unsigned ID) {
+  const bool HasImmArg =
----------------
tbaederr wrote:

```suggestion
  bool HasImmArg =
```

https://github.com/llvm/llvm-project/pull/182589
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to