xref: /llvm-project/llvm/test/CodeGen/RISCV/calling-conv-lp64e.ll (revision 2967e5f8007d873a3e9d97870d2461d0827a3976)
13ac9fe69SWang Pengcheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
23ac9fe69SWang Pengcheng; RUN: llc -mtriple=riscv64 -target-abi lp64e -verify-machineinstrs < %s \
33ac9fe69SWang Pengcheng; RUN:   | FileCheck -check-prefix=RV64I-LP64E-FPELIM %s
43ac9fe69SWang Pengcheng; RUN: llc -mtriple=riscv64 -target-abi lp64e -verify-machineinstrs -frame-pointer=all < %s \
53ac9fe69SWang Pengcheng; RUN:   | FileCheck -check-prefix=RV64I-LP64E-WITHFP %s
63ac9fe69SWang Pengcheng
73ac9fe69SWang Pengcheng; This file contains tests that will have differing output for the lp64e ABIs.
83ac9fe69SWang Pengcheng
93ac9fe69SWang Pengchengdefine i64 @callee_float_in_regs(i64 %a, float %b) nounwind {
103ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: callee_float_in_regs:
113ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
123ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, -16
133ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
143ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
153ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    mv s0, a0
163ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sext.w a0, a1
173ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    call __fixsfdi
183ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    add a0, s0, a0
193ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
203ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
213ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, 16
223ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
233ac9fe69SWang Pengcheng;
243ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: callee_float_in_regs:
253ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
263ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -24
273ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
283ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
293ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s1, 0(sp) # 8-byte Folded Spill
303ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 24
313ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    mv s1, a0
323ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sext.w a0, a1
333ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    call __fixsfdi
343ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    add a0, s1, a0
353ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
363ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
373ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s1, 0(sp) # 8-byte Folded Reload
383ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 24
393ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
403ac9fe69SWang Pengcheng  %b_fptosi = fptosi float %b to i64
413ac9fe69SWang Pengcheng  %1 = add i64 %a, %b_fptosi
423ac9fe69SWang Pengcheng  ret i64 %1
433ac9fe69SWang Pengcheng}
443ac9fe69SWang Pengcheng
453ac9fe69SWang Pengchengdefine i64 @caller_float_in_regs() nounwind {
463ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: caller_float_in_regs:
473ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
483ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, -8
493ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd ra, 0(sp) # 8-byte Folded Spill
503ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a0, 1
513ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    lui a1, 262144
523ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    call callee_float_in_regs
533ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld ra, 0(sp) # 8-byte Folded Reload
543ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, 8
553ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
563ac9fe69SWang Pengcheng;
573ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: caller_float_in_regs:
583ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
593ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -16
603ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
613ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
623ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 16
633ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a0, 1
643ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    lui a1, 262144
653ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    call callee_float_in_regs
663ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
673ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
683ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 16
693ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
703ac9fe69SWang Pengcheng  %1 = call i64 @callee_float_in_regs(i64 1, float 2.0)
713ac9fe69SWang Pengcheng  ret i64 %1
723ac9fe69SWang Pengcheng}
733ac9fe69SWang Pengcheng
743ac9fe69SWang Pengchengdefine i64 @callee_float_on_stack(i128 %a, i128 %b, i128 %c, i128 %d, float %e) nounwind {
753ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: callee_float_on_stack:
763ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
773ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, -16
783ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
793ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
803ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi s0, sp, 16
813ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    andi sp, sp, -16
823ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    lw a0, 16(s0)
833ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, s0, -16
843ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
853ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
863ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, 16
873ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
883ac9fe69SWang Pengcheng;
893ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: callee_float_on_stack:
903ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
913ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -16
923ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
933ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
943ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 16
953ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    andi sp, sp, -16
963ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    lw a0, 16(s0)
973ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, s0, -16
983ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
993ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1003ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 16
1013ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
1023ac9fe69SWang Pengcheng  %1 = trunc i128 %d to i64
1033ac9fe69SWang Pengcheng  %2 = bitcast float %e to i32
1043ac9fe69SWang Pengcheng  %3 = sext i32 %2 to i64
1053ac9fe69SWang Pengcheng  %4 = add i64 %1, %3
1063ac9fe69SWang Pengcheng  ret i64 %3
1073ac9fe69SWang Pengcheng}
1083ac9fe69SWang Pengcheng
1093ac9fe69SWang Pengchengdefine i64 @caller_float_on_stack() nounwind {
1103ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: caller_float_on_stack:
1113ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
1123ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, -48
1133ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1143ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1153ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi s0, sp, 48
1163ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    andi sp, sp, -16
117*2967e5f8SAlex Bradbury; RV64I-LP64E-FPELIM-NEXT:    lui a1, 264704
118*2967e5f8SAlex Bradbury; RV64I-LP64E-FPELIM-NEXT:    li a3, 4
1193ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a0, 1
1203ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a2, 2
1213ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a4, 3
122*2967e5f8SAlex Bradbury; RV64I-LP64E-FPELIM-NEXT:    sd a3, 0(sp)
123*2967e5f8SAlex Bradbury; RV64I-LP64E-FPELIM-NEXT:    sd zero, 8(sp)
124*2967e5f8SAlex Bradbury; RV64I-LP64E-FPELIM-NEXT:    sd a1, 16(sp)
1253ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a1, 0
1263ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a3, 0
1273ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    li a5, 0
1283ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    call callee_float_on_stack
1293ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, s0, -48
1303ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1313ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1323ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, 48
1333ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
1343ac9fe69SWang Pengcheng;
1353ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: caller_float_on_stack:
1363ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
1373ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -48
1383ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1393ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1403ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 48
1413ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    andi sp, sp, -16
142*2967e5f8SAlex Bradbury; RV64I-LP64E-WITHFP-NEXT:    lui a1, 264704
143*2967e5f8SAlex Bradbury; RV64I-LP64E-WITHFP-NEXT:    li a3, 4
1443ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a0, 1
1453ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a2, 2
1463ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a4, 3
147*2967e5f8SAlex Bradbury; RV64I-LP64E-WITHFP-NEXT:    sd a3, 0(sp)
148*2967e5f8SAlex Bradbury; RV64I-LP64E-WITHFP-NEXT:    sd zero, 8(sp)
149*2967e5f8SAlex Bradbury; RV64I-LP64E-WITHFP-NEXT:    sd a1, 16(sp)
1503ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a1, 0
1513ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a3, 0
1523ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    li a5, 0
1533ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    call callee_float_on_stack
1543ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, s0, -48
1553ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1563ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1573ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 48
1583ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
1593ac9fe69SWang Pengcheng  %1 = call i64 @callee_float_on_stack(i128 1, i128 2, i128 3, i128 4, float 5.0)
1603ac9fe69SWang Pengcheng  ret i64 %1
1613ac9fe69SWang Pengcheng}
1623ac9fe69SWang Pengcheng
1633ac9fe69SWang Pengchengdefine float @callee_tiny_scalar_ret() nounwind {
1643ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: callee_tiny_scalar_ret:
1653ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
1663ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    lui a0, 260096
1673ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
1683ac9fe69SWang Pengcheng;
1693ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: callee_tiny_scalar_ret:
1703ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
1713ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -16
1723ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1733ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
1743ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 16
1753ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    lui a0, 260096
1763ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1773ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1783ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 16
1793ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
1803ac9fe69SWang Pengcheng  ret float 1.0
1813ac9fe69SWang Pengcheng}
1823ac9fe69SWang Pengcheng
1833ac9fe69SWang Pengcheng; The sign extension of the float return is necessary, as softened floats are
1843ac9fe69SWang Pengcheng; passed anyext.
1853ac9fe69SWang Pengcheng
1863ac9fe69SWang Pengchengdefine i64 @caller_tiny_scalar_ret() nounwind {
1873ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-LABEL: caller_tiny_scalar_ret:
1883ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM:       # %bb.0:
1893ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, -8
1903ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sd ra, 0(sp) # 8-byte Folded Spill
1913ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    call callee_tiny_scalar_ret
1923ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    sext.w a0, a0
1933ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ld ra, 0(sp) # 8-byte Folded Reload
1943ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    addi sp, sp, 8
1953ac9fe69SWang Pengcheng; RV64I-LP64E-FPELIM-NEXT:    ret
1963ac9fe69SWang Pengcheng;
1973ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-LABEL: caller_tiny_scalar_ret:
1983ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP:       # %bb.0:
1993ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, -16
2003ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2013ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
2023ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi s0, sp, 16
2033ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    call callee_tiny_scalar_ret
2043ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    sext.w a0, a0
2053ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2063ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
2073ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    addi sp, sp, 16
2083ac9fe69SWang Pengcheng; RV64I-LP64E-WITHFP-NEXT:    ret
2093ac9fe69SWang Pengcheng  %1 = call float @callee_tiny_scalar_ret()
2103ac9fe69SWang Pengcheng  %2 = bitcast float %1 to i32
2113ac9fe69SWang Pengcheng  %3 = sext i32 %2 to i64
2123ac9fe69SWang Pengcheng  ret i64 %3
2133ac9fe69SWang Pengcheng}
214