Remove llvm-upgrade.
[oota-llvm.git] / test / CodeGen / ARM / vfp.ll
1 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
2 ; RUN:   grep fabs | count 2
3 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
4 ; RUN:   grep fmscs | count 1
5 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
6 ; RUN:   grep fcvt | count 2
7 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
8 ; RUN:   grep fuito | count 2
9 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
10 ; RUN:   grep fto.i | count 4
11 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
12 ; RUN:   grep bmi | count 1
13 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
14 ; RUN:   grep bgt | count 1
15 ; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | \
16 ; RUN:   grep fcmpezs | count 1
17
18 define void @test(float* %P, double* %D) {
19         %A = load float* %P             ; <float> [#uses=1]
20         %B = load double* %D            ; <double> [#uses=1]
21         store float %A, float* %P
22         store double %B, double* %D
23         ret void
24 }
25
26 declare float @fabsf(float)
27
28 declare double @fabs(double)
29
30 define void @test_abs(float* %P, double* %D) {
31         %a = load float* %P             ; <float> [#uses=1]
32         %b = call float @fabsf( float %a )              ; <float> [#uses=1]
33         store float %b, float* %P
34         %A = load double* %D            ; <double> [#uses=1]
35         %B = call double @fabs( double %A )             ; <double> [#uses=1]
36         store double %B, double* %D
37         ret void
38 }
39
40 define void @test_add(float* %P, double* %D) {
41         %a = load float* %P             ; <float> [#uses=2]
42         %b = add float %a, %a           ; <float> [#uses=1]
43         store float %b, float* %P
44         %A = load double* %D            ; <double> [#uses=2]
45         %B = add double %A, %A          ; <double> [#uses=1]
46         store double %B, double* %D
47         ret void
48 }
49
50 define void @test_ext_round(float* %P, double* %D) {
51         %a = load float* %P             ; <float> [#uses=1]
52         %b = fpext float %a to double           ; <double> [#uses=1]
53         %A = load double* %D            ; <double> [#uses=1]
54         %B = fptrunc double %A to float         ; <float> [#uses=1]
55         store double %b, double* %D
56         store float %B, float* %P
57         ret void
58 }
59
60 define void @test_fma(float* %P1, float* %P2, float* %P3) {
61         %a1 = load float* %P1           ; <float> [#uses=1]
62         %a2 = load float* %P2           ; <float> [#uses=1]
63         %a3 = load float* %P3           ; <float> [#uses=1]
64         %X = mul float %a1, %a2         ; <float> [#uses=1]
65         %Y = sub float %X, %a3          ; <float> [#uses=1]
66         store float %Y, float* %P1
67         ret void
68 }
69
70 define i32 @test_ftoi(float* %P1) {
71         %a1 = load float* %P1           ; <float> [#uses=1]
72         %b1 = fptosi float %a1 to i32           ; <i32> [#uses=1]
73         ret i32 %b1
74 }
75
76 define i32 @test_ftou(float* %P1) {
77         %a1 = load float* %P1           ; <float> [#uses=1]
78         %b1 = fptoui float %a1 to i32           ; <i32> [#uses=1]
79         ret i32 %b1
80 }
81
82 define i32 @test_dtoi(double* %P1) {
83         %a1 = load double* %P1          ; <double> [#uses=1]
84         %b1 = fptosi double %a1 to i32          ; <i32> [#uses=1]
85         ret i32 %b1
86 }
87
88 define i32 @test_dtou(double* %P1) {
89         %a1 = load double* %P1          ; <double> [#uses=1]
90         %b1 = fptoui double %a1 to i32          ; <i32> [#uses=1]
91         ret i32 %b1
92 }
93
94 define void @test_utod(double* %P1, i32 %X) {
95         %b1 = uitofp i32 %X to double           ; <double> [#uses=1]
96         store double %b1, double* %P1
97         ret void
98 }
99
100 define void @test_utod2(double* %P1, i8 %X) {
101         %b1 = uitofp i8 %X to double            ; <double> [#uses=1]
102         store double %b1, double* %P1
103         ret void
104 }
105
106 define void @test_cmp(float* %glob, i32 %X) {
107 entry:
108         %tmp = load float* %glob                ; <float> [#uses=2]
109         %tmp3 = getelementptr float* %glob, i32 2               ; <float*> [#uses=1]
110         %tmp4 = load float* %tmp3               ; <float> [#uses=2]
111         %tmp.upgrd.1 = fcmp oeq float %tmp, %tmp4               ; <i1> [#uses=1]
112         %tmp5 = fcmp uno float %tmp, %tmp4              ; <i1> [#uses=1]
113         %tmp6 = or i1 %tmp.upgrd.1, %tmp5               ; <i1> [#uses=1]
114         br i1 %tmp6, label %cond_true, label %cond_false
115
116 cond_true:              ; preds = %entry
117         %tmp.upgrd.2 = tail call i32 (...)* @bar( )             ; <i32> [#uses=0]
118         ret void
119
120 cond_false:             ; preds = %entry
121         %tmp7 = tail call i32 (...)* @baz( )            ; <i32> [#uses=0]
122         ret void
123 }
124
125 declare i1 @llvm.isunordered.f32(float, float)
126
127 declare i32 @bar(...)
128
129 declare i32 @baz(...)
130
131 define void @test_cmpfp0(float* %glob, i32 %X) {
132 entry:
133         %tmp = load float* %glob                ; <float> [#uses=1]
134         %tmp.upgrd.3 = fcmp ogt float %tmp, 0.000000e+00                ; <i1> [#uses=1]
135         br i1 %tmp.upgrd.3, label %cond_true, label %cond_false
136
137 cond_true:              ; preds = %entry
138         %tmp.upgrd.4 = tail call i32 (...)* @bar( )             ; <i32> [#uses=0]
139         ret void
140
141 cond_false:             ; preds = %entry
142         %tmp1 = tail call i32 (...)* @baz( )            ; <i32> [#uses=0]
143         ret void
144 }