• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=sparc -mattr=hard-quad-float | FileCheck %s --check-prefix=HARD
2; RUN: llc < %s -march=sparc -mattr=-hard-quad-float | FileCheck %s --check-prefix=SOFT
3
4
5; HARD-LABEL: f128_ops
6; HARD:       ldd
7; HARD:       ldd
8; HARD:       ldd
9; HARD:       ldd
10; HARD:       faddq [[R0:.+]],  [[R1:.+]],  [[R2:.+]]
11; HARD:       fsubq [[R2]], [[R3:.+]], [[R4:.+]]
12; HARD:       fmulq [[R4]], [[R5:.+]], [[R6:.+]]
13; HARD:       fdivq [[R6]], [[R2]]
14; HARD:       std
15; HARD:       std
16
17; SOFT-LABEL: f128_ops
18; SOFT:       ldd
19; SOFT:       ldd
20; SOFT:       ldd
21; SOFT:       ldd
22; SOFT:       call _Q_add
23; SOFT:       call _Q_sub
24; SOFT:       call _Q_mul
25; SOFT:       call _Q_div
26; SOFT:       std
27; SOFT:       std
28
29define void @f128_ops(fp128* noalias sret %scalar.result, fp128* byval %a, fp128* byval %b, fp128* byval %c, fp128* byval %d) {
30entry:
31  %0 = load fp128, fp128* %a, align 8
32  %1 = load fp128, fp128* %b, align 8
33  %2 = load fp128, fp128* %c, align 8
34  %3 = load fp128, fp128* %d, align 8
35  %4 = fadd fp128 %0, %1
36  %5 = fsub fp128 %4, %2
37  %6 = fmul fp128 %5, %3
38  %7 = fdiv fp128 %6, %4
39  store fp128 %7, fp128* %scalar.result, align 8
40  ret void
41}
42
43; HARD-LABEL: f128_spill
44; HARD:       std %f{{.+}}, [%[[S0:.+]]]
45; HARD:       std %f{{.+}}, [%[[S1:.+]]]
46; HARD-DAG:   ldd [%[[S0]]], %f{{.+}}
47; HARD-DAG:   ldd [%[[S1]]], %f{{.+}}
48; HARD:       jmp {{%[oi]7}}+12
49
50; SOFT-LABEL: f128_spill
51; SOFT:       std %f{{.+}}, [%[[S0:.+]]]
52; SOFT:       std %f{{.+}}, [%[[S1:.+]]]
53; SOFT-DAG:   ldd [%[[S0]]], %f{{.+}}
54; SOFT-DAG:   ldd [%[[S1]]], %f{{.+}}
55; SOFT:       jmp {{%[oi]7}}+12
56
57define void @f128_spill(fp128* noalias sret %scalar.result, fp128* byval %a) {
58entry:
59  %0 = load fp128, fp128* %a, align 8
60  call void asm sideeffect "", "~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f11},~{f12},~{f13},~{f14},~{f15},~{f16},~{f17},~{f18},~{f19},~{f20},~{f21},~{f22},~{f23},~{f24},~{f25},~{f26},~{f27},~{f28},~{f29},~{f30},~{f31}"()
61  store fp128 %0, fp128* %scalar.result, align 8
62  ret void
63}
64
65; HARD-LABEL: f128_compare
66; HARD:       fcmpq
67; HARD-NEXT:  nop
68
69; SOFT-LABEL: f128_compare
70; SOFT:       _Q_cmp
71
72define i32 @f128_compare(fp128* byval %f0, fp128* byval %f1, i32 %a, i32 %b) {
73entry:
74   %0 = load fp128, fp128* %f0, align 8
75   %1 = load fp128, fp128* %f1, align 8
76   %cond = fcmp ult fp128 %0, %1
77   %ret = select i1 %cond, i32 %a, i32 %b
78   ret i32 %ret
79}
80
81; HARD-LABEL: f128_compare2
82; HARD:       fcmpq
83; HARD:       fb{{ule|g}}
84
85; SOFT-LABEL: f128_compare2
86; SOFT:       _Q_cmp
87; SOFT:       cmp
88
89define i32 @f128_compare2() {
90entry:
91  %0 = fcmp ogt fp128 undef, 0xL00000000000000000000000000000000
92  br i1 %0, label %"5", label %"7"
93
94"5":                                              ; preds = %entry
95  ret i32 0
96
97"7":                                              ; preds = %entry
98  ret i32 1
99}
100
101
102; HARD-LABEL: f128_abs
103; HARD:       fabss
104
105; SOFT-LABEL: f128_abs
106; SOFT:       fabss
107
108define void @f128_abs(fp128* noalias sret %scalar.result, fp128* byval %a) {
109entry:
110  %0 = load fp128, fp128* %a, align 8
111  %1 = tail call fp128 @llvm.fabs.f128(fp128 %0)
112  store fp128 %1, fp128* %scalar.result, align 8
113  ret void
114}
115
116declare fp128 @llvm.fabs.f128(fp128) nounwind readonly
117
118; HARD-LABEL: int_to_f128
119; HARD:       fitoq
120
121; SOFT-LABEL: int_to_f128
122; SOFT:       _Q_itoq
123
124define void @int_to_f128(fp128* noalias sret %scalar.result, i32 %i) {
125entry:
126  %0 = sitofp i32 %i to fp128
127  store fp128 %0, fp128* %scalar.result, align 8
128  ret void
129}
130
131; HARD-LABEL: fp128_unaligned
132; HARD:       ldub
133; HARD:       faddq
134; HARD:       stb
135; HARD:       ret
136
137; SOFT-LABEL: fp128_unaligned
138; SOFT:       ldub
139; SOFT:       call _Q_add
140; SOFT:       stb
141; SOFT:       ret
142
143define void @fp128_unaligned(fp128* %a, fp128* %b, fp128* %c) {
144entry:
145  %0 = load fp128, fp128* %a, align 1
146  %1 = load fp128, fp128* %b, align 1
147  %2 = fadd fp128 %0, %1
148  store fp128 %2, fp128* %c, align 1
149  ret void
150}
151
152; HARD-LABEL: uint_to_f128
153; HARD:       fdtoq
154
155; SOFT-LABEL: uint_to_f128
156; SOFT:       _Q_utoq
157
158define void @uint_to_f128(fp128* noalias sret %scalar.result, i32 %i) {
159entry:
160  %0 = uitofp i32 %i to fp128
161  store fp128 %0, fp128* %scalar.result, align 8
162  ret void
163}
164
165; HARD-LABEL: f128_to_i32
166; HARD:       fqtoi
167; HARD:       fqtoi
168
169; SOFT-LABEL: f128_to_i32
170; SOFT:       call _Q_qtou
171; SOFT:       call _Q_qtoi
172
173
174define i32 @f128_to_i32(fp128* %a, fp128* %b) {
175entry:
176  %0 = load fp128, fp128* %a, align 8
177  %1 = load fp128, fp128* %b, align 8
178  %2 = fptoui fp128 %0 to i32
179  %3 = fptosi fp128 %1 to i32
180  %4 = add i32 %2, %3
181  ret i32 %4
182}
183
184; HARD-LABEL:    test_itoq_qtoi
185; HARD-DAG:      call _Q_lltoq
186; HARD-DAG:      call _Q_qtoll
187; HARD-DAG:      fitoq
188; HARD-DAG:      fqtoi
189
190; SOFT-LABEL:    test_itoq_qtoi
191; SOFT-DAG:      call _Q_lltoq
192; SOFT-DAG:      call _Q_qtoll
193; SOFT-DAG:      call _Q_itoq
194; SOFT-DAG:      call _Q_qtoi
195
196define void @test_itoq_qtoi(i64 %a, i32 %b, fp128* %c, fp128* %d, i64* %ptr0, fp128* %ptr1) {
197entry:
198  %0 = sitofp i64 %a to fp128
199  store  fp128 %0, fp128* %ptr1, align 8
200  %cval = load fp128, fp128* %c, align 8
201  %1 = fptosi fp128 %cval to i64
202  store  i64 %1, i64* %ptr0, align 8
203  %2 = sitofp i32 %b to fp128
204  store  fp128 %2, fp128* %ptr1, align 8
205  %dval = load fp128, fp128* %d, align 8
206  %3 = fptosi fp128 %dval to i32
207  %4 = bitcast i64* %ptr0 to i32*
208  store  i32 %3, i32* %4, align 8
209  ret void
210}
211
212; HARD-LABEL:    test_utoq_qtou
213; HARD-DAG:      call _Q_ulltoq
214; HARD-DAG:      call _Q_qtoull
215; HARD-DAG:      fdtoq
216; HARD-DAG:      fqtoi
217
218; SOFT-LABEL:    test_utoq_qtou
219; SOFT-DAG:      call _Q_ulltoq
220; SOFT-DAG:      call _Q_qtoull
221; SOFT-DAG:      call _Q_utoq
222; SOFT-DAG:      call _Q_qtou
223
224define void @test_utoq_qtou(i64 %a, i32 %b, fp128* %c, fp128* %d, i64* %ptr0, fp128* %ptr1) {
225entry:
226  %0 = uitofp i64 %a to fp128
227  store  fp128 %0, fp128* %ptr1, align 8
228  %cval = load fp128, fp128* %c, align 8
229  %1 = fptoui fp128 %cval to i64
230  store  i64 %1, i64* %ptr0, align 8
231  %2 = uitofp i32 %b to fp128
232  store  fp128 %2, fp128* %ptr1, align 8
233  %dval = load fp128, fp128* %d, align 8
234  %3 = fptoui fp128 %dval to i32
235  %4 = bitcast i64* %ptr0 to i32*
236  store  i32 %3, i32* %4, align 8
237  ret void
238}
239
240; SOFT-LABEL:     f128_neg
241; SOFT:           fnegs
242
243define void @f128_neg(fp128* noalias sret %scalar.result, fp128* byval %a) {
244entry:
245  %0 = load fp128, fp128* %a, align 8
246  %1 = fsub fp128 0xL00000000000000008000000000000000, %0
247  store fp128 %1, fp128* %scalar.result, align 8
248  ret void
249}
250