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
4
5
6define i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind readnone noinline {
7entry:
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
19}
20
21
22define i32 @test_select_int_icc(i32 %a, i32 %b, i32 %c) nounwind readnone noinline {
23entry:
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
34}
35
36
37define float @test_select_fp_icc(i32 %a, float %f1, float %f2) nounwind readnone noinline {
38entry:
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
49}
50
51define double @test_select_dfp_icc(i32 %a, double %f1, double %f2) nounwind readnone noinline {
52entry:
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
63}
64
65define i32 @test_select_int_fcc(float %f, i32 %a, i32 %b) nounwind readnone noinline {
66entry:
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-NEXT-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
79}
80
81
82define float @test_select_fp_fcc(float %f, float %f1, float %f2) nounwind readnone noinline {
83entry:
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
94}
95
96define double @test_select_dfp_fcc(double %f, double %f1, double %f2) nounwind readnone noinline {
97entry:
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-NEXT-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
110}
111
112define i32 @test_float_cc(double %a, double %b, i32 %c, i32 %d) {
113entry:
114; V8-LABEL: test_float_cc
115; V8:       fcmpd
116; V8:       {{fbl|fbuge}} .LBB
117; V8:       fcmpd
118; V8:       {{fbule|fbg}} .LBB
119
120; V9-LABEL: test_float_cc
121; V9:       fcmpd
122; V9:       {{fbl|fbuge}} .LBB
123; V9:       fcmpd
124; V9:       {{fbule|fbg}} .LBB
125
126   %0 = fcmp uge double %a, 0.000000e+00
127   br i1 %0, label %loop, label %loop.2
128
129loop:
130   %1 = icmp eq i32 %c, 10
131   br i1 %1, label %loop, label %exit.0
132
133loop.2:
134   %2 = fcmp ogt double %b, 0.000000e+00
135   br i1 %2, label %exit.1, label %loop
136
137exit.0:
138   ret i32 0
139
140exit.1:
141   ret i32 1
142}
143
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
153
154
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
164
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
174
175
176define void @test_adde_sube(i8* %a, i8* %b, i8* %sum, i8* %diff) {
177entry:
178   %0 = bitcast i8* %a to i128*
179   %1 = bitcast i8* %b to i128*
180   %2 = load i128* %0
181   %3 = load 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* %0
187   %7 = sub i128 %2, %6
188   %8 = bitcast i8* %diff to i128*
189   store i128 %7, i128* %8
190   ret void
191}
192