diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp --- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp +++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp @@ -195,19 +195,9 @@ // The following IS implemented in libgcc but is not in the EABI { RTLIB::UINTTOFP_I64_F32, "__mspabi_fltullf", ISD::SETCC_INVALID }, - // Floating point comparisons - EABI Table 7 - { RTLIB::OEQ_F64, "__mspabi_cmpd", ISD::SETEQ }, - { RTLIB::UNE_F64, "__mspabi_cmpd", ISD::SETNE }, - { RTLIB::OGE_F64, "__mspabi_cmpd", ISD::SETGE }, - { RTLIB::OLT_F64, "__mspabi_cmpd", ISD::SETLT }, - { RTLIB::OLE_F64, "__mspabi_cmpd", ISD::SETLE }, - { RTLIB::OGT_F64, "__mspabi_cmpd", ISD::SETGT }, - { RTLIB::OEQ_F32, "__mspabi_cmpf", ISD::SETEQ }, - { RTLIB::UNE_F32, "__mspabi_cmpf", ISD::SETNE }, - { RTLIB::OGE_F32, "__mspabi_cmpf", ISD::SETGE }, - { RTLIB::OLT_F32, "__mspabi_cmpf", ISD::SETLT }, - { RTLIB::OLE_F32, "__mspabi_cmpf", ISD::SETLE }, - { RTLIB::OGT_F32, "__mspabi_cmpf", ISD::SETGT }, + // NOT using __mspabi_cmp[fd] to compare floating point numbers because + // EABI Section 6.2 says the result is undefined if either argument is NaN. + // There are helpers with the traditional names in libgcc. // Floating point arithmetic - EABI Table 8 { RTLIB::ADD_F64, "__mspabi_addd", ISD::SETCC_INVALID }, @@ -323,12 +313,6 @@ setLibcallCallingConv(RTLIB::SUB_F64, CallingConv::MSP430_BUILTIN); setLibcallCallingConv(RTLIB::MUL_F64, CallingConv::MSP430_BUILTIN); setLibcallCallingConv(RTLIB::DIV_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::OEQ_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::UNE_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::OGE_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::OLT_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::OLE_F64, CallingConv::MSP430_BUILTIN); - setLibcallCallingConv(RTLIB::OGT_F64, CallingConv::MSP430_BUILTIN); // TODO: __mspabi_srall, __mspabi_srlll, __mspabi_sllll setMinFunctionAlignment(Align(2)); diff --git a/llvm/test/CodeGen/MSP430/cmp-return-type.ll b/llvm/test/CodeGen/MSP430/cmp-return-type.ll --- a/llvm/test/CodeGen/MSP430/cmp-return-type.ll +++ b/llvm/test/CodeGen/MSP430/cmp-return-type.ll @@ -6,17 +6,17 @@ define i16 @f(float %a, float %b) optsize { %cmp = fcmp une float %a, %b %conv = zext i1 %cmp to i16 -; CHECK-LABEL: call #__mspabi_cmpf +; CHECK-LABEL: call #__nesf2 ; CHECK-NOT: r13 ; CHECK-LABEL: mov r2 ; This is quite fragile attempt to detect the return type: ; Correct: -; call #__mspabi_cmpf +; call #__nesf2 ; tst r12 ; mov r2, r13 ; Incorrect: -; call #__mspabi_cmpf +; call #__nesf2 ; bis r12, r13 <-- checking (R12:R13) ; tst r13 ; mov r2, r13 diff --git a/llvm/test/CodeGen/MSP430/libcalls.ll b/llvm/test/CodeGen/MSP430/libcalls.ll --- a/llvm/test/CodeGen/MSP430/libcalls.ll +++ b/llvm/test/CodeGen/MSP430/libcalls.ll @@ -211,7 +211,7 @@ entry: ; CHECK: cmpd_oeq: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__eqdf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp oeq double %0, 123.0 @@ -222,7 +222,7 @@ entry: ; CHECK: cmpd_une: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__nedf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp une double %0, 123.0 @@ -233,7 +233,7 @@ entry: ; CHECK: cmpd_oge: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__gedf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp oge double %0, 123.0 @@ -244,7 +244,7 @@ entry: ; CHECK: cmpd_olt: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__ltdf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp olt double %0, 123.0 @@ -255,7 +255,7 @@ entry: ; CHECK: cmpd_ole: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__ledf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp ole double %0, 123.0 @@ -266,7 +266,7 @@ entry: ; CHECK: cmpd_ogt: -; CHECK: call #__mspabi_cmpd +; CHECK: call #__gtdf2 %0 = load volatile double, double* @g_double, align 8 %1 = fcmp ogt double %0, 123.0 @@ -277,7 +277,7 @@ entry: ; CHECK: cmpf_oeq: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__eqsf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp oeq float %0, 123.0 @@ -288,7 +288,7 @@ entry: ; CHECK: cmpf_une: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__nesf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp une float %0, 123.0 @@ -299,7 +299,7 @@ entry: ; CHECK: cmpf_oge: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__gesf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp oge float %0, 123.0 @@ -310,7 +310,7 @@ entry: ; CHECK: cmpf_olt: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__ltsf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp olt float %0, 123.0 @@ -321,7 +321,7 @@ entry: ; CHECK: cmpf_ole: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__lesf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp ole float %0, 123.0 @@ -332,7 +332,7 @@ entry: ; CHECK: cmpf_ogt: -; CHECK: call #__mspabi_cmpf +; CHECK: call #__gtsf2 %0 = load volatile float, float* @g_float, align 8 %1 = fcmp ogt float %0, 123.0