[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SPARC / 2011-01-11-CC.ll
blob6b738e386c3a49e47a2f91e8c3aa9a504a268987
1 ; RUN: llc -march=sparc <%s | FileCheck %s -check-prefix=V8
2 ; RUN: llc -march=sparc -mattr=v9 <%s | FileCheck %s -check-prefix=V9
3 ; RUN: llc -mtriple=sparc64-unknown-linux <%s | FileCheck %s -check-prefix=SPARC64
6 define i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind readnone noinline {
7 entry:
8 ; V8: addcc
9 ; V8-NOT: subcc
10 ; V8: addx
11 ; V9: addcc
12 ; V9-NOT: subcc
13 ; V9: addx
14 ; V9: mov{{e|ne}} %icc
15   %0 = add i64 %a, %b
16   %1 = icmp ugt i64 %0, %c
17   %2 = zext i1 %1 to i32
18   ret i32 %2
22 define i32 @test_select_int_icc(i32 %a, i32 %b, i32 %c) nounwind readnone noinline {
23 entry:
24 ; V8: test_select_int_icc
25 ; V8: cmp
26 ; V8: {{be|bne}}
27 ; V9: test_select_int_icc
28 ; V9: cmp
29 ; V9-NOT: {{be|bne}}
30 ; V9: mov{{e|ne}} %icc
31   %0 = icmp eq i32 %a, 0
32   %1 = select i1 %0, i32 %b, i32 %c
33   ret i32 %1
37 define float @test_select_fp_icc(i32 %a, float %f1, float %f2) nounwind readnone noinline {
38 entry:
39 ; V8: test_select_fp_icc
40 ; V8: cmp
41 ; V8: {{be|bne}}
42 ; V9: test_select_fp_icc
43 ; V9: cmp
44 ; V9-NOT: {{be|bne}}
45 ; V9: fmovs{{e|ne}} %icc
46   %0 = icmp eq i32 %a, 0
47   %1 = select i1 %0, float %f1, float %f2
48   ret float %1
51 define double @test_select_dfp_icc(i32 %a, double %f1, double %f2) nounwind readnone noinline {
52 entry:
53 ; V8: test_select_dfp_icc
54 ; V8: cmp
55 ; V8: {{be|bne}}
56 ; V9: test_select_dfp_icc
57 ; V9: cmp
58 ; V9-NOT: {{be|bne}}
59 ; V9: fmovd{{e|ne}} %icc
60   %0 = icmp eq i32 %a, 0
61   %1 = select i1 %0, double %f1, double %f2
62   ret double %1
65 define i32 @test_select_int_fcc(float %f, i32 %a, i32 %b) nounwind readnone noinline {
66 entry:
67 ;V8-LABEL: test_select_int_fcc:
68 ;V8: fcmps
69 ;V8-NEXT: nop
70 ;V8: {{fbe|fbne}}
71 ;V9-LABEL: test_select_int_fcc:
72 ;V9: fcmps
73 ;V9-NOT: nop
74 ;V9-NOT: {{fbe|fbne}}
75 ;V9: mov{{e|ne}} %fcc0
76   %0 = fcmp une float %f, 0.000000e+00
77   %a.b = select i1 %0, i32 %a, i32 %b
78   ret i32 %a.b
82 define float @test_select_fp_fcc(float %f, float %f1, float %f2) nounwind readnone noinline {
83 entry:
84 ;V8-LABEL: test_select_fp_fcc:
85 ;V8: fcmps
86 ;V8: {{fbe|fbne}}
87 ;V9-LABEL: test_select_fp_fcc:
88 ;V9: fcmps
89 ;V9-NOT: {{fbe|fbne}}
90 ;V9: fmovs{{e|ne}} %fcc0
91   %0 = fcmp une float %f, 0.000000e+00
92   %1 = select i1 %0, float %f1, float %f2
93   ret float %1
96 define double @test_select_dfp_fcc(double %f, double %f1, double %f2) nounwind readnone noinline {
97 entry:
98 ;V8-LABEL: test_select_dfp_fcc:
99 ;V8: fcmpd
100 ;V8-NEXT: nop
101 ;V8: {{fbne|fbe}}
102 ;V9-LABEL: test_select_dfp_fcc:
103 ;V9: fcmpd
104 ;V9-NOT: nop
105 ;V9-NOT: {{fbne|fbe}}
106 ;V9: fmovd{{e|ne}} %fcc0
107   %0 = fcmp une double %f, 0.000000e+00
108   %1 = select i1 %0, double %f1, double %f2
109   ret double %1
112 define i32 @test_float_cc(double %a, double %b, i32 %c, i32 %d) {
113 entry:
114 ; V8-LABEL: test_float_cc
115 ; V8:       fcmpd
116 ; V8:       {{fbl|fbuge}} .LBB
117 ; V8:       fcmpd
118 ; V8:       {{fbule|fbg}} .LBB
120 ; V9-LABEL: test_float_cc
121 ; V9:       fcmpd
122 ; V9:       {{fbl|fbuge}} .LBB
123 ; V9:       fcmpd
124 ; V9:       {{fbule|fbg}} .LBB
126    %0 = fcmp uge double %a, 0.000000e+00
127    br i1 %0, label %loop, label %loop.2
129 loop:
130    %1 = icmp eq i32 %c, 10
131    br i1 %1, label %loop, label %exit.0
133 loop.2:
134    %2 = fcmp ogt double %b, 0.000000e+00
135    br i1 %2, label %exit.1, label %loop
137 exit.0:
138    ret i32 0
140 exit.1:
141    ret i32 1
144 ; V8-LABEL: test_adde_sube
145 ; V8:       addcc
146 ; V8:       addxcc
147 ; V8:       addxcc
148 ; V8:       addxcc
149 ; V8:       subcc
150 ; V8:       subxcc
151 ; V8:       subxcc
152 ; V8:       subxcc
155 ; V9-LABEL: test_adde_sube
156 ; V9:       addcc
157 ; V9:       addxcc
158 ; V9:       addxcc
159 ; V9:       addxcc
160 ; V9:       subcc
161 ; V9:       subxcc
162 ; V9:       subxcc
163 ; V9:       subxcc
165 ; SPARC64-LABEL: test_adde_sube
166 ; SPARC64:       addcc
167 ; SPARC64:       addxcc
168 ; SPARC64:       addxcc
169 ; SPARC64:       addxcc
170 ; SPARC64:       subcc
171 ; SPARC64:       subxcc
172 ; SPARC64:       subxcc
173 ; SPARC64:       subxcc
176 define void @test_adde_sube(i8* %a, i8* %b, i8* %sum, i8* %diff) {
177 entry:
178    %0 = bitcast i8* %a to i128*
179    %1 = bitcast i8* %b to i128*
180    %2 = load i128, i128* %0
181    %3 = load i128, i128* %1
182    %4 = add i128 %2, %3
183    %5 = bitcast i8* %sum to i128*
184    store i128 %4, i128* %5
185    tail call void asm sideeffect "", "=*m,*m"(i128 *%0, i128* %5) nounwind
186    %6 = load i128, i128* %0
187    %7 = sub i128 %2, %6
188    %8 = bitcast i8* %diff to i128*
189    store i128 %7, i128* %8
190    ret void