@@ -609,37 +609,80 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
609609 }
610610}
611611
612- void RTLIB::initCmpLibcallCCs (ISD::CondCode *CmpLibcallCCs) {
613- std::fill (CmpLibcallCCs, CmpLibcallCCs + RTLIB::UNKNOWN_LIBCALL,
614- ISD::SETCC_INVALID);
615- CmpLibcallCCs[RTLIB::OEQ_F32] = ISD::SETEQ;
616- CmpLibcallCCs[RTLIB::OEQ_F64] = ISD::SETEQ;
617- CmpLibcallCCs[RTLIB::OEQ_F128] = ISD::SETEQ;
618- CmpLibcallCCs[RTLIB::OEQ_PPCF128] = ISD::SETEQ;
619- CmpLibcallCCs[RTLIB::UNE_F32] = ISD::SETNE;
620- CmpLibcallCCs[RTLIB::UNE_F64] = ISD::SETNE;
621- CmpLibcallCCs[RTLIB::UNE_F128] = ISD::SETNE;
622- CmpLibcallCCs[RTLIB::UNE_PPCF128] = ISD::SETNE;
623- CmpLibcallCCs[RTLIB::OGE_F32] = ISD::SETGE;
624- CmpLibcallCCs[RTLIB::OGE_F64] = ISD::SETGE;
625- CmpLibcallCCs[RTLIB::OGE_F128] = ISD::SETGE;
626- CmpLibcallCCs[RTLIB::OGE_PPCF128] = ISD::SETGE;
627- CmpLibcallCCs[RTLIB::OLT_F32] = ISD::SETLT;
628- CmpLibcallCCs[RTLIB::OLT_F64] = ISD::SETLT;
629- CmpLibcallCCs[RTLIB::OLT_F128] = ISD::SETLT;
630- CmpLibcallCCs[RTLIB::OLT_PPCF128] = ISD::SETLT;
631- CmpLibcallCCs[RTLIB::OLE_F32] = ISD::SETLE;
632- CmpLibcallCCs[RTLIB::OLE_F64] = ISD::SETLE;
633- CmpLibcallCCs[RTLIB::OLE_F128] = ISD::SETLE;
634- CmpLibcallCCs[RTLIB::OLE_PPCF128] = ISD::SETLE;
635- CmpLibcallCCs[RTLIB::OGT_F32] = ISD::SETGT;
636- CmpLibcallCCs[RTLIB::OGT_F64] = ISD::SETGT;
637- CmpLibcallCCs[RTLIB::OGT_F128] = ISD::SETGT;
638- CmpLibcallCCs[RTLIB::OGT_PPCF128] = ISD::SETGT;
639- CmpLibcallCCs[RTLIB::UO_F32] = ISD::SETNE;
640- CmpLibcallCCs[RTLIB::UO_F64] = ISD::SETNE;
641- CmpLibcallCCs[RTLIB::UO_F128] = ISD::SETNE;
642- CmpLibcallCCs[RTLIB::UO_PPCF128] = ISD::SETNE;
612+ ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate (
613+ RTLIB::LibcallImpl Impl) const {
614+ switch (Impl) {
615+ case RTLIB::__aeabi_dcmpeq__ne:
616+ return ISD::SETNE;
617+ case RTLIB::__aeabi_dcmpeq__eq:
618+ return ISD::SETEQ;
619+ case RTLIB::__aeabi_dcmplt:
620+ return ISD::SETNE;
621+ case RTLIB::__aeabi_dcmple:
622+ return ISD::SETNE;
623+ case RTLIB::__aeabi_dcmpge:
624+ return ISD::SETNE;
625+ case RTLIB::__aeabi_dcmpgt:
626+ return ISD::SETNE;
627+ case RTLIB::__aeabi_dcmpun:
628+ return ISD::SETNE;
629+ case RTLIB::__aeabi_fcmpeq__ne:
630+ return ISD::SETNE;
631+ case RTLIB::__aeabi_fcmpeq__eq:
632+ return ISD::SETEQ;
633+ case RTLIB::__aeabi_fcmplt:
634+ return ISD::SETNE;
635+ case RTLIB::__aeabi_fcmple:
636+ return ISD::SETNE;
637+ case RTLIB::__aeabi_fcmpge:
638+ return ISD::SETNE;
639+ case RTLIB::__aeabi_fcmpgt:
640+ return ISD::SETNE;
641+ default :
642+ break ;
643+ }
644+
645+ // Assume libgcc/compiler-rt behavior
646+ RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl (Impl);
647+ switch (LC) {
648+ case RTLIB::OEQ_F32:
649+ case RTLIB::OEQ_F64:
650+ case RTLIB::OEQ_F128:
651+ case RTLIB::OEQ_PPCF128:
652+ return ISD::SETEQ;
653+ case RTLIB::UNE_F32:
654+ case RTLIB::UNE_F64:
655+ case RTLIB::UNE_F128:
656+ case RTLIB::UNE_PPCF128:
657+ return ISD::SETNE;
658+ case RTLIB::OGE_F32:
659+ case RTLIB::OGE_F64:
660+ case RTLIB::OGE_F128:
661+ case RTLIB::OGE_PPCF128:
662+ return ISD::SETGE;
663+ case RTLIB::OLT_F32:
664+ case RTLIB::OLT_F64:
665+ case RTLIB::OLT_F128:
666+ case RTLIB::OLT_PPCF128:
667+ return ISD::SETLT;
668+ case RTLIB::OLE_F32:
669+ case RTLIB::OLE_F64:
670+ case RTLIB::OLE_F128:
671+ case RTLIB::OLE_PPCF128:
672+ return ISD::SETLE;
673+ case RTLIB::OGT_F32:
674+ case RTLIB::OGT_F64:
675+ case RTLIB::OGT_F128:
676+ case RTLIB::OGT_PPCF128:
677+ return ISD::SETGT;
678+ case RTLIB::UO_F32:
679+ case RTLIB::UO_F64:
680+ case RTLIB::UO_F128:
681+ case RTLIB::UO_PPCF128:
682+ return ISD::SETNE;
683+ default :
684+ llvm_unreachable (" not a compare libcall" );
685+ }
643686}
644687
645688// / NOTE: The TargetMachine owns TLOF.
@@ -678,8 +721,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
678721
679722 MinCmpXchgSizeInBits = 0 ;
680723 SupportsUnalignedAtomics = false ;
681-
682- RTLIB::initCmpLibcallCCs (CmpLibcallCCs);
683724}
684725
685726// Define the virtual destructor out-of-line to act as a key method to anchor
0 commit comments