@@ -597,37 +597,80 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
597597 }
598598}
599599
600- void RTLIB::initCmpLibcallCCs (ISD::CondCode *CmpLibcallCCs) {
601- std::fill (CmpLibcallCCs, CmpLibcallCCs + RTLIB::UNKNOWN_LIBCALL,
602- ISD::SETCC_INVALID);
603- CmpLibcallCCs[RTLIB::OEQ_F32] = ISD::SETEQ;
604- CmpLibcallCCs[RTLIB::OEQ_F64] = ISD::SETEQ;
605- CmpLibcallCCs[RTLIB::OEQ_F128] = ISD::SETEQ;
606- CmpLibcallCCs[RTLIB::OEQ_PPCF128] = ISD::SETEQ;
607- CmpLibcallCCs[RTLIB::UNE_F32] = ISD::SETNE;
608- CmpLibcallCCs[RTLIB::UNE_F64] = ISD::SETNE;
609- CmpLibcallCCs[RTLIB::UNE_F128] = ISD::SETNE;
610- CmpLibcallCCs[RTLIB::UNE_PPCF128] = ISD::SETNE;
611- CmpLibcallCCs[RTLIB::OGE_F32] = ISD::SETGE;
612- CmpLibcallCCs[RTLIB::OGE_F64] = ISD::SETGE;
613- CmpLibcallCCs[RTLIB::OGE_F128] = ISD::SETGE;
614- CmpLibcallCCs[RTLIB::OGE_PPCF128] = ISD::SETGE;
615- CmpLibcallCCs[RTLIB::OLT_F32] = ISD::SETLT;
616- CmpLibcallCCs[RTLIB::OLT_F64] = ISD::SETLT;
617- CmpLibcallCCs[RTLIB::OLT_F128] = ISD::SETLT;
618- CmpLibcallCCs[RTLIB::OLT_PPCF128] = ISD::SETLT;
619- CmpLibcallCCs[RTLIB::OLE_F32] = ISD::SETLE;
620- CmpLibcallCCs[RTLIB::OLE_F64] = ISD::SETLE;
621- CmpLibcallCCs[RTLIB::OLE_F128] = ISD::SETLE;
622- CmpLibcallCCs[RTLIB::OLE_PPCF128] = ISD::SETLE;
623- CmpLibcallCCs[RTLIB::OGT_F32] = ISD::SETGT;
624- CmpLibcallCCs[RTLIB::OGT_F64] = ISD::SETGT;
625- CmpLibcallCCs[RTLIB::OGT_F128] = ISD::SETGT;
626- CmpLibcallCCs[RTLIB::OGT_PPCF128] = ISD::SETGT;
627- CmpLibcallCCs[RTLIB::UO_F32] = ISD::SETNE;
628- CmpLibcallCCs[RTLIB::UO_F64] = ISD::SETNE;
629- CmpLibcallCCs[RTLIB::UO_F128] = ISD::SETNE;
630- CmpLibcallCCs[RTLIB::UO_PPCF128] = ISD::SETNE;
600+ ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate (
601+ RTLIB::LibcallImpl Impl) const {
602+ switch (Impl) {
603+ case RTLIB::__aeabi_dcmpeq__ne:
604+ return ISD::SETNE;
605+ case RTLIB::__aeabi_dcmpeq__eq:
606+ return ISD::SETEQ;
607+ case RTLIB::__aeabi_dcmplt:
608+ return ISD::SETNE;
609+ case RTLIB::__aeabi_dcmple:
610+ return ISD::SETNE;
611+ case RTLIB::__aeabi_dcmpge:
612+ return ISD::SETNE;
613+ case RTLIB::__aeabi_dcmpgt:
614+ return ISD::SETNE;
615+ case RTLIB::__aeabi_dcmpun:
616+ return ISD::SETNE;
617+ case RTLIB::__aeabi_fcmpeq__ne:
618+ return ISD::SETNE;
619+ case RTLIB::__aeabi_fcmpeq__eq:
620+ return ISD::SETEQ;
621+ case RTLIB::__aeabi_fcmplt:
622+ return ISD::SETNE;
623+ case RTLIB::__aeabi_fcmple:
624+ return ISD::SETNE;
625+ case RTLIB::__aeabi_fcmpge:
626+ return ISD::SETNE;
627+ case RTLIB::__aeabi_fcmpgt:
628+ return ISD::SETNE;
629+ default :
630+ break ;
631+ }
632+
633+ // Assume libgcc/compiler-rt behavior
634+ RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl (Impl);
635+ switch (LC) {
636+ case RTLIB::OEQ_F32:
637+ case RTLIB::OEQ_F64:
638+ case RTLIB::OEQ_F128:
639+ case RTLIB::OEQ_PPCF128:
640+ return ISD::SETEQ;
641+ case RTLIB::UNE_F32:
642+ case RTLIB::UNE_F64:
643+ case RTLIB::UNE_F128:
644+ case RTLIB::UNE_PPCF128:
645+ return ISD::SETNE;
646+ case RTLIB::OGE_F32:
647+ case RTLIB::OGE_F64:
648+ case RTLIB::OGE_F128:
649+ case RTLIB::OGE_PPCF128:
650+ return ISD::SETGE;
651+ case RTLIB::OLT_F32:
652+ case RTLIB::OLT_F64:
653+ case RTLIB::OLT_F128:
654+ case RTLIB::OLT_PPCF128:
655+ return ISD::SETLT;
656+ case RTLIB::OLE_F32:
657+ case RTLIB::OLE_F64:
658+ case RTLIB::OLE_F128:
659+ case RTLIB::OLE_PPCF128:
660+ return ISD::SETLE;
661+ case RTLIB::OGT_F32:
662+ case RTLIB::OGT_F64:
663+ case RTLIB::OGT_F128:
664+ case RTLIB::OGT_PPCF128:
665+ return ISD::SETGT;
666+ case RTLIB::UO_F32:
667+ case RTLIB::UO_F64:
668+ case RTLIB::UO_F128:
669+ case RTLIB::UO_PPCF128:
670+ return ISD::SETNE;
671+ default :
672+ llvm_unreachable (" not a compare libcall" );
673+ }
631674}
632675
633676// / NOTE: The TargetMachine owns TLOF.
@@ -666,8 +709,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
666709
667710 MinCmpXchgSizeInBits = 0 ;
668711 SupportsUnalignedAtomics = false ;
669-
670- RTLIB::initCmpLibcallCCs (CmpLibcallCCs);
671712}
672713
673714// Define the virtual destructor out-of-line to act as a key method to anchor
0 commit comments