[Sparc] Add support for soft long double (fp128).
[oota-llvm.git] / test / CodeGen / SPARC / fp128.ll
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
29 define void @f128_ops(fp128* noalias sret %scalar.result, fp128* byval %a, fp128* byval %b, fp128* byval %c, fp128* byval %d) {
30 entry:
31   %0 = load fp128* %a, align 8
32   %1 = load fp128* %b, align 8
33   %2 = load fp128* %c, align 8
34   %3 = load 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
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
56
57 define void @f128_spill(fp128* noalias sret %scalar.result, fp128* byval %a) {
58 entry:
59   %0 = load 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
68 ; SOFT-LABEL: f128_compare
69 ; SOFT:       _Q_cmp
70
71 define i32 @f128_compare(fp128* byval %f0, fp128* byval %f1, i32 %a, i32 %b) {
72 entry:
73    %0 = load fp128* %f0, align 8
74    %1 = load fp128* %f1, align 8
75    %cond = fcmp ult fp128 %0, %1
76    %ret = select i1 %cond, i32 %a, i32 %b
77    ret i32 %ret
78 }