119 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32IFD %s4; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefix=RV64IFD %s6; RUN: llc -mtriple=riscv32 -mattr=+zdinx -target-abi=ilp32 -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s8; RUN: llc -mtriple=riscv64 -mattr=+zdinx -target-abi=lp64 -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s10 11define double @func(double %d, i32 %n) nounwind {12; RV32IFD-LABEL: func:13; RV32IFD: # %bb.0: # %entry14; RV32IFD-NEXT: addi sp, sp, -3215; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill16; RV32IFD-NEXT: sw a0, 16(sp)17; RV32IFD-NEXT: sw a1, 20(sp)18; RV32IFD-NEXT: fld fa5, 16(sp)19; RV32IFD-NEXT: beqz a2, .LBB0_220; RV32IFD-NEXT: # %bb.1: # %if.else21; RV32IFD-NEXT: addi a2, a2, -122; RV32IFD-NEXT: fsd fa5, 16(sp)23; RV32IFD-NEXT: lw a0, 16(sp)24; RV32IFD-NEXT: lw a1, 20(sp)25; RV32IFD-NEXT: fsd fa5, 8(sp) # 8-byte Folded Spill26; RV32IFD-NEXT: call func27; RV32IFD-NEXT: sw a0, 16(sp)28; RV32IFD-NEXT: sw a1, 20(sp)29; RV32IFD-NEXT: fld fa5, 16(sp)30; RV32IFD-NEXT: fld fa4, 8(sp) # 8-byte Folded Reload31; RV32IFD-NEXT: fadd.d fa5, fa5, fa432; RV32IFD-NEXT: .LBB0_2: # %return33; RV32IFD-NEXT: fsd fa5, 16(sp)34; RV32IFD-NEXT: lw a0, 16(sp)35; RV32IFD-NEXT: lw a1, 20(sp)36; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload37; RV32IFD-NEXT: addi sp, sp, 3238; RV32IFD-NEXT: ret39;40; RV64IFD-LABEL: func:41; RV64IFD: # %bb.0: # %entry42; RV64IFD-NEXT: sext.w a2, a143; RV64IFD-NEXT: fmv.d.x fa5, a044; RV64IFD-NEXT: beqz a2, .LBB0_245; RV64IFD-NEXT: # %bb.1: # %if.else46; RV64IFD-NEXT: addi sp, sp, -1647; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill48; RV64IFD-NEXT: addiw a1, a1, -149; RV64IFD-NEXT: fmv.x.d a0, fa550; RV64IFD-NEXT: fsd fa5, 0(sp) # 8-byte Folded Spill51; RV64IFD-NEXT: call func52; RV64IFD-NEXT: fmv.d.x fa5, a053; RV64IFD-NEXT: fld fa4, 0(sp) # 8-byte Folded Reload54; RV64IFD-NEXT: fadd.d fa5, fa5, fa455; RV64IFD-NEXT: fmv.x.d a0, fa556; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload57; RV64IFD-NEXT: addi sp, sp, 1658; RV64IFD-NEXT: ret59; RV64IFD-NEXT: .LBB0_2: # %return60; RV64IFD-NEXT: fmv.x.d a0, fa561; RV64IFD-NEXT: ret62;63; RV32IZFINXZDINX-LABEL: func:64; RV32IZFINXZDINX: # %bb.0: # %entry65; RV32IZFINXZDINX-NEXT: addi sp, sp, -1666; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill67; RV32IZFINXZDINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill68; RV32IZFINXZDINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill69; RV32IZFINXZDINX-NEXT: mv s1, a170; RV32IZFINXZDINX-NEXT: mv s0, a071; RV32IZFINXZDINX-NEXT: beqz a2, .LBB0_272; RV32IZFINXZDINX-NEXT: # %bb.1: # %if.else73; RV32IZFINXZDINX-NEXT: addi a2, a2, -174; RV32IZFINXZDINX-NEXT: mv a0, s075; RV32IZFINXZDINX-NEXT: mv a1, s176; RV32IZFINXZDINX-NEXT: call func77; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, s078; RV32IZFINXZDINX-NEXT: j .LBB0_379; RV32IZFINXZDINX-NEXT: .LBB0_2: # %return80; RV32IZFINXZDINX-NEXT: mv a0, s081; RV32IZFINXZDINX-NEXT: mv a1, s182; RV32IZFINXZDINX-NEXT: .LBB0_3: # %return83; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload84; RV32IZFINXZDINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload85; RV32IZFINXZDINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload86; RV32IZFINXZDINX-NEXT: addi sp, sp, 1687; RV32IZFINXZDINX-NEXT: ret88;89; RV64IZFINXZDINX-LABEL: func:90; RV64IZFINXZDINX: # %bb.0: # %entry91; RV64IZFINXZDINX-NEXT: sext.w a2, a192; RV64IZFINXZDINX-NEXT: beqz a2, .LBB0_293; RV64IZFINXZDINX-NEXT: # %bb.1: # %if.else94; RV64IZFINXZDINX-NEXT: addi sp, sp, -1695; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill96; RV64IZFINXZDINX-NEXT: sd s0, 0(sp) # 8-byte Folded Spill97; RV64IZFINXZDINX-NEXT: addiw a1, a1, -198; RV64IZFINXZDINX-NEXT: mv s0, a099; RV64IZFINXZDINX-NEXT: call func100; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, s0101; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload102; RV64IZFINXZDINX-NEXT: ld s0, 0(sp) # 8-byte Folded Reload103; RV64IZFINXZDINX-NEXT: addi sp, sp, 16104; RV64IZFINXZDINX-NEXT: .LBB0_2: # %return105; RV64IZFINXZDINX-NEXT: ret106entry:107 %cmp = icmp eq i32 %n, 0108 br i1 %cmp, label %return, label %if.else109 110if.else:111 %sub = add i32 %n, -1112 %call = tail call double @func(double %d, i32 %sub)113 %add = fadd double %call, %d114 ret double %add115 116return:117 ret double %d118}119