1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv2_sf -mattr=+fpuv2_df | FileCheck %s --check-prefix=CHECK-DF
4; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv3_sf -mattr=+fpuv3_df | FileCheck %s --check-prefix=CHECK-DF2
5
6define double @FADD_DOUBLE(double %x, double %y) {
7; CHECK-DF-LABEL: FADD_DOUBLE:
8; CHECK-DF:       # %bb.0: # %entry
9; CHECK-DF-NEXT:    faddd vr0, vr1, vr0
10; CHECK-DF-NEXT:    rts16
11;
12; CHECK-DF2-LABEL: FADD_DOUBLE:
13; CHECK-DF2:       # %bb.0: # %entry
14; CHECK-DF2-NEXT:    fadd.64 vr0, vr1, vr0
15; CHECK-DF2-NEXT:    rts16
16entry:
17  %fadd = fadd  double %y, %x
18  ret double %fadd
19}
20
21define double @FADD_DOUBLE_I(double %x) {
22; CHECK-DF-LABEL: FADD_DOUBLE_I:
23; CHECK-DF:       # %bb.0: # %entry
24; CHECK-DF-NEXT:    grs32 a0, .LCPI1_0
25; CHECK-DF-NEXT:    fldd vr1, (a0, 0)
26; CHECK-DF-NEXT:    faddd vr0, vr0, vr1
27; CHECK-DF-NEXT:    rts16
28; CHECK-DF-NEXT:    .p2align 1
29; CHECK-DF-NEXT:  # %bb.1:
30; CHECK-DF-NEXT:    .p2align 2
31; CHECK-DF-NEXT:  .LCPI1_0:
32; CHECK-DF-NEXT:    .quad 0xbff0000000000000 # double -1
33;
34; CHECK-DF2-LABEL: FADD_DOUBLE_I:
35; CHECK-DF2:       # %bb.0: # %entry
36; CHECK-DF2-NEXT:    flrw.64 vr1, [.LCPI1_0]
37; CHECK-DF2-NEXT:    fadd.64 vr0, vr0, vr1
38; CHECK-DF2-NEXT:    rts16
39; CHECK-DF2-NEXT:    .p2align 1
40; CHECK-DF2-NEXT:  # %bb.1:
41; CHECK-DF2-NEXT:    .p2align 2
42; CHECK-DF2-NEXT:  .LCPI1_0:
43; CHECK-DF2-NEXT:    .quad 0xbff0000000000000 # double -1
44entry:
45  %fadd = fadd  double %x, -1.0
46  ret double %fadd
47}
48
49define double @FSUB_DOUBLE(double %x, double %y) {
50; CHECK-DF-LABEL: FSUB_DOUBLE:
51; CHECK-DF:       # %bb.0: # %entry
52; CHECK-DF-NEXT:    fsubd vr0, vr1, vr0
53; CHECK-DF-NEXT:    rts16
54;
55; CHECK-DF2-LABEL: FSUB_DOUBLE:
56; CHECK-DF2:       # %bb.0: # %entry
57; CHECK-DF2-NEXT:    fsub.64 vr0, vr1, vr0
58; CHECK-DF2-NEXT:    rts16
59
60entry:
61  %fsub = fsub  double %y, %x
62  ret double %fsub
63}
64
65define double @FSUB_DOUBLE_I(double %x) {
66;
67; CHECK-DF-LABEL: FSUB_DOUBLE_I:
68; CHECK-DF:       # %bb.0: # %entry
69; CHECK-DF-NEXT:    grs32 a0, .LCPI3_0
70; CHECK-DF-NEXT:    fldd vr1, (a0, 0)
71; CHECK-DF-NEXT:    faddd vr0, vr0, vr1
72; CHECK-DF-NEXT:    rts16
73; CHECK-DF-NEXT:    .p2align 1
74; CHECK-DF-NEXT:  # %bb.1:
75; CHECK-DF-NEXT:    .p2align 2
76; CHECK-DF-NEXT:  .LCPI3_0:
77; CHECK-DF-NEXT:    .quad 0x3ff0000000000000 # double 1
78;
79; CHECK-DF2-LABEL: FSUB_DOUBLE_I:
80; CHECK-DF2:       # %bb.0: # %entry
81; CHECK-DF2-NEXT:    flrw.64 vr1, [.LCPI3_0]
82; CHECK-DF2-NEXT:    fadd.64 vr0, vr0, vr1
83; CHECK-DF2-NEXT:    rts16
84; CHECK-DF2-NEXT:    .p2align 1
85; CHECK-DF2-NEXT:  # %bb.1:
86; CHECK-DF2-NEXT:    .p2align 2
87; CHECK-DF2-NEXT:  .LCPI3_0:
88; CHECK-DF2-NEXT:    .quad 0x3ff0000000000000 # double 1
89
90entry:
91  %fsub = fsub  double %x, -1.0
92  ret double %fsub
93}
94
95define double @FMUL_DOUBLE(double %x, double %y) {
96;
97; CHECK-DF-LABEL: FMUL_DOUBLE:
98; CHECK-DF:       # %bb.0: # %entry
99; CHECK-DF-NEXT:    fmuld vr0, vr1, vr0
100; CHECK-DF-NEXT:    rts16
101;
102; CHECK-DF2-LABEL: FMUL_DOUBLE:
103; CHECK-DF2:       # %bb.0: # %entry
104; CHECK-DF2-NEXT:    fmul.64 vr0, vr1, vr0
105; CHECK-DF2-NEXT:    rts16
106entry:
107  %fmul = fmul  double %y, %x
108  ret double %fmul
109}
110
111define double @FMUL_DOUBLE_I(double %x) {
112;
113; CHECK-DF-LABEL: FMUL_DOUBLE_I:
114; CHECK-DF:       # %bb.0: # %entry
115; CHECK-DF-NEXT:    grs32 a0, .LCPI5_0
116; CHECK-DF-NEXT:    fldd vr1, (a0, 0)
117; CHECK-DF-NEXT:    fmuld vr0, vr0, vr1
118; CHECK-DF-NEXT:    rts16
119; CHECK-DF-NEXT:    .p2align 1
120; CHECK-DF-NEXT:  # %bb.1:
121; CHECK-DF-NEXT:    .p2align 2
122; CHECK-DF-NEXT:  .LCPI5_0:
123; CHECK-DF-NEXT:    .quad 0xc01c000000000000 # double -7
124;
125; CHECK-DF2-LABEL: FMUL_DOUBLE_I:
126; CHECK-DF2:       # %bb.0: # %entry
127; CHECK-DF2-NEXT:    flrw.64 vr1, [.LCPI5_0]
128; CHECK-DF2-NEXT:    fmul.64 vr0, vr0, vr1
129; CHECK-DF2-NEXT:    rts16
130; CHECK-DF2-NEXT:    .p2align 1
131; CHECK-DF2-NEXT:  # %bb.1:
132; CHECK-DF2-NEXT:    .p2align 2
133; CHECK-DF2-NEXT:  .LCPI5_0:
134; CHECK-DF2-NEXT:    .quad 0xc01c000000000000 # double -7
135entry:
136  %fmul = fmul  double %x, -7.0
137  ret double %fmul
138}
139
140define double @FDIV_DOUBLE(double %x, double %y) {
141;
142;
143; CHECK-DF-LABEL: FDIV_DOUBLE:
144; CHECK-DF:       # %bb.0: # %entry
145; CHECK-DF-NEXT:    fdivd vr0, vr1, vr0
146; CHECK-DF-NEXT:    rts16
147;
148; CHECK-DF2-LABEL: FDIV_DOUBLE:
149; CHECK-DF2:       # %bb.0: # %entry
150; CHECK-DF2-NEXT:    fdiv.64 vr0, vr1, vr0
151; CHECK-DF2-NEXT:    rts16
152
153entry:
154  %fdiv = fdiv  double %y, %x
155  ret double %fdiv
156}
157
158define double @FDIV_DOUBLE_I(double %x) {
159;
160; CHECK-DF-LABEL: FDIV_DOUBLE_I:
161; CHECK-DF:       # %bb.0: # %entry
162; CHECK-DF-NEXT:    grs32 a0, .LCPI7_0
163; CHECK-DF-NEXT:    fldd vr1, (a0, 0)
164; CHECK-DF-NEXT:    fdivd vr0, vr0, vr1
165; CHECK-DF-NEXT:    rts16
166; CHECK-DF-NEXT:    .p2align 1
167; CHECK-DF-NEXT:  # %bb.1:
168; CHECK-DF-NEXT:    .p2align 2
169; CHECK-DF-NEXT:  .LCPI7_0:
170; CHECK-DF-NEXT:    .quad 0xc01c000000000000 # double -7
171;
172; CHECK-DF2-LABEL: FDIV_DOUBLE_I:
173; CHECK-DF2:       # %bb.0: # %entry
174; CHECK-DF2-NEXT:    flrw.64 vr1, [.LCPI7_0]
175; CHECK-DF2-NEXT:    fdiv.64 vr0, vr0, vr1
176; CHECK-DF2-NEXT:    rts16
177; CHECK-DF2-NEXT:    .p2align 1
178; CHECK-DF2-NEXT:  # %bb.1:
179; CHECK-DF2-NEXT:    .p2align 2
180; CHECK-DF2-NEXT:  .LCPI7_0:
181; CHECK-DF2-NEXT:    .quad 0xc01c000000000000 # double -7
182entry:
183  %fdiv = fdiv  double %x, -7.0
184  ret double %fdiv
185}
186
187define double @FNEG_DOUBLE(double %x) {
188;
189; CHECK-DF-LABEL: FNEG_DOUBLE:
190; CHECK-DF:       # %bb.0: # %entry
191; CHECK-DF-NEXT:    fnegd vr0, vr0
192; CHECK-DF-NEXT:    rts16
193;
194; CHECK-DF2-LABEL: FNEG_DOUBLE:
195; CHECK-DF2:       # %bb.0: # %entry
196; CHECK-DF2-NEXT:    fneg.64 vr0, vr0
197; CHECK-DF2-NEXT:    rts16
198entry:
199  %fneg = fneg  double  %x
200  ret double %fneg
201}
202
203; double --> float
204define float @fptruncR_double_0(double %x) {
205;
206; CHECK-DF-LABEL: fptruncR_double_0:
207; CHECK-DF:       # %bb.0: # %entry
208; CHECK-DF-NEXT:    fdtos vr0, vr0
209; CHECK-DF-NEXT:    rts16
210;
211; CHECK-DF2-LABEL: fptruncR_double_0:
212; CHECK-DF2:       # %bb.0: # %entry
213; CHECK-DF2-NEXT:    fdtos vr0, vr0
214; CHECK-DF2-NEXT:    rts16
215entry:
216  %fptrunc = fptrunc double %x to float
217  ret float %fptrunc
218}
219
220define double @fpextR_double_0(float %x) {
221;
222; CHECK-DF-LABEL: fpextR_double_0:
223; CHECK-DF:       # %bb.0: # %entry
224; CHECK-DF-NEXT:    fstod vr0, vr0
225; CHECK-DF-NEXT:    rts16
226;
227; CHECK-DF2-LABEL: fpextR_double_0:
228; CHECK-DF2:       # %bb.0: # %entry
229; CHECK-DF2-NEXT:    fstod vr0, vr0
230; CHECK-DF2-NEXT:    rts16
231entry:
232  %fpext = fpext float %x to double
233  ret double %fpext
234}
235