7
7
; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINX %s
8
8
; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \
9
9
; RUN: -target-abi=lp64 | FileCheck -check-prefixes=RV64IZFINXZDINX %s
10
+ ; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zilsd -verify-machineinstrs < %s \
11
+ ; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINXZILSD %s
10
12
11
13
define dso_local double @fld (ptr %a ) nounwind {
12
14
; CHECKIFD-LABEL: fld:
@@ -31,6 +33,13 @@ define dso_local double @fld(ptr %a) nounwind {
31
33
; RV64IZFINXZDINX-NEXT: ld a0, 24(a0)
32
34
; RV64IZFINXZDINX-NEXT: fadd.d a0, a1, a0
33
35
; RV64IZFINXZDINX-NEXT: ret
36
+ ;
37
+ ; RV32IZFINXZDINXZILSD-LABEL: fld:
38
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
39
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a2, 0(a0)
40
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a0, 24(a0)
41
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a0, a2, a0
42
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
34
43
%1 = load double , ptr %a
35
44
%2 = getelementptr double , ptr %a , i32 3
36
45
%3 = load double , ptr %2
@@ -67,6 +76,17 @@ define dso_local void @fsd(ptr %a, double %b, double %c) nounwind {
67
76
; RV64IZFINXZDINX-NEXT: sd a1, 0(a0)
68
77
; RV64IZFINXZDINX-NEXT: sd a1, 64(a0)
69
78
; RV64IZFINXZDINX-NEXT: ret
79
+ ;
80
+ ; RV32IZFINXZDINXZILSD-LABEL: fsd:
81
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
82
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a5, a4
83
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a7, a2
84
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a4, a3
85
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a6, a1
86
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a2, a6, a4
87
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a2, 0(a0)
88
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a2, 64(a0)
89
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
70
90
; Use %b and %c in an FP op to ensure floating point registers are used, even
71
91
; for the soft float ABI
72
92
%1 = fadd double %b , %c
@@ -116,6 +136,17 @@ define dso_local double @fld_fsd_global(double %a, double %b) nounwind {
116
136
; RV64IZFINXZDINX-NEXT: ld zero, 72(a2)
117
137
; RV64IZFINXZDINX-NEXT: sd a0, 72(a2)
118
138
; RV64IZFINXZDINX-NEXT: ret
139
+ ;
140
+ ; RV32IZFINXZDINXZILSD-LABEL: fld_fsd_global:
141
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
142
+ ; RV32IZFINXZDINXZILSD-NEXT: lui a4, %hi(G)
143
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a0, a0, a2
144
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a2, %lo(G)(a4)
145
+ ; RV32IZFINXZDINXZILSD-NEXT: addi a2, a4, %lo(G)
146
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a0, %lo(G)(a4)
147
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a4, 72(a2)
148
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a0, 72(a2)
149
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
119
150
; Use %a and %b in an FP op to ensure floating point registers are used, even
120
151
; for the soft float ABI
121
152
%1 = fadd double %a , %b
@@ -164,6 +195,14 @@ define dso_local double @fld_fsd_constant(double %a) nounwind {
164
195
; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a2
165
196
; RV64IZFINXZDINX-NEXT: sd a0, -273(a1)
166
197
; RV64IZFINXZDINX-NEXT: ret
198
+ ;
199
+ ; RV32IZFINXZDINXZILSD-LABEL: fld_fsd_constant:
200
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
201
+ ; RV32IZFINXZDINXZILSD-NEXT: lui a2, 912092
202
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a4, -273(a2)
203
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a0, a0, a4
204
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a0, -273(a2)
205
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
167
206
%1 = inttoptr i32 3735928559 to ptr
168
207
%2 = load volatile double , ptr %1
169
208
%3 = fadd double %a , %2
@@ -237,6 +276,24 @@ define dso_local double @fld_stack(double %a) nounwind {
237
276
; RV64IZFINXZDINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
238
277
; RV64IZFINXZDINX-NEXT: addi sp, sp, 32
239
278
; RV64IZFINXZDINX-NEXT: ret
279
+ ;
280
+ ; RV32IZFINXZDINXZILSD-LABEL: fld_stack:
281
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
282
+ ; RV32IZFINXZDINXZILSD-NEXT: addi sp, sp, -32
283
+ ; RV32IZFINXZDINXZILSD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
284
+ ; RV32IZFINXZDINXZILSD-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
285
+ ; RV32IZFINXZDINXZILSD-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
286
+ ; RV32IZFINXZDINXZILSD-NEXT: mv s1, a1
287
+ ; RV32IZFINXZDINXZILSD-NEXT: mv s0, a0
288
+ ; RV32IZFINXZDINXZILSD-NEXT: addi a0, sp, 8
289
+ ; RV32IZFINXZDINXZILSD-NEXT: call notdead
290
+ ; RV32IZFINXZDINXZILSD-NEXT: ld a0, 8(sp)
291
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a0, a0, s0
292
+ ; RV32IZFINXZDINXZILSD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
293
+ ; RV32IZFINXZDINXZILSD-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
294
+ ; RV32IZFINXZDINXZILSD-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
295
+ ; RV32IZFINXZDINXZILSD-NEXT: addi sp, sp, 32
296
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
240
297
%1 = alloca double , align 8
241
298
call void @notdead (ptr %1 )
242
299
%2 = load double , ptr %1
@@ -293,6 +350,18 @@ define dso_local void @fsd_stack(double %a, double %b) nounwind {
293
350
; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
294
351
; RV64IZFINXZDINX-NEXT: addi sp, sp, 16
295
352
; RV64IZFINXZDINX-NEXT: ret
353
+ ;
354
+ ; RV32IZFINXZDINXZILSD-LABEL: fsd_stack:
355
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
356
+ ; RV32IZFINXZDINXZILSD-NEXT: addi sp, sp, -16
357
+ ; RV32IZFINXZDINXZILSD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
358
+ ; RV32IZFINXZDINXZILSD-NEXT: fadd.d a0, a0, a2
359
+ ; RV32IZFINXZDINXZILSD-NEXT: sd a0, 0(sp)
360
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a0, sp
361
+ ; RV32IZFINXZDINXZILSD-NEXT: call notdead
362
+ ; RV32IZFINXZDINXZILSD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
363
+ ; RV32IZFINXZDINXZILSD-NEXT: addi sp, sp, 16
364
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
296
365
%1 = fadd double %a , %b ; force store from FPR64
297
366
%2 = alloca double , align 8
298
367
store double %1 , ptr %2
@@ -321,6 +390,14 @@ define dso_local void @fsd_trunc(ptr %a, double %b) nounwind noinline optnone {
321
390
; RV64IZFINXZDINX-NEXT: fcvt.s.d a1, a1
322
391
; RV64IZFINXZDINX-NEXT: sw a1, 0(a0)
323
392
; RV64IZFINXZDINX-NEXT: ret
393
+ ;
394
+ ; RV32IZFINXZDINXZILSD-LABEL: fsd_trunc:
395
+ ; RV32IZFINXZDINXZILSD: # %bb.0:
396
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a3, a2
397
+ ; RV32IZFINXZDINXZILSD-NEXT: mv a2, a1
398
+ ; RV32IZFINXZDINXZILSD-NEXT: fcvt.s.d a1, a2
399
+ ; RV32IZFINXZDINXZILSD-NEXT: sw a1, 0(a0)
400
+ ; RV32IZFINXZDINXZILSD-NEXT: ret
324
401
%1 = fptrunc double %b to float
325
402
store float %1 , ptr %a , align 4
326
403
ret void
0 commit comments