2
2
; RUN: llc < %s -mtriple=sparc | FileCheck %s
3
3
; RUN: llc < %s -mtriple=sparcel | FileCheck %s --check-prefix=CHECK-LE
4
4
; RUN: llc < %s -mtriple=sparcv9 -mattr=+vis | FileCheck %s --check-prefix=CHECK-VIS
5
+ ; RUN: llc < %s -mtriple=sparcv9 -mattr=+vis,+vis3 | FileCheck %s --check-prefix=CHECK-VIS3
5
6
6
7
;; Bitcast should not do a runtime conversion, but rather emit a
7
8
;; constant into integer registers directly.
@@ -24,6 +25,12 @@ define <2 x i32> @bitcast() nounwind {
24
25
; CHECK-VIS-NEXT: sethi 1049856, %o0
25
26
; CHECK-VIS-NEXT: retl
26
27
; CHECK-VIS-NEXT: mov %g0, %o1
28
+ ;
29
+ ; CHECK-VIS3-LABEL: bitcast:
30
+ ; CHECK-VIS3: ! %bb.0:
31
+ ; CHECK-VIS3-NEXT: sethi 1049856, %o0
32
+ ; CHECK-VIS3-NEXT: retl
33
+ ; CHECK-VIS3-NEXT: mov %g0, %o1
27
34
%1 = bitcast double 5 .0 to <2 x i32 >
28
35
ret <2 x i32 > %1
29
36
}
@@ -61,6 +68,17 @@ define void @test_call() nounwind {
61
68
; CHECK-VIS-NEXT: ldd [%i0+%l44(.LCPI1_0)], %f0
62
69
; CHECK-VIS-NEXT: ret
63
70
; CHECK-VIS-NEXT: restore
71
+ ;
72
+ ; CHECK-VIS3-LABEL: test_call:
73
+ ; CHECK-VIS3: ! %bb.0:
74
+ ; CHECK-VIS3-NEXT: save %sp, -176, %sp
75
+ ; CHECK-VIS3-NEXT: sethi %h44(.LCPI1_0), %i0
76
+ ; CHECK-VIS3-NEXT: add %i0, %m44(.LCPI1_0), %i0
77
+ ; CHECK-VIS3-NEXT: sllx %i0, 12, %i0
78
+ ; CHECK-VIS3-NEXT: call a
79
+ ; CHECK-VIS3-NEXT: ldd [%i0+%l44(.LCPI1_0)], %f0
80
+ ; CHECK-VIS3-NEXT: ret
81
+ ; CHECK-VIS3-NEXT: restore
64
82
call void @a (double 5 .0 )
65
83
ret void
66
84
}
@@ -106,6 +124,19 @@ define double @test_intrins_call() nounwind {
106
124
; CHECK-VIS-NEXT: nop
107
125
; CHECK-VIS-NEXT: ret
108
126
; CHECK-VIS-NEXT: restore
127
+ ;
128
+ ; CHECK-VIS3-LABEL: test_intrins_call:
129
+ ; CHECK-VIS3: ! %bb.0:
130
+ ; CHECK-VIS3-NEXT: save %sp, -176, %sp
131
+ ; CHECK-VIS3-NEXT: sethi %h44(.LCPI2_0), %i0
132
+ ; CHECK-VIS3-NEXT: add %i0, %m44(.LCPI2_0), %i0
133
+ ; CHECK-VIS3-NEXT: sllx %i0, 12, %i0
134
+ ; CHECK-VIS3-NEXT: ldd [%i0+%l44(.LCPI2_0)], %f0
135
+ ; CHECK-VIS3-NEXT: fmovd %f0, %f2
136
+ ; CHECK-VIS3-NEXT: call pow
137
+ ; CHECK-VIS3-NEXT: nop
138
+ ; CHECK-VIS3-NEXT: ret
139
+ ; CHECK-VIS3-NEXT: restore
109
140
%1 = call double @llvm.pow.f64 (double 2 .0 , double 2 .0 )
110
141
ret double %1
111
142
}
@@ -129,6 +160,11 @@ define double @pos_zero_double() nounwind {
129
160
; CHECK-VIS: ! %bb.0:
130
161
; CHECK-VIS-NEXT: retl
131
162
; CHECK-VIS-NEXT: fzero %f0
163
+ ;
164
+ ; CHECK-VIS3-LABEL: pos_zero_double:
165
+ ; CHECK-VIS3: ! %bb.0:
166
+ ; CHECK-VIS3-NEXT: retl
167
+ ; CHECK-VIS3-NEXT: fzero %f0
132
168
ret double +0 .0
133
169
}
134
170
@@ -150,6 +186,12 @@ define double @neg_zero_double() nounwind {
150
186
; CHECK-VIS-NEXT: fzero %f0
151
187
; CHECK-VIS-NEXT: retl
152
188
; CHECK-VIS-NEXT: fnegd %f0, %f0
189
+ ;
190
+ ; CHECK-VIS3-LABEL: neg_zero_double:
191
+ ; CHECK-VIS3: ! %bb.0:
192
+ ; CHECK-VIS3-NEXT: fzero %f0
193
+ ; CHECK-VIS3-NEXT: retl
194
+ ; CHECK-VIS3-NEXT: fnegd %f0, %f0
153
195
ret double -0 .0
154
196
}
155
197
@@ -170,6 +212,11 @@ define float @pos_zero_float() nounwind {
170
212
; CHECK-VIS: ! %bb.0:
171
213
; CHECK-VIS-NEXT: retl
172
214
; CHECK-VIS-NEXT: fzeros %f0
215
+ ;
216
+ ; CHECK-VIS3-LABEL: pos_zero_float:
217
+ ; CHECK-VIS3: ! %bb.0:
218
+ ; CHECK-VIS3-NEXT: retl
219
+ ; CHECK-VIS3-NEXT: fzeros %f0
173
220
ret float +0 .0
174
221
}
175
222
@@ -191,5 +238,131 @@ define float @neg_zero_float() nounwind {
191
238
; CHECK-VIS-NEXT: fzeros %f0
192
239
; CHECK-VIS-NEXT: retl
193
240
; CHECK-VIS-NEXT: fnegs %f0, %f0
241
+ ;
242
+ ; CHECK-VIS3-LABEL: neg_zero_float:
243
+ ; CHECK-VIS3: ! %bb.0:
244
+ ; CHECK-VIS3-NEXT: fzeros %f0
245
+ ; CHECK-VIS3-NEXT: retl
246
+ ; CHECK-VIS3-NEXT: fnegs %f0, %f0
194
247
ret float -0 .0
195
248
}
249
+
250
+ ;; When we have VIS3, f32/f64 +/-0.5 constant should be materialized from sethi.
251
+
252
+ define double @pos_half_double () nounwind {
253
+ ; CHECK-LABEL: pos_half_double:
254
+ ; CHECK: ! %bb.0:
255
+ ; CHECK-NEXT: sethi %hi(.LCPI7_0), %o0
256
+ ; CHECK-NEXT: retl
257
+ ; CHECK-NEXT: ldd [%o0+%lo(.LCPI7_0)], %f0
258
+ ;
259
+ ; CHECK-LE-LABEL: pos_half_double:
260
+ ; CHECK-LE: ! %bb.0:
261
+ ; CHECK-LE-NEXT: sethi %hi(.LCPI7_0), %o0
262
+ ; CHECK-LE-NEXT: retl
263
+ ; CHECK-LE-NEXT: ldd [%o0+%lo(.LCPI7_0)], %f0
264
+ ;
265
+ ; CHECK-VIS-LABEL: pos_half_double:
266
+ ; CHECK-VIS: ! %bb.0:
267
+ ; CHECK-VIS-NEXT: sethi %h44(.LCPI7_0), %o0
268
+ ; CHECK-VIS-NEXT: add %o0, %m44(.LCPI7_0), %o0
269
+ ; CHECK-VIS-NEXT: sllx %o0, 12, %o0
270
+ ; CHECK-VIS-NEXT: retl
271
+ ; CHECK-VIS-NEXT: ldd [%o0+%l44(.LCPI7_0)], %f0
272
+ ;
273
+ ; CHECK-VIS3-LABEL: pos_half_double:
274
+ ; CHECK-VIS3: ! %bb.0:
275
+ ; CHECK-VIS3-NEXT: sethi 1046528, %o0
276
+ ; CHECK-VIS3-NEXT: sllx %o0, 32, %o0
277
+ ; CHECK-VIS3-NEXT: retl
278
+ ; CHECK-VIS3-NEXT: movxtod %o0, %f0
279
+ ret double +0 .5
280
+ }
281
+
282
+ define double @neg_half_double () nounwind {
283
+ ; CHECK-LABEL: neg_half_double:
284
+ ; CHECK: ! %bb.0:
285
+ ; CHECK-NEXT: sethi %hi(.LCPI8_0), %o0
286
+ ; CHECK-NEXT: retl
287
+ ; CHECK-NEXT: ldd [%o0+%lo(.LCPI8_0)], %f0
288
+ ;
289
+ ; CHECK-LE-LABEL: neg_half_double:
290
+ ; CHECK-LE: ! %bb.0:
291
+ ; CHECK-LE-NEXT: sethi %hi(.LCPI8_0), %o0
292
+ ; CHECK-LE-NEXT: retl
293
+ ; CHECK-LE-NEXT: ldd [%o0+%lo(.LCPI8_0)], %f0
294
+ ;
295
+ ; CHECK-VIS-LABEL: neg_half_double:
296
+ ; CHECK-VIS: ! %bb.0:
297
+ ; CHECK-VIS-NEXT: sethi %h44(.LCPI8_0), %o0
298
+ ; CHECK-VIS-NEXT: add %o0, %m44(.LCPI8_0), %o0
299
+ ; CHECK-VIS-NEXT: sllx %o0, 12, %o0
300
+ ; CHECK-VIS-NEXT: retl
301
+ ; CHECK-VIS-NEXT: ldd [%o0+%l44(.LCPI8_0)], %f0
302
+ ;
303
+ ; CHECK-VIS3-LABEL: neg_half_double:
304
+ ; CHECK-VIS3: ! %bb.0:
305
+ ; CHECK-VIS3-NEXT: sethi 3143680, %o0
306
+ ; CHECK-VIS3-NEXT: sllx %o0, 32, %o0
307
+ ; CHECK-VIS3-NEXT: retl
308
+ ; CHECK-VIS3-NEXT: movxtod %o0, %f0
309
+ ret double -0 .5
310
+ }
311
+
312
+ define float @pos_half_float () nounwind {
313
+ ; CHECK-LABEL: pos_half_float:
314
+ ; CHECK: ! %bb.0:
315
+ ; CHECK-NEXT: sethi %hi(.LCPI9_0), %o0
316
+ ; CHECK-NEXT: retl
317
+ ; CHECK-NEXT: ld [%o0+%lo(.LCPI9_0)], %f0
318
+ ;
319
+ ; CHECK-LE-LABEL: pos_half_float:
320
+ ; CHECK-LE: ! %bb.0:
321
+ ; CHECK-LE-NEXT: sethi %hi(.LCPI9_0), %o0
322
+ ; CHECK-LE-NEXT: retl
323
+ ; CHECK-LE-NEXT: ld [%o0+%lo(.LCPI9_0)], %f0
324
+ ;
325
+ ; CHECK-VIS-LABEL: pos_half_float:
326
+ ; CHECK-VIS: ! %bb.0:
327
+ ; CHECK-VIS-NEXT: sethi %h44(.LCPI9_0), %o0
328
+ ; CHECK-VIS-NEXT: add %o0, %m44(.LCPI9_0), %o0
329
+ ; CHECK-VIS-NEXT: sllx %o0, 12, %o0
330
+ ; CHECK-VIS-NEXT: retl
331
+ ; CHECK-VIS-NEXT: ld [%o0+%l44(.LCPI9_0)], %f0
332
+ ;
333
+ ; CHECK-VIS3-LABEL: pos_half_float:
334
+ ; CHECK-VIS3: ! %bb.0:
335
+ ; CHECK-VIS3-NEXT: sethi 1032192, %o0
336
+ ; CHECK-VIS3-NEXT: retl
337
+ ; CHECK-VIS3-NEXT: movwtos %o0, %f0
338
+ ret float +0 .5
339
+ }
340
+
341
+ define float @neg_half_float () nounwind {
342
+ ; CHECK-LABEL: neg_half_float:
343
+ ; CHECK: ! %bb.0:
344
+ ; CHECK-NEXT: sethi %hi(.LCPI10_0), %o0
345
+ ; CHECK-NEXT: retl
346
+ ; CHECK-NEXT: ld [%o0+%lo(.LCPI10_0)], %f0
347
+ ;
348
+ ; CHECK-LE-LABEL: neg_half_float:
349
+ ; CHECK-LE: ! %bb.0:
350
+ ; CHECK-LE-NEXT: sethi %hi(.LCPI10_0), %o0
351
+ ; CHECK-LE-NEXT: retl
352
+ ; CHECK-LE-NEXT: ld [%o0+%lo(.LCPI10_0)], %f0
353
+ ;
354
+ ; CHECK-VIS-LABEL: neg_half_float:
355
+ ; CHECK-VIS: ! %bb.0:
356
+ ; CHECK-VIS-NEXT: sethi %h44(.LCPI10_0), %o0
357
+ ; CHECK-VIS-NEXT: add %o0, %m44(.LCPI10_0), %o0
358
+ ; CHECK-VIS-NEXT: sllx %o0, 12, %o0
359
+ ; CHECK-VIS-NEXT: retl
360
+ ; CHECK-VIS-NEXT: ld [%o0+%l44(.LCPI10_0)], %f0
361
+ ;
362
+ ; CHECK-VIS3-LABEL: neg_half_float:
363
+ ; CHECK-VIS3: ! %bb.0:
364
+ ; CHECK-VIS3-NEXT: sethi 3129344, %o0
365
+ ; CHECK-VIS3-NEXT: retl
366
+ ; CHECK-VIS3-NEXT: movwtos %o0, %f0
367
+ ret float -0 .5
368
+ }
0 commit comments