================
@@ -6662,6 +6725,225 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC,
const CallExpr *Call,
return llvm::maximum(A, B);
});
+ // COMI and UCOMI produce the same boolean result, but keep their signaling
+ // and quiet predicates distinct to reflect their different floating-point
+ // exception behavior, even though constant evaluation does not expose it.
+ case X86::BI__builtin_ia32_comieq:
+ case X86::BI__builtin_ia32_comisdeq:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_EQ_OS);
+
+ case X86::BI__builtin_ia32_ucomieq:
+ case X86::BI__builtin_ia32_ucomisdeq:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_EQ_OQ);
+
+ case X86::BI__builtin_ia32_comilt:
+ case X86::BI__builtin_ia32_comisdlt:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_LT_OS);
+
+ case X86::BI__builtin_ia32_ucomilt:
+ case X86::BI__builtin_ia32_ucomisdlt:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_LT_OQ);
+
+ case X86::BI__builtin_ia32_comile:
+ case X86::BI__builtin_ia32_comisdle:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_LE_OS);
+
+ case X86::BI__builtin_ia32_ucomile:
+ case X86::BI__builtin_ia32_ucomisdle:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_LE_OQ);
+
+ case X86::BI__builtin_ia32_comigt:
+ case X86::BI__builtin_ia32_comisdgt:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_GT_OS);
+
+ case X86::BI__builtin_ia32_ucomigt:
+ case X86::BI__builtin_ia32_ucomisdgt:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_GT_OQ);
+
+ case X86::BI__builtin_ia32_comige:
+ case X86::BI__builtin_ia32_comisdge:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_GE_OS);
+
+ case X86::BI__builtin_ia32_ucomige:
+ case X86::BI__builtin_ia32_ucomisdge:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_GE_OQ);
+
+ case X86::BI__builtin_ia32_comineq:
+ case X86::BI__builtin_ia32_comisdneq:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_NEQ_US);
+
+ case X86::BI__builtin_ia32_ucomineq:
+ case X86::BI__builtin_ia32_ucomisdneq:
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
+ X86CmpImm::CMP_NEQ_UQ);
+
+ case X86::BI__builtin_ia32_vcomish: {
+ uint64_t Predicate;
+ discard(S.Stk, *S.getContext().classify(Call->getArg(3)));
+ if (!popToUInt64(S, Call->getArg(2), Predicate))
+ return false;
+ return interp__builtin_x86_comi(S, OpPC, Frame, Call, BuiltinID,
Predicate);
+ }
+
+ case X86::BI__builtin_ia32_cmpps:
+ case X86::BI__builtin_ia32_cmppd:
+ case X86::BI__builtin_ia32_cmpps256:
+ case X86::BI__builtin_ia32_cmppd256:
+ case X86::BI__builtin_ia32_cmpss:
+ case X86::BI__builtin_ia32_cmpsd: {
+ uint64_t Predicate;
+ if (!popToUInt64(S, Call->getArg(2), Predicate))
+ return false;
+
+ bool IsScalar = (BuiltinID == X86::BI__builtin_ia32_cmpss ||
+ BuiltinID == X86::BI__builtin_ia32_cmpsd);
+
+ return interp__builtin_x86_cmp(S, OpPC, Frame, Call, BuiltinID, Predicate,
+ IsScalar);
+ }
+
+ case X86::BI__builtin_ia32_cmpeqss:
+ case X86::BI__builtin_ia32_cmpeqsd:
+ case X86::BI__builtin_ia32_cmpeqps:
+ case X86::BI__builtin_ia32_cmpeqpd: {
+ bool IsScalar = (BuiltinID == X86::BI__builtin_ia32_cmpeqss ||
+ BuiltinID == X86::BI__builtin_ia32_cmpeqsd);
+
+ return interp__builtin_x86_cmp(S, OpPC, Frame, Call, BuiltinID,
----------------
ZakyHermawan wrote:
Yup, this looks cleaner
https://github.com/llvm/llvm-project/pull/182589
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits