xref: /llvm-project/llvm/test/CodeGen/RISCV/calling-conv-rv32f-ilp32e.ll (revision 2967e5f8007d873a3e9d97870d2461d0827a3976)
13ac9fe69SWang Pengcheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
23ac9fe69SWang Pengcheng; RUN: llc -mtriple=riscv32 -mattr=+f -target-abi ilp32e -verify-machineinstrs < %s \
33ac9fe69SWang Pengcheng; RUN:   | FileCheck %s -check-prefix=RV32IF-ILP32E
43ac9fe69SWang Pengcheng
53ac9fe69SWang Pengcheng; Exercises the ILP32E calling convention code in the case that f32 is a legal
63ac9fe69SWang Pengcheng; type. As well as testing that lowering is correct, these tests also aim to
73ac9fe69SWang Pengcheng; check that floating point load/store or integer load/store is chosen
83ac9fe69SWang Pengcheng; optimally when floats are passed on the stack.
93ac9fe69SWang Pengcheng
103ac9fe69SWang Pengchengdefine float @onstack_f32_noop(i64 %a, i64 %b, i64 %c, i64 %d, float %e, float %f) nounwind {
113ac9fe69SWang Pengcheng; RV32IF-ILP32E-LABEL: onstack_f32_noop:
123ac9fe69SWang Pengcheng; RV32IF-ILP32E:       # %bb.0:
133ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    lw a0, 12(sp)
143ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    ret
153ac9fe69SWang Pengcheng  ret float %f
163ac9fe69SWang Pengcheng}
173ac9fe69SWang Pengcheng
183ac9fe69SWang Pengchengdefine float @onstack_f32_fadd(i64 %a, i64 %b, i64 %c, i64 %d, float %e, float %f) nounwind {
193ac9fe69SWang Pengcheng; RV32IF-ILP32E-LABEL: onstack_f32_fadd:
203ac9fe69SWang Pengcheng; RV32IF-ILP32E:       # %bb.0:
213ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    flw fa5, 12(sp)
223ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    flw fa4, 8(sp)
233ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fadd.s fa5, fa4, fa5
243ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fmv.x.w a0, fa5
253ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    ret
263ac9fe69SWang Pengcheng  %1 = fadd float %e, %f
273ac9fe69SWang Pengcheng  ret float %1
283ac9fe69SWang Pengcheng}
293ac9fe69SWang Pengcheng
303ac9fe69SWang Pengchengdefine float @caller_onstack_f32_noop(float %a) nounwind {
313ac9fe69SWang Pengcheng; RV32IF-ILP32E-LABEL: caller_onstack_f32_noop:
323ac9fe69SWang Pengcheng; RV32IF-ILP32E:       # %bb.0:
333ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    addi sp, sp, -20
343ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    sw ra, 16(sp) # 4-byte Folded Spill
35*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    mv a1, a0
36*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    lui a3, 264704
37*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    li a5, 4
383ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a0, 1
393ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a2, 2
403ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a4, 3
41*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw a5, 0(sp)
42*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw zero, 4(sp)
43*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw a3, 8(sp)
44*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw a1, 12(sp)
453ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a1, 0
463ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a3, 0
473ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a5, 0
483ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    call onstack_f32_noop
493ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    lw ra, 16(sp) # 4-byte Folded Reload
503ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    addi sp, sp, 20
513ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    ret
523ac9fe69SWang Pengcheng  %1 = call float @onstack_f32_noop(i64 1, i64 2, i64 3, i64 4, float 5.0, float %a)
533ac9fe69SWang Pengcheng  ret float %1
543ac9fe69SWang Pengcheng}
553ac9fe69SWang Pengcheng
563ac9fe69SWang Pengchengdefine float @caller_onstack_f32_fadd(float %a, float %b) nounwind {
573ac9fe69SWang Pengcheng; RV32IF-ILP32E-LABEL: caller_onstack_f32_fadd:
583ac9fe69SWang Pengcheng; RV32IF-ILP32E:       # %bb.0:
593ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    addi sp, sp, -20
603ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    sw ra, 16(sp) # 4-byte Folded Spill
613ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fmv.w.x fa5, a1
623ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fmv.w.x fa4, a0
633ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fadd.s fa3, fa4, fa5
643ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fsub.s fa5, fa5, fa4
65*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    li a1, 4
663ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a0, 1
673ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a2, 2
683ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a4, 3
69*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw a1, 0(sp)
70*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    sw zero, 4(sp)
713ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    fsw fa3, 8(sp)
72*2967e5f8SAlex Bradbury; RV32IF-ILP32E-NEXT:    fsw fa5, 12(sp)
733ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a1, 0
743ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a3, 0
753ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    li a5, 0
763ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    call onstack_f32_noop
773ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    lw ra, 16(sp) # 4-byte Folded Reload
783ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    addi sp, sp, 20
793ac9fe69SWang Pengcheng; RV32IF-ILP32E-NEXT:    ret
803ac9fe69SWang Pengcheng  %1 = fadd float %a, %b
813ac9fe69SWang Pengcheng  %2 = fsub float %b, %a
823ac9fe69SWang Pengcheng  %3 = call float @onstack_f32_noop(i64 1, i64 2, i64 3, i64 4, float %1, float %2)
833ac9fe69SWang Pengcheng  ret float %3
843ac9fe69SWang Pengcheng}
85