Index: llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp +++ llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp @@ -217,8 +217,6 @@ // { RTLIB::NEG_F64, "__mspabi_negd", ISD::SETCC_INVALID }, // { RTLIB::NEG_F32, "__mspabi_negf", ISD::SETCC_INVALID }, - // TODO: SLL/SRA/SRL are in libgcc, RLL isn't - // Universal Integer Operations - EABI Table 9 { RTLIB::SDIV_I16, "__mspabi_divi", ISD::SETCC_INVALID }, { RTLIB::SDIV_I32, "__mspabi_divli", ISD::SETCC_INVALID }, @@ -233,6 +231,13 @@ { RTLIB::UREM_I32, "__mspabi_remul", ISD::SETCC_INVALID }, { RTLIB::UREM_I64, "__mspabi_remull", ISD::SETCC_INVALID }, + // Bitwise Operations - EABI Table 10 + // TODO: __mspabi_[srli/srai/slli] ARE implemented in libgcc + { RTLIB::SRL_I32, "__mspabi_srll", ISD::SETCC_INVALID }, + { RTLIB::SRA_I32, "__mspabi_sral", ISD::SETCC_INVALID }, + { RTLIB::SHL_I32, "__mspabi_slll", ISD::SETCC_INVALID }, + // __mspabi_[srlll/srall/sllll/rlli/rlll] are NOT implemented in libgcc + }; for (const auto &LC : LibraryCalls) { Index: llvm/trunk/test/CodeGen/MSP430/libcalls.ll =================================================================== --- llvm/trunk/test/CodeGen/MSP430/libcalls.ll +++ llvm/trunk/test/CodeGen/MSP430/libcalls.ll @@ -604,4 +604,39 @@ ret i64 %1 } +@i = external global i32, align 2 + +define i32 @srll() #0 { +entry: +; CHECK-LABEL: srll: +; CHECK: call #__mspabi_srll + %0 = load volatile i32, i32* @g_i32, align 2 + %1 = load volatile i32, i32* @i, align 2 + %shr = lshr i32 %0, %1 + + ret i32 %shr +} + +define i32 @sral() #0 { +entry: +; CHECK-LABEL: sral: +; CHECK: call #__mspabi_sral + %0 = load volatile i32, i32* @g_i32, align 2 + %1 = load volatile i32, i32* @i, align 2 + %shr = ashr i32 %0, %1 + + ret i32 %shr +} + +define i32 @slll() #0 { +entry: +; CHECK-LABEL: slll: +; CHECK: call #__mspabi_slll + %0 = load volatile i32, i32* @g_i32, align 2 + %1 = load volatile i32, i32* @i, align 2 + %shr = shl i32 %0, %1 + + ret i32 %shr +} + attributes #0 = { nounwind }