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