77; RUN: -target-abi=ilp32 | FileCheck -check-prefixes=RV32IZFINXZDINX %s
88; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \
99; 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
1012
1113define dso_local double @fld (ptr %a ) nounwind {
1214; CHECKIFD-LABEL: fld:
@@ -31,6 +33,13 @@ define dso_local double @fld(ptr %a) nounwind {
3133; RV64IZFINXZDINX-NEXT: ld a0, 24(a0)
3234; RV64IZFINXZDINX-NEXT: fadd.d a0, a1, a0
3335; 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
3443 %1 = load double , ptr %a
3544 %2 = getelementptr double , ptr %a , i32 3
3645 %3 = load double , ptr %2
@@ -67,6 +76,17 @@ define dso_local void @fsd(ptr %a, double %b, double %c) nounwind {
6776; RV64IZFINXZDINX-NEXT: sd a1, 0(a0)
6877; RV64IZFINXZDINX-NEXT: sd a1, 64(a0)
6978; 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
7090; Use %b and %c in an FP op to ensure floating point registers are used, even
7191; for the soft float ABI
7292 %1 = fadd double %b , %c
@@ -116,6 +136,17 @@ define dso_local double @fld_fsd_global(double %a, double %b) nounwind {
116136; RV64IZFINXZDINX-NEXT: ld zero, 72(a2)
117137; RV64IZFINXZDINX-NEXT: sd a0, 72(a2)
118138; 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
119150; Use %a and %b in an FP op to ensure floating point registers are used, even
120151; for the soft float ABI
121152 %1 = fadd double %a , %b
@@ -164,6 +195,14 @@ define dso_local double @fld_fsd_constant(double %a) nounwind {
164195; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a2
165196; RV64IZFINXZDINX-NEXT: sd a0, -273(a1)
166197; 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
167206 %1 = inttoptr i32 3735928559 to ptr
168207 %2 = load volatile double , ptr %1
169208 %3 = fadd double %a , %2
@@ -237,6 +276,24 @@ define dso_local double @fld_stack(double %a) nounwind {
237276; RV64IZFINXZDINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
238277; RV64IZFINXZDINX-NEXT: addi sp, sp, 32
239278; 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
240297 %1 = alloca double , align 8
241298 call void @notdead (ptr %1 )
242299 %2 = load double , ptr %1
@@ -293,6 +350,18 @@ define dso_local void @fsd_stack(double %a, double %b) nounwind {
293350; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
294351; RV64IZFINXZDINX-NEXT: addi sp, sp, 16
295352; 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
296365 %1 = fadd double %a , %b ; force store from FPR64
297366 %2 = alloca double , align 8
298367 store double %1 , ptr %2
@@ -321,6 +390,14 @@ define dso_local void @fsd_trunc(ptr %a, double %b) nounwind noinline optnone {
321390; RV64IZFINXZDINX-NEXT: fcvt.s.d a1, a1
322391; RV64IZFINXZDINX-NEXT: sw a1, 0(a0)
323392; 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
324401 %1 = fptrunc double %b to float
325402 store float %1 , ptr %a , align 4
326403 ret void
0 commit comments