643 lines
11 KiB
LLVM
643 lines
11 KiB
LLVM
; 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 }
|