[mips][msa] Added support for matching fmadd.[wd] from normal IR (i.e. not intrinsics)
[oota-llvm.git] / test / CodeGen / Mips / msa / 2rf_exup.ll
1 ; Test the MSA floating point conversion intrinsics (e.g. float->double) that
2 ; are encoded with the 2RF instruction format.
3
4 ; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s
5
6 @llvm_mips_fexupl_w_ARG1 = global <8 x half> <half 0.000000e+00, half 1.000000e+00, half 2.000000e+00, half 3.000000e+00, half 4.000000e+00, half 5.000000e+00, half 6.000000e+00, half 7.000000e+00>, align 16
7 @llvm_mips_fexupl_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
8
9 define void @llvm_mips_fexupl_w_test() nounwind {
10 entry:
11   %0 = load <8 x half>* @llvm_mips_fexupl_w_ARG1
12   %1 = tail call <4 x float> @llvm.mips.fexupl.w(<8 x half> %0)
13   store <4 x float> %1, <4 x float>* @llvm_mips_fexupl_w_RES
14   ret void
15 }
16
17 declare <4 x float> @llvm.mips.fexupl.w(<8 x half>) nounwind
18
19 ; CHECK: llvm_mips_fexupl_w_test:
20 ; CHECK: ld.h
21 ; CHECK: fexupl.w
22 ; CHECK: st.w
23 ; CHECK: .size llvm_mips_fexupl_w_test
24 ;
25 @llvm_mips_fexupl_d_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
26 @llvm_mips_fexupl_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
27
28 define void @llvm_mips_fexupl_d_test() nounwind {
29 entry:
30   %0 = load <4 x float>* @llvm_mips_fexupl_d_ARG1
31   %1 = tail call <2 x double> @llvm.mips.fexupl.d(<4 x float> %0)
32   store <2 x double> %1, <2 x double>* @llvm_mips_fexupl_d_RES
33   ret void
34 }
35
36 declare <2 x double> @llvm.mips.fexupl.d(<4 x float>) nounwind
37
38 ; CHECK: llvm_mips_fexupl_d_test:
39 ; CHECK: ld.w
40 ; CHECK: fexupl.d
41 ; CHECK: st.d
42 ; CHECK: .size llvm_mips_fexupl_d_test
43 ;
44 @llvm_mips_fexupr_w_ARG1 = global <8 x half> <half 0.000000e+00, half 1.000000e+00, half 2.000000e+00, half 3.000000e+00, half 4.000000e+00, half 5.000000e+00, half 6.000000e+00, half 7.000000e+00>, align 16
45 @llvm_mips_fexupr_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
46
47 define void @llvm_mips_fexupr_w_test() nounwind {
48 entry:
49   %0 = load <8 x half>* @llvm_mips_fexupr_w_ARG1
50   %1 = tail call <4 x float> @llvm.mips.fexupr.w(<8 x half> %0)
51   store <4 x float> %1, <4 x float>* @llvm_mips_fexupr_w_RES
52   ret void
53 }
54
55 declare <4 x float> @llvm.mips.fexupr.w(<8 x half>) nounwind
56
57 ; CHECK: llvm_mips_fexupr_w_test:
58 ; CHECK: ld.h
59 ; CHECK: fexupr.w
60 ; CHECK: st.w
61 ; CHECK: .size llvm_mips_fexupr_w_test
62 ;
63 @llvm_mips_fexupr_d_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
64 @llvm_mips_fexupr_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
65
66 define void @llvm_mips_fexupr_d_test() nounwind {
67 entry:
68   %0 = load <4 x float>* @llvm_mips_fexupr_d_ARG1
69   %1 = tail call <2 x double> @llvm.mips.fexupr.d(<4 x float> %0)
70   store <2 x double> %1, <2 x double>* @llvm_mips_fexupr_d_RES
71   ret void
72 }
73
74 declare <2 x double> @llvm.mips.fexupr.d(<4 x float>) nounwind
75
76 ; CHECK: llvm_mips_fexupr_d_test:
77 ; CHECK: ld.w
78 ; CHECK: fexupr.d
79 ; CHECK: st.d
80 ; CHECK: .size llvm_mips_fexupr_d_test
81 ;