; RUN: llc -O0 < %s | FileCheck %s target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16" target triple = "msp430---elf" @g_double = global double 123.0, align 8 @g_float = global float 123.0, align 8 @g_i32 = global i32 123, align 8 @g_i64 = global i64 456, align 8 @g_i16 = global i16 789, align 8 define float @d2f() #0 { entry: ; CHECK: d2f: ; CHECK: call #__mspabi_cvtdf %0 = load volatile double, double* @g_double, align 8 %1 = fptrunc double %0 to float ret float %1 } define double @f2d() #0 { entry: ; CHECK: f2d: ; CHECK: call #__mspabi_cvtfd %0 = load volatile float, float* @g_float, align 8 %1 = fpext float %0 to double ret double %1 } define i32 @d2l() #0 { entry: ; CHECK: d2l: ; CHECK: call #__mspabi_fixdli %0 = load volatile double, double* @g_double, align 8 %1 = fptosi double %0 to i32 ret i32 %1 } define i64 @d2ll() #0 { entry: ; CHECK: d2ll: ; CHECK: call #__mspabi_fixdlli %0 = load volatile double, double* @g_double, align 8 %1 = fptosi double %0 to i64 ret i64 %1 } define i32 @d2ul() #0 { entry: ; CHECK: d2ul: ; CHECK: call #__mspabi_fixdul %0 = load volatile double, double* @g_double, align 8 %1 = fptoui double %0 to i32 ret i32 %1 } define i64 @d2ull() #0 { entry: ; CHECK: d2ull: ; CHECK: call #__mspabi_fixdull %0 = load volatile double, double* @g_double, align 8 %1 = fptoui double %0 to i64 ret i64 %1 } define i32 @f2l() #0 { entry: ; CHECK: f2l: ; CHECK: call #__mspabi_fixfli %0 = load volatile float, float* @g_float, align 8 %1 = fptosi float %0 to i32 ret i32 %1 } define i64 @f2ll() #0 { entry: ; CHECK: f2ll: ; CHECK: call #__mspabi_fixflli %0 = load volatile float, float* @g_float, align 8 %1 = fptosi float %0 to i64 ret i64 %1 } define i32 @f2ul() #0 { entry: ; CHECK: f2ul: ; CHECK: call #__mspabi_fixful %0 = load volatile float, float* @g_float, align 8 %1 = fptoui float %0 to i32 ret i32 %1 } define i64 @f2ull() #0 { entry: ; CHECK: f2ull: ; CHECK: call #__mspabi_fixfull %0 = load volatile float, float* @g_float, align 8 %1 = fptoui float %0 to i64 ret i64 %1 } define double @l2d() #0 { entry: ; CHECK: l2d: ; CHECK: call #__mspabi_fltlid %0 = load volatile i32, i32* @g_i32, align 8 %1 = sitofp i32 %0 to double ret double %1 } define double @ll2d() #0 { entry: ; CHECK: ll2d: ; CHECK: call #__mspabi_fltllid %0 = load volatile i64, i64* @g_i64, align 8 %1 = sitofp i64 %0 to double ret double %1 } define double @ul2d() #0 { entry: ; CHECK: ul2d: ; CHECK: call #__mspabi_fltuld %0 = load volatile i32, i32* @g_i32, align 8 %1 = uitofp i32 %0 to double ret double %1 } define double @ull2d() #0 { entry: ; CHECK: ull2d: ; CHECK: call #__mspabi_fltulld %0 = load volatile i64, i64* @g_i64, align 8 %1 = uitofp i64 %0 to double ret double %1 } define float @l2f() #0 { entry: ; CHECK: l2f: ; CHECK: call #__mspabi_fltlif %0 = load volatile i32, i32* @g_i32, align 8 %1 = sitofp i32 %0 to float ret float %1 } define float @ll2f() #0 { entry: ; CHECK: ll2f: ; CHECK: call #__mspabi_fltllif %0 = load volatile i64, i64* @g_i64, align 8 %1 = sitofp i64 %0 to float ret float %1 } define float @ul2f() #0 { entry: ; CHECK: ul2f: ; CHECK: call #__mspabi_fltulf %0 = load volatile i32, i32* @g_i32, align 8 %1 = uitofp i32 %0 to float ret float %1 } define float @ull2f() #0 { entry: ; CHECK: ull2f: ; CHECK: call #__mspabi_fltullf %0 = load volatile i64, i64* @g_i64, align 8 %1 = uitofp i64 %0 to float ret float %1 } define i1 @cmpd_oeq() #0 { entry: ; CHECK: cmpd_oeq: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp oeq double %0, 123.0 ret i1 %1 } define i1 @cmpd_une() #0 { entry: ; CHECK: cmpd_une: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp une double %0, 123.0 ret i1 %1 } define i1 @cmpd_oge() #0 { entry: ; CHECK: cmpd_oge: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp oge double %0, 123.0 ret i1 %1 } define i1 @cmpd_olt() #0 { entry: ; CHECK: cmpd_olt: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp olt double %0, 123.0 ret i1 %1 } define i1 @cmpd_ole() #0 { entry: ; CHECK: cmpd_ole: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp ole double %0, 123.0 ret i1 %1 } define i1 @cmpd_ogt() #0 { entry: ; CHECK: cmpd_ogt: ; CHECK: call #__mspabi_cmpd %0 = load volatile double, double* @g_double, align 8 %1 = fcmp ogt double %0, 123.0 ret i1 %1 } define i1 @cmpf_oeq() #0 { entry: ; CHECK: cmpf_oeq: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp oeq float %0, 123.0 ret i1 %1 } define i1 @cmpf_une() #0 { entry: ; CHECK: cmpf_une: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp une float %0, 123.0 ret i1 %1 } define i1 @cmpf_oge() #0 { entry: ; CHECK: cmpf_oge: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp oge float %0, 123.0 ret i1 %1 } define i1 @cmpf_olt() #0 { entry: ; CHECK: cmpf_olt: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp olt float %0, 123.0 ret i1 %1 } define i1 @cmpf_ole() #0 { entry: ; CHECK: cmpf_ole: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp ole float %0, 123.0 ret i1 %1 } define i1 @cmpf_ogt() #0 { entry: ; CHECK: cmpf_ogt: ; CHECK: call #__mspabi_cmpf %0 = load volatile float, float* @g_float, align 8 %1 = fcmp ogt float %0, 123.0 ret i1 %1 } define double @addd() #0 { entry: ; CHECK: addd: ; CHECK: call #__mspabi_addd %0 = load volatile double, double* @g_double, align 8 %1 = fadd double %0, 123.0 ret double %1 } define float @addf() #0 { entry: ; CHECK: addf: ; CHECK: call #__mspabi_addf %0 = load volatile float, float* @g_float, align 8 %1 = fadd float %0, 123.0 ret float %1 } define double @divd() #0 { entry: ; CHECK: divd: ; CHECK: call #__mspabi_divd %0 = load volatile double, double* @g_double, align 8 %1 = fdiv double %0, 123.0 ret double %1 } define float @divf() #0 { entry: ; CHECK: divf: ; CHECK: call #__mspabi_divf %0 = load volatile float, float* @g_float, align 8 %1 = fdiv float %0, 123.0 ret float %1 } define double @mpyd() #0 { entry: ; CHECK: mpyd: ; CHECK: call #__mspabi_mpyd %0 = load volatile double, double* @g_double, align 8 %1 = fmul double %0, 123.0 ret double %1 } define float @mpyf() #0 { entry: ; CHECK: mpyf: ; CHECK: call #__mspabi_mpyf %0 = load volatile float, float* @g_float, align 8 %1 = fmul float %0, 123.0 ret float %1 } define double @subd() #0 { entry: ; CHECK: subd: ; CHECK: call #__mspabi_subd %0 = load volatile double, double* @g_double, align 8 %1 = fsub double %0, %0 ret double %1 } define float @subf() #0 { entry: ; CHECK: subf: ; CHECK: call #__mspabi_subf %0 = load volatile float, float* @g_float, align 8 %1 = fsub float %0, %0 ret float %1 } define i16 @divi() #0 { entry: ; CHECK: divi: ; CHECK: call #__mspabi_divi %0 = load volatile i16, i16* @g_i16, align 8 %1 = load volatile i16, i16* @g_i16, align 8 %2 = sdiv i16 %0, %1 ret i16 %2 } define i32 @divli() #0 { entry: ; CHECK: divli: ; CHECK: call #__mspabi_divli %0 = load volatile i32, i32* @g_i32, align 8 %1 = load volatile i32, i32* @g_i32, align 8 %2 = sdiv i32 %0, %1 ret i32 %2 } define i64 @divlli() #0 { entry: ; CHECK: divlli: ; CHECK: call #__mspabi_divlli %0 = load volatile i64, i64* @g_i64, align 8 %1 = load volatile i64, i64* @g_i64, align 8 %2 = sdiv i64 %0, %1 ret i64 %2 } define i16 @divu() #0 { entry: ; CHECK: divu: ; CHECK: call #__mspabi_divu %0 = load volatile i16, i16* @g_i16, align 8 %1 = load volatile i16, i16* @g_i16, align 8 %2 = udiv i16 %0, %1 ret i16 %2 } define i32 @divul() #0 { entry: ; CHECK: divul: ; CHECK: call #__mspabi_divul %0 = load volatile i32, i32* @g_i32, align 8 %1 = load volatile i32, i32* @g_i32, align 8 %2 = udiv i32 %0, %1 ret i32 %2 } define i64 @divull() #0 { entry: ; CHECK: divull: ; CHECK: call #__mspabi_divull %0 = load volatile i64, i64* @g_i64, align 8 %1 = load volatile i64, i64* @g_i64, align 8 %2 = udiv i64 %0, %1 ret i64 %2 } define i16 @remi() #0 { entry: ; CHECK: remi: ; CHECK: call #__mspabi_remi %0 = load volatile i16, i16* @g_i16, align 8 %1 = load volatile i16, i16* @g_i16, align 8 %2 = srem i16 %0, %1 ret i16 %2 } define i32 @remli() #0 { entry: ; CHECK: remli: ; CHECK: call #__mspabi_remli %0 = load volatile i32, i32* @g_i32, align 8 %1 = load volatile i32, i32* @g_i32, align 8 %2 = srem i32 %0, %1 ret i32 %2 } define i64 @remlli() #0 { entry: ; CHECK: remlli: ; CHECK: call #__mspabi_remlli %0 = load volatile i64, i64* @g_i64, align 8 %1 = load volatile i64, i64* @g_i64, align 8 %2 = srem i64 %0, %1 ret i64 %2 } define i16 @remu() #0 { entry: ; CHECK: remu: ; CHECK: call #__mspabi_remu %0 = load volatile i16, i16* @g_i16, align 8 %1 = load volatile i16, i16* @g_i16, align 8 %2 = urem i16 %0, %1 ret i16 %2 } define i32 @remul() #0 { entry: ; CHECK: remul: ; CHECK: call #__mspabi_remul %0 = load volatile i32, i32* @g_i32, align 8 %1 = load volatile i32, i32* @g_i32, align 8 %2 = urem i32 %0, %1 ret i32 %2 } define i64 @remull() #0 { entry: ; CHECK: remull: ; CHECK: call #__mspabi_remull %0 = load volatile i64, i64* @g_i64, align 8 %1 = load volatile i64, i64* @g_i64, align 8 %2 = urem i64 %0, %1 ret i64 %2 } define i16 @mpyi() #0 { entry: ; CHECK: mpyi: ; CHECK: call #__mspabi_mpyi %0 = load volatile i16, i16* @g_i16, align 8 %1 = mul i16 %0, %0 ret i16 %1 } define i32 @mpyli() #0 { entry: ; CHECK: mpyli: ; CHECK: call #__mspabi_mpyl %0 = load volatile i32, i32* @g_i32, align 8 %1 = mul i32 %0, %0 ret i32 %1 } define i64 @mpylli() #0 { entry: ; CHECK: mpylli: ; CHECK: call #__mspabi_mpyll %0 = load volatile i64, i64* @g_i64, align 8 %1 = mul i64 %0, %0 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 }