1491 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32I3; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64I4; RUN: llc -mtriple=riscv32 -mattr=+f -target-abi=ilp32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32IF5; RUN: llc -mtriple=riscv64 -mattr=+f -target-abi=lp64 -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64IF6; RUN: llc -mtriple=riscv32 -mattr=+f -target-abi=ilp32f -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32-ILP32F7; RUN: llc -mtriple=riscv64 -mattr=+f -target-abi=lp64f -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64-LP64F8; RUN: llc -mtriple=riscv32 -mattr=+f,+zfhmin -target-abi=ilp32f -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV32-ILP32ZFHMIN9; RUN: llc -mtriple=riscv64 -mattr=+f,+zfhmin -target-abi=lp64f -verify-machineinstrs < %s | FileCheck %s -check-prefix=RV64-LP64ZFHMIN10; RUN: llc -mtriple=riscv32 -mattr=+f -mattr=+zfh -verify-machineinstrs -target-abi ilp32 -O1 < %s \11; RUN: | FileCheck %s -check-prefix=RV32-ZFH-ILP3212; RUN: llc -mtriple=riscv32 -mattr=+f -mattr=+zfh -verify-machineinstrs -target-abi ilp32f -O1 < %s \13; RUN: | FileCheck %s -check-prefix=RV32-ZFH-ILP32F14; RUN: llc -mtriple=riscv64 -mattr=+f -mattr=+zfh -verify-machineinstrs -target-abi lp64 -O1 < %s \15; RUN: | FileCheck %s -check-prefix=RV64-ZFH-LP6416; RUN: llc -mtriple=riscv64 -mattr=+f -mattr=+zfh -verify-machineinstrs -target-abi lp64f -O1 < %s \17; RUN: | FileCheck %s -check-prefix=RV64-ZFH-LP64F18 19; Tests passing half arguments and returns.20; Covers with and without F extension, with and without Zfhmin/Zfh extensions,21; and ilp32f/ilp64f calling conventions.22 23define i32 @callee_half_in_regs(i32 %a, half %b) nounwind {24; RV32I-LABEL: callee_half_in_regs:25; RV32I: # %bb.0:26; RV32I-NEXT: addi sp, sp, -1627; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill28; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill29; RV32I-NEXT: mv s0, a030; RV32I-NEXT: slli a0, a1, 1631; RV32I-NEXT: srli a0, a0, 1632; RV32I-NEXT: call __extendhfsf233; RV32I-NEXT: call __fixsfsi34; RV32I-NEXT: add a0, s0, a035; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload36; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload37; RV32I-NEXT: addi sp, sp, 1638; RV32I-NEXT: ret39;40; RV64I-LABEL: callee_half_in_regs:41; RV64I: # %bb.0:42; RV64I-NEXT: addi sp, sp, -1643; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill44; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill45; RV64I-NEXT: mv s0, a046; RV64I-NEXT: slli a0, a1, 4847; RV64I-NEXT: srli a0, a0, 4848; RV64I-NEXT: call __extendhfsf249; RV64I-NEXT: call __fixsfdi50; RV64I-NEXT: addw a0, s0, a051; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload52; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload53; RV64I-NEXT: addi sp, sp, 1654; RV64I-NEXT: ret55;56; RV32IF-LABEL: callee_half_in_regs:57; RV32IF: # %bb.0:58; RV32IF-NEXT: addi sp, sp, -1659; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill60; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill61; RV32IF-NEXT: mv s0, a062; RV32IF-NEXT: mv a0, a163; RV32IF-NEXT: call __extendhfsf264; RV32IF-NEXT: fmv.w.x fa5, a065; RV32IF-NEXT: fcvt.w.s a0, fa5, rtz66; RV32IF-NEXT: add a0, s0, a067; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload68; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload69; RV32IF-NEXT: addi sp, sp, 1670; RV32IF-NEXT: ret71;72; RV64IF-LABEL: callee_half_in_regs:73; RV64IF: # %bb.0:74; RV64IF-NEXT: addi sp, sp, -1675; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill76; RV64IF-NEXT: sd s0, 0(sp) # 8-byte Folded Spill77; RV64IF-NEXT: mv s0, a078; RV64IF-NEXT: mv a0, a179; RV64IF-NEXT: call __extendhfsf280; RV64IF-NEXT: fmv.w.x fa5, a081; RV64IF-NEXT: fcvt.l.s a0, fa5, rtz82; RV64IF-NEXT: addw a0, s0, a083; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload84; RV64IF-NEXT: ld s0, 0(sp) # 8-byte Folded Reload85; RV64IF-NEXT: addi sp, sp, 1686; RV64IF-NEXT: ret87;88; RV32-ILP32F-LABEL: callee_half_in_regs:89; RV32-ILP32F: # %bb.0:90; RV32-ILP32F-NEXT: addi sp, sp, -1691; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill92; RV32-ILP32F-NEXT: sw s0, 8(sp) # 4-byte Folded Spill93; RV32-ILP32F-NEXT: mv s0, a094; RV32-ILP32F-NEXT: call __extendhfsf295; RV32-ILP32F-NEXT: fcvt.w.s a0, fa0, rtz96; RV32-ILP32F-NEXT: add a0, s0, a097; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload98; RV32-ILP32F-NEXT: lw s0, 8(sp) # 4-byte Folded Reload99; RV32-ILP32F-NEXT: addi sp, sp, 16100; RV32-ILP32F-NEXT: ret101;102; RV64-LP64F-LABEL: callee_half_in_regs:103; RV64-LP64F: # %bb.0:104; RV64-LP64F-NEXT: addi sp, sp, -16105; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill106; RV64-LP64F-NEXT: sd s0, 0(sp) # 8-byte Folded Spill107; RV64-LP64F-NEXT: mv s0, a0108; RV64-LP64F-NEXT: call __extendhfsf2109; RV64-LP64F-NEXT: fcvt.l.s a0, fa0, rtz110; RV64-LP64F-NEXT: addw a0, s0, a0111; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload112; RV64-LP64F-NEXT: ld s0, 0(sp) # 8-byte Folded Reload113; RV64-LP64F-NEXT: addi sp, sp, 16114; RV64-LP64F-NEXT: ret115;116; RV32-ILP32ZFHMIN-LABEL: callee_half_in_regs:117; RV32-ILP32ZFHMIN: # %bb.0:118; RV32-ILP32ZFHMIN-NEXT: fcvt.s.h fa5, fa0119; RV32-ILP32ZFHMIN-NEXT: fcvt.w.s a1, fa5, rtz120; RV32-ILP32ZFHMIN-NEXT: add a0, a0, a1121; RV32-ILP32ZFHMIN-NEXT: ret122;123; RV64-LP64ZFHMIN-LABEL: callee_half_in_regs:124; RV64-LP64ZFHMIN: # %bb.0:125; RV64-LP64ZFHMIN-NEXT: fcvt.s.h fa5, fa0126; RV64-LP64ZFHMIN-NEXT: fcvt.w.s a1, fa5, rtz127; RV64-LP64ZFHMIN-NEXT: addw a0, a0, a1128; RV64-LP64ZFHMIN-NEXT: ret129;130; RV32-ZFH-ILP32-LABEL: callee_half_in_regs:131; RV32-ZFH-ILP32: # %bb.0:132; RV32-ZFH-ILP32-NEXT: fmv.h.x fa5, a1133; RV32-ZFH-ILP32-NEXT: fcvt.w.h a1, fa5, rtz134; RV32-ZFH-ILP32-NEXT: add a0, a0, a1135; RV32-ZFH-ILP32-NEXT: ret136;137; RV32-ZFH-ILP32F-LABEL: callee_half_in_regs:138; RV32-ZFH-ILP32F: # %bb.0:139; RV32-ZFH-ILP32F-NEXT: fcvt.w.h a1, fa0, rtz140; RV32-ZFH-ILP32F-NEXT: add a0, a0, a1141; RV32-ZFH-ILP32F-NEXT: ret142;143; RV64-ZFH-LP64-LABEL: callee_half_in_regs:144; RV64-ZFH-LP64: # %bb.0:145; RV64-ZFH-LP64-NEXT: fmv.h.x fa5, a1146; RV64-ZFH-LP64-NEXT: fcvt.w.h a1, fa5, rtz147; RV64-ZFH-LP64-NEXT: addw a0, a0, a1148; RV64-ZFH-LP64-NEXT: ret149;150; RV64-ZFH-LP64F-LABEL: callee_half_in_regs:151; RV64-ZFH-LP64F: # %bb.0:152; RV64-ZFH-LP64F-NEXT: fcvt.w.h a1, fa0, rtz153; RV64-ZFH-LP64F-NEXT: addw a0, a0, a1154; RV64-ZFH-LP64F-NEXT: ret155 %b_fptosi = fptosi half %b to i32156 %1 = add i32 %a, %b_fptosi157 ret i32 %1158}159 160define i32 @caller_half_in_regs() nounwind {161; RV32I-LABEL: caller_half_in_regs:162; RV32I: # %bb.0:163; RV32I-NEXT: addi sp, sp, -16164; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill165; RV32I-NEXT: li a0, 1166; RV32I-NEXT: lui a1, 4167; RV32I-NEXT: call callee_half_in_regs168; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload169; RV32I-NEXT: addi sp, sp, 16170; RV32I-NEXT: ret171;172; RV64I-LABEL: caller_half_in_regs:173; RV64I: # %bb.0:174; RV64I-NEXT: addi sp, sp, -16175; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill176; RV64I-NEXT: li a0, 1177; RV64I-NEXT: lui a1, 4178; RV64I-NEXT: call callee_half_in_regs179; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload180; RV64I-NEXT: addi sp, sp, 16181; RV64I-NEXT: ret182;183; RV32IF-LABEL: caller_half_in_regs:184; RV32IF: # %bb.0:185; RV32IF-NEXT: addi sp, sp, -16186; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill187; RV32IF-NEXT: li a0, 1188; RV32IF-NEXT: lui a1, 1048564189; RV32IF-NEXT: call callee_half_in_regs190; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload191; RV32IF-NEXT: addi sp, sp, 16192; RV32IF-NEXT: ret193;194; RV64IF-LABEL: caller_half_in_regs:195; RV64IF: # %bb.0:196; RV64IF-NEXT: addi sp, sp, -16197; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill198; RV64IF-NEXT: li a0, 1199; RV64IF-NEXT: lui a1, 1048564200; RV64IF-NEXT: call callee_half_in_regs201; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload202; RV64IF-NEXT: addi sp, sp, 16203; RV64IF-NEXT: ret204;205; RV32-ILP32F-LABEL: caller_half_in_regs:206; RV32-ILP32F: # %bb.0:207; RV32-ILP32F-NEXT: addi sp, sp, -16208; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill209; RV32-ILP32F-NEXT: lui a0, 1048564210; RV32-ILP32F-NEXT: fmv.w.x fa0, a0211; RV32-ILP32F-NEXT: li a0, 1212; RV32-ILP32F-NEXT: call callee_half_in_regs213; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload214; RV32-ILP32F-NEXT: addi sp, sp, 16215; RV32-ILP32F-NEXT: ret216;217; RV64-LP64F-LABEL: caller_half_in_regs:218; RV64-LP64F: # %bb.0:219; RV64-LP64F-NEXT: addi sp, sp, -16220; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill221; RV64-LP64F-NEXT: lui a0, 1048564222; RV64-LP64F-NEXT: fmv.w.x fa0, a0223; RV64-LP64F-NEXT: li a0, 1224; RV64-LP64F-NEXT: call callee_half_in_regs225; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload226; RV64-LP64F-NEXT: addi sp, sp, 16227; RV64-LP64F-NEXT: ret228;229; RV32-ILP32ZFHMIN-LABEL: caller_half_in_regs:230; RV32-ILP32ZFHMIN: # %bb.0:231; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, -16232; RV32-ILP32ZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill233; RV32-ILP32ZFHMIN-NEXT: lui a0, 4234; RV32-ILP32ZFHMIN-NEXT: fmv.h.x fa0, a0235; RV32-ILP32ZFHMIN-NEXT: li a0, 1236; RV32-ILP32ZFHMIN-NEXT: call callee_half_in_regs237; RV32-ILP32ZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload238; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, 16239; RV32-ILP32ZFHMIN-NEXT: ret240;241; RV64-LP64ZFHMIN-LABEL: caller_half_in_regs:242; RV64-LP64ZFHMIN: # %bb.0:243; RV64-LP64ZFHMIN-NEXT: addi sp, sp, -16244; RV64-LP64ZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill245; RV64-LP64ZFHMIN-NEXT: lui a0, 4246; RV64-LP64ZFHMIN-NEXT: fmv.h.x fa0, a0247; RV64-LP64ZFHMIN-NEXT: li a0, 1248; RV64-LP64ZFHMIN-NEXT: call callee_half_in_regs249; RV64-LP64ZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload250; RV64-LP64ZFHMIN-NEXT: addi sp, sp, 16251; RV64-LP64ZFHMIN-NEXT: ret252;253; RV32-ZFH-ILP32-LABEL: caller_half_in_regs:254; RV32-ZFH-ILP32: # %bb.0:255; RV32-ZFH-ILP32-NEXT: addi sp, sp, -16256; RV32-ZFH-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill257; RV32-ZFH-ILP32-NEXT: li a0, 1258; RV32-ZFH-ILP32-NEXT: lui a1, 4259; RV32-ZFH-ILP32-NEXT: call callee_half_in_regs260; RV32-ZFH-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload261; RV32-ZFH-ILP32-NEXT: addi sp, sp, 16262; RV32-ZFH-ILP32-NEXT: ret263;264; RV32-ZFH-ILP32F-LABEL: caller_half_in_regs:265; RV32-ZFH-ILP32F: # %bb.0:266; RV32-ZFH-ILP32F-NEXT: addi sp, sp, -16267; RV32-ZFH-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill268; RV32-ZFH-ILP32F-NEXT: lui a0, 4269; RV32-ZFH-ILP32F-NEXT: fmv.h.x fa0, a0270; RV32-ZFH-ILP32F-NEXT: li a0, 1271; RV32-ZFH-ILP32F-NEXT: call callee_half_in_regs272; RV32-ZFH-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload273; RV32-ZFH-ILP32F-NEXT: addi sp, sp, 16274; RV32-ZFH-ILP32F-NEXT: ret275;276; RV64-ZFH-LP64-LABEL: caller_half_in_regs:277; RV64-ZFH-LP64: # %bb.0:278; RV64-ZFH-LP64-NEXT: addi sp, sp, -16279; RV64-ZFH-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill280; RV64-ZFH-LP64-NEXT: li a0, 1281; RV64-ZFH-LP64-NEXT: lui a1, 4282; RV64-ZFH-LP64-NEXT: call callee_half_in_regs283; RV64-ZFH-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload284; RV64-ZFH-LP64-NEXT: addi sp, sp, 16285; RV64-ZFH-LP64-NEXT: ret286;287; RV64-ZFH-LP64F-LABEL: caller_half_in_regs:288; RV64-ZFH-LP64F: # %bb.0:289; RV64-ZFH-LP64F-NEXT: addi sp, sp, -16290; RV64-ZFH-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill291; RV64-ZFH-LP64F-NEXT: lui a0, 4292; RV64-ZFH-LP64F-NEXT: fmv.h.x fa0, a0293; RV64-ZFH-LP64F-NEXT: li a0, 1294; RV64-ZFH-LP64F-NEXT: call callee_half_in_regs295; RV64-ZFH-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload296; RV64-ZFH-LP64F-NEXT: addi sp, sp, 16297; RV64-ZFH-LP64F-NEXT: ret298 %1 = call i32 @callee_half_in_regs(i32 1, half 2.0)299 ret i32 %1300}301 302define i32 @callee_half_on_stack(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, half %i) nounwind {303; RV32I-LABEL: callee_half_on_stack:304; RV32I: # %bb.0:305; RV32I-NEXT: addi sp, sp, -16306; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill307; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill308; RV32I-NEXT: lhu a0, 16(sp)309; RV32I-NEXT: mv s0, a7310; RV32I-NEXT: call __extendhfsf2311; RV32I-NEXT: call __fixsfsi312; RV32I-NEXT: add a0, s0, a0313; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload314; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload315; RV32I-NEXT: addi sp, sp, 16316; RV32I-NEXT: ret317;318; RV64I-LABEL: callee_half_on_stack:319; RV64I: # %bb.0:320; RV64I-NEXT: addi sp, sp, -16321; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill322; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill323; RV64I-NEXT: lhu a0, 16(sp)324; RV64I-NEXT: mv s0, a7325; RV64I-NEXT: call __extendhfsf2326; RV64I-NEXT: call __fixsfdi327; RV64I-NEXT: addw a0, s0, a0328; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload329; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload330; RV64I-NEXT: addi sp, sp, 16331; RV64I-NEXT: ret332;333; RV32IF-LABEL: callee_half_on_stack:334; RV32IF: # %bb.0:335; RV32IF-NEXT: addi sp, sp, -16336; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill337; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill338; RV32IF-NEXT: lhu a0, 16(sp)339; RV32IF-NEXT: mv s0, a7340; RV32IF-NEXT: call __extendhfsf2341; RV32IF-NEXT: fmv.w.x fa5, a0342; RV32IF-NEXT: fcvt.w.s a0, fa5, rtz343; RV32IF-NEXT: add a0, s0, a0344; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload345; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload346; RV32IF-NEXT: addi sp, sp, 16347; RV32IF-NEXT: ret348;349; RV64IF-LABEL: callee_half_on_stack:350; RV64IF: # %bb.0:351; RV64IF-NEXT: addi sp, sp, -16352; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill353; RV64IF-NEXT: sd s0, 0(sp) # 8-byte Folded Spill354; RV64IF-NEXT: lhu a0, 16(sp)355; RV64IF-NEXT: mv s0, a7356; RV64IF-NEXT: call __extendhfsf2357; RV64IF-NEXT: fmv.w.x fa5, a0358; RV64IF-NEXT: fcvt.l.s a0, fa5, rtz359; RV64IF-NEXT: addw a0, s0, a0360; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload361; RV64IF-NEXT: ld s0, 0(sp) # 8-byte Folded Reload362; RV64IF-NEXT: addi sp, sp, 16363; RV64IF-NEXT: ret364;365; RV32-ILP32F-LABEL: callee_half_on_stack:366; RV32-ILP32F: # %bb.0:367; RV32-ILP32F-NEXT: addi sp, sp, -16368; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill369; RV32-ILP32F-NEXT: sw s0, 8(sp) # 4-byte Folded Spill370; RV32-ILP32F-NEXT: mv s0, a7371; RV32-ILP32F-NEXT: call __extendhfsf2372; RV32-ILP32F-NEXT: fcvt.w.s a0, fa0, rtz373; RV32-ILP32F-NEXT: add a0, s0, a0374; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload375; RV32-ILP32F-NEXT: lw s0, 8(sp) # 4-byte Folded Reload376; RV32-ILP32F-NEXT: addi sp, sp, 16377; RV32-ILP32F-NEXT: ret378;379; RV64-LP64F-LABEL: callee_half_on_stack:380; RV64-LP64F: # %bb.0:381; RV64-LP64F-NEXT: addi sp, sp, -16382; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill383; RV64-LP64F-NEXT: sd s0, 0(sp) # 8-byte Folded Spill384; RV64-LP64F-NEXT: mv s0, a7385; RV64-LP64F-NEXT: call __extendhfsf2386; RV64-LP64F-NEXT: fcvt.l.s a0, fa0, rtz387; RV64-LP64F-NEXT: addw a0, s0, a0388; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload389; RV64-LP64F-NEXT: ld s0, 0(sp) # 8-byte Folded Reload390; RV64-LP64F-NEXT: addi sp, sp, 16391; RV64-LP64F-NEXT: ret392;393; RV32-ILP32ZFHMIN-LABEL: callee_half_on_stack:394; RV32-ILP32ZFHMIN: # %bb.0:395; RV32-ILP32ZFHMIN-NEXT: fcvt.s.h fa5, fa0396; RV32-ILP32ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz397; RV32-ILP32ZFHMIN-NEXT: add a0, a7, a0398; RV32-ILP32ZFHMIN-NEXT: ret399;400; RV64-LP64ZFHMIN-LABEL: callee_half_on_stack:401; RV64-LP64ZFHMIN: # %bb.0:402; RV64-LP64ZFHMIN-NEXT: fcvt.s.h fa5, fa0403; RV64-LP64ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz404; RV64-LP64ZFHMIN-NEXT: addw a0, a7, a0405; RV64-LP64ZFHMIN-NEXT: ret406;407; RV32-ZFH-ILP32-LABEL: callee_half_on_stack:408; RV32-ZFH-ILP32: # %bb.0:409; RV32-ZFH-ILP32-NEXT: flh fa5, 0(sp)410; RV32-ZFH-ILP32-NEXT: fcvt.w.h a0, fa5, rtz411; RV32-ZFH-ILP32-NEXT: add a0, a7, a0412; RV32-ZFH-ILP32-NEXT: ret413;414; RV32-ZFH-ILP32F-LABEL: callee_half_on_stack:415; RV32-ZFH-ILP32F: # %bb.0:416; RV32-ZFH-ILP32F-NEXT: fcvt.w.h a0, fa0, rtz417; RV32-ZFH-ILP32F-NEXT: add a0, a7, a0418; RV32-ZFH-ILP32F-NEXT: ret419;420; RV64-ZFH-LP64-LABEL: callee_half_on_stack:421; RV64-ZFH-LP64: # %bb.0:422; RV64-ZFH-LP64-NEXT: flh fa5, 0(sp)423; RV64-ZFH-LP64-NEXT: fcvt.w.h a0, fa5, rtz424; RV64-ZFH-LP64-NEXT: addw a0, a7, a0425; RV64-ZFH-LP64-NEXT: ret426;427; RV64-ZFH-LP64F-LABEL: callee_half_on_stack:428; RV64-ZFH-LP64F: # %bb.0:429; RV64-ZFH-LP64F-NEXT: fcvt.w.h a0, fa0, rtz430; RV64-ZFH-LP64F-NEXT: addw a0, a7, a0431; RV64-ZFH-LP64F-NEXT: ret432 %1 = fptosi half %i to i32433 %2 = add i32 %h, %1434 ret i32 %2435}436 437define i32 @caller_half_on_stack() nounwind {438; RV32I-LABEL: caller_half_on_stack:439; RV32I: # %bb.0:440; RV32I-NEXT: addi sp, sp, -16441; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill442; RV32I-NEXT: lui a7, 5443; RV32I-NEXT: li a0, 1444; RV32I-NEXT: li a1, 2445; RV32I-NEXT: li a2, 3446; RV32I-NEXT: li a3, 4447; RV32I-NEXT: li a4, 5448; RV32I-NEXT: li a5, 6449; RV32I-NEXT: li a6, 7450; RV32I-NEXT: addi t0, a7, -1792451; RV32I-NEXT: li a7, 8452; RV32I-NEXT: sw t0, 0(sp)453; RV32I-NEXT: call callee_half_on_stack454; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload455; RV32I-NEXT: addi sp, sp, 16456; RV32I-NEXT: ret457;458; RV64I-LABEL: caller_half_on_stack:459; RV64I: # %bb.0:460; RV64I-NEXT: addi sp, sp, -16461; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill462; RV64I-NEXT: lui a7, 5463; RV64I-NEXT: li a0, 1464; RV64I-NEXT: li a1, 2465; RV64I-NEXT: li a2, 3466; RV64I-NEXT: li a3, 4467; RV64I-NEXT: li a4, 5468; RV64I-NEXT: li a5, 6469; RV64I-NEXT: li a6, 7470; RV64I-NEXT: addi t0, a7, -1792471; RV64I-NEXT: li a7, 8472; RV64I-NEXT: sd t0, 0(sp)473; RV64I-NEXT: call callee_half_on_stack474; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload475; RV64I-NEXT: addi sp, sp, 16476; RV64I-NEXT: ret477;478; RV32IF-LABEL: caller_half_on_stack:479; RV32IF: # %bb.0:480; RV32IF-NEXT: addi sp, sp, -16481; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill482; RV32IF-NEXT: lui a7, 1048565483; RV32IF-NEXT: li a0, 1484; RV32IF-NEXT: li a1, 2485; RV32IF-NEXT: li a2, 3486; RV32IF-NEXT: li a3, 4487; RV32IF-NEXT: li a4, 5488; RV32IF-NEXT: li a5, 6489; RV32IF-NEXT: li a6, 7490; RV32IF-NEXT: addi t0, a7, -1792491; RV32IF-NEXT: li a7, 8492; RV32IF-NEXT: sw t0, 0(sp)493; RV32IF-NEXT: call callee_half_on_stack494; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload495; RV32IF-NEXT: addi sp, sp, 16496; RV32IF-NEXT: ret497;498; RV64IF-LABEL: caller_half_on_stack:499; RV64IF: # %bb.0:500; RV64IF-NEXT: addi sp, sp, -16501; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill502; RV64IF-NEXT: lui a7, 1048565503; RV64IF-NEXT: li a0, 1504; RV64IF-NEXT: li a1, 2505; RV64IF-NEXT: li a2, 3506; RV64IF-NEXT: li a3, 4507; RV64IF-NEXT: li a4, 5508; RV64IF-NEXT: li a5, 6509; RV64IF-NEXT: li a6, 7510; RV64IF-NEXT: addi t0, a7, -1792511; RV64IF-NEXT: li a7, 8512; RV64IF-NEXT: sw t0, 0(sp)513; RV64IF-NEXT: call callee_half_on_stack514; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload515; RV64IF-NEXT: addi sp, sp, 16516; RV64IF-NEXT: ret517;518; RV32-ILP32F-LABEL: caller_half_on_stack:519; RV32-ILP32F: # %bb.0:520; RV32-ILP32F-NEXT: addi sp, sp, -16521; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill522; RV32-ILP32F-NEXT: lui a7, 1048565523; RV32-ILP32F-NEXT: li a0, 1524; RV32-ILP32F-NEXT: li a1, 2525; RV32-ILP32F-NEXT: li a2, 3526; RV32-ILP32F-NEXT: li a3, 4527; RV32-ILP32F-NEXT: li a4, 5528; RV32-ILP32F-NEXT: li a5, 6529; RV32-ILP32F-NEXT: li a6, 7530; RV32-ILP32F-NEXT: addi a7, a7, -1792531; RV32-ILP32F-NEXT: fmv.w.x fa0, a7532; RV32-ILP32F-NEXT: li a7, 8533; RV32-ILP32F-NEXT: call callee_half_on_stack534; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload535; RV32-ILP32F-NEXT: addi sp, sp, 16536; RV32-ILP32F-NEXT: ret537;538; RV64-LP64F-LABEL: caller_half_on_stack:539; RV64-LP64F: # %bb.0:540; RV64-LP64F-NEXT: addi sp, sp, -16541; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill542; RV64-LP64F-NEXT: lui a7, 1048565543; RV64-LP64F-NEXT: li a0, 1544; RV64-LP64F-NEXT: li a1, 2545; RV64-LP64F-NEXT: li a2, 3546; RV64-LP64F-NEXT: li a3, 4547; RV64-LP64F-NEXT: li a4, 5548; RV64-LP64F-NEXT: li a5, 6549; RV64-LP64F-NEXT: li a6, 7550; RV64-LP64F-NEXT: addi a7, a7, -1792551; RV64-LP64F-NEXT: fmv.w.x fa0, a7552; RV64-LP64F-NEXT: li a7, 8553; RV64-LP64F-NEXT: call callee_half_on_stack554; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload555; RV64-LP64F-NEXT: addi sp, sp, 16556; RV64-LP64F-NEXT: ret557;558; RV32-ILP32ZFHMIN-LABEL: caller_half_on_stack:559; RV32-ILP32ZFHMIN: # %bb.0:560; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, -16561; RV32-ILP32ZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill562; RV32-ILP32ZFHMIN-NEXT: lui a7, 5563; RV32-ILP32ZFHMIN-NEXT: li a0, 1564; RV32-ILP32ZFHMIN-NEXT: li a1, 2565; RV32-ILP32ZFHMIN-NEXT: li a2, 3566; RV32-ILP32ZFHMIN-NEXT: li a3, 4567; RV32-ILP32ZFHMIN-NEXT: li a4, 5568; RV32-ILP32ZFHMIN-NEXT: li a5, 6569; RV32-ILP32ZFHMIN-NEXT: li a6, 7570; RV32-ILP32ZFHMIN-NEXT: addi a7, a7, -1792571; RV32-ILP32ZFHMIN-NEXT: fmv.h.x fa0, a7572; RV32-ILP32ZFHMIN-NEXT: li a7, 8573; RV32-ILP32ZFHMIN-NEXT: call callee_half_on_stack574; RV32-ILP32ZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload575; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, 16576; RV32-ILP32ZFHMIN-NEXT: ret577;578; RV64-LP64ZFHMIN-LABEL: caller_half_on_stack:579; RV64-LP64ZFHMIN: # %bb.0:580; RV64-LP64ZFHMIN-NEXT: addi sp, sp, -16581; RV64-LP64ZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill582; RV64-LP64ZFHMIN-NEXT: lui a7, 5583; RV64-LP64ZFHMIN-NEXT: li a0, 1584; RV64-LP64ZFHMIN-NEXT: li a1, 2585; RV64-LP64ZFHMIN-NEXT: li a2, 3586; RV64-LP64ZFHMIN-NEXT: li a3, 4587; RV64-LP64ZFHMIN-NEXT: li a4, 5588; RV64-LP64ZFHMIN-NEXT: li a5, 6589; RV64-LP64ZFHMIN-NEXT: li a6, 7590; RV64-LP64ZFHMIN-NEXT: addi a7, a7, -1792591; RV64-LP64ZFHMIN-NEXT: fmv.h.x fa0, a7592; RV64-LP64ZFHMIN-NEXT: li a7, 8593; RV64-LP64ZFHMIN-NEXT: call callee_half_on_stack594; RV64-LP64ZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload595; RV64-LP64ZFHMIN-NEXT: addi sp, sp, 16596; RV64-LP64ZFHMIN-NEXT: ret597;598; RV32-ZFH-ILP32-LABEL: caller_half_on_stack:599; RV32-ZFH-ILP32: # %bb.0:600; RV32-ZFH-ILP32-NEXT: addi sp, sp, -16601; RV32-ZFH-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill602; RV32-ZFH-ILP32-NEXT: lui a7, 5603; RV32-ZFH-ILP32-NEXT: li a0, 1604; RV32-ZFH-ILP32-NEXT: li a1, 2605; RV32-ZFH-ILP32-NEXT: li a2, 3606; RV32-ZFH-ILP32-NEXT: li a3, 4607; RV32-ZFH-ILP32-NEXT: li a4, 5608; RV32-ZFH-ILP32-NEXT: li a5, 6609; RV32-ZFH-ILP32-NEXT: li a6, 7610; RV32-ZFH-ILP32-NEXT: addi a7, a7, -1792611; RV32-ZFH-ILP32-NEXT: fmv.h.x fa5, a7612; RV32-ZFH-ILP32-NEXT: li a7, 8613; RV32-ZFH-ILP32-NEXT: fsh fa5, 0(sp)614; RV32-ZFH-ILP32-NEXT: call callee_half_on_stack615; RV32-ZFH-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload616; RV32-ZFH-ILP32-NEXT: addi sp, sp, 16617; RV32-ZFH-ILP32-NEXT: ret618;619; RV32-ZFH-ILP32F-LABEL: caller_half_on_stack:620; RV32-ZFH-ILP32F: # %bb.0:621; RV32-ZFH-ILP32F-NEXT: addi sp, sp, -16622; RV32-ZFH-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill623; RV32-ZFH-ILP32F-NEXT: lui a7, 5624; RV32-ZFH-ILP32F-NEXT: li a0, 1625; RV32-ZFH-ILP32F-NEXT: li a1, 2626; RV32-ZFH-ILP32F-NEXT: li a2, 3627; RV32-ZFH-ILP32F-NEXT: li a3, 4628; RV32-ZFH-ILP32F-NEXT: li a4, 5629; RV32-ZFH-ILP32F-NEXT: li a5, 6630; RV32-ZFH-ILP32F-NEXT: li a6, 7631; RV32-ZFH-ILP32F-NEXT: addi a7, a7, -1792632; RV32-ZFH-ILP32F-NEXT: fmv.h.x fa0, a7633; RV32-ZFH-ILP32F-NEXT: li a7, 8634; RV32-ZFH-ILP32F-NEXT: call callee_half_on_stack635; RV32-ZFH-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload636; RV32-ZFH-ILP32F-NEXT: addi sp, sp, 16637; RV32-ZFH-ILP32F-NEXT: ret638;639; RV64-ZFH-LP64-LABEL: caller_half_on_stack:640; RV64-ZFH-LP64: # %bb.0:641; RV64-ZFH-LP64-NEXT: addi sp, sp, -16642; RV64-ZFH-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill643; RV64-ZFH-LP64-NEXT: lui a7, 5644; RV64-ZFH-LP64-NEXT: li a0, 1645; RV64-ZFH-LP64-NEXT: li a1, 2646; RV64-ZFH-LP64-NEXT: li a2, 3647; RV64-ZFH-LP64-NEXT: li a3, 4648; RV64-ZFH-LP64-NEXT: li a4, 5649; RV64-ZFH-LP64-NEXT: li a5, 6650; RV64-ZFH-LP64-NEXT: li a6, 7651; RV64-ZFH-LP64-NEXT: addi a7, a7, -1792652; RV64-ZFH-LP64-NEXT: fmv.h.x fa5, a7653; RV64-ZFH-LP64-NEXT: li a7, 8654; RV64-ZFH-LP64-NEXT: fsh fa5, 0(sp)655; RV64-ZFH-LP64-NEXT: call callee_half_on_stack656; RV64-ZFH-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload657; RV64-ZFH-LP64-NEXT: addi sp, sp, 16658; RV64-ZFH-LP64-NEXT: ret659;660; RV64-ZFH-LP64F-LABEL: caller_half_on_stack:661; RV64-ZFH-LP64F: # %bb.0:662; RV64-ZFH-LP64F-NEXT: addi sp, sp, -16663; RV64-ZFH-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill664; RV64-ZFH-LP64F-NEXT: lui a7, 5665; RV64-ZFH-LP64F-NEXT: li a0, 1666; RV64-ZFH-LP64F-NEXT: li a1, 2667; RV64-ZFH-LP64F-NEXT: li a2, 3668; RV64-ZFH-LP64F-NEXT: li a3, 4669; RV64-ZFH-LP64F-NEXT: li a4, 5670; RV64-ZFH-LP64F-NEXT: li a5, 6671; RV64-ZFH-LP64F-NEXT: li a6, 7672; RV64-ZFH-LP64F-NEXT: addi a7, a7, -1792673; RV64-ZFH-LP64F-NEXT: fmv.h.x fa0, a7674; RV64-ZFH-LP64F-NEXT: li a7, 8675; RV64-ZFH-LP64F-NEXT: call callee_half_on_stack676; RV64-ZFH-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload677; RV64-ZFH-LP64F-NEXT: addi sp, sp, 16678; RV64-ZFH-LP64F-NEXT: ret679 %1 = call i32 @callee_half_on_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, half 10.0)680 ret i32 %1681}682 683define i32 @callee_half_on_stack_exhausted_gprs_fprs(i32 %a, float %fa, i32 %b, float %fb, i32 %c, float %fc, i32 %d, float %fd, i32 %e, float %fe, i32 %f, float %ff, i32 %g, float %fg, i32 %h, float %fh, half %i) nounwind {684; RV32I-LABEL: callee_half_on_stack_exhausted_gprs_fprs:685; RV32I: # %bb.0:686; RV32I-NEXT: addi sp, sp, -16687; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill688; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill689; RV32I-NEXT: lw s0, 40(sp)690; RV32I-NEXT: lhu a0, 48(sp)691; RV32I-NEXT: call __extendhfsf2692; RV32I-NEXT: call __fixsfsi693; RV32I-NEXT: add a0, s0, a0694; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload695; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload696; RV32I-NEXT: addi sp, sp, 16697; RV32I-NEXT: ret698;699; RV64I-LABEL: callee_half_on_stack_exhausted_gprs_fprs:700; RV64I: # %bb.0:701; RV64I-NEXT: addi sp, sp, -16702; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill703; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill704; RV64I-NEXT: lw s0, 64(sp)705; RV64I-NEXT: lhu a0, 80(sp)706; RV64I-NEXT: call __extendhfsf2707; RV64I-NEXT: call __fixsfdi708; RV64I-NEXT: addw a0, s0, a0709; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload710; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload711; RV64I-NEXT: addi sp, sp, 16712; RV64I-NEXT: ret713;714; RV32IF-LABEL: callee_half_on_stack_exhausted_gprs_fprs:715; RV32IF: # %bb.0:716; RV32IF-NEXT: addi sp, sp, -16717; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill718; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill719; RV32IF-NEXT: lw s0, 40(sp)720; RV32IF-NEXT: lhu a0, 48(sp)721; RV32IF-NEXT: call __extendhfsf2722; RV32IF-NEXT: fmv.w.x fa5, a0723; RV32IF-NEXT: fcvt.w.s a0, fa5, rtz724; RV32IF-NEXT: add a0, s0, a0725; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload726; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload727; RV32IF-NEXT: addi sp, sp, 16728; RV32IF-NEXT: ret729;730; RV64IF-LABEL: callee_half_on_stack_exhausted_gprs_fprs:731; RV64IF: # %bb.0:732; RV64IF-NEXT: addi sp, sp, -16733; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill734; RV64IF-NEXT: sd s0, 0(sp) # 8-byte Folded Spill735; RV64IF-NEXT: lw s0, 64(sp)736; RV64IF-NEXT: lhu a0, 80(sp)737; RV64IF-NEXT: call __extendhfsf2738; RV64IF-NEXT: fmv.w.x fa5, a0739; RV64IF-NEXT: fcvt.l.s a0, fa5, rtz740; RV64IF-NEXT: addw a0, s0, a0741; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload742; RV64IF-NEXT: ld s0, 0(sp) # 8-byte Folded Reload743; RV64IF-NEXT: addi sp, sp, 16744; RV64IF-NEXT: ret745;746; RV32-ILP32F-LABEL: callee_half_on_stack_exhausted_gprs_fprs:747; RV32-ILP32F: # %bb.0:748; RV32-ILP32F-NEXT: addi sp, sp, -16749; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill750; RV32-ILP32F-NEXT: sw s0, 8(sp) # 4-byte Folded Spill751; RV32-ILP32F-NEXT: mv s0, a7752; RV32-ILP32F-NEXT: lhu a0, 16(sp)753; RV32-ILP32F-NEXT: fmv.w.x fa0, a0754; RV32-ILP32F-NEXT: call __extendhfsf2755; RV32-ILP32F-NEXT: fcvt.w.s a0, fa0, rtz756; RV32-ILP32F-NEXT: add a0, s0, a0757; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload758; RV32-ILP32F-NEXT: lw s0, 8(sp) # 4-byte Folded Reload759; RV32-ILP32F-NEXT: addi sp, sp, 16760; RV32-ILP32F-NEXT: ret761;762; RV64-LP64F-LABEL: callee_half_on_stack_exhausted_gprs_fprs:763; RV64-LP64F: # %bb.0:764; RV64-LP64F-NEXT: addi sp, sp, -16765; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill766; RV64-LP64F-NEXT: sd s0, 0(sp) # 8-byte Folded Spill767; RV64-LP64F-NEXT: lhu a0, 16(sp)768; RV64-LP64F-NEXT: mv s0, a7769; RV64-LP64F-NEXT: fmv.w.x fa0, a0770; RV64-LP64F-NEXT: call __extendhfsf2771; RV64-LP64F-NEXT: fcvt.l.s a0, fa0, rtz772; RV64-LP64F-NEXT: addw a0, s0, a0773; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload774; RV64-LP64F-NEXT: ld s0, 0(sp) # 8-byte Folded Reload775; RV64-LP64F-NEXT: addi sp, sp, 16776; RV64-LP64F-NEXT: ret777;778; RV32-ILP32ZFHMIN-LABEL: callee_half_on_stack_exhausted_gprs_fprs:779; RV32-ILP32ZFHMIN: # %bb.0:780; RV32-ILP32ZFHMIN-NEXT: flh fa5, 0(sp)781; RV32-ILP32ZFHMIN-NEXT: fcvt.s.h fa5, fa5782; RV32-ILP32ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz783; RV32-ILP32ZFHMIN-NEXT: add a0, a7, a0784; RV32-ILP32ZFHMIN-NEXT: ret785;786; RV64-LP64ZFHMIN-LABEL: callee_half_on_stack_exhausted_gprs_fprs:787; RV64-LP64ZFHMIN: # %bb.0:788; RV64-LP64ZFHMIN-NEXT: flh fa5, 0(sp)789; RV64-LP64ZFHMIN-NEXT: fcvt.s.h fa5, fa5790; RV64-LP64ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz791; RV64-LP64ZFHMIN-NEXT: addw a0, a7, a0792; RV64-LP64ZFHMIN-NEXT: ret793;794; RV32-ZFH-ILP32-LABEL: callee_half_on_stack_exhausted_gprs_fprs:795; RV32-ZFH-ILP32: # %bb.0:796; RV32-ZFH-ILP32-NEXT: flh fa5, 32(sp)797; RV32-ZFH-ILP32-NEXT: lw a0, 24(sp)798; RV32-ZFH-ILP32-NEXT: fcvt.w.h a1, fa5, rtz799; RV32-ZFH-ILP32-NEXT: add a0, a0, a1800; RV32-ZFH-ILP32-NEXT: ret801;802; RV32-ZFH-ILP32F-LABEL: callee_half_on_stack_exhausted_gprs_fprs:803; RV32-ZFH-ILP32F: # %bb.0:804; RV32-ZFH-ILP32F-NEXT: flh fa5, 0(sp)805; RV32-ZFH-ILP32F-NEXT: fcvt.w.h a0, fa5, rtz806; RV32-ZFH-ILP32F-NEXT: add a0, a7, a0807; RV32-ZFH-ILP32F-NEXT: ret808;809; RV64-ZFH-LP64-LABEL: callee_half_on_stack_exhausted_gprs_fprs:810; RV64-ZFH-LP64: # %bb.0:811; RV64-ZFH-LP64-NEXT: flh fa5, 64(sp)812; RV64-ZFH-LP64-NEXT: lw a0, 48(sp)813; RV64-ZFH-LP64-NEXT: fcvt.w.h a1, fa5, rtz814; RV64-ZFH-LP64-NEXT: addw a0, a0, a1815; RV64-ZFH-LP64-NEXT: ret816;817; RV64-ZFH-LP64F-LABEL: callee_half_on_stack_exhausted_gprs_fprs:818; RV64-ZFH-LP64F: # %bb.0:819; RV64-ZFH-LP64F-NEXT: flh fa5, 0(sp)820; RV64-ZFH-LP64F-NEXT: fcvt.w.h a0, fa5, rtz821; RV64-ZFH-LP64F-NEXT: addw a0, a7, a0822; RV64-ZFH-LP64F-NEXT: ret823 %1 = fptosi half %i to i32824 %2 = add i32 %h, %1825 ret i32 %2826}827 828define i32 @caller_half_on_stack_exhausted_gprs_fprs() nounwind {829; RV32I-LABEL: caller_half_on_stack_exhausted_gprs_fprs:830; RV32I: # %bb.0:831; RV32I-NEXT: addi sp, sp, -48832; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill833; RV32I-NEXT: lui a7, 5834; RV32I-NEXT: lui a6, 266240835; RV32I-NEXT: li t0, 8836; RV32I-NEXT: lui t1, 265728837; RV32I-NEXT: li t2, 7838; RV32I-NEXT: lui t3, 265216839; RV32I-NEXT: li t4, 6840; RV32I-NEXT: lui t5, 264704841; RV32I-NEXT: li t6, 5842; RV32I-NEXT: li a0, 1843; RV32I-NEXT: lui a1, 260096844; RV32I-NEXT: li a2, 2845; RV32I-NEXT: lui a3, 262144846; RV32I-NEXT: li a4, 3847; RV32I-NEXT: lui a5, 263168848; RV32I-NEXT: sw t2, 16(sp)849; RV32I-NEXT: sw t1, 20(sp)850; RV32I-NEXT: sw t0, 24(sp)851; RV32I-NEXT: sw a6, 28(sp)852; RV32I-NEXT: li a6, 4853; RV32I-NEXT: addi a7, a7, -1792854; RV32I-NEXT: sw a7, 32(sp)855; RV32I-NEXT: lui a7, 264192856; RV32I-NEXT: sw t6, 0(sp)857; RV32I-NEXT: sw t5, 4(sp)858; RV32I-NEXT: sw t4, 8(sp)859; RV32I-NEXT: sw t3, 12(sp)860; RV32I-NEXT: call callee_half_on_stack861; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload862; RV32I-NEXT: addi sp, sp, 48863; RV32I-NEXT: ret864;865; RV64I-LABEL: caller_half_on_stack_exhausted_gprs_fprs:866; RV64I: # %bb.0:867; RV64I-NEXT: addi sp, sp, -80868; RV64I-NEXT: sd ra, 72(sp) # 8-byte Folded Spill869; RV64I-NEXT: lui a7, 5870; RV64I-NEXT: lui a6, 266240871; RV64I-NEXT: li t0, 8872; RV64I-NEXT: lui t1, 265728873; RV64I-NEXT: li t2, 7874; RV64I-NEXT: lui t3, 265216875; RV64I-NEXT: li t4, 6876; RV64I-NEXT: lui t5, 264704877; RV64I-NEXT: li t6, 5878; RV64I-NEXT: li a0, 1879; RV64I-NEXT: lui a1, 260096880; RV64I-NEXT: li a2, 2881; RV64I-NEXT: lui a3, 262144882; RV64I-NEXT: li a4, 3883; RV64I-NEXT: lui a5, 263168884; RV64I-NEXT: sd t2, 32(sp)885; RV64I-NEXT: sd t1, 40(sp)886; RV64I-NEXT: sd t0, 48(sp)887; RV64I-NEXT: sd a6, 56(sp)888; RV64I-NEXT: li a6, 4889; RV64I-NEXT: addi a7, a7, -1792890; RV64I-NEXT: sd a7, 64(sp)891; RV64I-NEXT: lui a7, 264192892; RV64I-NEXT: sd t6, 0(sp)893; RV64I-NEXT: sd t5, 8(sp)894; RV64I-NEXT: sd t4, 16(sp)895; RV64I-NEXT: sd t3, 24(sp)896; RV64I-NEXT: call callee_half_on_stack897; RV64I-NEXT: ld ra, 72(sp) # 8-byte Folded Reload898; RV64I-NEXT: addi sp, sp, 80899; RV64I-NEXT: ret900;901; RV32IF-LABEL: caller_half_on_stack_exhausted_gprs_fprs:902; RV32IF: # %bb.0:903; RV32IF-NEXT: addi sp, sp, -48904; RV32IF-NEXT: sw ra, 44(sp) # 4-byte Folded Spill905; RV32IF-NEXT: lui a7, 1048565906; RV32IF-NEXT: lui a6, 266240907; RV32IF-NEXT: li t0, 8908; RV32IF-NEXT: lui t1, 265728909; RV32IF-NEXT: li t2, 7910; RV32IF-NEXT: lui t3, 265216911; RV32IF-NEXT: li t4, 6912; RV32IF-NEXT: lui t5, 264704913; RV32IF-NEXT: li t6, 5914; RV32IF-NEXT: li a0, 1915; RV32IF-NEXT: lui a1, 260096916; RV32IF-NEXT: li a2, 2917; RV32IF-NEXT: lui a3, 262144918; RV32IF-NEXT: li a4, 3919; RV32IF-NEXT: lui a5, 263168920; RV32IF-NEXT: sw t2, 16(sp)921; RV32IF-NEXT: sw t1, 20(sp)922; RV32IF-NEXT: sw t0, 24(sp)923; RV32IF-NEXT: sw a6, 28(sp)924; RV32IF-NEXT: li a6, 4925; RV32IF-NEXT: addi a7, a7, -1792926; RV32IF-NEXT: sw a7, 32(sp)927; RV32IF-NEXT: lui a7, 264192928; RV32IF-NEXT: sw t6, 0(sp)929; RV32IF-NEXT: sw t5, 4(sp)930; RV32IF-NEXT: sw t4, 8(sp)931; RV32IF-NEXT: sw t3, 12(sp)932; RV32IF-NEXT: call callee_half_on_stack933; RV32IF-NEXT: lw ra, 44(sp) # 4-byte Folded Reload934; RV32IF-NEXT: addi sp, sp, 48935; RV32IF-NEXT: ret936;937; RV64IF-LABEL: caller_half_on_stack_exhausted_gprs_fprs:938; RV64IF: # %bb.0:939; RV64IF-NEXT: addi sp, sp, -80940; RV64IF-NEXT: sd ra, 72(sp) # 8-byte Folded Spill941; RV64IF-NEXT: lui a7, 1048565942; RV64IF-NEXT: lui a6, 266240943; RV64IF-NEXT: li t0, 8944; RV64IF-NEXT: lui t1, 265728945; RV64IF-NEXT: li t2, 7946; RV64IF-NEXT: lui t3, 265216947; RV64IF-NEXT: li t4, 6948; RV64IF-NEXT: lui t5, 264704949; RV64IF-NEXT: li t6, 5950; RV64IF-NEXT: li a0, 1951; RV64IF-NEXT: lui a1, 260096952; RV64IF-NEXT: li a2, 2953; RV64IF-NEXT: lui a3, 262144954; RV64IF-NEXT: li a4, 3955; RV64IF-NEXT: lui a5, 263168956; RV64IF-NEXT: sd t2, 32(sp)957; RV64IF-NEXT: sw t1, 40(sp)958; RV64IF-NEXT: sd t0, 48(sp)959; RV64IF-NEXT: sw a6, 56(sp)960; RV64IF-NEXT: li a6, 4961; RV64IF-NEXT: addi a7, a7, -1792962; RV64IF-NEXT: sw a7, 64(sp)963; RV64IF-NEXT: lui a7, 264192964; RV64IF-NEXT: sd t6, 0(sp)965; RV64IF-NEXT: sw t5, 8(sp)966; RV64IF-NEXT: sd t4, 16(sp)967; RV64IF-NEXT: sw t3, 24(sp)968; RV64IF-NEXT: call callee_half_on_stack969; RV64IF-NEXT: ld ra, 72(sp) # 8-byte Folded Reload970; RV64IF-NEXT: addi sp, sp, 80971; RV64IF-NEXT: ret972;973; RV32-ILP32F-LABEL: caller_half_on_stack_exhausted_gprs_fprs:974; RV32-ILP32F: # %bb.0:975; RV32-ILP32F-NEXT: addi sp, sp, -16976; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill977; RV32-ILP32F-NEXT: lui a7, 1048565978; RV32-ILP32F-NEXT: lui a0, 260096979; RV32-ILP32F-NEXT: lui a1, 262144980; RV32-ILP32F-NEXT: lui a2, 263168981; RV32-ILP32F-NEXT: lui a3, 264192982; RV32-ILP32F-NEXT: lui a4, 264704983; RV32-ILP32F-NEXT: lui a5, 265216984; RV32-ILP32F-NEXT: lui a6, 265728985; RV32-ILP32F-NEXT: lui t0, 266240986; RV32-ILP32F-NEXT: fmv.w.x fa0, a0987; RV32-ILP32F-NEXT: li a0, 1988; RV32-ILP32F-NEXT: fmv.w.x fa1, a1989; RV32-ILP32F-NEXT: li a1, 2990; RV32-ILP32F-NEXT: fmv.w.x fa2, a2991; RV32-ILP32F-NEXT: li a2, 3992; RV32-ILP32F-NEXT: fmv.w.x fa3, a3993; RV32-ILP32F-NEXT: li a3, 4994; RV32-ILP32F-NEXT: fmv.w.x fa4, a4995; RV32-ILP32F-NEXT: li a4, 5996; RV32-ILP32F-NEXT: fmv.w.x fa5, a5997; RV32-ILP32F-NEXT: li a5, 6998; RV32-ILP32F-NEXT: fmv.w.x fa6, a6999; RV32-ILP32F-NEXT: li a6, 71000; RV32-ILP32F-NEXT: addi t1, a7, -17921001; RV32-ILP32F-NEXT: fmv.w.x fa7, t01002; RV32-ILP32F-NEXT: li a7, 81003; RV32-ILP32F-NEXT: sw t1, 0(sp)1004; RV32-ILP32F-NEXT: call callee_half_on_stack1005; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1006; RV32-ILP32F-NEXT: addi sp, sp, 161007; RV32-ILP32F-NEXT: ret1008;1009; RV64-LP64F-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1010; RV64-LP64F: # %bb.0:1011; RV64-LP64F-NEXT: addi sp, sp, -161012; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1013; RV64-LP64F-NEXT: lui a7, 10485651014; RV64-LP64F-NEXT: lui a0, 2600961015; RV64-LP64F-NEXT: lui a1, 2621441016; RV64-LP64F-NEXT: lui a2, 2631681017; RV64-LP64F-NEXT: lui a3, 2641921018; RV64-LP64F-NEXT: lui a4, 2647041019; RV64-LP64F-NEXT: lui a5, 2652161020; RV64-LP64F-NEXT: lui a6, 2657281021; RV64-LP64F-NEXT: lui t0, 2662401022; RV64-LP64F-NEXT: fmv.w.x fa0, a01023; RV64-LP64F-NEXT: li a0, 11024; RV64-LP64F-NEXT: fmv.w.x fa1, a11025; RV64-LP64F-NEXT: li a1, 21026; RV64-LP64F-NEXT: fmv.w.x fa2, a21027; RV64-LP64F-NEXT: li a2, 31028; RV64-LP64F-NEXT: fmv.w.x fa3, a31029; RV64-LP64F-NEXT: li a3, 41030; RV64-LP64F-NEXT: fmv.w.x fa4, a41031; RV64-LP64F-NEXT: li a4, 51032; RV64-LP64F-NEXT: fmv.w.x fa5, a51033; RV64-LP64F-NEXT: li a5, 61034; RV64-LP64F-NEXT: fmv.w.x fa6, a61035; RV64-LP64F-NEXT: li a6, 71036; RV64-LP64F-NEXT: addi t1, a7, -17921037; RV64-LP64F-NEXT: fmv.w.x fa7, t01038; RV64-LP64F-NEXT: li a7, 81039; RV64-LP64F-NEXT: sw t1, 0(sp)1040; RV64-LP64F-NEXT: call callee_half_on_stack1041; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1042; RV64-LP64F-NEXT: addi sp, sp, 161043; RV64-LP64F-NEXT: ret1044;1045; RV32-ILP32ZFHMIN-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1046; RV32-ILP32ZFHMIN: # %bb.0:1047; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, -161048; RV32-ILP32ZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1049; RV32-ILP32ZFHMIN-NEXT: lui a7, 51050; RV32-ILP32ZFHMIN-NEXT: lui a0, 2600961051; RV32-ILP32ZFHMIN-NEXT: lui a1, 2621441052; RV32-ILP32ZFHMIN-NEXT: lui a2, 2631681053; RV32-ILP32ZFHMIN-NEXT: lui a3, 2641921054; RV32-ILP32ZFHMIN-NEXT: lui a4, 2647041055; RV32-ILP32ZFHMIN-NEXT: lui a5, 2652161056; RV32-ILP32ZFHMIN-NEXT: lui a6, 2657281057; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa0, a01058; RV32-ILP32ZFHMIN-NEXT: lui t0, 2662401059; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa1, a11060; RV32-ILP32ZFHMIN-NEXT: li a0, 11061; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa2, a21062; RV32-ILP32ZFHMIN-NEXT: li a1, 21063; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa3, a31064; RV32-ILP32ZFHMIN-NEXT: li a2, 31065; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa4, a41066; RV32-ILP32ZFHMIN-NEXT: li a3, 41067; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa5, a51068; RV32-ILP32ZFHMIN-NEXT: li a4, 51069; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa6, a61070; RV32-ILP32ZFHMIN-NEXT: li a5, 61071; RV32-ILP32ZFHMIN-NEXT: fmv.w.x fa7, t01072; RV32-ILP32ZFHMIN-NEXT: li a6, 71073; RV32-ILP32ZFHMIN-NEXT: addi a7, a7, -17921074; RV32-ILP32ZFHMIN-NEXT: fmv.h.x ft0, a71075; RV32-ILP32ZFHMIN-NEXT: li a7, 81076; RV32-ILP32ZFHMIN-NEXT: fsh ft0, 0(sp)1077; RV32-ILP32ZFHMIN-NEXT: call callee_half_on_stack1078; RV32-ILP32ZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1079; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, 161080; RV32-ILP32ZFHMIN-NEXT: ret1081;1082; RV64-LP64ZFHMIN-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1083; RV64-LP64ZFHMIN: # %bb.0:1084; RV64-LP64ZFHMIN-NEXT: addi sp, sp, -161085; RV64-LP64ZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1086; RV64-LP64ZFHMIN-NEXT: lui a7, 51087; RV64-LP64ZFHMIN-NEXT: lui a0, 2600961088; RV64-LP64ZFHMIN-NEXT: lui a1, 2621441089; RV64-LP64ZFHMIN-NEXT: lui a2, 2631681090; RV64-LP64ZFHMIN-NEXT: lui a3, 2641921091; RV64-LP64ZFHMIN-NEXT: lui a4, 2647041092; RV64-LP64ZFHMIN-NEXT: lui a5, 2652161093; RV64-LP64ZFHMIN-NEXT: lui a6, 2657281094; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa0, a01095; RV64-LP64ZFHMIN-NEXT: lui t0, 2662401096; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa1, a11097; RV64-LP64ZFHMIN-NEXT: li a0, 11098; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa2, a21099; RV64-LP64ZFHMIN-NEXT: li a1, 21100; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa3, a31101; RV64-LP64ZFHMIN-NEXT: li a2, 31102; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa4, a41103; RV64-LP64ZFHMIN-NEXT: li a3, 41104; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa5, a51105; RV64-LP64ZFHMIN-NEXT: li a4, 51106; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa6, a61107; RV64-LP64ZFHMIN-NEXT: li a5, 61108; RV64-LP64ZFHMIN-NEXT: fmv.w.x fa7, t01109; RV64-LP64ZFHMIN-NEXT: li a6, 71110; RV64-LP64ZFHMIN-NEXT: addi a7, a7, -17921111; RV64-LP64ZFHMIN-NEXT: fmv.h.x ft0, a71112; RV64-LP64ZFHMIN-NEXT: li a7, 81113; RV64-LP64ZFHMIN-NEXT: fsh ft0, 0(sp)1114; RV64-LP64ZFHMIN-NEXT: call callee_half_on_stack1115; RV64-LP64ZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1116; RV64-LP64ZFHMIN-NEXT: addi sp, sp, 161117; RV64-LP64ZFHMIN-NEXT: ret1118;1119; RV32-ZFH-ILP32-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1120; RV32-ZFH-ILP32: # %bb.0:1121; RV32-ZFH-ILP32-NEXT: addi sp, sp, -481122; RV32-ZFH-ILP32-NEXT: sw ra, 44(sp) # 4-byte Folded Spill1123; RV32-ZFH-ILP32-NEXT: lui a5, 2662401124; RV32-ZFH-ILP32-NEXT: li a6, 81125; RV32-ZFH-ILP32-NEXT: lui a7, 2657281126; RV32-ZFH-ILP32-NEXT: li t0, 71127; RV32-ZFH-ILP32-NEXT: lui t1, 2652161128; RV32-ZFH-ILP32-NEXT: li t2, 61129; RV32-ZFH-ILP32-NEXT: lui t3, 2647041130; RV32-ZFH-ILP32-NEXT: li t4, 51131; RV32-ZFH-ILP32-NEXT: lui t5, 51132; RV32-ZFH-ILP32-NEXT: li a0, 11133; RV32-ZFH-ILP32-NEXT: lui a1, 2600961134; RV32-ZFH-ILP32-NEXT: li a2, 21135; RV32-ZFH-ILP32-NEXT: lui a3, 2621441136; RV32-ZFH-ILP32-NEXT: li a4, 31137; RV32-ZFH-ILP32-NEXT: sw t0, 16(sp)1138; RV32-ZFH-ILP32-NEXT: sw a7, 20(sp)1139; RV32-ZFH-ILP32-NEXT: sw a6, 24(sp)1140; RV32-ZFH-ILP32-NEXT: sw a5, 28(sp)1141; RV32-ZFH-ILP32-NEXT: lui a5, 2631681142; RV32-ZFH-ILP32-NEXT: sw t4, 0(sp)1143; RV32-ZFH-ILP32-NEXT: sw t3, 4(sp)1144; RV32-ZFH-ILP32-NEXT: sw t2, 8(sp)1145; RV32-ZFH-ILP32-NEXT: sw t1, 12(sp)1146; RV32-ZFH-ILP32-NEXT: li a6, 41147; RV32-ZFH-ILP32-NEXT: addi a7, t5, -17921148; RV32-ZFH-ILP32-NEXT: fmv.h.x fa5, a71149; RV32-ZFH-ILP32-NEXT: lui a7, 2641921150; RV32-ZFH-ILP32-NEXT: fsh fa5, 32(sp)1151; RV32-ZFH-ILP32-NEXT: call callee_half_on_stack1152; RV32-ZFH-ILP32-NEXT: lw ra, 44(sp) # 4-byte Folded Reload1153; RV32-ZFH-ILP32-NEXT: addi sp, sp, 481154; RV32-ZFH-ILP32-NEXT: ret1155;1156; RV32-ZFH-ILP32F-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1157; RV32-ZFH-ILP32F: # %bb.0:1158; RV32-ZFH-ILP32F-NEXT: addi sp, sp, -161159; RV32-ZFH-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1160; RV32-ZFH-ILP32F-NEXT: lui a7, 51161; RV32-ZFH-ILP32F-NEXT: lui a0, 2600961162; RV32-ZFH-ILP32F-NEXT: lui a1, 2621441163; RV32-ZFH-ILP32F-NEXT: lui a2, 2631681164; RV32-ZFH-ILP32F-NEXT: lui a3, 2641921165; RV32-ZFH-ILP32F-NEXT: lui a4, 2647041166; RV32-ZFH-ILP32F-NEXT: lui a5, 2652161167; RV32-ZFH-ILP32F-NEXT: lui a6, 2657281168; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa0, a01169; RV32-ZFH-ILP32F-NEXT: lui t0, 2662401170; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa1, a11171; RV32-ZFH-ILP32F-NEXT: li a0, 11172; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa2, a21173; RV32-ZFH-ILP32F-NEXT: li a1, 21174; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa3, a31175; RV32-ZFH-ILP32F-NEXT: li a2, 31176; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa4, a41177; RV32-ZFH-ILP32F-NEXT: li a3, 41178; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa5, a51179; RV32-ZFH-ILP32F-NEXT: li a4, 51180; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa6, a61181; RV32-ZFH-ILP32F-NEXT: li a5, 61182; RV32-ZFH-ILP32F-NEXT: fmv.w.x fa7, t01183; RV32-ZFH-ILP32F-NEXT: li a6, 71184; RV32-ZFH-ILP32F-NEXT: addi a7, a7, -17921185; RV32-ZFH-ILP32F-NEXT: fmv.h.x ft0, a71186; RV32-ZFH-ILP32F-NEXT: li a7, 81187; RV32-ZFH-ILP32F-NEXT: fsh ft0, 0(sp)1188; RV32-ZFH-ILP32F-NEXT: call callee_half_on_stack1189; RV32-ZFH-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1190; RV32-ZFH-ILP32F-NEXT: addi sp, sp, 161191; RV32-ZFH-ILP32F-NEXT: ret1192;1193; RV64-ZFH-LP64-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1194; RV64-ZFH-LP64: # %bb.0:1195; RV64-ZFH-LP64-NEXT: addi sp, sp, -801196; RV64-ZFH-LP64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill1197; RV64-ZFH-LP64-NEXT: lui a5, 2662401198; RV64-ZFH-LP64-NEXT: li a6, 81199; RV64-ZFH-LP64-NEXT: lui a7, 2657281200; RV64-ZFH-LP64-NEXT: li t0, 71201; RV64-ZFH-LP64-NEXT: lui t1, 2652161202; RV64-ZFH-LP64-NEXT: li t2, 61203; RV64-ZFH-LP64-NEXT: lui t3, 2647041204; RV64-ZFH-LP64-NEXT: li t4, 51205; RV64-ZFH-LP64-NEXT: lui t5, 51206; RV64-ZFH-LP64-NEXT: li a0, 11207; RV64-ZFH-LP64-NEXT: lui a1, 2600961208; RV64-ZFH-LP64-NEXT: li a2, 21209; RV64-ZFH-LP64-NEXT: lui a3, 2621441210; RV64-ZFH-LP64-NEXT: li a4, 31211; RV64-ZFH-LP64-NEXT: sd t0, 32(sp)1212; RV64-ZFH-LP64-NEXT: sw a7, 40(sp)1213; RV64-ZFH-LP64-NEXT: sd a6, 48(sp)1214; RV64-ZFH-LP64-NEXT: sw a5, 56(sp)1215; RV64-ZFH-LP64-NEXT: lui a5, 2631681216; RV64-ZFH-LP64-NEXT: sd t4, 0(sp)1217; RV64-ZFH-LP64-NEXT: sw t3, 8(sp)1218; RV64-ZFH-LP64-NEXT: sd t2, 16(sp)1219; RV64-ZFH-LP64-NEXT: sw t1, 24(sp)1220; RV64-ZFH-LP64-NEXT: li a6, 41221; RV64-ZFH-LP64-NEXT: addi a7, t5, -17921222; RV64-ZFH-LP64-NEXT: fmv.h.x fa5, a71223; RV64-ZFH-LP64-NEXT: lui a7, 2641921224; RV64-ZFH-LP64-NEXT: fsh fa5, 64(sp)1225; RV64-ZFH-LP64-NEXT: call callee_half_on_stack1226; RV64-ZFH-LP64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload1227; RV64-ZFH-LP64-NEXT: addi sp, sp, 801228; RV64-ZFH-LP64-NEXT: ret1229;1230; RV64-ZFH-LP64F-LABEL: caller_half_on_stack_exhausted_gprs_fprs:1231; RV64-ZFH-LP64F: # %bb.0:1232; RV64-ZFH-LP64F-NEXT: addi sp, sp, -161233; RV64-ZFH-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1234; RV64-ZFH-LP64F-NEXT: lui a7, 51235; RV64-ZFH-LP64F-NEXT: lui a0, 2600961236; RV64-ZFH-LP64F-NEXT: lui a1, 2621441237; RV64-ZFH-LP64F-NEXT: lui a2, 2631681238; RV64-ZFH-LP64F-NEXT: lui a3, 2641921239; RV64-ZFH-LP64F-NEXT: lui a4, 2647041240; RV64-ZFH-LP64F-NEXT: lui a5, 2652161241; RV64-ZFH-LP64F-NEXT: lui a6, 2657281242; RV64-ZFH-LP64F-NEXT: fmv.w.x fa0, a01243; RV64-ZFH-LP64F-NEXT: lui t0, 2662401244; RV64-ZFH-LP64F-NEXT: fmv.w.x fa1, a11245; RV64-ZFH-LP64F-NEXT: li a0, 11246; RV64-ZFH-LP64F-NEXT: fmv.w.x fa2, a21247; RV64-ZFH-LP64F-NEXT: li a1, 21248; RV64-ZFH-LP64F-NEXT: fmv.w.x fa3, a31249; RV64-ZFH-LP64F-NEXT: li a2, 31250; RV64-ZFH-LP64F-NEXT: fmv.w.x fa4, a41251; RV64-ZFH-LP64F-NEXT: li a3, 41252; RV64-ZFH-LP64F-NEXT: fmv.w.x fa5, a51253; RV64-ZFH-LP64F-NEXT: li a4, 51254; RV64-ZFH-LP64F-NEXT: fmv.w.x fa6, a61255; RV64-ZFH-LP64F-NEXT: li a5, 61256; RV64-ZFH-LP64F-NEXT: fmv.w.x fa7, t01257; RV64-ZFH-LP64F-NEXT: li a6, 71258; RV64-ZFH-LP64F-NEXT: addi a7, a7, -17921259; RV64-ZFH-LP64F-NEXT: fmv.h.x ft0, a71260; RV64-ZFH-LP64F-NEXT: li a7, 81261; RV64-ZFH-LP64F-NEXT: fsh ft0, 0(sp)1262; RV64-ZFH-LP64F-NEXT: call callee_half_on_stack1263; RV64-ZFH-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1264; RV64-ZFH-LP64F-NEXT: addi sp, sp, 161265; RV64-ZFH-LP64F-NEXT: ret1266 %1 = call i32 @callee_half_on_stack(i32 1, float 1.0, i32 2, float 2.0, i32 3, float 3.0, i32 4, float 4.0, i32 5, float 5.0, i32 6, float 6.0, i32 7, float 7.0, i32 8, float 8.0, half 10.0)1267 ret i32 %11268}1269 1270define half @callee_half_ret() nounwind {1271; RV32I-LABEL: callee_half_ret:1272; RV32I: # %bb.0:1273; RV32I-NEXT: li a0, 151274; RV32I-NEXT: slli a0, a0, 101275; RV32I-NEXT: ret1276;1277; RV64I-LABEL: callee_half_ret:1278; RV64I: # %bb.0:1279; RV64I-NEXT: li a0, 151280; RV64I-NEXT: slli a0, a0, 101281; RV64I-NEXT: ret1282;1283; RV32IF-LABEL: callee_half_ret:1284; RV32IF: # %bb.0:1285; RV32IF-NEXT: lui a0, 10485641286; RV32IF-NEXT: addi a0, a0, -10241287; RV32IF-NEXT: ret1288;1289; RV64IF-LABEL: callee_half_ret:1290; RV64IF: # %bb.0:1291; RV64IF-NEXT: lui a0, 10485641292; RV64IF-NEXT: addi a0, a0, -10241293; RV64IF-NEXT: ret1294;1295; RV32-ILP32F-LABEL: callee_half_ret:1296; RV32-ILP32F: # %bb.0:1297; RV32-ILP32F-NEXT: lui a0, 10485641298; RV32-ILP32F-NEXT: addi a0, a0, -10241299; RV32-ILP32F-NEXT: fmv.w.x fa0, a01300; RV32-ILP32F-NEXT: ret1301;1302; RV64-LP64F-LABEL: callee_half_ret:1303; RV64-LP64F: # %bb.0:1304; RV64-LP64F-NEXT: lui a0, 10485641305; RV64-LP64F-NEXT: addi a0, a0, -10241306; RV64-LP64F-NEXT: fmv.w.x fa0, a01307; RV64-LP64F-NEXT: ret1308;1309; RV32-ILP32ZFHMIN-LABEL: callee_half_ret:1310; RV32-ILP32ZFHMIN: # %bb.0:1311; RV32-ILP32ZFHMIN-NEXT: li a0, 151312; RV32-ILP32ZFHMIN-NEXT: slli a0, a0, 101313; RV32-ILP32ZFHMIN-NEXT: fmv.h.x fa0, a01314; RV32-ILP32ZFHMIN-NEXT: ret1315;1316; RV64-LP64ZFHMIN-LABEL: callee_half_ret:1317; RV64-LP64ZFHMIN: # %bb.0:1318; RV64-LP64ZFHMIN-NEXT: li a0, 151319; RV64-LP64ZFHMIN-NEXT: slli a0, a0, 101320; RV64-LP64ZFHMIN-NEXT: fmv.h.x fa0, a01321; RV64-LP64ZFHMIN-NEXT: ret1322;1323; RV32-ZFH-ILP32-LABEL: callee_half_ret:1324; RV32-ZFH-ILP32: # %bb.0:1325; RV32-ZFH-ILP32-NEXT: li a0, 151326; RV32-ZFH-ILP32-NEXT: slli a0, a0, 101327; RV32-ZFH-ILP32-NEXT: ret1328;1329; RV32-ZFH-ILP32F-LABEL: callee_half_ret:1330; RV32-ZFH-ILP32F: # %bb.0:1331; RV32-ZFH-ILP32F-NEXT: li a0, 151332; RV32-ZFH-ILP32F-NEXT: slli a0, a0, 101333; RV32-ZFH-ILP32F-NEXT: fmv.h.x fa0, a01334; RV32-ZFH-ILP32F-NEXT: ret1335;1336; RV64-ZFH-LP64-LABEL: callee_half_ret:1337; RV64-ZFH-LP64: # %bb.0:1338; RV64-ZFH-LP64-NEXT: li a0, 151339; RV64-ZFH-LP64-NEXT: slli a0, a0, 101340; RV64-ZFH-LP64-NEXT: ret1341;1342; RV64-ZFH-LP64F-LABEL: callee_half_ret:1343; RV64-ZFH-LP64F: # %bb.0:1344; RV64-ZFH-LP64F-NEXT: li a0, 151345; RV64-ZFH-LP64F-NEXT: slli a0, a0, 101346; RV64-ZFH-LP64F-NEXT: fmv.h.x fa0, a01347; RV64-ZFH-LP64F-NEXT: ret1348 ret half 1.01349}1350 1351define i32 @caller_half_ret() nounwind {1352; RV32I-LABEL: caller_half_ret:1353; RV32I: # %bb.0:1354; RV32I-NEXT: addi sp, sp, -161355; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1356; RV32I-NEXT: call callee_half_ret1357; RV32I-NEXT: slli a0, a0, 161358; RV32I-NEXT: srli a0, a0, 161359; RV32I-NEXT: call __extendhfsf21360; RV32I-NEXT: call __fixsfsi1361; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1362; RV32I-NEXT: addi sp, sp, 161363; RV32I-NEXT: ret1364;1365; RV64I-LABEL: caller_half_ret:1366; RV64I: # %bb.0:1367; RV64I-NEXT: addi sp, sp, -161368; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1369; RV64I-NEXT: call callee_half_ret1370; RV64I-NEXT: slli a0, a0, 481371; RV64I-NEXT: srli a0, a0, 481372; RV64I-NEXT: call __extendhfsf21373; RV64I-NEXT: call __fixsfdi1374; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1375; RV64I-NEXT: addi sp, sp, 161376; RV64I-NEXT: ret1377;1378; RV32IF-LABEL: caller_half_ret:1379; RV32IF: # %bb.0:1380; RV32IF-NEXT: addi sp, sp, -161381; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1382; RV32IF-NEXT: call callee_half_ret1383; RV32IF-NEXT: call __extendhfsf21384; RV32IF-NEXT: fmv.w.x fa5, a01385; RV32IF-NEXT: fcvt.w.s a0, fa5, rtz1386; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1387; RV32IF-NEXT: addi sp, sp, 161388; RV32IF-NEXT: ret1389;1390; RV64IF-LABEL: caller_half_ret:1391; RV64IF: # %bb.0:1392; RV64IF-NEXT: addi sp, sp, -161393; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1394; RV64IF-NEXT: call callee_half_ret1395; RV64IF-NEXT: call __extendhfsf21396; RV64IF-NEXT: fmv.w.x fa5, a01397; RV64IF-NEXT: fcvt.l.s a0, fa5, rtz1398; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1399; RV64IF-NEXT: addi sp, sp, 161400; RV64IF-NEXT: ret1401;1402; RV32-ILP32F-LABEL: caller_half_ret:1403; RV32-ILP32F: # %bb.0:1404; RV32-ILP32F-NEXT: addi sp, sp, -161405; RV32-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1406; RV32-ILP32F-NEXT: call callee_half_ret1407; RV32-ILP32F-NEXT: call __extendhfsf21408; RV32-ILP32F-NEXT: fcvt.w.s a0, fa0, rtz1409; RV32-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1410; RV32-ILP32F-NEXT: addi sp, sp, 161411; RV32-ILP32F-NEXT: ret1412;1413; RV64-LP64F-LABEL: caller_half_ret:1414; RV64-LP64F: # %bb.0:1415; RV64-LP64F-NEXT: addi sp, sp, -161416; RV64-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1417; RV64-LP64F-NEXT: call callee_half_ret1418; RV64-LP64F-NEXT: call __extendhfsf21419; RV64-LP64F-NEXT: fcvt.l.s a0, fa0, rtz1420; RV64-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1421; RV64-LP64F-NEXT: addi sp, sp, 161422; RV64-LP64F-NEXT: ret1423;1424; RV32-ILP32ZFHMIN-LABEL: caller_half_ret:1425; RV32-ILP32ZFHMIN: # %bb.0:1426; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, -161427; RV32-ILP32ZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1428; RV32-ILP32ZFHMIN-NEXT: call callee_half_ret1429; RV32-ILP32ZFHMIN-NEXT: fcvt.s.h fa5, fa01430; RV32-ILP32ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz1431; RV32-ILP32ZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1432; RV32-ILP32ZFHMIN-NEXT: addi sp, sp, 161433; RV32-ILP32ZFHMIN-NEXT: ret1434;1435; RV64-LP64ZFHMIN-LABEL: caller_half_ret:1436; RV64-LP64ZFHMIN: # %bb.0:1437; RV64-LP64ZFHMIN-NEXT: addi sp, sp, -161438; RV64-LP64ZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1439; RV64-LP64ZFHMIN-NEXT: call callee_half_ret1440; RV64-LP64ZFHMIN-NEXT: fcvt.s.h fa5, fa01441; RV64-LP64ZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz1442; RV64-LP64ZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1443; RV64-LP64ZFHMIN-NEXT: addi sp, sp, 161444; RV64-LP64ZFHMIN-NEXT: ret1445;1446; RV32-ZFH-ILP32-LABEL: caller_half_ret:1447; RV32-ZFH-ILP32: # %bb.0:1448; RV32-ZFH-ILP32-NEXT: addi sp, sp, -161449; RV32-ZFH-ILP32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1450; RV32-ZFH-ILP32-NEXT: call callee_half_ret1451; RV32-ZFH-ILP32-NEXT: fmv.h.x fa5, a01452; RV32-ZFH-ILP32-NEXT: fcvt.w.h a0, fa5, rtz1453; RV32-ZFH-ILP32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1454; RV32-ZFH-ILP32-NEXT: addi sp, sp, 161455; RV32-ZFH-ILP32-NEXT: ret1456;1457; RV32-ZFH-ILP32F-LABEL: caller_half_ret:1458; RV32-ZFH-ILP32F: # %bb.0:1459; RV32-ZFH-ILP32F-NEXT: addi sp, sp, -161460; RV32-ZFH-ILP32F-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1461; RV32-ZFH-ILP32F-NEXT: call callee_half_ret1462; RV32-ZFH-ILP32F-NEXT: fcvt.w.h a0, fa0, rtz1463; RV32-ZFH-ILP32F-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1464; RV32-ZFH-ILP32F-NEXT: addi sp, sp, 161465; RV32-ZFH-ILP32F-NEXT: ret1466;1467; RV64-ZFH-LP64-LABEL: caller_half_ret:1468; RV64-ZFH-LP64: # %bb.0:1469; RV64-ZFH-LP64-NEXT: addi sp, sp, -161470; RV64-ZFH-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1471; RV64-ZFH-LP64-NEXT: call callee_half_ret1472; RV64-ZFH-LP64-NEXT: fmv.h.x fa5, a01473; RV64-ZFH-LP64-NEXT: fcvt.w.h a0, fa5, rtz1474; RV64-ZFH-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1475; RV64-ZFH-LP64-NEXT: addi sp, sp, 161476; RV64-ZFH-LP64-NEXT: ret1477;1478; RV64-ZFH-LP64F-LABEL: caller_half_ret:1479; RV64-ZFH-LP64F: # %bb.0:1480; RV64-ZFH-LP64F-NEXT: addi sp, sp, -161481; RV64-ZFH-LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1482; RV64-ZFH-LP64F-NEXT: call callee_half_ret1483; RV64-ZFH-LP64F-NEXT: fcvt.w.h a0, fa0, rtz1484; RV64-ZFH-LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1485; RV64-ZFH-LP64F-NEXT: addi sp, sp, 161486; RV64-ZFH-LP64F-NEXT: ret1487 %1 = call half @callee_half_ret()1488 %2 = fptosi half %1 to i321489 ret i32 %21490}1491