Skip to content

Commit 211bb3d

Browse files
committed
ARM: Stop using setCmpLibcallCC in MachO case
setCmpLibcallCC appears to be a hack to express a non 0/1 return value difference in the eabi case that's only relevant when expanding unordered compares. I see no test changes if I remove this case.
1 parent 437b160 commit 211bb3d

File tree

1 file changed

+55
-57
lines changed

1 file changed

+55
-57
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 55 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -523,67 +523,65 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
523523
Subtarget->hasARMOps() && !Subtarget->useSoftFloat()) {
524524
static const struct {
525525
const RTLIB::Libcall Op;
526-
const char * const Name;
527-
const ISD::CondCode Cond;
526+
const char *const Name;
528527
} LibraryCalls[] = {
529-
// Single-precision floating-point arithmetic.
530-
{ RTLIB::ADD_F32, "__addsf3vfp", ISD::SETCC_INVALID },
531-
{ RTLIB::SUB_F32, "__subsf3vfp", ISD::SETCC_INVALID },
532-
{ RTLIB::MUL_F32, "__mulsf3vfp", ISD::SETCC_INVALID },
533-
{ RTLIB::DIV_F32, "__divsf3vfp", ISD::SETCC_INVALID },
534-
535-
// Double-precision floating-point arithmetic.
536-
{ RTLIB::ADD_F64, "__adddf3vfp", ISD::SETCC_INVALID },
537-
{ RTLIB::SUB_F64, "__subdf3vfp", ISD::SETCC_INVALID },
538-
{ RTLIB::MUL_F64, "__muldf3vfp", ISD::SETCC_INVALID },
539-
{ RTLIB::DIV_F64, "__divdf3vfp", ISD::SETCC_INVALID },
540-
541-
// Single-precision comparisons.
542-
{ RTLIB::OEQ_F32, "__eqsf2vfp", ISD::SETNE },
543-
{ RTLIB::UNE_F32, "__nesf2vfp", ISD::SETNE },
544-
{ RTLIB::OLT_F32, "__ltsf2vfp", ISD::SETNE },
545-
{ RTLIB::OLE_F32, "__lesf2vfp", ISD::SETNE },
546-
{ RTLIB::OGE_F32, "__gesf2vfp", ISD::SETNE },
547-
{ RTLIB::OGT_F32, "__gtsf2vfp", ISD::SETNE },
548-
{ RTLIB::UO_F32, "__unordsf2vfp", ISD::SETNE },
549-
550-
// Double-precision comparisons.
551-
{ RTLIB::OEQ_F64, "__eqdf2vfp", ISD::SETNE },
552-
{ RTLIB::UNE_F64, "__nedf2vfp", ISD::SETNE },
553-
{ RTLIB::OLT_F64, "__ltdf2vfp", ISD::SETNE },
554-
{ RTLIB::OLE_F64, "__ledf2vfp", ISD::SETNE },
555-
{ RTLIB::OGE_F64, "__gedf2vfp", ISD::SETNE },
556-
{ RTLIB::OGT_F64, "__gtdf2vfp", ISD::SETNE },
557-
{ RTLIB::UO_F64, "__unorddf2vfp", ISD::SETNE },
558-
559-
// Floating-point to integer conversions.
560-
// i64 conversions are done via library routines even when generating VFP
561-
// instructions, so use the same ones.
562-
{ RTLIB::FPTOSINT_F64_I32, "__fixdfsivfp", ISD::SETCC_INVALID },
563-
{ RTLIB::FPTOUINT_F64_I32, "__fixunsdfsivfp", ISD::SETCC_INVALID },
564-
{ RTLIB::FPTOSINT_F32_I32, "__fixsfsivfp", ISD::SETCC_INVALID },
565-
{ RTLIB::FPTOUINT_F32_I32, "__fixunssfsivfp", ISD::SETCC_INVALID },
566-
567-
// Conversions between floating types.
568-
{ RTLIB::FPROUND_F64_F32, "__truncdfsf2vfp", ISD::SETCC_INVALID },
569-
{ RTLIB::FPEXT_F32_F64, "__extendsfdf2vfp", ISD::SETCC_INVALID },
570-
571-
// Integer to floating-point conversions.
572-
// i64 conversions are done via library routines even when generating VFP
573-
// instructions, so use the same ones.
574-
// FIXME: There appears to be some naming inconsistency in ARM libgcc:
575-
// e.g., __floatunsidf vs. __floatunssidfvfp.
576-
{ RTLIB::SINTTOFP_I32_F64, "__floatsidfvfp", ISD::SETCC_INVALID },
577-
{ RTLIB::UINTTOFP_I32_F64, "__floatunssidfvfp", ISD::SETCC_INVALID },
578-
{ RTLIB::SINTTOFP_I32_F32, "__floatsisfvfp", ISD::SETCC_INVALID },
579-
{ RTLIB::UINTTOFP_I32_F32, "__floatunssisfvfp", ISD::SETCC_INVALID },
528+
// Single-precision floating-point arithmetic.
529+
{RTLIB::ADD_F32, "__addsf3vfp"},
530+
{RTLIB::SUB_F32, "__subsf3vfp"},
531+
{RTLIB::MUL_F32, "__mulsf3vfp"},
532+
{RTLIB::DIV_F32, "__divsf3vfp"},
533+
534+
// Double-precision floating-point arithmetic.
535+
{RTLIB::ADD_F64, "__adddf3vfp"},
536+
{RTLIB::SUB_F64, "__subdf3vfp"},
537+
{RTLIB::MUL_F64, "__muldf3vfp"},
538+
{RTLIB::DIV_F64, "__divdf3vfp"},
539+
540+
// Single-precision comparisons.
541+
{RTLIB::OEQ_F32, "__eqsf2vfp"},
542+
{RTLIB::UNE_F32, "__nesf2vfp"},
543+
{RTLIB::OLT_F32, "__ltsf2vfp"},
544+
{RTLIB::OLE_F32, "__lesf2vfp"},
545+
{RTLIB::OGE_F32, "__gesf2vfp"},
546+
{RTLIB::OGT_F32, "__gtsf2vfp"},
547+
{RTLIB::UO_F32, "__unordsf2vfp"},
548+
549+
// Double-precision comparisons.
550+
{RTLIB::OEQ_F64, "__eqdf2vfp"},
551+
{RTLIB::UNE_F64, "__nedf2vfp"},
552+
{RTLIB::OLT_F64, "__ltdf2vfp"},
553+
{RTLIB::OLE_F64, "__ledf2vfp"},
554+
{RTLIB::OGE_F64, "__gedf2vfp"},
555+
{RTLIB::OGT_F64, "__gtdf2vfp"},
556+
{RTLIB::UO_F64, "__unorddf2vfp"},
557+
558+
// Floating-point to integer conversions.
559+
// i64 conversions are done via library routines even when generating
560+
// VFP
561+
// instructions, so use the same ones.
562+
{RTLIB::FPTOSINT_F64_I32, "__fixdfsivfp"},
563+
{RTLIB::FPTOUINT_F64_I32, "__fixunsdfsivfp"},
564+
{RTLIB::FPTOSINT_F32_I32, "__fixsfsivfp"},
565+
{RTLIB::FPTOUINT_F32_I32, "__fixunssfsivfp"},
566+
567+
// Conversions between floating types.
568+
{RTLIB::FPROUND_F64_F32, "__truncdfsf2vfp"},
569+
{RTLIB::FPEXT_F32_F64, "__extendsfdf2vfp"},
570+
571+
// Integer to floating-point conversions.
572+
// i64 conversions are done via library routines even when generating
573+
// VFP
574+
// instructions, so use the same ones.
575+
// FIXME: There appears to be some naming inconsistency in ARM libgcc:
576+
// e.g., __floatunsidf vs. __floatunssidfvfp.
577+
{RTLIB::SINTTOFP_I32_F64, "__floatsidfvfp"},
578+
{RTLIB::UINTTOFP_I32_F64, "__floatunssidfvfp"},
579+
{RTLIB::SINTTOFP_I32_F32, "__floatsisfvfp"},
580+
{RTLIB::UINTTOFP_I32_F32, "__floatunssisfvfp"},
580581
};
581582

582-
for (const auto &LC : LibraryCalls) {
583+
for (const auto &LC : LibraryCalls)
583584
setLibcallName(LC.Op, LC.Name);
584-
if (LC.Cond != ISD::SETCC_INVALID)
585-
setCmpLibcallCC(LC.Op, LC.Cond);
586-
}
587585
}
588586
}
589587

0 commit comments

Comments
 (0)