| ; 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 = sdiv i16 %0, %0 | |
| ret i16 %1 | |
| } | |
| define i32 @divli() #0 { | |
| entry: | |
| ; CHECK: divli: | |
| ; CHECK: call #__mspabi_divli | |
| %0 = load volatile i32, i32* @g_i32, align 8 | |
| %1 = sdiv i32 %0, %0 | |
| ret i32 %1 | |
| } | |
| define i64 @divlli() #0 { | |
| entry: | |
| ; CHECK: divlli: | |
| ; CHECK: call #__mspabi_divlli | |
| %0 = load volatile i64, i64* @g_i64, align 8 | |
| %1 = sdiv i64 %0, %0 | |
| ret i64 %1 | |
| } | |
| define i16 @divu() #0 { | |
| entry: | |
| ; CHECK: divu: | |
| ; CHECK: call #__mspabi_divu | |
| %0 = load volatile i16, i16* @g_i16, align 8 | |
| %1 = udiv i16 %0, %0 | |
| ret i16 %1 | |
| } | |
| define i32 @divul() #0 { | |
| entry: | |
| ; CHECK: divul: | |
| ; CHECK: call #__mspabi_divul | |
| %0 = load volatile i32, i32* @g_i32, align 8 | |
| %1 = udiv i32 %0, %0 | |
| ret i32 %1 | |
| } | |
| define i64 @divull() #0 { | |
| entry: | |
| ; CHECK: divull: | |
| ; CHECK: call #__mspabi_divull | |
| %0 = load volatile i64, i64* @g_i64, align 8 | |
| %1 = udiv i64 %0, %0 | |
| ret i64 %1 | |
| } | |
| define i16 @remi() #0 { | |
| entry: | |
| ; CHECK: remi: | |
| ; CHECK: call #__mspabi_remi | |
| %0 = load volatile i16, i16* @g_i16, align 8 | |
| %1 = srem i16 %0, %0 | |
| ret i16 %1 | |
| } | |
| define i32 @remli() #0 { | |
| entry: | |
| ; CHECK: remli: | |
| ; CHECK: call #__mspabi_remli | |
| %0 = load volatile i32, i32* @g_i32, align 8 | |
| %1 = srem i32 %0, %0 | |
| ret i32 %1 | |
| } | |
| define i64 @remlli() #0 { | |
| entry: | |
| ; CHECK: remlli: | |
| ; CHECK: call #__mspabi_remlli | |
| %0 = load volatile i64, i64* @g_i64, align 8 | |
| %1 = srem i64 %0, %0 | |
| ret i64 %1 | |
| } | |
| define i16 @remu() #0 { | |
| entry: | |
| ; CHECK: remu: | |
| ; CHECK: call #__mspabi_remu | |
| %0 = load volatile i16, i16* @g_i16, align 8 | |
| %1 = urem i16 %0, %0 | |
| ret i16 %1 | |
| } | |
| define i32 @remul() #0 { | |
| entry: | |
| ; CHECK: remul: | |
| ; CHECK: call #__mspabi_remul | |
| %0 = load volatile i32, i32* @g_i32, align 8 | |
| %1 = urem i32 %0, %0 | |
| ret i32 %1 | |
| } | |
| define i64 @remull() #0 { | |
| entry: | |
| ; CHECK: remull: | |
| ; CHECK: call #__mspabi_remull | |
| %0 = load volatile i64, i64* @g_i64, align 8 | |
| %1 = urem i64 %0, %0 | |
| ret i64 %1 | |
| } | |
| 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 | |
| } | |
| attributes #0 = { nounwind } |