1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
2
; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
3
3
; RUN: | FileCheck -check-prefix=RV32IFD %s
4
+ ; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
5
+ ; RUN: | FileCheck -check-prefix=RV64IFD %s
4
6
5
7
; These tests are each targeted at a particular RISC-V FPU instruction. Most
6
8
; other files in this folder exercise LLVM IR instructions that don't directly
@@ -22,6 +24,14 @@ define double @fadd_d(double %a, double %b) nounwind {
22
24
; RV32IFD-NEXT: lw a1, 12(sp)
23
25
; RV32IFD-NEXT: addi sp, sp, 16
24
26
; RV32IFD-NEXT: ret
27
+ ;
28
+ ; RV64IFD-LABEL: fadd_d:
29
+ ; RV64IFD: # %bb.0:
30
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
31
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
32
+ ; RV64IFD-NEXT: fadd.d ft0, ft1, ft0
33
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
34
+ ; RV64IFD-NEXT: ret
25
35
%1 = fadd double %a , %b
26
36
ret double %1
27
37
}
@@ -42,6 +52,14 @@ define double @fsub_d(double %a, double %b) nounwind {
42
52
; RV32IFD-NEXT: lw a1, 12(sp)
43
53
; RV32IFD-NEXT: addi sp, sp, 16
44
54
; RV32IFD-NEXT: ret
55
+ ;
56
+ ; RV64IFD-LABEL: fsub_d:
57
+ ; RV64IFD: # %bb.0:
58
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
59
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
60
+ ; RV64IFD-NEXT: fsub.d ft0, ft1, ft0
61
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
62
+ ; RV64IFD-NEXT: ret
45
63
%1 = fsub double %a , %b
46
64
ret double %1
47
65
}
@@ -62,6 +80,14 @@ define double @fmul_d(double %a, double %b) nounwind {
62
80
; RV32IFD-NEXT: lw a1, 12(sp)
63
81
; RV32IFD-NEXT: addi sp, sp, 16
64
82
; RV32IFD-NEXT: ret
83
+ ;
84
+ ; RV64IFD-LABEL: fmul_d:
85
+ ; RV64IFD: # %bb.0:
86
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
87
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
88
+ ; RV64IFD-NEXT: fmul.d ft0, ft1, ft0
89
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
90
+ ; RV64IFD-NEXT: ret
65
91
%1 = fmul double %a , %b
66
92
ret double %1
67
93
}
@@ -82,6 +108,14 @@ define double @fdiv_d(double %a, double %b) nounwind {
82
108
; RV32IFD-NEXT: lw a1, 12(sp)
83
109
; RV32IFD-NEXT: addi sp, sp, 16
84
110
; RV32IFD-NEXT: ret
111
+ ;
112
+ ; RV64IFD-LABEL: fdiv_d:
113
+ ; RV64IFD: # %bb.0:
114
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
115
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
116
+ ; RV64IFD-NEXT: fdiv.d ft0, ft1, ft0
117
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
118
+ ; RV64IFD-NEXT: ret
85
119
%1 = fdiv double %a , %b
86
120
ret double %1
87
121
}
@@ -101,6 +135,13 @@ define double @fsqrt_d(double %a) nounwind {
101
135
; RV32IFD-NEXT: lw a1, 12(sp)
102
136
; RV32IFD-NEXT: addi sp, sp, 16
103
137
; RV32IFD-NEXT: ret
138
+ ;
139
+ ; RV64IFD-LABEL: fsqrt_d:
140
+ ; RV64IFD: # %bb.0:
141
+ ; RV64IFD-NEXT: fmv.d.x ft0, a0
142
+ ; RV64IFD-NEXT: fsqrt.d ft0, ft0
143
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
144
+ ; RV64IFD-NEXT: ret
104
145
%1 = call double @llvm.sqrt.f64 (double %a )
105
146
ret double %1
106
147
}
@@ -123,6 +164,14 @@ define double @fsgnj_d(double %a, double %b) nounwind {
123
164
; RV32IFD-NEXT: lw a1, 12(sp)
124
165
; RV32IFD-NEXT: addi sp, sp, 16
125
166
; RV32IFD-NEXT: ret
167
+ ;
168
+ ; RV64IFD-LABEL: fsgnj_d:
169
+ ; RV64IFD: # %bb.0:
170
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
171
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
172
+ ; RV64IFD-NEXT: fsgnj.d ft0, ft1, ft0
173
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
174
+ ; RV64IFD-NEXT: ret
126
175
%1 = call double @llvm.copysign.f64 (double %a , double %b )
127
176
ret double %1
128
177
}
@@ -141,6 +190,14 @@ define i32 @fneg_d(double %a, double %b) nounwind {
141
190
; RV32IFD-NEXT: feq.d a0, ft0, ft1
142
191
; RV32IFD-NEXT: addi sp, sp, 16
143
192
; RV32IFD-NEXT: ret
193
+ ;
194
+ ; RV64IFD-LABEL: fneg_d:
195
+ ; RV64IFD: # %bb.0:
196
+ ; RV64IFD-NEXT: fmv.d.x ft0, a0
197
+ ; RV64IFD-NEXT: fadd.d ft0, ft0, ft0
198
+ ; RV64IFD-NEXT: fneg.d ft1, ft0
199
+ ; RV64IFD-NEXT: feq.d a0, ft0, ft1
200
+ ; RV64IFD-NEXT: ret
144
201
%1 = fadd double %a , %a
145
202
%2 = fneg double %1
146
203
%3 = fcmp oeq double %1 , %2
@@ -149,6 +206,9 @@ define i32 @fneg_d(double %a, double %b) nounwind {
149
206
}
150
207
151
208
define double @fsgnjn_d (double %a , double %b ) nounwind {
209
+ ; TODO: fsgnjn.s isn't selected on RV64 because DAGCombiner::visitBITCAST will
210
+ ; convert (bitconvert (fneg x)) to a xor.
211
+ ;
152
212
; RV32IFD-LABEL: fsgnjn_d:
153
213
; RV32IFD: # %bb.0:
154
214
; RV32IFD-NEXT: addi sp, sp, -16
@@ -164,6 +224,17 @@ define double @fsgnjn_d(double %a, double %b) nounwind {
164
224
; RV32IFD-NEXT: lw a1, 12(sp)
165
225
; RV32IFD-NEXT: addi sp, sp, 16
166
226
; RV32IFD-NEXT: ret
227
+ ;
228
+ ; RV64IFD-LABEL: fsgnjn_d:
229
+ ; RV64IFD: # %bb.0:
230
+ ; RV64IFD-NEXT: addi a2, zero, -1
231
+ ; RV64IFD-NEXT: slli a2, a2, 63
232
+ ; RV64IFD-NEXT: xor a1, a1, a2
233
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
234
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
235
+ ; RV64IFD-NEXT: fsgnj.d ft0, ft1, ft0
236
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
237
+ ; RV64IFD-NEXT: ret
167
238
%1 = fsub double -0 .0 , %b
168
239
%2 = call double @llvm.copysign.f64 (double %a , double %1 )
169
240
ret double %2
@@ -191,6 +262,16 @@ define double @fabs_d(double %a, double %b) nounwind {
191
262
; RV32IFD-NEXT: lw a1, 12(sp)
192
263
; RV32IFD-NEXT: addi sp, sp, 16
193
264
; RV32IFD-NEXT: ret
265
+ ;
266
+ ; RV64IFD-LABEL: fabs_d:
267
+ ; RV64IFD: # %bb.0:
268
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
269
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
270
+ ; RV64IFD-NEXT: fadd.d ft0, ft1, ft0
271
+ ; RV64IFD-NEXT: fabs.d ft1, ft0
272
+ ; RV64IFD-NEXT: fadd.d ft0, ft1, ft0
273
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
274
+ ; RV64IFD-NEXT: ret
194
275
%1 = fadd double %a , %b
195
276
%2 = call double @llvm.fabs.f64 (double %1 )
196
277
%3 = fadd double %2 , %1
@@ -215,6 +296,14 @@ define double @fmin_d(double %a, double %b) nounwind {
215
296
; RV32IFD-NEXT: lw a1, 12(sp)
216
297
; RV32IFD-NEXT: addi sp, sp, 16
217
298
; RV32IFD-NEXT: ret
299
+ ;
300
+ ; RV64IFD-LABEL: fmin_d:
301
+ ; RV64IFD: # %bb.0:
302
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
303
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
304
+ ; RV64IFD-NEXT: fmin.d ft0, ft1, ft0
305
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
306
+ ; RV64IFD-NEXT: ret
218
307
%1 = call double @llvm.minnum.f64 (double %a , double %b )
219
308
ret double %1
220
309
}
@@ -237,6 +326,14 @@ define double @fmax_d(double %a, double %b) nounwind {
237
326
; RV32IFD-NEXT: lw a1, 12(sp)
238
327
; RV32IFD-NEXT: addi sp, sp, 16
239
328
; RV32IFD-NEXT: ret
329
+ ;
330
+ ; RV64IFD-LABEL: fmax_d:
331
+ ; RV64IFD: # %bb.0:
332
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
333
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
334
+ ; RV64IFD-NEXT: fmax.d ft0, ft1, ft0
335
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
336
+ ; RV64IFD-NEXT: ret
240
337
%1 = call double @llvm.maxnum.f64 (double %a , double %b )
241
338
ret double %1
242
339
}
@@ -254,6 +351,13 @@ define i32 @feq_d(double %a, double %b) nounwind {
254
351
; RV32IFD-NEXT: feq.d a0, ft1, ft0
255
352
; RV32IFD-NEXT: addi sp, sp, 16
256
353
; RV32IFD-NEXT: ret
354
+ ;
355
+ ; RV64IFD-LABEL: feq_d:
356
+ ; RV64IFD: # %bb.0:
357
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
358
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
359
+ ; RV64IFD-NEXT: feq.d a0, ft1, ft0
360
+ ; RV64IFD-NEXT: ret
257
361
%1 = fcmp oeq double %a , %b
258
362
%2 = zext i1 %1 to i32
259
363
ret i32 %2
@@ -272,6 +376,13 @@ define i32 @flt_d(double %a, double %b) nounwind {
272
376
; RV32IFD-NEXT: flt.d a0, ft1, ft0
273
377
; RV32IFD-NEXT: addi sp, sp, 16
274
378
; RV32IFD-NEXT: ret
379
+ ;
380
+ ; RV64IFD-LABEL: flt_d:
381
+ ; RV64IFD: # %bb.0:
382
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
383
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
384
+ ; RV64IFD-NEXT: flt.d a0, ft1, ft0
385
+ ; RV64IFD-NEXT: ret
275
386
%1 = fcmp olt double %a , %b
276
387
%2 = zext i1 %1 to i32
277
388
ret i32 %2
@@ -290,6 +401,13 @@ define i32 @fle_d(double %a, double %b) nounwind {
290
401
; RV32IFD-NEXT: fle.d a0, ft1, ft0
291
402
; RV32IFD-NEXT: addi sp, sp, 16
292
403
; RV32IFD-NEXT: ret
404
+ ;
405
+ ; RV64IFD-LABEL: fle_d:
406
+ ; RV64IFD: # %bb.0:
407
+ ; RV64IFD-NEXT: fmv.d.x ft0, a1
408
+ ; RV64IFD-NEXT: fmv.d.x ft1, a0
409
+ ; RV64IFD-NEXT: fle.d a0, ft1, ft0
410
+ ; RV64IFD-NEXT: ret
293
411
%1 = fcmp ole double %a , %b
294
412
%2 = zext i1 %1 to i32
295
413
ret i32 %2
@@ -316,6 +434,15 @@ define double @fmadd_d(double %a, double %b, double %c) nounwind {
316
434
; RV32IFD-NEXT: lw a1, 12(sp)
317
435
; RV32IFD-NEXT: addi sp, sp, 16
318
436
; RV32IFD-NEXT: ret
437
+ ;
438
+ ; RV64IFD-LABEL: fmadd_d:
439
+ ; RV64IFD: # %bb.0:
440
+ ; RV64IFD-NEXT: fmv.d.x ft0, a2
441
+ ; RV64IFD-NEXT: fmv.d.x ft1, a1
442
+ ; RV64IFD-NEXT: fmv.d.x ft2, a0
443
+ ; RV64IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0
444
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
445
+ ; RV64IFD-NEXT: ret
319
446
%1 = call double @llvm.fma.f64 (double %a , double %b , double %c )
320
447
ret double %1
321
448
}
@@ -343,6 +470,19 @@ define double @fmsub_d(double %a, double %b, double %c) nounwind {
343
470
; RV32IFD-NEXT: lw a1, 12(sp)
344
471
; RV32IFD-NEXT: addi sp, sp, 16
345
472
; RV32IFD-NEXT: ret
473
+ ;
474
+ ; RV64IFD-LABEL: fmsub_d:
475
+ ; RV64IFD: # %bb.0:
476
+ ; RV64IFD-NEXT: fmv.d.x ft0, a2
477
+ ; RV64IFD-NEXT: lui a2, %hi(.LCPI15_0)
478
+ ; RV64IFD-NEXT: addi a2, a2, %lo(.LCPI15_0)
479
+ ; RV64IFD-NEXT: fld ft1, 0(a2)
480
+ ; RV64IFD-NEXT: fadd.d ft0, ft0, ft1
481
+ ; RV64IFD-NEXT: fmv.d.x ft1, a1
482
+ ; RV64IFD-NEXT: fmv.d.x ft2, a0
483
+ ; RV64IFD-NEXT: fmsub.d ft0, ft2, ft1, ft0
484
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
485
+ ; RV64IFD-NEXT: ret
346
486
%c_ = fadd double 0 .0 , %c ; avoid negation using xor
347
487
%negc = fsub double -0 .0 , %c_
348
488
%1 = call double @llvm.fma.f64 (double %a , double %b , double %negc )
@@ -373,6 +513,20 @@ define double @fnmadd_d(double %a, double %b, double %c) nounwind {
373
513
; RV32IFD-NEXT: lw a1, 12(sp)
374
514
; RV32IFD-NEXT: addi sp, sp, 16
375
515
; RV32IFD-NEXT: ret
516
+ ;
517
+ ; RV64IFD-LABEL: fnmadd_d:
518
+ ; RV64IFD: # %bb.0:
519
+ ; RV64IFD-NEXT: fmv.d.x ft0, a2
520
+ ; RV64IFD-NEXT: lui a2, %hi(.LCPI16_0)
521
+ ; RV64IFD-NEXT: addi a2, a2, %lo(.LCPI16_0)
522
+ ; RV64IFD-NEXT: fld ft1, 0(a2)
523
+ ; RV64IFD-NEXT: fadd.d ft0, ft0, ft1
524
+ ; RV64IFD-NEXT: fmv.d.x ft2, a0
525
+ ; RV64IFD-NEXT: fadd.d ft1, ft2, ft1
526
+ ; RV64IFD-NEXT: fmv.d.x ft2, a1
527
+ ; RV64IFD-NEXT: fnmadd.d ft0, ft1, ft2, ft0
528
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
529
+ ; RV64IFD-NEXT: ret
376
530
%a_ = fadd double 0 .0 , %a
377
531
%c_ = fadd double 0 .0 , %c
378
532
%nega = fsub double -0 .0 , %a_
@@ -404,6 +558,19 @@ define double @fnmsub_d(double %a, double %b, double %c) nounwind {
404
558
; RV32IFD-NEXT: lw a1, 12(sp)
405
559
; RV32IFD-NEXT: addi sp, sp, 16
406
560
; RV32IFD-NEXT: ret
561
+ ;
562
+ ; RV64IFD-LABEL: fnmsub_d:
563
+ ; RV64IFD: # %bb.0:
564
+ ; RV64IFD-NEXT: fmv.d.x ft0, a0
565
+ ; RV64IFD-NEXT: lui a0, %hi(.LCPI17_0)
566
+ ; RV64IFD-NEXT: addi a0, a0, %lo(.LCPI17_0)
567
+ ; RV64IFD-NEXT: fld ft1, 0(a0)
568
+ ; RV64IFD-NEXT: fadd.d ft0, ft0, ft1
569
+ ; RV64IFD-NEXT: fmv.d.x ft1, a2
570
+ ; RV64IFD-NEXT: fmv.d.x ft2, a1
571
+ ; RV64IFD-NEXT: fnmsub.d ft0, ft0, ft2, ft1
572
+ ; RV64IFD-NEXT: fmv.x.d a0, ft0
573
+ ; RV64IFD-NEXT: ret
407
574
%a_ = fadd double 0 .0 , %a
408
575
%nega = fsub double -0 .0 , %a_
409
576
%1 = call double @llvm.fma.f64 (double %nega , double %b , double %c )
0 commit comments