@@ -609,37 +609,79 @@ 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__une:
616+ case RTLIB::__aeabi_fcmpeq__une:
617+ // Usage in the eq case, so we have to invert the comparison.
618+ return ISD::SETEQ;
619+ case RTLIB::__aeabi_dcmpeq__oeq:
620+ case RTLIB::__aeabi_fcmpeq__oeq:
621+ // Normal comparison to boolean value.
622+ return ISD::SETNE;
623+ case RTLIB::__aeabi_dcmplt:
624+ case RTLIB::__aeabi_dcmple:
625+ case RTLIB::__aeabi_dcmpge:
626+ case RTLIB::__aeabi_dcmpgt:
627+ case RTLIB::__aeabi_dcmpun:
628+ case RTLIB::__aeabi_fcmplt:
629+ case RTLIB::__aeabi_fcmple:
630+ case RTLIB::__aeabi_fcmpge:
631+ case RTLIB::__aeabi_fcmpgt:
632+ // / The AEABI versions return a typical boolean value, so we can compare
633+ // / against the integer result as simply != 0.
634+ return ISD::SETNE;
635+ default :
636+ break ;
637+ }
638+
639+ // Assume libgcc/compiler-rt behavior. Most of the cases are really aliases of
640+ // each other, and return a 3-way comparison style result of -1, 0, or 1
641+ // depending on lt/eq/gt.
642+ //
643+ // FIXME: It would be cleaner to directly express this as a 3-way comparison
644+ // soft FP libcall instead of individual compares.
645+ RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl (Impl);
646+ switch (LC) {
647+ case RTLIB::OEQ_F32:
648+ case RTLIB::OEQ_F64:
649+ case RTLIB::OEQ_F128:
650+ case RTLIB::OEQ_PPCF128:
651+ return ISD::SETEQ;
652+ case RTLIB::UNE_F32:
653+ case RTLIB::UNE_F64:
654+ case RTLIB::UNE_F128:
655+ case RTLIB::UNE_PPCF128:
656+ return ISD::SETNE;
657+ case RTLIB::OGE_F32:
658+ case RTLIB::OGE_F64:
659+ case RTLIB::OGE_F128:
660+ case RTLIB::OGE_PPCF128:
661+ return ISD::SETGE;
662+ case RTLIB::OLT_F32:
663+ case RTLIB::OLT_F64:
664+ case RTLIB::OLT_F128:
665+ case RTLIB::OLT_PPCF128:
666+ return ISD::SETLT;
667+ case RTLIB::OLE_F32:
668+ case RTLIB::OLE_F64:
669+ case RTLIB::OLE_F128:
670+ case RTLIB::OLE_PPCF128:
671+ return ISD::SETLE;
672+ case RTLIB::OGT_F32:
673+ case RTLIB::OGT_F64:
674+ case RTLIB::OGT_F128:
675+ case RTLIB::OGT_PPCF128:
676+ return ISD::SETGT;
677+ case RTLIB::UO_F32:
678+ case RTLIB::UO_F64:
679+ case RTLIB::UO_F128:
680+ case RTLIB::UO_PPCF128:
681+ return ISD::SETNE;
682+ default :
683+ llvm_unreachable (" not a compare libcall" );
684+ }
643685}
644686
645687// / NOTE: The TargetMachine owns TLOF.
@@ -678,8 +720,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
678720
679721 MinCmpXchgSizeInBits = 0 ;
680722 SupportsUnalignedAtomics = false ;
681-
682- RTLIB::initCmpLibcallCCs (CmpLibcallCCs);
683723}
684724
685725// Define the virtual destructor out-of-line to act as a key method to anchor
0 commit comments