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