4525 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfh \3; RUN: -verify-machineinstrs -target-abi ilp32f | \4; RUN: FileCheck -check-prefixes=CHECKIZFH,RV32IZFH,RV32IFZFH %s5; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfh \6; RUN: -verify-machineinstrs -target-abi lp64f | \7; RUN: FileCheck -check-prefixes=CHECKIZFH,RV64IZFH,RV64IFZFH %s8; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zhinx \9; RUN: -verify-machineinstrs -target-abi ilp32 | \10; RUN: FileCheck -check-prefixes=CHECKIZHINX,RV32IZHINX %s11; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zhinx \12; RUN: -verify-machineinstrs -target-abi lp64 | \13; RUN: FileCheck -check-prefixes=CHECKIZHINX,RV64IZHINX %s14; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \15; RUN: -mattr=+zfh -verify-machineinstrs -target-abi ilp32d | \16; RUN: FileCheck -check-prefixes=CHECKIZFH,RV32IZFH,RV32IDZFH %s17; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \18; RUN: -mattr=+zfh -verify-machineinstrs -target-abi lp64d | \19; RUN: FileCheck -check-prefixes=CHECKIZFH,RV64IZFH,RV64IDZFH %s20; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zdinx \21; RUN: -mattr=+zhinx -verify-machineinstrs -target-abi ilp32 | \22; RUN: FileCheck -check-prefixes=CHECKIZHINX,RV32IZHINX %s23; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zdinx \24; RUN: -mattr=+zhinx -verify-machineinstrs -target-abi lp64 | \25; RUN: FileCheck -check-prefixes=CHECKIZHINX,RV64IZHINX %s26; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 \27; RUN: -verify-machineinstrs | \28; RUN: FileCheck -check-prefix=RV32I %s29; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 \30; RUN: -verify-machineinstrs | \31; RUN: FileCheck -check-prefix=RV64I %s32 33; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfhmin \34; RUN: -verify-machineinstrs -target-abi ilp32f | \35; RUN: FileCheck -check-prefixes=CHECKIZFHMIN,RV32IZFHMIN,RV32IFZFHMIN %s36; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfhmin \37; RUN: -verify-machineinstrs -target-abi lp64f | \38; RUN: FileCheck -check-prefixes=CHECKIZFHMIN,RV64IZFHMIN,RV64IFZFHMIN %s39; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \40; RUN: -mattr=+zfhmin -verify-machineinstrs -target-abi ilp32d | \41; RUN: FileCheck -check-prefixes=CHECKIZFHMIN,RV32IZFHMIN,RV32IDZFHMIN %s42; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \43; RUN: -mattr=+zfhmin -verify-machineinstrs -target-abi lp64d | \44; RUN: FileCheck -check-prefixes=CHECKIZFHMIN,RV64IZFHMIN,RV64IDZFHMIN %s45 46; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zhinxmin \47; RUN: -verify-machineinstrs -target-abi ilp32 | \48; RUN: FileCheck -check-prefixes=CHECKIZHINXMIN,RV32IZHINXMIN %s49; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zhinxmin \50; RUN: -verify-machineinstrs -target-abi lp64 | \51; RUN: FileCheck -check-prefixes=CHECKIZHINXMIN,RV64IZHINXMIN %s52; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zdinx \53; RUN: -mattr=+zhinxmin -verify-machineinstrs -target-abi ilp32 | \54; RUN: FileCheck -check-prefixes=CHECKIZHINXMIN,RV32IZHINXMIN %s55; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zdinx \56; RUN: -mattr=+zhinxmin -verify-machineinstrs -target-abi lp64 | \57; RUN: FileCheck -check-prefixes=CHECKIZHINXMIN,RV64IZHINXMIN %s58 59define half @sqrt_f16(half %a) nounwind {60; CHECKIZFH-LABEL: sqrt_f16:61; CHECKIZFH: # %bb.0:62; CHECKIZFH-NEXT: fsqrt.h fa0, fa063; CHECKIZFH-NEXT: ret64;65; CHECKIZHINX-LABEL: sqrt_f16:66; CHECKIZHINX: # %bb.0:67; CHECKIZHINX-NEXT: fsqrt.h a0, a068; CHECKIZHINX-NEXT: ret69;70; RV32I-LABEL: sqrt_f16:71; RV32I: # %bb.0:72; RV32I-NEXT: addi sp, sp, -1673; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill74; RV32I-NEXT: slli a0, a0, 1675; RV32I-NEXT: srli a0, a0, 1676; RV32I-NEXT: call __extendhfsf277; RV32I-NEXT: call sqrtf78; RV32I-NEXT: call __truncsfhf279; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload80; RV32I-NEXT: addi sp, sp, 1681; RV32I-NEXT: ret82;83; RV64I-LABEL: sqrt_f16:84; RV64I: # %bb.0:85; RV64I-NEXT: addi sp, sp, -1686; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill87; RV64I-NEXT: slli a0, a0, 4888; RV64I-NEXT: srli a0, a0, 4889; RV64I-NEXT: call __extendhfsf290; RV64I-NEXT: call sqrtf91; RV64I-NEXT: call __truncsfhf292; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload93; RV64I-NEXT: addi sp, sp, 1694; RV64I-NEXT: ret95;96; CHECKIZFHMIN-LABEL: sqrt_f16:97; CHECKIZFHMIN: # %bb.0:98; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa099; CHECKIZFHMIN-NEXT: fsqrt.s fa5, fa5100; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa5101; CHECKIZFHMIN-NEXT: ret102;103; CHECKIZHINXMIN-LABEL: sqrt_f16:104; CHECKIZHINXMIN: # %bb.0:105; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a0106; CHECKIZHINXMIN-NEXT: fsqrt.s a0, a0107; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a0108; CHECKIZHINXMIN-NEXT: ret109 %1 = call half @llvm.sqrt.f16(half %a)110 ret half %1111}112 113define half @powi_f16(half %a, i32 %b) nounwind {114; RV32IZFH-LABEL: powi_f16:115; RV32IZFH: # %bb.0:116; RV32IZFH-NEXT: addi sp, sp, -16117; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill118; RV32IZFH-NEXT: fcvt.s.h fa0, fa0119; RV32IZFH-NEXT: call __powisf2120; RV32IZFH-NEXT: fcvt.h.s fa0, fa0121; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload122; RV32IZFH-NEXT: addi sp, sp, 16123; RV32IZFH-NEXT: ret124;125; RV64IZFH-LABEL: powi_f16:126; RV64IZFH: # %bb.0:127; RV64IZFH-NEXT: addi sp, sp, -16128; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill129; RV64IZFH-NEXT: fcvt.s.h fa0, fa0130; RV64IZFH-NEXT: sext.w a0, a0131; RV64IZFH-NEXT: call __powisf2132; RV64IZFH-NEXT: fcvt.h.s fa0, fa0133; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload134; RV64IZFH-NEXT: addi sp, sp, 16135; RV64IZFH-NEXT: ret136;137; RV32IZHINX-LABEL: powi_f16:138; RV32IZHINX: # %bb.0:139; RV32IZHINX-NEXT: addi sp, sp, -16140; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill141; RV32IZHINX-NEXT: fcvt.s.h a0, a0142; RV32IZHINX-NEXT: call __powisf2143; RV32IZHINX-NEXT: fcvt.h.s a0, a0144; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload145; RV32IZHINX-NEXT: addi sp, sp, 16146; RV32IZHINX-NEXT: ret147;148; RV64IZHINX-LABEL: powi_f16:149; RV64IZHINX: # %bb.0:150; RV64IZHINX-NEXT: addi sp, sp, -16151; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill152; RV64IZHINX-NEXT: fcvt.s.h a0, a0153; RV64IZHINX-NEXT: sext.w a1, a1154; RV64IZHINX-NEXT: call __powisf2155; RV64IZHINX-NEXT: fcvt.h.s a0, a0156; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload157; RV64IZHINX-NEXT: addi sp, sp, 16158; RV64IZHINX-NEXT: ret159;160; RV32I-LABEL: powi_f16:161; RV32I: # %bb.0:162; RV32I-NEXT: addi sp, sp, -16163; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill164; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill165; RV32I-NEXT: mv s0, a1166; RV32I-NEXT: slli a0, a0, 16167; RV32I-NEXT: srli a0, a0, 16168; RV32I-NEXT: call __extendhfsf2169; RV32I-NEXT: mv a1, s0170; RV32I-NEXT: call __powisf2171; RV32I-NEXT: call __truncsfhf2172; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload173; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload174; RV32I-NEXT: addi sp, sp, 16175; RV32I-NEXT: ret176;177; RV64I-LABEL: powi_f16:178; RV64I: # %bb.0:179; RV64I-NEXT: addi sp, sp, -16180; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill181; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill182; RV64I-NEXT: mv s0, a1183; RV64I-NEXT: slli a0, a0, 48184; RV64I-NEXT: srli a0, a0, 48185; RV64I-NEXT: call __extendhfsf2186; RV64I-NEXT: sext.w a1, s0187; RV64I-NEXT: call __powisf2188; RV64I-NEXT: call __truncsfhf2189; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload190; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload191; RV64I-NEXT: addi sp, sp, 16192; RV64I-NEXT: ret193;194; RV32IZFHMIN-LABEL: powi_f16:195; RV32IZFHMIN: # %bb.0:196; RV32IZFHMIN-NEXT: addi sp, sp, -16197; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill198; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0199; RV32IZFHMIN-NEXT: call __powisf2200; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0201; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload202; RV32IZFHMIN-NEXT: addi sp, sp, 16203; RV32IZFHMIN-NEXT: ret204;205; RV64IZFHMIN-LABEL: powi_f16:206; RV64IZFHMIN: # %bb.0:207; RV64IZFHMIN-NEXT: addi sp, sp, -16208; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill209; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0210; RV64IZFHMIN-NEXT: sext.w a0, a0211; RV64IZFHMIN-NEXT: call __powisf2212; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0213; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload214; RV64IZFHMIN-NEXT: addi sp, sp, 16215; RV64IZFHMIN-NEXT: ret216;217; RV32IZHINXMIN-LABEL: powi_f16:218; RV32IZHINXMIN: # %bb.0:219; RV32IZHINXMIN-NEXT: addi sp, sp, -16220; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill221; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0222; RV32IZHINXMIN-NEXT: call __powisf2223; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0224; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload225; RV32IZHINXMIN-NEXT: addi sp, sp, 16226; RV32IZHINXMIN-NEXT: ret227;228; RV64IZHINXMIN-LABEL: powi_f16:229; RV64IZHINXMIN: # %bb.0:230; RV64IZHINXMIN-NEXT: addi sp, sp, -16231; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill232; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0233; RV64IZHINXMIN-NEXT: sext.w a1, a1234; RV64IZHINXMIN-NEXT: call __powisf2235; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0236; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload237; RV64IZHINXMIN-NEXT: addi sp, sp, 16238; RV64IZHINXMIN-NEXT: ret239 %1 = call half @llvm.powi.f16.i32(half %a, i32 %b)240 ret half %1241}242 243define half @sin_f16(half %a) nounwind {244; RV32IZFH-LABEL: sin_f16:245; RV32IZFH: # %bb.0:246; RV32IZFH-NEXT: addi sp, sp, -16247; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill248; RV32IZFH-NEXT: fcvt.s.h fa0, fa0249; RV32IZFH-NEXT: call sinf250; RV32IZFH-NEXT: fcvt.h.s fa0, fa0251; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload252; RV32IZFH-NEXT: addi sp, sp, 16253; RV32IZFH-NEXT: ret254;255; RV64IZFH-LABEL: sin_f16:256; RV64IZFH: # %bb.0:257; RV64IZFH-NEXT: addi sp, sp, -16258; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill259; RV64IZFH-NEXT: fcvt.s.h fa0, fa0260; RV64IZFH-NEXT: call sinf261; RV64IZFH-NEXT: fcvt.h.s fa0, fa0262; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload263; RV64IZFH-NEXT: addi sp, sp, 16264; RV64IZFH-NEXT: ret265;266; RV32IZHINX-LABEL: sin_f16:267; RV32IZHINX: # %bb.0:268; RV32IZHINX-NEXT: addi sp, sp, -16269; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill270; RV32IZHINX-NEXT: fcvt.s.h a0, a0271; RV32IZHINX-NEXT: call sinf272; RV32IZHINX-NEXT: fcvt.h.s a0, a0273; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload274; RV32IZHINX-NEXT: addi sp, sp, 16275; RV32IZHINX-NEXT: ret276;277; RV64IZHINX-LABEL: sin_f16:278; RV64IZHINX: # %bb.0:279; RV64IZHINX-NEXT: addi sp, sp, -16280; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill281; RV64IZHINX-NEXT: fcvt.s.h a0, a0282; RV64IZHINX-NEXT: call sinf283; RV64IZHINX-NEXT: fcvt.h.s a0, a0284; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload285; RV64IZHINX-NEXT: addi sp, sp, 16286; RV64IZHINX-NEXT: ret287;288; RV32I-LABEL: sin_f16:289; RV32I: # %bb.0:290; RV32I-NEXT: addi sp, sp, -16291; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill292; RV32I-NEXT: slli a0, a0, 16293; RV32I-NEXT: srli a0, a0, 16294; RV32I-NEXT: call __extendhfsf2295; RV32I-NEXT: call sinf296; RV32I-NEXT: call __truncsfhf2297; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload298; RV32I-NEXT: addi sp, sp, 16299; RV32I-NEXT: ret300;301; RV64I-LABEL: sin_f16:302; RV64I: # %bb.0:303; RV64I-NEXT: addi sp, sp, -16304; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill305; RV64I-NEXT: slli a0, a0, 48306; RV64I-NEXT: srli a0, a0, 48307; RV64I-NEXT: call __extendhfsf2308; RV64I-NEXT: call sinf309; RV64I-NEXT: call __truncsfhf2310; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload311; RV64I-NEXT: addi sp, sp, 16312; RV64I-NEXT: ret313;314; RV32IZFHMIN-LABEL: sin_f16:315; RV32IZFHMIN: # %bb.0:316; RV32IZFHMIN-NEXT: addi sp, sp, -16317; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill318; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0319; RV32IZFHMIN-NEXT: call sinf320; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0321; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload322; RV32IZFHMIN-NEXT: addi sp, sp, 16323; RV32IZFHMIN-NEXT: ret324;325; RV64IZFHMIN-LABEL: sin_f16:326; RV64IZFHMIN: # %bb.0:327; RV64IZFHMIN-NEXT: addi sp, sp, -16328; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill329; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0330; RV64IZFHMIN-NEXT: call sinf331; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0332; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload333; RV64IZFHMIN-NEXT: addi sp, sp, 16334; RV64IZFHMIN-NEXT: ret335;336; RV32IZHINXMIN-LABEL: sin_f16:337; RV32IZHINXMIN: # %bb.0:338; RV32IZHINXMIN-NEXT: addi sp, sp, -16339; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill340; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0341; RV32IZHINXMIN-NEXT: call sinf342; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0343; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload344; RV32IZHINXMIN-NEXT: addi sp, sp, 16345; RV32IZHINXMIN-NEXT: ret346;347; RV64IZHINXMIN-LABEL: sin_f16:348; RV64IZHINXMIN: # %bb.0:349; RV64IZHINXMIN-NEXT: addi sp, sp, -16350; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill351; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0352; RV64IZHINXMIN-NEXT: call sinf353; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0354; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload355; RV64IZHINXMIN-NEXT: addi sp, sp, 16356; RV64IZHINXMIN-NEXT: ret357 %1 = call half @llvm.sin.f16(half %a)358 ret half %1359}360 361define half @cos_f16(half %a) nounwind {362; RV32IZFH-LABEL: cos_f16:363; RV32IZFH: # %bb.0:364; RV32IZFH-NEXT: addi sp, sp, -16365; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill366; RV32IZFH-NEXT: fcvt.s.h fa0, fa0367; RV32IZFH-NEXT: call cosf368; RV32IZFH-NEXT: fcvt.h.s fa0, fa0369; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload370; RV32IZFH-NEXT: addi sp, sp, 16371; RV32IZFH-NEXT: ret372;373; RV64IZFH-LABEL: cos_f16:374; RV64IZFH: # %bb.0:375; RV64IZFH-NEXT: addi sp, sp, -16376; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill377; RV64IZFH-NEXT: fcvt.s.h fa0, fa0378; RV64IZFH-NEXT: call cosf379; RV64IZFH-NEXT: fcvt.h.s fa0, fa0380; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload381; RV64IZFH-NEXT: addi sp, sp, 16382; RV64IZFH-NEXT: ret383;384; RV32IZHINX-LABEL: cos_f16:385; RV32IZHINX: # %bb.0:386; RV32IZHINX-NEXT: addi sp, sp, -16387; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill388; RV32IZHINX-NEXT: fcvt.s.h a0, a0389; RV32IZHINX-NEXT: call cosf390; RV32IZHINX-NEXT: fcvt.h.s a0, a0391; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload392; RV32IZHINX-NEXT: addi sp, sp, 16393; RV32IZHINX-NEXT: ret394;395; RV64IZHINX-LABEL: cos_f16:396; RV64IZHINX: # %bb.0:397; RV64IZHINX-NEXT: addi sp, sp, -16398; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill399; RV64IZHINX-NEXT: fcvt.s.h a0, a0400; RV64IZHINX-NEXT: call cosf401; RV64IZHINX-NEXT: fcvt.h.s a0, a0402; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload403; RV64IZHINX-NEXT: addi sp, sp, 16404; RV64IZHINX-NEXT: ret405;406; RV32I-LABEL: cos_f16:407; RV32I: # %bb.0:408; RV32I-NEXT: addi sp, sp, -16409; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill410; RV32I-NEXT: slli a0, a0, 16411; RV32I-NEXT: srli a0, a0, 16412; RV32I-NEXT: call __extendhfsf2413; RV32I-NEXT: call cosf414; RV32I-NEXT: call __truncsfhf2415; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload416; RV32I-NEXT: addi sp, sp, 16417; RV32I-NEXT: ret418;419; RV64I-LABEL: cos_f16:420; RV64I: # %bb.0:421; RV64I-NEXT: addi sp, sp, -16422; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill423; RV64I-NEXT: slli a0, a0, 48424; RV64I-NEXT: srli a0, a0, 48425; RV64I-NEXT: call __extendhfsf2426; RV64I-NEXT: call cosf427; RV64I-NEXT: call __truncsfhf2428; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload429; RV64I-NEXT: addi sp, sp, 16430; RV64I-NEXT: ret431;432; RV32IZFHMIN-LABEL: cos_f16:433; RV32IZFHMIN: # %bb.0:434; RV32IZFHMIN-NEXT: addi sp, sp, -16435; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill436; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0437; RV32IZFHMIN-NEXT: call cosf438; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0439; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload440; RV32IZFHMIN-NEXT: addi sp, sp, 16441; RV32IZFHMIN-NEXT: ret442;443; RV64IZFHMIN-LABEL: cos_f16:444; RV64IZFHMIN: # %bb.0:445; RV64IZFHMIN-NEXT: addi sp, sp, -16446; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill447; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0448; RV64IZFHMIN-NEXT: call cosf449; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0450; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload451; RV64IZFHMIN-NEXT: addi sp, sp, 16452; RV64IZFHMIN-NEXT: ret453;454; RV32IZHINXMIN-LABEL: cos_f16:455; RV32IZHINXMIN: # %bb.0:456; RV32IZHINXMIN-NEXT: addi sp, sp, -16457; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill458; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0459; RV32IZHINXMIN-NEXT: call cosf460; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0461; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload462; RV32IZHINXMIN-NEXT: addi sp, sp, 16463; RV32IZHINXMIN-NEXT: ret464;465; RV64IZHINXMIN-LABEL: cos_f16:466; RV64IZHINXMIN: # %bb.0:467; RV64IZHINXMIN-NEXT: addi sp, sp, -16468; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill469; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0470; RV64IZHINXMIN-NEXT: call cosf471; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0472; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload473; RV64IZHINXMIN-NEXT: addi sp, sp, 16474; RV64IZHINXMIN-NEXT: ret475 %1 = call half @llvm.cos.f16(half %a)476 ret half %1477}478 479; The sin+cos combination results in an FSINCOS SelectionDAG node.480define half @sincos_f16(half %a) nounwind {481; RV32IFZFH-LABEL: sincos_f16:482; RV32IFZFH: # %bb.0:483; RV32IFZFH-NEXT: addi sp, sp, -16484; RV32IFZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill485; RV32IFZFH-NEXT: fsw fs0, 8(sp) # 4-byte Folded Spill486; RV32IFZFH-NEXT: fsw fs1, 4(sp) # 4-byte Folded Spill487; RV32IFZFH-NEXT: fcvt.s.h fs0, fa0488; RV32IFZFH-NEXT: fmv.s fa0, fs0489; RV32IFZFH-NEXT: call sinf490; RV32IFZFH-NEXT: fcvt.h.s fs1, fa0491; RV32IFZFH-NEXT: fmv.s fa0, fs0492; RV32IFZFH-NEXT: call cosf493; RV32IFZFH-NEXT: fcvt.h.s fa5, fa0494; RV32IFZFH-NEXT: fadd.h fa0, fs1, fa5495; RV32IFZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload496; RV32IFZFH-NEXT: flw fs0, 8(sp) # 4-byte Folded Reload497; RV32IFZFH-NEXT: flw fs1, 4(sp) # 4-byte Folded Reload498; RV32IFZFH-NEXT: addi sp, sp, 16499; RV32IFZFH-NEXT: ret500;501; RV64IFZFH-LABEL: sincos_f16:502; RV64IFZFH: # %bb.0:503; RV64IFZFH-NEXT: addi sp, sp, -16504; RV64IFZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill505; RV64IFZFH-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill506; RV64IFZFH-NEXT: fsw fs1, 0(sp) # 4-byte Folded Spill507; RV64IFZFH-NEXT: fcvt.s.h fs0, fa0508; RV64IFZFH-NEXT: fmv.s fa0, fs0509; RV64IFZFH-NEXT: call sinf510; RV64IFZFH-NEXT: fcvt.h.s fs1, fa0511; RV64IFZFH-NEXT: fmv.s fa0, fs0512; RV64IFZFH-NEXT: call cosf513; RV64IFZFH-NEXT: fcvt.h.s fa5, fa0514; RV64IFZFH-NEXT: fadd.h fa0, fs1, fa5515; RV64IFZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload516; RV64IFZFH-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload517; RV64IFZFH-NEXT: flw fs1, 0(sp) # 4-byte Folded Reload518; RV64IFZFH-NEXT: addi sp, sp, 16519; RV64IFZFH-NEXT: ret520;521; RV32IZHINX-LABEL: sincos_f16:522; RV32IZHINX: # %bb.0:523; RV32IZHINX-NEXT: addi sp, sp, -16524; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill525; RV32IZHINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill526; RV32IZHINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill527; RV32IZHINX-NEXT: fcvt.s.h s0, a0528; RV32IZHINX-NEXT: mv a0, s0529; RV32IZHINX-NEXT: call sinf530; RV32IZHINX-NEXT: fcvt.h.s s1, a0531; RV32IZHINX-NEXT: mv a0, s0532; RV32IZHINX-NEXT: call cosf533; RV32IZHINX-NEXT: fcvt.h.s a0, a0534; RV32IZHINX-NEXT: fadd.h a0, s1, a0535; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload536; RV32IZHINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload537; RV32IZHINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload538; RV32IZHINX-NEXT: addi sp, sp, 16539; RV32IZHINX-NEXT: ret540;541; RV64IZHINX-LABEL: sincos_f16:542; RV64IZHINX: # %bb.0:543; RV64IZHINX-NEXT: addi sp, sp, -32544; RV64IZHINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill545; RV64IZHINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill546; RV64IZHINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill547; RV64IZHINX-NEXT: fcvt.s.h s0, a0548; RV64IZHINX-NEXT: mv a0, s0549; RV64IZHINX-NEXT: call sinf550; RV64IZHINX-NEXT: fcvt.h.s s1, a0551; RV64IZHINX-NEXT: mv a0, s0552; RV64IZHINX-NEXT: call cosf553; RV64IZHINX-NEXT: fcvt.h.s a0, a0554; RV64IZHINX-NEXT: fadd.h a0, s1, a0555; RV64IZHINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload556; RV64IZHINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload557; RV64IZHINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload558; RV64IZHINX-NEXT: addi sp, sp, 32559; RV64IZHINX-NEXT: ret560;561; RV32IDZFH-LABEL: sincos_f16:562; RV32IDZFH: # %bb.0:563; RV32IDZFH-NEXT: addi sp, sp, -32564; RV32IDZFH-NEXT: sw ra, 28(sp) # 4-byte Folded Spill565; RV32IDZFH-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill566; RV32IDZFH-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill567; RV32IDZFH-NEXT: fcvt.s.h fs0, fa0568; RV32IDZFH-NEXT: fmv.s fa0, fs0569; RV32IDZFH-NEXT: call sinf570; RV32IDZFH-NEXT: fcvt.h.s fs1, fa0571; RV32IDZFH-NEXT: fmv.s fa0, fs0572; RV32IDZFH-NEXT: call cosf573; RV32IDZFH-NEXT: fcvt.h.s fa5, fa0574; RV32IDZFH-NEXT: fadd.h fa0, fs1, fa5575; RV32IDZFH-NEXT: lw ra, 28(sp) # 4-byte Folded Reload576; RV32IDZFH-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload577; RV32IDZFH-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload578; RV32IDZFH-NEXT: addi sp, sp, 32579; RV32IDZFH-NEXT: ret580;581; RV64IDZFH-LABEL: sincos_f16:582; RV64IDZFH: # %bb.0:583; RV64IDZFH-NEXT: addi sp, sp, -32584; RV64IDZFH-NEXT: sd ra, 24(sp) # 8-byte Folded Spill585; RV64IDZFH-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill586; RV64IDZFH-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill587; RV64IDZFH-NEXT: fcvt.s.h fs0, fa0588; RV64IDZFH-NEXT: fmv.s fa0, fs0589; RV64IDZFH-NEXT: call sinf590; RV64IDZFH-NEXT: fcvt.h.s fs1, fa0591; RV64IDZFH-NEXT: fmv.s fa0, fs0592; RV64IDZFH-NEXT: call cosf593; RV64IDZFH-NEXT: fcvt.h.s fa5, fa0594; RV64IDZFH-NEXT: fadd.h fa0, fs1, fa5595; RV64IDZFH-NEXT: ld ra, 24(sp) # 8-byte Folded Reload596; RV64IDZFH-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload597; RV64IDZFH-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload598; RV64IDZFH-NEXT: addi sp, sp, 32599; RV64IDZFH-NEXT: ret600;601; RV32I-LABEL: sincos_f16:602; RV32I: # %bb.0:603; RV32I-NEXT: addi sp, sp, -16604; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill605; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill606; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill607; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill608; RV32I-NEXT: lui a1, 16609; RV32I-NEXT: addi s2, a1, -1610; RV32I-NEXT: and a0, a0, s2611; RV32I-NEXT: call __extendhfsf2612; RV32I-NEXT: mv s0, a0613; RV32I-NEXT: call sinf614; RV32I-NEXT: call __truncsfhf2615; RV32I-NEXT: mv s1, a0616; RV32I-NEXT: mv a0, s0617; RV32I-NEXT: call cosf618; RV32I-NEXT: call __truncsfhf2619; RV32I-NEXT: mv s0, a0620; RV32I-NEXT: and a0, s1, s2621; RV32I-NEXT: call __extendhfsf2622; RV32I-NEXT: mv s1, a0623; RV32I-NEXT: and a0, s0, s2624; RV32I-NEXT: call __extendhfsf2625; RV32I-NEXT: mv a1, a0626; RV32I-NEXT: mv a0, s1627; RV32I-NEXT: call __addsf3628; RV32I-NEXT: call __truncsfhf2629; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload630; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload631; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload632; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload633; RV32I-NEXT: addi sp, sp, 16634; RV32I-NEXT: ret635;636; RV64I-LABEL: sincos_f16:637; RV64I: # %bb.0:638; RV64I-NEXT: addi sp, sp, -32639; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill640; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill641; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill642; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill643; RV64I-NEXT: lui a1, 16644; RV64I-NEXT: addi s2, a1, -1645; RV64I-NEXT: and a0, a0, s2646; RV64I-NEXT: call __extendhfsf2647; RV64I-NEXT: mv s0, a0648; RV64I-NEXT: call sinf649; RV64I-NEXT: call __truncsfhf2650; RV64I-NEXT: mv s1, a0651; RV64I-NEXT: mv a0, s0652; RV64I-NEXT: call cosf653; RV64I-NEXT: call __truncsfhf2654; RV64I-NEXT: mv s0, a0655; RV64I-NEXT: and a0, s1, s2656; RV64I-NEXT: call __extendhfsf2657; RV64I-NEXT: mv s1, a0658; RV64I-NEXT: and a0, s0, s2659; RV64I-NEXT: call __extendhfsf2660; RV64I-NEXT: mv a1, a0661; RV64I-NEXT: mv a0, s1662; RV64I-NEXT: call __addsf3663; RV64I-NEXT: call __truncsfhf2664; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload665; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload666; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload667; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload668; RV64I-NEXT: addi sp, sp, 32669; RV64I-NEXT: ret670;671; RV32IFZFHMIN-LABEL: sincos_f16:672; RV32IFZFHMIN: # %bb.0:673; RV32IFZFHMIN-NEXT: addi sp, sp, -16674; RV32IFZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill675; RV32IFZFHMIN-NEXT: fsw fs0, 8(sp) # 4-byte Folded Spill676; RV32IFZFHMIN-NEXT: fsw fs1, 4(sp) # 4-byte Folded Spill677; RV32IFZFHMIN-NEXT: fcvt.s.h fs0, fa0678; RV32IFZFHMIN-NEXT: fmv.s fa0, fs0679; RV32IFZFHMIN-NEXT: call sinf680; RV32IFZFHMIN-NEXT: fcvt.h.s fs1, fa0681; RV32IFZFHMIN-NEXT: fmv.s fa0, fs0682; RV32IFZFHMIN-NEXT: call cosf683; RV32IFZFHMIN-NEXT: fcvt.h.s fa5, fa0684; RV32IFZFHMIN-NEXT: fcvt.s.h fa5, fa5685; RV32IFZFHMIN-NEXT: fcvt.s.h fa4, fs1686; RV32IFZFHMIN-NEXT: fadd.s fa5, fa4, fa5687; RV32IFZFHMIN-NEXT: fcvt.h.s fa0, fa5688; RV32IFZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload689; RV32IFZFHMIN-NEXT: flw fs0, 8(sp) # 4-byte Folded Reload690; RV32IFZFHMIN-NEXT: flw fs1, 4(sp) # 4-byte Folded Reload691; RV32IFZFHMIN-NEXT: addi sp, sp, 16692; RV32IFZFHMIN-NEXT: ret693;694; RV64IFZFHMIN-LABEL: sincos_f16:695; RV64IFZFHMIN: # %bb.0:696; RV64IFZFHMIN-NEXT: addi sp, sp, -16697; RV64IFZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill698; RV64IFZFHMIN-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill699; RV64IFZFHMIN-NEXT: fsw fs1, 0(sp) # 4-byte Folded Spill700; RV64IFZFHMIN-NEXT: fcvt.s.h fs0, fa0701; RV64IFZFHMIN-NEXT: fmv.s fa0, fs0702; RV64IFZFHMIN-NEXT: call sinf703; RV64IFZFHMIN-NEXT: fcvt.h.s fs1, fa0704; RV64IFZFHMIN-NEXT: fmv.s fa0, fs0705; RV64IFZFHMIN-NEXT: call cosf706; RV64IFZFHMIN-NEXT: fcvt.h.s fa5, fa0707; RV64IFZFHMIN-NEXT: fcvt.s.h fa5, fa5708; RV64IFZFHMIN-NEXT: fcvt.s.h fa4, fs1709; RV64IFZFHMIN-NEXT: fadd.s fa5, fa4, fa5710; RV64IFZFHMIN-NEXT: fcvt.h.s fa0, fa5711; RV64IFZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload712; RV64IFZFHMIN-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload713; RV64IFZFHMIN-NEXT: flw fs1, 0(sp) # 4-byte Folded Reload714; RV64IFZFHMIN-NEXT: addi sp, sp, 16715; RV64IFZFHMIN-NEXT: ret716;717; RV32IDZFHMIN-LABEL: sincos_f16:718; RV32IDZFHMIN: # %bb.0:719; RV32IDZFHMIN-NEXT: addi sp, sp, -32720; RV32IDZFHMIN-NEXT: sw ra, 28(sp) # 4-byte Folded Spill721; RV32IDZFHMIN-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill722; RV32IDZFHMIN-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill723; RV32IDZFHMIN-NEXT: fcvt.s.h fs0, fa0724; RV32IDZFHMIN-NEXT: fmv.s fa0, fs0725; RV32IDZFHMIN-NEXT: call sinf726; RV32IDZFHMIN-NEXT: fcvt.h.s fs1, fa0727; RV32IDZFHMIN-NEXT: fmv.s fa0, fs0728; RV32IDZFHMIN-NEXT: call cosf729; RV32IDZFHMIN-NEXT: fcvt.h.s fa5, fa0730; RV32IDZFHMIN-NEXT: fcvt.s.h fa5, fa5731; RV32IDZFHMIN-NEXT: fcvt.s.h fa4, fs1732; RV32IDZFHMIN-NEXT: fadd.s fa5, fa4, fa5733; RV32IDZFHMIN-NEXT: fcvt.h.s fa0, fa5734; RV32IDZFHMIN-NEXT: lw ra, 28(sp) # 4-byte Folded Reload735; RV32IDZFHMIN-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload736; RV32IDZFHMIN-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload737; RV32IDZFHMIN-NEXT: addi sp, sp, 32738; RV32IDZFHMIN-NEXT: ret739;740; RV64IDZFHMIN-LABEL: sincos_f16:741; RV64IDZFHMIN: # %bb.0:742; RV64IDZFHMIN-NEXT: addi sp, sp, -32743; RV64IDZFHMIN-NEXT: sd ra, 24(sp) # 8-byte Folded Spill744; RV64IDZFHMIN-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill745; RV64IDZFHMIN-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill746; RV64IDZFHMIN-NEXT: fcvt.s.h fs0, fa0747; RV64IDZFHMIN-NEXT: fmv.s fa0, fs0748; RV64IDZFHMIN-NEXT: call sinf749; RV64IDZFHMIN-NEXT: fcvt.h.s fs1, fa0750; RV64IDZFHMIN-NEXT: fmv.s fa0, fs0751; RV64IDZFHMIN-NEXT: call cosf752; RV64IDZFHMIN-NEXT: fcvt.h.s fa5, fa0753; RV64IDZFHMIN-NEXT: fcvt.s.h fa5, fa5754; RV64IDZFHMIN-NEXT: fcvt.s.h fa4, fs1755; RV64IDZFHMIN-NEXT: fadd.s fa5, fa4, fa5756; RV64IDZFHMIN-NEXT: fcvt.h.s fa0, fa5757; RV64IDZFHMIN-NEXT: ld ra, 24(sp) # 8-byte Folded Reload758; RV64IDZFHMIN-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload759; RV64IDZFHMIN-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload760; RV64IDZFHMIN-NEXT: addi sp, sp, 32761; RV64IDZFHMIN-NEXT: ret762;763; RV32IZHINXMIN-LABEL: sincos_f16:764; RV32IZHINXMIN: # %bb.0:765; RV32IZHINXMIN-NEXT: addi sp, sp, -16766; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill767; RV32IZHINXMIN-NEXT: sw s0, 8(sp) # 4-byte Folded Spill768; RV32IZHINXMIN-NEXT: sw s1, 4(sp) # 4-byte Folded Spill769; RV32IZHINXMIN-NEXT: fcvt.s.h s0, a0770; RV32IZHINXMIN-NEXT: mv a0, s0771; RV32IZHINXMIN-NEXT: call sinf772; RV32IZHINXMIN-NEXT: fcvt.h.s s1, a0773; RV32IZHINXMIN-NEXT: mv a0, s0774; RV32IZHINXMIN-NEXT: call cosf775; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0776; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0777; RV32IZHINXMIN-NEXT: fcvt.s.h a1, s1778; RV32IZHINXMIN-NEXT: fadd.s a0, a1, a0779; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0780; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload781; RV32IZHINXMIN-NEXT: lw s0, 8(sp) # 4-byte Folded Reload782; RV32IZHINXMIN-NEXT: lw s1, 4(sp) # 4-byte Folded Reload783; RV32IZHINXMIN-NEXT: addi sp, sp, 16784; RV32IZHINXMIN-NEXT: ret785;786; RV64IZHINXMIN-LABEL: sincos_f16:787; RV64IZHINXMIN: # %bb.0:788; RV64IZHINXMIN-NEXT: addi sp, sp, -32789; RV64IZHINXMIN-NEXT: sd ra, 24(sp) # 8-byte Folded Spill790; RV64IZHINXMIN-NEXT: sd s0, 16(sp) # 8-byte Folded Spill791; RV64IZHINXMIN-NEXT: sd s1, 8(sp) # 8-byte Folded Spill792; RV64IZHINXMIN-NEXT: fcvt.s.h s0, a0793; RV64IZHINXMIN-NEXT: mv a0, s0794; RV64IZHINXMIN-NEXT: call sinf795; RV64IZHINXMIN-NEXT: fcvt.h.s s1, a0796; RV64IZHINXMIN-NEXT: mv a0, s0797; RV64IZHINXMIN-NEXT: call cosf798; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0799; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0800; RV64IZHINXMIN-NEXT: fcvt.s.h a1, s1801; RV64IZHINXMIN-NEXT: fadd.s a0, a1, a0802; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0803; RV64IZHINXMIN-NEXT: ld ra, 24(sp) # 8-byte Folded Reload804; RV64IZHINXMIN-NEXT: ld s0, 16(sp) # 8-byte Folded Reload805; RV64IZHINXMIN-NEXT: ld s1, 8(sp) # 8-byte Folded Reload806; RV64IZHINXMIN-NEXT: addi sp, sp, 32807; RV64IZHINXMIN-NEXT: ret808 %1 = call half @llvm.sin.f16(half %a)809 %2 = call half @llvm.cos.f16(half %a)810 %3 = fadd half %1, %2811 ret half %3812}813 814define half @pow_f16(half %a, half %b) nounwind {815; RV32IZFH-LABEL: pow_f16:816; RV32IZFH: # %bb.0:817; RV32IZFH-NEXT: addi sp, sp, -16818; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill819; RV32IZFH-NEXT: fcvt.s.h fa0, fa0820; RV32IZFH-NEXT: fcvt.s.h fa1, fa1821; RV32IZFH-NEXT: call powf822; RV32IZFH-NEXT: fcvt.h.s fa0, fa0823; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload824; RV32IZFH-NEXT: addi sp, sp, 16825; RV32IZFH-NEXT: ret826;827; RV64IZFH-LABEL: pow_f16:828; RV64IZFH: # %bb.0:829; RV64IZFH-NEXT: addi sp, sp, -16830; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill831; RV64IZFH-NEXT: fcvt.s.h fa0, fa0832; RV64IZFH-NEXT: fcvt.s.h fa1, fa1833; RV64IZFH-NEXT: call powf834; RV64IZFH-NEXT: fcvt.h.s fa0, fa0835; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload836; RV64IZFH-NEXT: addi sp, sp, 16837; RV64IZFH-NEXT: ret838;839; RV32IZHINX-LABEL: pow_f16:840; RV32IZHINX: # %bb.0:841; RV32IZHINX-NEXT: addi sp, sp, -16842; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill843; RV32IZHINX-NEXT: fcvt.s.h a0, a0844; RV32IZHINX-NEXT: fcvt.s.h a1, a1845; RV32IZHINX-NEXT: call powf846; RV32IZHINX-NEXT: fcvt.h.s a0, a0847; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload848; RV32IZHINX-NEXT: addi sp, sp, 16849; RV32IZHINX-NEXT: ret850;851; RV64IZHINX-LABEL: pow_f16:852; RV64IZHINX: # %bb.0:853; RV64IZHINX-NEXT: addi sp, sp, -16854; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill855; RV64IZHINX-NEXT: fcvt.s.h a0, a0856; RV64IZHINX-NEXT: fcvt.s.h a1, a1857; RV64IZHINX-NEXT: call powf858; RV64IZHINX-NEXT: fcvt.h.s a0, a0859; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload860; RV64IZHINX-NEXT: addi sp, sp, 16861; RV64IZHINX-NEXT: ret862;863; RV32I-LABEL: pow_f16:864; RV32I: # %bb.0:865; RV32I-NEXT: addi sp, sp, -16866; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill867; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill868; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill869; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill870; RV32I-NEXT: mv s0, a1871; RV32I-NEXT: lui a1, 16872; RV32I-NEXT: addi s2, a1, -1873; RV32I-NEXT: and a0, a0, s2874; RV32I-NEXT: call __extendhfsf2875; RV32I-NEXT: mv s1, a0876; RV32I-NEXT: and a0, s0, s2877; RV32I-NEXT: call __extendhfsf2878; RV32I-NEXT: mv a1, a0879; RV32I-NEXT: mv a0, s1880; RV32I-NEXT: call powf881; RV32I-NEXT: call __truncsfhf2882; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload883; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload884; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload885; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload886; RV32I-NEXT: addi sp, sp, 16887; RV32I-NEXT: ret888;889; RV64I-LABEL: pow_f16:890; RV64I: # %bb.0:891; RV64I-NEXT: addi sp, sp, -32892; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill893; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill894; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill895; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill896; RV64I-NEXT: mv s0, a1897; RV64I-NEXT: lui a1, 16898; RV64I-NEXT: addi s2, a1, -1899; RV64I-NEXT: and a0, a0, s2900; RV64I-NEXT: call __extendhfsf2901; RV64I-NEXT: mv s1, a0902; RV64I-NEXT: and a0, s0, s2903; RV64I-NEXT: call __extendhfsf2904; RV64I-NEXT: mv a1, a0905; RV64I-NEXT: mv a0, s1906; RV64I-NEXT: call powf907; RV64I-NEXT: call __truncsfhf2908; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload909; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload910; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload911; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload912; RV64I-NEXT: addi sp, sp, 32913; RV64I-NEXT: ret914;915; RV32IZFHMIN-LABEL: pow_f16:916; RV32IZFHMIN: # %bb.0:917; RV32IZFHMIN-NEXT: addi sp, sp, -16918; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill919; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0920; RV32IZFHMIN-NEXT: fcvt.s.h fa1, fa1921; RV32IZFHMIN-NEXT: call powf922; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0923; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload924; RV32IZFHMIN-NEXT: addi sp, sp, 16925; RV32IZFHMIN-NEXT: ret926;927; RV64IZFHMIN-LABEL: pow_f16:928; RV64IZFHMIN: # %bb.0:929; RV64IZFHMIN-NEXT: addi sp, sp, -16930; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill931; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0932; RV64IZFHMIN-NEXT: fcvt.s.h fa1, fa1933; RV64IZFHMIN-NEXT: call powf934; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0935; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload936; RV64IZFHMIN-NEXT: addi sp, sp, 16937; RV64IZFHMIN-NEXT: ret938;939; RV32IZHINXMIN-LABEL: pow_f16:940; RV32IZHINXMIN: # %bb.0:941; RV32IZHINXMIN-NEXT: addi sp, sp, -16942; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill943; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0944; RV32IZHINXMIN-NEXT: fcvt.s.h a1, a1945; RV32IZHINXMIN-NEXT: call powf946; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0947; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload948; RV32IZHINXMIN-NEXT: addi sp, sp, 16949; RV32IZHINXMIN-NEXT: ret950;951; RV64IZHINXMIN-LABEL: pow_f16:952; RV64IZHINXMIN: # %bb.0:953; RV64IZHINXMIN-NEXT: addi sp, sp, -16954; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill955; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0956; RV64IZHINXMIN-NEXT: fcvt.s.h a1, a1957; RV64IZHINXMIN-NEXT: call powf958; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0959; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload960; RV64IZHINXMIN-NEXT: addi sp, sp, 16961; RV64IZHINXMIN-NEXT: ret962 %1 = call half @llvm.pow.f16(half %a, half %b)963 ret half %1964}965 966define half @exp_f16(half %a) nounwind {967; RV32IZFH-LABEL: exp_f16:968; RV32IZFH: # %bb.0:969; RV32IZFH-NEXT: addi sp, sp, -16970; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill971; RV32IZFH-NEXT: fcvt.s.h fa0, fa0972; RV32IZFH-NEXT: call expf973; RV32IZFH-NEXT: fcvt.h.s fa0, fa0974; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload975; RV32IZFH-NEXT: addi sp, sp, 16976; RV32IZFH-NEXT: ret977;978; RV64IZFH-LABEL: exp_f16:979; RV64IZFH: # %bb.0:980; RV64IZFH-NEXT: addi sp, sp, -16981; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill982; RV64IZFH-NEXT: fcvt.s.h fa0, fa0983; RV64IZFH-NEXT: call expf984; RV64IZFH-NEXT: fcvt.h.s fa0, fa0985; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload986; RV64IZFH-NEXT: addi sp, sp, 16987; RV64IZFH-NEXT: ret988;989; RV32IZHINX-LABEL: exp_f16:990; RV32IZHINX: # %bb.0:991; RV32IZHINX-NEXT: addi sp, sp, -16992; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill993; RV32IZHINX-NEXT: fcvt.s.h a0, a0994; RV32IZHINX-NEXT: call expf995; RV32IZHINX-NEXT: fcvt.h.s a0, a0996; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload997; RV32IZHINX-NEXT: addi sp, sp, 16998; RV32IZHINX-NEXT: ret999;1000; RV64IZHINX-LABEL: exp_f16:1001; RV64IZHINX: # %bb.0:1002; RV64IZHINX-NEXT: addi sp, sp, -161003; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1004; RV64IZHINX-NEXT: fcvt.s.h a0, a01005; RV64IZHINX-NEXT: call expf1006; RV64IZHINX-NEXT: fcvt.h.s a0, a01007; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1008; RV64IZHINX-NEXT: addi sp, sp, 161009; RV64IZHINX-NEXT: ret1010;1011; RV32I-LABEL: exp_f16:1012; RV32I: # %bb.0:1013; RV32I-NEXT: addi sp, sp, -161014; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1015; RV32I-NEXT: slli a0, a0, 161016; RV32I-NEXT: srli a0, a0, 161017; RV32I-NEXT: call __extendhfsf21018; RV32I-NEXT: call expf1019; RV32I-NEXT: call __truncsfhf21020; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1021; RV32I-NEXT: addi sp, sp, 161022; RV32I-NEXT: ret1023;1024; RV64I-LABEL: exp_f16:1025; RV64I: # %bb.0:1026; RV64I-NEXT: addi sp, sp, -161027; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1028; RV64I-NEXT: slli a0, a0, 481029; RV64I-NEXT: srli a0, a0, 481030; RV64I-NEXT: call __extendhfsf21031; RV64I-NEXT: call expf1032; RV64I-NEXT: call __truncsfhf21033; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1034; RV64I-NEXT: addi sp, sp, 161035; RV64I-NEXT: ret1036;1037; RV32IZFHMIN-LABEL: exp_f16:1038; RV32IZFHMIN: # %bb.0:1039; RV32IZFHMIN-NEXT: addi sp, sp, -161040; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1041; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01042; RV32IZFHMIN-NEXT: call expf1043; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01044; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1045; RV32IZFHMIN-NEXT: addi sp, sp, 161046; RV32IZFHMIN-NEXT: ret1047;1048; RV64IZFHMIN-LABEL: exp_f16:1049; RV64IZFHMIN: # %bb.0:1050; RV64IZFHMIN-NEXT: addi sp, sp, -161051; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1052; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01053; RV64IZFHMIN-NEXT: call expf1054; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01055; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1056; RV64IZFHMIN-NEXT: addi sp, sp, 161057; RV64IZFHMIN-NEXT: ret1058;1059; RV32IZHINXMIN-LABEL: exp_f16:1060; RV32IZHINXMIN: # %bb.0:1061; RV32IZHINXMIN-NEXT: addi sp, sp, -161062; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1063; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01064; RV32IZHINXMIN-NEXT: call expf1065; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01066; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1067; RV32IZHINXMIN-NEXT: addi sp, sp, 161068; RV32IZHINXMIN-NEXT: ret1069;1070; RV64IZHINXMIN-LABEL: exp_f16:1071; RV64IZHINXMIN: # %bb.0:1072; RV64IZHINXMIN-NEXT: addi sp, sp, -161073; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1074; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01075; RV64IZHINXMIN-NEXT: call expf1076; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01077; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1078; RV64IZHINXMIN-NEXT: addi sp, sp, 161079; RV64IZHINXMIN-NEXT: ret1080 %1 = call half @llvm.exp.f16(half %a)1081 ret half %11082}1083 1084define half @exp2_f16(half %a) nounwind {1085; RV32IZFH-LABEL: exp2_f16:1086; RV32IZFH: # %bb.0:1087; RV32IZFH-NEXT: addi sp, sp, -161088; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1089; RV32IZFH-NEXT: fcvt.s.h fa0, fa01090; RV32IZFH-NEXT: call exp2f1091; RV32IZFH-NEXT: fcvt.h.s fa0, fa01092; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1093; RV32IZFH-NEXT: addi sp, sp, 161094; RV32IZFH-NEXT: ret1095;1096; RV64IZFH-LABEL: exp2_f16:1097; RV64IZFH: # %bb.0:1098; RV64IZFH-NEXT: addi sp, sp, -161099; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1100; RV64IZFH-NEXT: fcvt.s.h fa0, fa01101; RV64IZFH-NEXT: call exp2f1102; RV64IZFH-NEXT: fcvt.h.s fa0, fa01103; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1104; RV64IZFH-NEXT: addi sp, sp, 161105; RV64IZFH-NEXT: ret1106;1107; RV32IZHINX-LABEL: exp2_f16:1108; RV32IZHINX: # %bb.0:1109; RV32IZHINX-NEXT: addi sp, sp, -161110; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1111; RV32IZHINX-NEXT: fcvt.s.h a0, a01112; RV32IZHINX-NEXT: call exp2f1113; RV32IZHINX-NEXT: fcvt.h.s a0, a01114; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1115; RV32IZHINX-NEXT: addi sp, sp, 161116; RV32IZHINX-NEXT: ret1117;1118; RV64IZHINX-LABEL: exp2_f16:1119; RV64IZHINX: # %bb.0:1120; RV64IZHINX-NEXT: addi sp, sp, -161121; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1122; RV64IZHINX-NEXT: fcvt.s.h a0, a01123; RV64IZHINX-NEXT: call exp2f1124; RV64IZHINX-NEXT: fcvt.h.s a0, a01125; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1126; RV64IZHINX-NEXT: addi sp, sp, 161127; RV64IZHINX-NEXT: ret1128;1129; RV32I-LABEL: exp2_f16:1130; RV32I: # %bb.0:1131; RV32I-NEXT: addi sp, sp, -161132; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1133; RV32I-NEXT: slli a0, a0, 161134; RV32I-NEXT: srli a0, a0, 161135; RV32I-NEXT: call __extendhfsf21136; RV32I-NEXT: call exp2f1137; RV32I-NEXT: call __truncsfhf21138; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1139; RV32I-NEXT: addi sp, sp, 161140; RV32I-NEXT: ret1141;1142; RV64I-LABEL: exp2_f16:1143; RV64I: # %bb.0:1144; RV64I-NEXT: addi sp, sp, -161145; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1146; RV64I-NEXT: slli a0, a0, 481147; RV64I-NEXT: srli a0, a0, 481148; RV64I-NEXT: call __extendhfsf21149; RV64I-NEXT: call exp2f1150; RV64I-NEXT: call __truncsfhf21151; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1152; RV64I-NEXT: addi sp, sp, 161153; RV64I-NEXT: ret1154;1155; RV32IZFHMIN-LABEL: exp2_f16:1156; RV32IZFHMIN: # %bb.0:1157; RV32IZFHMIN-NEXT: addi sp, sp, -161158; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1159; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01160; RV32IZFHMIN-NEXT: call exp2f1161; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01162; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1163; RV32IZFHMIN-NEXT: addi sp, sp, 161164; RV32IZFHMIN-NEXT: ret1165;1166; RV64IZFHMIN-LABEL: exp2_f16:1167; RV64IZFHMIN: # %bb.0:1168; RV64IZFHMIN-NEXT: addi sp, sp, -161169; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1170; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01171; RV64IZFHMIN-NEXT: call exp2f1172; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01173; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1174; RV64IZFHMIN-NEXT: addi sp, sp, 161175; RV64IZFHMIN-NEXT: ret1176;1177; RV32IZHINXMIN-LABEL: exp2_f16:1178; RV32IZHINXMIN: # %bb.0:1179; RV32IZHINXMIN-NEXT: addi sp, sp, -161180; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1181; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01182; RV32IZHINXMIN-NEXT: call exp2f1183; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01184; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1185; RV32IZHINXMIN-NEXT: addi sp, sp, 161186; RV32IZHINXMIN-NEXT: ret1187;1188; RV64IZHINXMIN-LABEL: exp2_f16:1189; RV64IZHINXMIN: # %bb.0:1190; RV64IZHINXMIN-NEXT: addi sp, sp, -161191; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1192; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01193; RV64IZHINXMIN-NEXT: call exp2f1194; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01195; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1196; RV64IZHINXMIN-NEXT: addi sp, sp, 161197; RV64IZHINXMIN-NEXT: ret1198 %1 = call half @llvm.exp2.f16(half %a)1199 ret half %11200}1201 1202define half @exp10_f16(half %a) nounwind {1203; RV32IZFH-LABEL: exp10_f16:1204; RV32IZFH: # %bb.0:1205; RV32IZFH-NEXT: addi sp, sp, -161206; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1207; RV32IZFH-NEXT: fcvt.s.h fa0, fa01208; RV32IZFH-NEXT: call exp10f1209; RV32IZFH-NEXT: fcvt.h.s fa0, fa01210; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1211; RV32IZFH-NEXT: addi sp, sp, 161212; RV32IZFH-NEXT: ret1213;1214; RV64IZFH-LABEL: exp10_f16:1215; RV64IZFH: # %bb.0:1216; RV64IZFH-NEXT: addi sp, sp, -161217; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1218; RV64IZFH-NEXT: fcvt.s.h fa0, fa01219; RV64IZFH-NEXT: call exp10f1220; RV64IZFH-NEXT: fcvt.h.s fa0, fa01221; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1222; RV64IZFH-NEXT: addi sp, sp, 161223; RV64IZFH-NEXT: ret1224;1225; RV32IZHINX-LABEL: exp10_f16:1226; RV32IZHINX: # %bb.0:1227; RV32IZHINX-NEXT: addi sp, sp, -161228; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1229; RV32IZHINX-NEXT: fcvt.s.h a0, a01230; RV32IZHINX-NEXT: call exp10f1231; RV32IZHINX-NEXT: fcvt.h.s a0, a01232; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1233; RV32IZHINX-NEXT: addi sp, sp, 161234; RV32IZHINX-NEXT: ret1235;1236; RV64IZHINX-LABEL: exp10_f16:1237; RV64IZHINX: # %bb.0:1238; RV64IZHINX-NEXT: addi sp, sp, -161239; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1240; RV64IZHINX-NEXT: fcvt.s.h a0, a01241; RV64IZHINX-NEXT: call exp10f1242; RV64IZHINX-NEXT: fcvt.h.s a0, a01243; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1244; RV64IZHINX-NEXT: addi sp, sp, 161245; RV64IZHINX-NEXT: ret1246;1247; RV32I-LABEL: exp10_f16:1248; RV32I: # %bb.0:1249; RV32I-NEXT: addi sp, sp, -161250; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1251; RV32I-NEXT: slli a0, a0, 161252; RV32I-NEXT: srli a0, a0, 161253; RV32I-NEXT: call __extendhfsf21254; RV32I-NEXT: call exp10f1255; RV32I-NEXT: call __truncsfhf21256; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1257; RV32I-NEXT: addi sp, sp, 161258; RV32I-NEXT: ret1259;1260; RV64I-LABEL: exp10_f16:1261; RV64I: # %bb.0:1262; RV64I-NEXT: addi sp, sp, -161263; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1264; RV64I-NEXT: slli a0, a0, 481265; RV64I-NEXT: srli a0, a0, 481266; RV64I-NEXT: call __extendhfsf21267; RV64I-NEXT: call exp10f1268; RV64I-NEXT: call __truncsfhf21269; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1270; RV64I-NEXT: addi sp, sp, 161271; RV64I-NEXT: ret1272;1273; RV32IZFHMIN-LABEL: exp10_f16:1274; RV32IZFHMIN: # %bb.0:1275; RV32IZFHMIN-NEXT: addi sp, sp, -161276; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1277; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01278; RV32IZFHMIN-NEXT: call exp10f1279; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01280; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1281; RV32IZFHMIN-NEXT: addi sp, sp, 161282; RV32IZFHMIN-NEXT: ret1283;1284; RV64IZFHMIN-LABEL: exp10_f16:1285; RV64IZFHMIN: # %bb.0:1286; RV64IZFHMIN-NEXT: addi sp, sp, -161287; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1288; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01289; RV64IZFHMIN-NEXT: call exp10f1290; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01291; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1292; RV64IZFHMIN-NEXT: addi sp, sp, 161293; RV64IZFHMIN-NEXT: ret1294;1295; RV32IZHINXMIN-LABEL: exp10_f16:1296; RV32IZHINXMIN: # %bb.0:1297; RV32IZHINXMIN-NEXT: addi sp, sp, -161298; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1299; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01300; RV32IZHINXMIN-NEXT: call exp10f1301; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01302; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1303; RV32IZHINXMIN-NEXT: addi sp, sp, 161304; RV32IZHINXMIN-NEXT: ret1305;1306; RV64IZHINXMIN-LABEL: exp10_f16:1307; RV64IZHINXMIN: # %bb.0:1308; RV64IZHINXMIN-NEXT: addi sp, sp, -161309; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1310; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01311; RV64IZHINXMIN-NEXT: call exp10f1312; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01313; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1314; RV64IZHINXMIN-NEXT: addi sp, sp, 161315; RV64IZHINXMIN-NEXT: ret1316 %1 = call half @llvm.exp10.f16(half %a)1317 ret half %11318}1319 1320define half @log_f16(half %a) nounwind {1321; RV32IZFH-LABEL: log_f16:1322; RV32IZFH: # %bb.0:1323; RV32IZFH-NEXT: addi sp, sp, -161324; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1325; RV32IZFH-NEXT: fcvt.s.h fa0, fa01326; RV32IZFH-NEXT: call logf1327; RV32IZFH-NEXT: fcvt.h.s fa0, fa01328; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1329; RV32IZFH-NEXT: addi sp, sp, 161330; RV32IZFH-NEXT: ret1331;1332; RV64IZFH-LABEL: log_f16:1333; RV64IZFH: # %bb.0:1334; RV64IZFH-NEXT: addi sp, sp, -161335; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1336; RV64IZFH-NEXT: fcvt.s.h fa0, fa01337; RV64IZFH-NEXT: call logf1338; RV64IZFH-NEXT: fcvt.h.s fa0, fa01339; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1340; RV64IZFH-NEXT: addi sp, sp, 161341; RV64IZFH-NEXT: ret1342;1343; RV32IZHINX-LABEL: log_f16:1344; RV32IZHINX: # %bb.0:1345; RV32IZHINX-NEXT: addi sp, sp, -161346; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1347; RV32IZHINX-NEXT: fcvt.s.h a0, a01348; RV32IZHINX-NEXT: call logf1349; RV32IZHINX-NEXT: fcvt.h.s a0, a01350; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1351; RV32IZHINX-NEXT: addi sp, sp, 161352; RV32IZHINX-NEXT: ret1353;1354; RV64IZHINX-LABEL: log_f16:1355; RV64IZHINX: # %bb.0:1356; RV64IZHINX-NEXT: addi sp, sp, -161357; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1358; RV64IZHINX-NEXT: fcvt.s.h a0, a01359; RV64IZHINX-NEXT: call logf1360; RV64IZHINX-NEXT: fcvt.h.s a0, a01361; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1362; RV64IZHINX-NEXT: addi sp, sp, 161363; RV64IZHINX-NEXT: ret1364;1365; RV32I-LABEL: log_f16:1366; RV32I: # %bb.0:1367; RV32I-NEXT: addi sp, sp, -161368; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1369; RV32I-NEXT: slli a0, a0, 161370; RV32I-NEXT: srli a0, a0, 161371; RV32I-NEXT: call __extendhfsf21372; RV32I-NEXT: call logf1373; RV32I-NEXT: call __truncsfhf21374; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1375; RV32I-NEXT: addi sp, sp, 161376; RV32I-NEXT: ret1377;1378; RV64I-LABEL: log_f16:1379; RV64I: # %bb.0:1380; RV64I-NEXT: addi sp, sp, -161381; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1382; RV64I-NEXT: slli a0, a0, 481383; RV64I-NEXT: srli a0, a0, 481384; RV64I-NEXT: call __extendhfsf21385; RV64I-NEXT: call logf1386; RV64I-NEXT: call __truncsfhf21387; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1388; RV64I-NEXT: addi sp, sp, 161389; RV64I-NEXT: ret1390;1391; RV32IZFHMIN-LABEL: log_f16:1392; RV32IZFHMIN: # %bb.0:1393; RV32IZFHMIN-NEXT: addi sp, sp, -161394; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1395; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01396; RV32IZFHMIN-NEXT: call logf1397; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01398; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1399; RV32IZFHMIN-NEXT: addi sp, sp, 161400; RV32IZFHMIN-NEXT: ret1401;1402; RV64IZFHMIN-LABEL: log_f16:1403; RV64IZFHMIN: # %bb.0:1404; RV64IZFHMIN-NEXT: addi sp, sp, -161405; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1406; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01407; RV64IZFHMIN-NEXT: call logf1408; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01409; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1410; RV64IZFHMIN-NEXT: addi sp, sp, 161411; RV64IZFHMIN-NEXT: ret1412;1413; RV32IZHINXMIN-LABEL: log_f16:1414; RV32IZHINXMIN: # %bb.0:1415; RV32IZHINXMIN-NEXT: addi sp, sp, -161416; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1417; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01418; RV32IZHINXMIN-NEXT: call logf1419; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01420; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1421; RV32IZHINXMIN-NEXT: addi sp, sp, 161422; RV32IZHINXMIN-NEXT: ret1423;1424; RV64IZHINXMIN-LABEL: log_f16:1425; RV64IZHINXMIN: # %bb.0:1426; RV64IZHINXMIN-NEXT: addi sp, sp, -161427; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1428; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01429; RV64IZHINXMIN-NEXT: call logf1430; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01431; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1432; RV64IZHINXMIN-NEXT: addi sp, sp, 161433; RV64IZHINXMIN-NEXT: ret1434 %1 = call half @llvm.log.f16(half %a)1435 ret half %11436}1437 1438define half @log10_f16(half %a) nounwind {1439; RV32IZFH-LABEL: log10_f16:1440; RV32IZFH: # %bb.0:1441; RV32IZFH-NEXT: addi sp, sp, -161442; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1443; RV32IZFH-NEXT: fcvt.s.h fa0, fa01444; RV32IZFH-NEXT: call log10f1445; RV32IZFH-NEXT: fcvt.h.s fa0, fa01446; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1447; RV32IZFH-NEXT: addi sp, sp, 161448; RV32IZFH-NEXT: ret1449;1450; RV64IZFH-LABEL: log10_f16:1451; RV64IZFH: # %bb.0:1452; RV64IZFH-NEXT: addi sp, sp, -161453; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1454; RV64IZFH-NEXT: fcvt.s.h fa0, fa01455; RV64IZFH-NEXT: call log10f1456; RV64IZFH-NEXT: fcvt.h.s fa0, fa01457; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1458; RV64IZFH-NEXT: addi sp, sp, 161459; RV64IZFH-NEXT: ret1460;1461; RV32IZHINX-LABEL: log10_f16:1462; RV32IZHINX: # %bb.0:1463; RV32IZHINX-NEXT: addi sp, sp, -161464; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1465; RV32IZHINX-NEXT: fcvt.s.h a0, a01466; RV32IZHINX-NEXT: call log10f1467; RV32IZHINX-NEXT: fcvt.h.s a0, a01468; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1469; RV32IZHINX-NEXT: addi sp, sp, 161470; RV32IZHINX-NEXT: ret1471;1472; RV64IZHINX-LABEL: log10_f16:1473; RV64IZHINX: # %bb.0:1474; RV64IZHINX-NEXT: addi sp, sp, -161475; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1476; RV64IZHINX-NEXT: fcvt.s.h a0, a01477; RV64IZHINX-NEXT: call log10f1478; RV64IZHINX-NEXT: fcvt.h.s a0, a01479; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1480; RV64IZHINX-NEXT: addi sp, sp, 161481; RV64IZHINX-NEXT: ret1482;1483; RV32I-LABEL: log10_f16:1484; RV32I: # %bb.0:1485; RV32I-NEXT: addi sp, sp, -161486; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1487; RV32I-NEXT: slli a0, a0, 161488; RV32I-NEXT: srli a0, a0, 161489; RV32I-NEXT: call __extendhfsf21490; RV32I-NEXT: call log10f1491; RV32I-NEXT: call __truncsfhf21492; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1493; RV32I-NEXT: addi sp, sp, 161494; RV32I-NEXT: ret1495;1496; RV64I-LABEL: log10_f16:1497; RV64I: # %bb.0:1498; RV64I-NEXT: addi sp, sp, -161499; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1500; RV64I-NEXT: slli a0, a0, 481501; RV64I-NEXT: srli a0, a0, 481502; RV64I-NEXT: call __extendhfsf21503; RV64I-NEXT: call log10f1504; RV64I-NEXT: call __truncsfhf21505; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1506; RV64I-NEXT: addi sp, sp, 161507; RV64I-NEXT: ret1508;1509; RV32IZFHMIN-LABEL: log10_f16:1510; RV32IZFHMIN: # %bb.0:1511; RV32IZFHMIN-NEXT: addi sp, sp, -161512; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1513; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01514; RV32IZFHMIN-NEXT: call log10f1515; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01516; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1517; RV32IZFHMIN-NEXT: addi sp, sp, 161518; RV32IZFHMIN-NEXT: ret1519;1520; RV64IZFHMIN-LABEL: log10_f16:1521; RV64IZFHMIN: # %bb.0:1522; RV64IZFHMIN-NEXT: addi sp, sp, -161523; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1524; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01525; RV64IZFHMIN-NEXT: call log10f1526; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01527; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1528; RV64IZFHMIN-NEXT: addi sp, sp, 161529; RV64IZFHMIN-NEXT: ret1530;1531; RV32IZHINXMIN-LABEL: log10_f16:1532; RV32IZHINXMIN: # %bb.0:1533; RV32IZHINXMIN-NEXT: addi sp, sp, -161534; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1535; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01536; RV32IZHINXMIN-NEXT: call log10f1537; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01538; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1539; RV32IZHINXMIN-NEXT: addi sp, sp, 161540; RV32IZHINXMIN-NEXT: ret1541;1542; RV64IZHINXMIN-LABEL: log10_f16:1543; RV64IZHINXMIN: # %bb.0:1544; RV64IZHINXMIN-NEXT: addi sp, sp, -161545; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1546; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01547; RV64IZHINXMIN-NEXT: call log10f1548; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01549; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1550; RV64IZHINXMIN-NEXT: addi sp, sp, 161551; RV64IZHINXMIN-NEXT: ret1552 %1 = call half @llvm.log10.f16(half %a)1553 ret half %11554}1555 1556define half @log2_f16(half %a) nounwind {1557; RV32IZFH-LABEL: log2_f16:1558; RV32IZFH: # %bb.0:1559; RV32IZFH-NEXT: addi sp, sp, -161560; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1561; RV32IZFH-NEXT: fcvt.s.h fa0, fa01562; RV32IZFH-NEXT: call log2f1563; RV32IZFH-NEXT: fcvt.h.s fa0, fa01564; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1565; RV32IZFH-NEXT: addi sp, sp, 161566; RV32IZFH-NEXT: ret1567;1568; RV64IZFH-LABEL: log2_f16:1569; RV64IZFH: # %bb.0:1570; RV64IZFH-NEXT: addi sp, sp, -161571; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1572; RV64IZFH-NEXT: fcvt.s.h fa0, fa01573; RV64IZFH-NEXT: call log2f1574; RV64IZFH-NEXT: fcvt.h.s fa0, fa01575; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1576; RV64IZFH-NEXT: addi sp, sp, 161577; RV64IZFH-NEXT: ret1578;1579; RV32IZHINX-LABEL: log2_f16:1580; RV32IZHINX: # %bb.0:1581; RV32IZHINX-NEXT: addi sp, sp, -161582; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1583; RV32IZHINX-NEXT: fcvt.s.h a0, a01584; RV32IZHINX-NEXT: call log2f1585; RV32IZHINX-NEXT: fcvt.h.s a0, a01586; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1587; RV32IZHINX-NEXT: addi sp, sp, 161588; RV32IZHINX-NEXT: ret1589;1590; RV64IZHINX-LABEL: log2_f16:1591; RV64IZHINX: # %bb.0:1592; RV64IZHINX-NEXT: addi sp, sp, -161593; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1594; RV64IZHINX-NEXT: fcvt.s.h a0, a01595; RV64IZHINX-NEXT: call log2f1596; RV64IZHINX-NEXT: fcvt.h.s a0, a01597; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1598; RV64IZHINX-NEXT: addi sp, sp, 161599; RV64IZHINX-NEXT: ret1600;1601; RV32I-LABEL: log2_f16:1602; RV32I: # %bb.0:1603; RV32I-NEXT: addi sp, sp, -161604; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1605; RV32I-NEXT: slli a0, a0, 161606; RV32I-NEXT: srli a0, a0, 161607; RV32I-NEXT: call __extendhfsf21608; RV32I-NEXT: call log2f1609; RV32I-NEXT: call __truncsfhf21610; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1611; RV32I-NEXT: addi sp, sp, 161612; RV32I-NEXT: ret1613;1614; RV64I-LABEL: log2_f16:1615; RV64I: # %bb.0:1616; RV64I-NEXT: addi sp, sp, -161617; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1618; RV64I-NEXT: slli a0, a0, 481619; RV64I-NEXT: srli a0, a0, 481620; RV64I-NEXT: call __extendhfsf21621; RV64I-NEXT: call log2f1622; RV64I-NEXT: call __truncsfhf21623; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1624; RV64I-NEXT: addi sp, sp, 161625; RV64I-NEXT: ret1626;1627; RV32IZFHMIN-LABEL: log2_f16:1628; RV32IZFHMIN: # %bb.0:1629; RV32IZFHMIN-NEXT: addi sp, sp, -161630; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1631; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa01632; RV32IZFHMIN-NEXT: call log2f1633; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa01634; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1635; RV32IZFHMIN-NEXT: addi sp, sp, 161636; RV32IZFHMIN-NEXT: ret1637;1638; RV64IZFHMIN-LABEL: log2_f16:1639; RV64IZFHMIN: # %bb.0:1640; RV64IZFHMIN-NEXT: addi sp, sp, -161641; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1642; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa01643; RV64IZFHMIN-NEXT: call log2f1644; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa01645; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1646; RV64IZFHMIN-NEXT: addi sp, sp, 161647; RV64IZFHMIN-NEXT: ret1648;1649; RV32IZHINXMIN-LABEL: log2_f16:1650; RV32IZHINXMIN: # %bb.0:1651; RV32IZHINXMIN-NEXT: addi sp, sp, -161652; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1653; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a01654; RV32IZHINXMIN-NEXT: call log2f1655; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a01656; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1657; RV32IZHINXMIN-NEXT: addi sp, sp, 161658; RV32IZHINXMIN-NEXT: ret1659;1660; RV64IZHINXMIN-LABEL: log2_f16:1661; RV64IZHINXMIN: # %bb.0:1662; RV64IZHINXMIN-NEXT: addi sp, sp, -161663; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1664; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a01665; RV64IZHINXMIN-NEXT: call log2f1666; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a01667; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1668; RV64IZHINXMIN-NEXT: addi sp, sp, 161669; RV64IZHINXMIN-NEXT: ret1670 %1 = call half @llvm.log2.f16(half %a)1671 ret half %11672}1673 1674define half @fma_f16(half %a, half %b, half %c) nounwind {1675; CHECKIZFH-LABEL: fma_f16:1676; CHECKIZFH: # %bb.0:1677; CHECKIZFH-NEXT: fmadd.h fa0, fa0, fa1, fa21678; CHECKIZFH-NEXT: ret1679;1680; CHECKIZHINX-LABEL: fma_f16:1681; CHECKIZHINX: # %bb.0:1682; CHECKIZHINX-NEXT: fmadd.h a0, a0, a1, a21683; CHECKIZHINX-NEXT: ret1684;1685; RV32I-LABEL: fma_f16:1686; RV32I: # %bb.0:1687; RV32I-NEXT: addi sp, sp, -321688; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1689; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1690; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1691; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1692; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1693; RV32I-NEXT: mv s0, a21694; RV32I-NEXT: mv s1, a11695; RV32I-NEXT: lui a1, 161696; RV32I-NEXT: addi s3, a1, -11697; RV32I-NEXT: and a0, a0, s31698; RV32I-NEXT: call __extendhfsf21699; RV32I-NEXT: mv s2, a01700; RV32I-NEXT: and a0, s1, s31701; RV32I-NEXT: call __extendhfsf21702; RV32I-NEXT: mv s1, a01703; RV32I-NEXT: and a0, s0, s31704; RV32I-NEXT: call __extendhfsf21705; RV32I-NEXT: mv a2, a01706; RV32I-NEXT: mv a0, s21707; RV32I-NEXT: mv a1, s11708; RV32I-NEXT: call fmaf1709; RV32I-NEXT: call __truncsfhf21710; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1711; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1712; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1713; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1714; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1715; RV32I-NEXT: addi sp, sp, 321716; RV32I-NEXT: ret1717;1718; RV64I-LABEL: fma_f16:1719; RV64I: # %bb.0:1720; RV64I-NEXT: addi sp, sp, -481721; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1722; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1723; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1724; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1725; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1726; RV64I-NEXT: mv s0, a21727; RV64I-NEXT: mv s1, a11728; RV64I-NEXT: lui a1, 161729; RV64I-NEXT: addi s3, a1, -11730; RV64I-NEXT: and a0, a0, s31731; RV64I-NEXT: call __extendhfsf21732; RV64I-NEXT: mv s2, a01733; RV64I-NEXT: and a0, s1, s31734; RV64I-NEXT: call __extendhfsf21735; RV64I-NEXT: mv s1, a01736; RV64I-NEXT: and a0, s0, s31737; RV64I-NEXT: call __extendhfsf21738; RV64I-NEXT: mv a2, a01739; RV64I-NEXT: mv a0, s21740; RV64I-NEXT: mv a1, s11741; RV64I-NEXT: call fmaf1742; RV64I-NEXT: call __truncsfhf21743; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1744; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1745; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1746; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1747; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1748; RV64I-NEXT: addi sp, sp, 481749; RV64I-NEXT: ret1750;1751; CHECKIZFHMIN-LABEL: fma_f16:1752; CHECKIZFHMIN: # %bb.0:1753; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa21754; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa11755; CHECKIZFHMIN-NEXT: fcvt.s.h fa3, fa01756; CHECKIZFHMIN-NEXT: fmadd.s fa5, fa3, fa4, fa51757; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51758; CHECKIZFHMIN-NEXT: ret1759;1760; CHECKIZHINXMIN-LABEL: fma_f16:1761; CHECKIZHINXMIN: # %bb.0:1762; CHECKIZHINXMIN-NEXT: fcvt.s.h a2, a21763; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11764; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01765; CHECKIZHINXMIN-NEXT: fmadd.s a0, a0, a1, a21766; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01767; CHECKIZHINXMIN-NEXT: ret1768 %1 = call half @llvm.fma.f16(half %a, half %b, half %c)1769 ret half %11770}1771 1772define half @fmuladd_f16(half %a, half %b, half %c) nounwind {1773; CHECKIZFH-LABEL: fmuladd_f16:1774; CHECKIZFH: # %bb.0:1775; CHECKIZFH-NEXT: fmadd.h fa0, fa0, fa1, fa21776; CHECKIZFH-NEXT: ret1777;1778; CHECKIZHINX-LABEL: fmuladd_f16:1779; CHECKIZHINX: # %bb.0:1780; CHECKIZHINX-NEXT: fmadd.h a0, a0, a1, a21781; CHECKIZHINX-NEXT: ret1782;1783; RV32I-LABEL: fmuladd_f16:1784; RV32I: # %bb.0:1785; RV32I-NEXT: addi sp, sp, -321786; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1787; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1788; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1789; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1790; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1791; RV32I-NEXT: mv s0, a21792; RV32I-NEXT: mv s1, a11793; RV32I-NEXT: lui a1, 161794; RV32I-NEXT: addi s3, a1, -11795; RV32I-NEXT: and a0, a0, s31796; RV32I-NEXT: call __extendhfsf21797; RV32I-NEXT: mv s2, a01798; RV32I-NEXT: and a0, s1, s31799; RV32I-NEXT: call __extendhfsf21800; RV32I-NEXT: mv a1, a01801; RV32I-NEXT: mv a0, s21802; RV32I-NEXT: call __mulsf31803; RV32I-NEXT: call __truncsfhf21804; RV32I-NEXT: mv s1, a01805; RV32I-NEXT: and a0, s0, s31806; RV32I-NEXT: call __extendhfsf21807; RV32I-NEXT: mv s0, a01808; RV32I-NEXT: and a0, s1, s31809; RV32I-NEXT: call __extendhfsf21810; RV32I-NEXT: mv a1, s01811; RV32I-NEXT: call __addsf31812; RV32I-NEXT: call __truncsfhf21813; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1814; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1815; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1816; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1817; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1818; RV32I-NEXT: addi sp, sp, 321819; RV32I-NEXT: ret1820;1821; RV64I-LABEL: fmuladd_f16:1822; RV64I: # %bb.0:1823; RV64I-NEXT: addi sp, sp, -481824; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1825; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1826; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1827; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1828; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1829; RV64I-NEXT: mv s0, a21830; RV64I-NEXT: mv s1, a11831; RV64I-NEXT: lui a1, 161832; RV64I-NEXT: addi s3, a1, -11833; RV64I-NEXT: and a0, a0, s31834; RV64I-NEXT: call __extendhfsf21835; RV64I-NEXT: mv s2, a01836; RV64I-NEXT: and a0, s1, s31837; RV64I-NEXT: call __extendhfsf21838; RV64I-NEXT: mv a1, a01839; RV64I-NEXT: mv a0, s21840; RV64I-NEXT: call __mulsf31841; RV64I-NEXT: call __truncsfhf21842; RV64I-NEXT: mv s1, a01843; RV64I-NEXT: and a0, s0, s31844; RV64I-NEXT: call __extendhfsf21845; RV64I-NEXT: mv s0, a01846; RV64I-NEXT: and a0, s1, s31847; RV64I-NEXT: call __extendhfsf21848; RV64I-NEXT: mv a1, s01849; RV64I-NEXT: call __addsf31850; RV64I-NEXT: call __truncsfhf21851; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1852; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1853; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1854; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1855; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1856; RV64I-NEXT: addi sp, sp, 481857; RV64I-NEXT: ret1858;1859; CHECKIZFHMIN-LABEL: fmuladd_f16:1860; CHECKIZFHMIN: # %bb.0:1861; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa11862; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa01863; CHECKIZFHMIN-NEXT: fmul.s fa5, fa4, fa51864; CHECKIZFHMIN-NEXT: fcvt.h.s fa5, fa51865; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa51866; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa21867; CHECKIZFHMIN-NEXT: fadd.s fa5, fa5, fa41868; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa51869; CHECKIZFHMIN-NEXT: ret1870;1871; CHECKIZHINXMIN-LABEL: fmuladd_f16:1872; CHECKIZHINXMIN: # %bb.0:1873; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a11874; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01875; CHECKIZHINXMIN-NEXT: fmul.s a0, a0, a11876; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01877; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a01878; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a21879; CHECKIZHINXMIN-NEXT: fadd.s a0, a0, a11880; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a01881; CHECKIZHINXMIN-NEXT: ret1882 %1 = call half @llvm.fmuladd.f16(half %a, half %b, half %c)1883 ret half %11884}1885 1886define half @fabs_f16(half %a) nounwind {1887; CHECKIZFH-LABEL: fabs_f16:1888; CHECKIZFH: # %bb.0:1889; CHECKIZFH-NEXT: fabs.h fa0, fa01890; CHECKIZFH-NEXT: ret1891;1892; CHECKIZHINX-LABEL: fabs_f16:1893; CHECKIZHINX: # %bb.0:1894; CHECKIZHINX-NEXT: fabs.h a0, a01895; CHECKIZHINX-NEXT: ret1896;1897; RV32I-LABEL: fabs_f16:1898; RV32I: # %bb.0:1899; RV32I-NEXT: slli a0, a0, 171900; RV32I-NEXT: srli a0, a0, 171901; RV32I-NEXT: ret1902;1903; RV64I-LABEL: fabs_f16:1904; RV64I: # %bb.0:1905; RV64I-NEXT: slli a0, a0, 491906; RV64I-NEXT: srli a0, a0, 491907; RV64I-NEXT: ret1908;1909; RV32IZFHMIN-LABEL: fabs_f16:1910; RV32IZFHMIN: # %bb.0:1911; RV32IZFHMIN-NEXT: fmv.x.h a0, fa01912; RV32IZFHMIN-NEXT: slli a0, a0, 171913; RV32IZFHMIN-NEXT: srli a0, a0, 171914; RV32IZFHMIN-NEXT: fmv.h.x fa0, a01915; RV32IZFHMIN-NEXT: ret1916;1917; RV64IZFHMIN-LABEL: fabs_f16:1918; RV64IZFHMIN: # %bb.0:1919; RV64IZFHMIN-NEXT: fmv.x.h a0, fa01920; RV64IZFHMIN-NEXT: slli a0, a0, 491921; RV64IZFHMIN-NEXT: srli a0, a0, 491922; RV64IZFHMIN-NEXT: fmv.h.x fa0, a01923; RV64IZFHMIN-NEXT: ret1924;1925; RV32IZHINXMIN-LABEL: fabs_f16:1926; RV32IZHINXMIN: # %bb.0:1927; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x101928; RV32IZHINXMIN-NEXT: slli a0, a0, 171929; RV32IZHINXMIN-NEXT: srli a0, a0, 171930; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x101931; RV32IZHINXMIN-NEXT: ret1932;1933; RV64IZHINXMIN-LABEL: fabs_f16:1934; RV64IZHINXMIN: # %bb.0:1935; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x101936; RV64IZHINXMIN-NEXT: slli a0, a0, 491937; RV64IZHINXMIN-NEXT: srli a0, a0, 491938; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x101939; RV64IZHINXMIN-NEXT: ret1940 %1 = call half @llvm.fabs.f16(half %a)1941 ret half %11942}1943 1944define half @minnum_f16(half %a, half %b) nounwind {1945; CHECKIZFH-LABEL: minnum_f16:1946; CHECKIZFH: # %bb.0:1947; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa11948; CHECKIZFH-NEXT: ret1949;1950; CHECKIZHINX-LABEL: minnum_f16:1951; CHECKIZHINX: # %bb.0:1952; CHECKIZHINX-NEXT: fmin.h a0, a0, a11953; CHECKIZHINX-NEXT: ret1954;1955; RV32I-LABEL: minnum_f16:1956; RV32I: # %bb.0:1957; RV32I-NEXT: addi sp, sp, -161958; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1959; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1960; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill1961; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill1962; RV32I-NEXT: mv s0, a11963; RV32I-NEXT: lui a1, 161964; RV32I-NEXT: addi s2, a1, -11965; RV32I-NEXT: and a0, a0, s21966; RV32I-NEXT: call __extendhfsf21967; RV32I-NEXT: mv s1, a01968; RV32I-NEXT: and a0, s0, s21969; RV32I-NEXT: call __extendhfsf21970; RV32I-NEXT: mv a1, a01971; RV32I-NEXT: mv a0, s11972; RV32I-NEXT: call fminf1973; RV32I-NEXT: call __truncsfhf21974; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1975; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1976; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload1977; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload1978; RV32I-NEXT: addi sp, sp, 161979; RV32I-NEXT: ret1980;1981; RV64I-LABEL: minnum_f16:1982; RV64I: # %bb.0:1983; RV64I-NEXT: addi sp, sp, -321984; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1985; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1986; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1987; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1988; RV64I-NEXT: mv s0, a11989; RV64I-NEXT: lui a1, 161990; RV64I-NEXT: addi s2, a1, -11991; RV64I-NEXT: and a0, a0, s21992; RV64I-NEXT: call __extendhfsf21993; RV64I-NEXT: mv s1, a01994; RV64I-NEXT: and a0, s0, s21995; RV64I-NEXT: call __extendhfsf21996; RV64I-NEXT: mv a1, a01997; RV64I-NEXT: mv a0, s11998; RV64I-NEXT: call fminf1999; RV64I-NEXT: call __truncsfhf22000; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2001; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2002; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2003; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2004; RV64I-NEXT: addi sp, sp, 322005; RV64I-NEXT: ret2006;2007; CHECKIZFHMIN-LABEL: minnum_f16:2008; CHECKIZFHMIN: # %bb.0:2009; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa12010; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa02011; CHECKIZFHMIN-NEXT: fmin.s fa5, fa4, fa52012; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52013; CHECKIZFHMIN-NEXT: ret2014;2015; CHECKIZHINXMIN-LABEL: minnum_f16:2016; CHECKIZHINXMIN: # %bb.0:2017; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12018; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02019; CHECKIZHINXMIN-NEXT: fmin.s a0, a0, a12020; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02021; CHECKIZHINXMIN-NEXT: ret2022 %1 = call half @llvm.minnum.f16(half %a, half %b)2023 ret half %12024}2025 2026define half @maxnum_f16(half %a, half %b) nounwind {2027; CHECKIZFH-LABEL: maxnum_f16:2028; CHECKIZFH: # %bb.0:2029; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa12030; CHECKIZFH-NEXT: ret2031;2032; CHECKIZHINX-LABEL: maxnum_f16:2033; CHECKIZHINX: # %bb.0:2034; CHECKIZHINX-NEXT: fmax.h a0, a0, a12035; CHECKIZHINX-NEXT: ret2036;2037; RV32I-LABEL: maxnum_f16:2038; RV32I: # %bb.0:2039; RV32I-NEXT: addi sp, sp, -162040; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2041; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill2042; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill2043; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill2044; RV32I-NEXT: mv s0, a12045; RV32I-NEXT: lui a1, 162046; RV32I-NEXT: addi s2, a1, -12047; RV32I-NEXT: and a0, a0, s22048; RV32I-NEXT: call __extendhfsf22049; RV32I-NEXT: mv s1, a02050; RV32I-NEXT: and a0, s0, s22051; RV32I-NEXT: call __extendhfsf22052; RV32I-NEXT: mv a1, a02053; RV32I-NEXT: mv a0, s12054; RV32I-NEXT: call fmaxf2055; RV32I-NEXT: call __truncsfhf22056; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2057; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload2058; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload2059; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload2060; RV32I-NEXT: addi sp, sp, 162061; RV32I-NEXT: ret2062;2063; RV64I-LABEL: maxnum_f16:2064; RV64I: # %bb.0:2065; RV64I-NEXT: addi sp, sp, -322066; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill2067; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill2068; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill2069; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill2070; RV64I-NEXT: mv s0, a12071; RV64I-NEXT: lui a1, 162072; RV64I-NEXT: addi s2, a1, -12073; RV64I-NEXT: and a0, a0, s22074; RV64I-NEXT: call __extendhfsf22075; RV64I-NEXT: mv s1, a02076; RV64I-NEXT: and a0, s0, s22077; RV64I-NEXT: call __extendhfsf22078; RV64I-NEXT: mv a1, a02079; RV64I-NEXT: mv a0, s12080; RV64I-NEXT: call fmaxf2081; RV64I-NEXT: call __truncsfhf22082; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload2083; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload2084; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload2085; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload2086; RV64I-NEXT: addi sp, sp, 322087; RV64I-NEXT: ret2088;2089; CHECKIZFHMIN-LABEL: maxnum_f16:2090; CHECKIZFHMIN: # %bb.0:2091; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa12092; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa02093; CHECKIZFHMIN-NEXT: fmax.s fa5, fa4, fa52094; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52095; CHECKIZFHMIN-NEXT: ret2096;2097; CHECKIZHINXMIN-LABEL: maxnum_f16:2098; CHECKIZHINXMIN: # %bb.0:2099; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a12100; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02101; CHECKIZHINXMIN-NEXT: fmax.s a0, a0, a12102; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02103; CHECKIZHINXMIN-NEXT: ret2104 %1 = call half @llvm.maxnum.f16(half %a, half %b)2105 ret half %12106}2107 2108define half @copysign_f16(half %a, half %b) nounwind {2109; CHECKIZFH-LABEL: copysign_f16:2110; CHECKIZFH: # %bb.0:2111; CHECKIZFH-NEXT: fsgnj.h fa0, fa0, fa12112; CHECKIZFH-NEXT: ret2113;2114; CHECKIZHINX-LABEL: copysign_f16:2115; CHECKIZHINX: # %bb.0:2116; CHECKIZHINX-NEXT: fsgnj.h a0, a0, a12117; CHECKIZHINX-NEXT: ret2118;2119; RV32I-LABEL: copysign_f16:2120; RV32I: # %bb.0:2121; RV32I-NEXT: lui a2, 10485682122; RV32I-NEXT: slli a0, a0, 172123; RV32I-NEXT: and a1, a1, a22124; RV32I-NEXT: srli a0, a0, 172125; RV32I-NEXT: or a0, a0, a12126; RV32I-NEXT: ret2127;2128; RV64I-LABEL: copysign_f16:2129; RV64I: # %bb.0:2130; RV64I-NEXT: lui a2, 10485682131; RV64I-NEXT: slli a0, a0, 492132; RV64I-NEXT: and a1, a1, a22133; RV64I-NEXT: srli a0, a0, 492134; RV64I-NEXT: or a0, a0, a12135; RV64I-NEXT: ret2136;2137; RV32IZFHMIN-LABEL: copysign_f16:2138; RV32IZFHMIN: # %bb.0:2139; RV32IZFHMIN-NEXT: fmv.x.h a0, fa12140; RV32IZFHMIN-NEXT: lui a1, 10485682141; RV32IZFHMIN-NEXT: and a0, a0, a12142; RV32IZFHMIN-NEXT: fmv.x.h a1, fa02143; RV32IZFHMIN-NEXT: slli a1, a1, 172144; RV32IZFHMIN-NEXT: srli a1, a1, 172145; RV32IZFHMIN-NEXT: or a0, a1, a02146; RV32IZFHMIN-NEXT: fmv.h.x fa0, a02147; RV32IZFHMIN-NEXT: ret2148;2149; RV64IZFHMIN-LABEL: copysign_f16:2150; RV64IZFHMIN: # %bb.0:2151; RV64IZFHMIN-NEXT: fmv.x.h a0, fa12152; RV64IZFHMIN-NEXT: lui a1, 10485682153; RV64IZFHMIN-NEXT: and a0, a0, a12154; RV64IZFHMIN-NEXT: fmv.x.h a1, fa02155; RV64IZFHMIN-NEXT: slli a1, a1, 492156; RV64IZFHMIN-NEXT: srli a1, a1, 492157; RV64IZFHMIN-NEXT: or a0, a1, a02158; RV64IZFHMIN-NEXT: fmv.h.x fa0, a02159; RV64IZFHMIN-NEXT: ret2160;2161; RV32IZHINXMIN-LABEL: copysign_f16:2162; RV32IZHINXMIN: # %bb.0:2163; RV32IZHINXMIN-NEXT: # kill: def $x11_h killed $x11_h def $x112164; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x102165; RV32IZHINXMIN-NEXT: lui a2, 10485682166; RV32IZHINXMIN-NEXT: slli a0, a0, 172167; RV32IZHINXMIN-NEXT: and a1, a1, a22168; RV32IZHINXMIN-NEXT: srli a0, a0, 172169; RV32IZHINXMIN-NEXT: or a0, a0, a12170; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x102171; RV32IZHINXMIN-NEXT: ret2172;2173; RV64IZHINXMIN-LABEL: copysign_f16:2174; RV64IZHINXMIN: # %bb.0:2175; RV64IZHINXMIN-NEXT: # kill: def $x11_h killed $x11_h def $x112176; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x102177; RV64IZHINXMIN-NEXT: lui a2, 10485682178; RV64IZHINXMIN-NEXT: slli a0, a0, 492179; RV64IZHINXMIN-NEXT: and a1, a1, a22180; RV64IZHINXMIN-NEXT: srli a0, a0, 492181; RV64IZHINXMIN-NEXT: or a0, a0, a12182; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h killed $x102183; RV64IZHINXMIN-NEXT: ret2184 %1 = call half @llvm.copysign.f16(half %a, half %b)2185 ret half %12186}2187 2188define half @floor_f16(half %a) nounwind {2189; CHECKIZFH-LABEL: floor_f16:2190; CHECKIZFH: # %bb.0:2191; CHECKIZFH-NEXT: li a0, 252192; CHECKIZFH-NEXT: slli a0, a0, 102193; CHECKIZFH-NEXT: fmv.h.x fa5, a02194; CHECKIZFH-NEXT: fabs.h fa4, fa02195; CHECKIZFH-NEXT: flt.h a0, fa4, fa52196; CHECKIZFH-NEXT: beqz a0, .LBB18_22197; CHECKIZFH-NEXT: # %bb.1:2198; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rdn2199; CHECKIZFH-NEXT: fcvt.h.w fa5, a0, rdn2200; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02201; CHECKIZFH-NEXT: .LBB18_2:2202; CHECKIZFH-NEXT: ret2203;2204; CHECKIZHINX-LABEL: floor_f16:2205; CHECKIZHINX: # %bb.0:2206; CHECKIZHINX-NEXT: li a1, 252207; CHECKIZHINX-NEXT: slli a1, a1, 102208; CHECKIZHINX-NEXT: fabs.h a2, a02209; CHECKIZHINX-NEXT: flt.h a1, a2, a12210; CHECKIZHINX-NEXT: beqz a1, .LBB18_22211; CHECKIZHINX-NEXT: # %bb.1:2212; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rdn2213; CHECKIZHINX-NEXT: fcvt.h.w a1, a1, rdn2214; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02215; CHECKIZHINX-NEXT: .LBB18_2:2216; CHECKIZHINX-NEXT: ret2217;2218; RV32I-LABEL: floor_f16:2219; RV32I: # %bb.0:2220; RV32I-NEXT: addi sp, sp, -162221; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2222; RV32I-NEXT: slli a0, a0, 162223; RV32I-NEXT: srli a0, a0, 162224; RV32I-NEXT: call __extendhfsf22225; RV32I-NEXT: call floorf2226; RV32I-NEXT: call __truncsfhf22227; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2228; RV32I-NEXT: addi sp, sp, 162229; RV32I-NEXT: ret2230;2231; RV64I-LABEL: floor_f16:2232; RV64I: # %bb.0:2233; RV64I-NEXT: addi sp, sp, -162234; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2235; RV64I-NEXT: slli a0, a0, 482236; RV64I-NEXT: srli a0, a0, 482237; RV64I-NEXT: call __extendhfsf22238; RV64I-NEXT: call floorf2239; RV64I-NEXT: call __truncsfhf22240; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2241; RV64I-NEXT: addi sp, sp, 162242; RV64I-NEXT: ret2243;2244; CHECKIZFHMIN-LABEL: floor_f16:2245; CHECKIZFHMIN: # %bb.0:2246; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02247; CHECKIZFHMIN-NEXT: lui a0, 3072002248; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02249; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52250; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42251; CHECKIZFHMIN-NEXT: beqz a0, .LBB18_22252; CHECKIZFHMIN-NEXT: # %bb.1:2253; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa5, rdn2254; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a0, rdn2255; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52256; CHECKIZFHMIN-NEXT: .LBB18_2:2257; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52258; CHECKIZFHMIN-NEXT: ret2259;2260; CHECKIZHINXMIN-LABEL: floor_f16:2261; CHECKIZHINXMIN: # %bb.0:2262; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02263; CHECKIZHINXMIN-NEXT: lui a1, 3072002264; CHECKIZHINXMIN-NEXT: fabs.s a2, a02265; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12266; CHECKIZHINXMIN-NEXT: beqz a1, .LBB18_22267; CHECKIZHINXMIN-NEXT: # %bb.1:2268; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a0, rdn2269; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a1, rdn2270; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02271; CHECKIZHINXMIN-NEXT: .LBB18_2:2272; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02273; CHECKIZHINXMIN-NEXT: ret2274 %1 = call half @llvm.floor.f16(half %a)2275 ret half %12276}2277 2278define half @ceil_f16(half %a) nounwind {2279; CHECKIZFH-LABEL: ceil_f16:2280; CHECKIZFH: # %bb.0:2281; CHECKIZFH-NEXT: li a0, 252282; CHECKIZFH-NEXT: slli a0, a0, 102283; CHECKIZFH-NEXT: fmv.h.x fa5, a02284; CHECKIZFH-NEXT: fabs.h fa4, fa02285; CHECKIZFH-NEXT: flt.h a0, fa4, fa52286; CHECKIZFH-NEXT: beqz a0, .LBB19_22287; CHECKIZFH-NEXT: # %bb.1:2288; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rup2289; CHECKIZFH-NEXT: fcvt.h.w fa5, a0, rup2290; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02291; CHECKIZFH-NEXT: .LBB19_2:2292; CHECKIZFH-NEXT: ret2293;2294; CHECKIZHINX-LABEL: ceil_f16:2295; CHECKIZHINX: # %bb.0:2296; CHECKIZHINX-NEXT: li a1, 252297; CHECKIZHINX-NEXT: slli a1, a1, 102298; CHECKIZHINX-NEXT: fabs.h a2, a02299; CHECKIZHINX-NEXT: flt.h a1, a2, a12300; CHECKIZHINX-NEXT: beqz a1, .LBB19_22301; CHECKIZHINX-NEXT: # %bb.1:2302; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rup2303; CHECKIZHINX-NEXT: fcvt.h.w a1, a1, rup2304; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02305; CHECKIZHINX-NEXT: .LBB19_2:2306; CHECKIZHINX-NEXT: ret2307;2308; RV32I-LABEL: ceil_f16:2309; RV32I: # %bb.0:2310; RV32I-NEXT: addi sp, sp, -162311; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2312; RV32I-NEXT: slli a0, a0, 162313; RV32I-NEXT: srli a0, a0, 162314; RV32I-NEXT: call __extendhfsf22315; RV32I-NEXT: call ceilf2316; RV32I-NEXT: call __truncsfhf22317; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2318; RV32I-NEXT: addi sp, sp, 162319; RV32I-NEXT: ret2320;2321; RV64I-LABEL: ceil_f16:2322; RV64I: # %bb.0:2323; RV64I-NEXT: addi sp, sp, -162324; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2325; RV64I-NEXT: slli a0, a0, 482326; RV64I-NEXT: srli a0, a0, 482327; RV64I-NEXT: call __extendhfsf22328; RV64I-NEXT: call ceilf2329; RV64I-NEXT: call __truncsfhf22330; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2331; RV64I-NEXT: addi sp, sp, 162332; RV64I-NEXT: ret2333;2334; CHECKIZFHMIN-LABEL: ceil_f16:2335; CHECKIZFHMIN: # %bb.0:2336; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02337; CHECKIZFHMIN-NEXT: lui a0, 3072002338; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02339; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52340; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42341; CHECKIZFHMIN-NEXT: beqz a0, .LBB19_22342; CHECKIZFHMIN-NEXT: # %bb.1:2343; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa5, rup2344; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a0, rup2345; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52346; CHECKIZFHMIN-NEXT: .LBB19_2:2347; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52348; CHECKIZFHMIN-NEXT: ret2349;2350; CHECKIZHINXMIN-LABEL: ceil_f16:2351; CHECKIZHINXMIN: # %bb.0:2352; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02353; CHECKIZHINXMIN-NEXT: lui a1, 3072002354; CHECKIZHINXMIN-NEXT: fabs.s a2, a02355; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12356; CHECKIZHINXMIN-NEXT: beqz a1, .LBB19_22357; CHECKIZHINXMIN-NEXT: # %bb.1:2358; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a0, rup2359; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a1, rup2360; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02361; CHECKIZHINXMIN-NEXT: .LBB19_2:2362; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02363; CHECKIZHINXMIN-NEXT: ret2364 %1 = call half @llvm.ceil.f16(half %a)2365 ret half %12366}2367 2368define half @trunc_f16(half %a) nounwind {2369; CHECKIZFH-LABEL: trunc_f16:2370; CHECKIZFH: # %bb.0:2371; CHECKIZFH-NEXT: li a0, 252372; CHECKIZFH-NEXT: slli a0, a0, 102373; CHECKIZFH-NEXT: fmv.h.x fa5, a02374; CHECKIZFH-NEXT: fabs.h fa4, fa02375; CHECKIZFH-NEXT: flt.h a0, fa4, fa52376; CHECKIZFH-NEXT: beqz a0, .LBB20_22377; CHECKIZFH-NEXT: # %bb.1:2378; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rtz2379; CHECKIZFH-NEXT: fcvt.h.w fa5, a0, rtz2380; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02381; CHECKIZFH-NEXT: .LBB20_2:2382; CHECKIZFH-NEXT: ret2383;2384; CHECKIZHINX-LABEL: trunc_f16:2385; CHECKIZHINX: # %bb.0:2386; CHECKIZHINX-NEXT: li a1, 252387; CHECKIZHINX-NEXT: slli a1, a1, 102388; CHECKIZHINX-NEXT: fabs.h a2, a02389; CHECKIZHINX-NEXT: flt.h a1, a2, a12390; CHECKIZHINX-NEXT: beqz a1, .LBB20_22391; CHECKIZHINX-NEXT: # %bb.1:2392; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rtz2393; CHECKIZHINX-NEXT: fcvt.h.w a1, a1, rtz2394; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02395; CHECKIZHINX-NEXT: .LBB20_2:2396; CHECKIZHINX-NEXT: ret2397;2398; RV32I-LABEL: trunc_f16:2399; RV32I: # %bb.0:2400; RV32I-NEXT: addi sp, sp, -162401; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2402; RV32I-NEXT: slli a0, a0, 162403; RV32I-NEXT: srli a0, a0, 162404; RV32I-NEXT: call __extendhfsf22405; RV32I-NEXT: call truncf2406; RV32I-NEXT: call __truncsfhf22407; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2408; RV32I-NEXT: addi sp, sp, 162409; RV32I-NEXT: ret2410;2411; RV64I-LABEL: trunc_f16:2412; RV64I: # %bb.0:2413; RV64I-NEXT: addi sp, sp, -162414; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2415; RV64I-NEXT: slli a0, a0, 482416; RV64I-NEXT: srli a0, a0, 482417; RV64I-NEXT: call __extendhfsf22418; RV64I-NEXT: call truncf2419; RV64I-NEXT: call __truncsfhf22420; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2421; RV64I-NEXT: addi sp, sp, 162422; RV64I-NEXT: ret2423;2424; CHECKIZFHMIN-LABEL: trunc_f16:2425; CHECKIZFHMIN: # %bb.0:2426; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02427; CHECKIZFHMIN-NEXT: lui a0, 3072002428; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02429; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52430; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42431; CHECKIZFHMIN-NEXT: beqz a0, .LBB20_22432; CHECKIZFHMIN-NEXT: # %bb.1:2433; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa5, rtz2434; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a0, rtz2435; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52436; CHECKIZFHMIN-NEXT: .LBB20_2:2437; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52438; CHECKIZFHMIN-NEXT: ret2439;2440; CHECKIZHINXMIN-LABEL: trunc_f16:2441; CHECKIZHINXMIN: # %bb.0:2442; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02443; CHECKIZHINXMIN-NEXT: lui a1, 3072002444; CHECKIZHINXMIN-NEXT: fabs.s a2, a02445; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12446; CHECKIZHINXMIN-NEXT: beqz a1, .LBB20_22447; CHECKIZHINXMIN-NEXT: # %bb.1:2448; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a0, rtz2449; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a1, rtz2450; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02451; CHECKIZHINXMIN-NEXT: .LBB20_2:2452; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02453; CHECKIZHINXMIN-NEXT: ret2454 %1 = call half @llvm.trunc.f16(half %a)2455 ret half %12456}2457 2458define half @rint_f16(half %a) nounwind {2459; CHECKIZFH-LABEL: rint_f16:2460; CHECKIZFH: # %bb.0:2461; CHECKIZFH-NEXT: li a0, 252462; CHECKIZFH-NEXT: slli a0, a0, 102463; CHECKIZFH-NEXT: fmv.h.x fa5, a02464; CHECKIZFH-NEXT: fabs.h fa4, fa02465; CHECKIZFH-NEXT: flt.h a0, fa4, fa52466; CHECKIZFH-NEXT: beqz a0, .LBB21_22467; CHECKIZFH-NEXT: # %bb.1:2468; CHECKIZFH-NEXT: fcvt.w.h a0, fa02469; CHECKIZFH-NEXT: fcvt.h.w fa5, a02470; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02471; CHECKIZFH-NEXT: .LBB21_2:2472; CHECKIZFH-NEXT: ret2473;2474; CHECKIZHINX-LABEL: rint_f16:2475; CHECKIZHINX: # %bb.0:2476; CHECKIZHINX-NEXT: li a1, 252477; CHECKIZHINX-NEXT: slli a1, a1, 102478; CHECKIZHINX-NEXT: fabs.h a2, a02479; CHECKIZHINX-NEXT: flt.h a1, a2, a12480; CHECKIZHINX-NEXT: beqz a1, .LBB21_22481; CHECKIZHINX-NEXT: # %bb.1:2482; CHECKIZHINX-NEXT: fcvt.w.h a1, a02483; CHECKIZHINX-NEXT: fcvt.h.w a1, a12484; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02485; CHECKIZHINX-NEXT: .LBB21_2:2486; CHECKIZHINX-NEXT: ret2487;2488; RV32I-LABEL: rint_f16:2489; RV32I: # %bb.0:2490; RV32I-NEXT: addi sp, sp, -162491; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2492; RV32I-NEXT: slli a0, a0, 162493; RV32I-NEXT: srli a0, a0, 162494; RV32I-NEXT: call __extendhfsf22495; RV32I-NEXT: call rintf2496; RV32I-NEXT: call __truncsfhf22497; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2498; RV32I-NEXT: addi sp, sp, 162499; RV32I-NEXT: ret2500;2501; RV64I-LABEL: rint_f16:2502; RV64I: # %bb.0:2503; RV64I-NEXT: addi sp, sp, -162504; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2505; RV64I-NEXT: slli a0, a0, 482506; RV64I-NEXT: srli a0, a0, 482507; RV64I-NEXT: call __extendhfsf22508; RV64I-NEXT: call rintf2509; RV64I-NEXT: call __truncsfhf22510; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2511; RV64I-NEXT: addi sp, sp, 162512; RV64I-NEXT: ret2513;2514; CHECKIZFHMIN-LABEL: rint_f16:2515; CHECKIZFHMIN: # %bb.0:2516; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02517; CHECKIZFHMIN-NEXT: lui a0, 3072002518; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02519; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52520; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42521; CHECKIZFHMIN-NEXT: beqz a0, .LBB21_22522; CHECKIZFHMIN-NEXT: # %bb.1:2523; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa52524; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a02525; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52526; CHECKIZFHMIN-NEXT: .LBB21_2:2527; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52528; CHECKIZFHMIN-NEXT: ret2529;2530; CHECKIZHINXMIN-LABEL: rint_f16:2531; CHECKIZHINXMIN: # %bb.0:2532; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02533; CHECKIZHINXMIN-NEXT: lui a1, 3072002534; CHECKIZHINXMIN-NEXT: fabs.s a2, a02535; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12536; CHECKIZHINXMIN-NEXT: beqz a1, .LBB21_22537; CHECKIZHINXMIN-NEXT: # %bb.1:2538; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a02539; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a12540; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02541; CHECKIZHINXMIN-NEXT: .LBB21_2:2542; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02543; CHECKIZHINXMIN-NEXT: ret2544 %1 = call half @llvm.rint.f16(half %a)2545 ret half %12546}2547 2548define half @nearbyint_f16(half %a) nounwind {2549; RV32IZFH-LABEL: nearbyint_f16:2550; RV32IZFH: # %bb.0:2551; RV32IZFH-NEXT: addi sp, sp, -162552; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2553; RV32IZFH-NEXT: fcvt.s.h fa0, fa02554; RV32IZFH-NEXT: call nearbyintf2555; RV32IZFH-NEXT: fcvt.h.s fa0, fa02556; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2557; RV32IZFH-NEXT: addi sp, sp, 162558; RV32IZFH-NEXT: ret2559;2560; RV64IZFH-LABEL: nearbyint_f16:2561; RV64IZFH: # %bb.0:2562; RV64IZFH-NEXT: addi sp, sp, -162563; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2564; RV64IZFH-NEXT: fcvt.s.h fa0, fa02565; RV64IZFH-NEXT: call nearbyintf2566; RV64IZFH-NEXT: fcvt.h.s fa0, fa02567; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2568; RV64IZFH-NEXT: addi sp, sp, 162569; RV64IZFH-NEXT: ret2570;2571; RV32IZHINX-LABEL: nearbyint_f16:2572; RV32IZHINX: # %bb.0:2573; RV32IZHINX-NEXT: addi sp, sp, -162574; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2575; RV32IZHINX-NEXT: fcvt.s.h a0, a02576; RV32IZHINX-NEXT: call nearbyintf2577; RV32IZHINX-NEXT: fcvt.h.s a0, a02578; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2579; RV32IZHINX-NEXT: addi sp, sp, 162580; RV32IZHINX-NEXT: ret2581;2582; RV64IZHINX-LABEL: nearbyint_f16:2583; RV64IZHINX: # %bb.0:2584; RV64IZHINX-NEXT: addi sp, sp, -162585; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2586; RV64IZHINX-NEXT: fcvt.s.h a0, a02587; RV64IZHINX-NEXT: call nearbyintf2588; RV64IZHINX-NEXT: fcvt.h.s a0, a02589; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2590; RV64IZHINX-NEXT: addi sp, sp, 162591; RV64IZHINX-NEXT: ret2592;2593; RV32I-LABEL: nearbyint_f16:2594; RV32I: # %bb.0:2595; RV32I-NEXT: addi sp, sp, -162596; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2597; RV32I-NEXT: slli a0, a0, 162598; RV32I-NEXT: srli a0, a0, 162599; RV32I-NEXT: call __extendhfsf22600; RV32I-NEXT: call nearbyintf2601; RV32I-NEXT: call __truncsfhf22602; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2603; RV32I-NEXT: addi sp, sp, 162604; RV32I-NEXT: ret2605;2606; RV64I-LABEL: nearbyint_f16:2607; RV64I: # %bb.0:2608; RV64I-NEXT: addi sp, sp, -162609; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2610; RV64I-NEXT: slli a0, a0, 482611; RV64I-NEXT: srli a0, a0, 482612; RV64I-NEXT: call __extendhfsf22613; RV64I-NEXT: call nearbyintf2614; RV64I-NEXT: call __truncsfhf22615; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2616; RV64I-NEXT: addi sp, sp, 162617; RV64I-NEXT: ret2618;2619; RV32IZFHMIN-LABEL: nearbyint_f16:2620; RV32IZFHMIN: # %bb.0:2621; RV32IZFHMIN-NEXT: addi sp, sp, -162622; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2623; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa02624; RV32IZFHMIN-NEXT: call nearbyintf2625; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa02626; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2627; RV32IZFHMIN-NEXT: addi sp, sp, 162628; RV32IZFHMIN-NEXT: ret2629;2630; RV64IZFHMIN-LABEL: nearbyint_f16:2631; RV64IZFHMIN: # %bb.0:2632; RV64IZFHMIN-NEXT: addi sp, sp, -162633; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2634; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa02635; RV64IZFHMIN-NEXT: call nearbyintf2636; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa02637; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2638; RV64IZFHMIN-NEXT: addi sp, sp, 162639; RV64IZFHMIN-NEXT: ret2640;2641; RV32IZHINXMIN-LABEL: nearbyint_f16:2642; RV32IZHINXMIN: # %bb.0:2643; RV32IZHINXMIN-NEXT: addi sp, sp, -162644; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2645; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a02646; RV32IZHINXMIN-NEXT: call nearbyintf2647; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a02648; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2649; RV32IZHINXMIN-NEXT: addi sp, sp, 162650; RV32IZHINXMIN-NEXT: ret2651;2652; RV64IZHINXMIN-LABEL: nearbyint_f16:2653; RV64IZHINXMIN: # %bb.0:2654; RV64IZHINXMIN-NEXT: addi sp, sp, -162655; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2656; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a02657; RV64IZHINXMIN-NEXT: call nearbyintf2658; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a02659; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2660; RV64IZHINXMIN-NEXT: addi sp, sp, 162661; RV64IZHINXMIN-NEXT: ret2662 %1 = call half @llvm.nearbyint.f16(half %a)2663 ret half %12664}2665 2666define half @round_f16(half %a) nounwind {2667; CHECKIZFH-LABEL: round_f16:2668; CHECKIZFH: # %bb.0:2669; CHECKIZFH-NEXT: li a0, 252670; CHECKIZFH-NEXT: slli a0, a0, 102671; CHECKIZFH-NEXT: fmv.h.x fa5, a02672; CHECKIZFH-NEXT: fabs.h fa4, fa02673; CHECKIZFH-NEXT: flt.h a0, fa4, fa52674; CHECKIZFH-NEXT: beqz a0, .LBB23_22675; CHECKIZFH-NEXT: # %bb.1:2676; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rmm2677; CHECKIZFH-NEXT: fcvt.h.w fa5, a0, rmm2678; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02679; CHECKIZFH-NEXT: .LBB23_2:2680; CHECKIZFH-NEXT: ret2681;2682; CHECKIZHINX-LABEL: round_f16:2683; CHECKIZHINX: # %bb.0:2684; CHECKIZHINX-NEXT: li a1, 252685; CHECKIZHINX-NEXT: slli a1, a1, 102686; CHECKIZHINX-NEXT: fabs.h a2, a02687; CHECKIZHINX-NEXT: flt.h a1, a2, a12688; CHECKIZHINX-NEXT: beqz a1, .LBB23_22689; CHECKIZHINX-NEXT: # %bb.1:2690; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rmm2691; CHECKIZHINX-NEXT: fcvt.h.w a1, a1, rmm2692; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02693; CHECKIZHINX-NEXT: .LBB23_2:2694; CHECKIZHINX-NEXT: ret2695;2696; RV32I-LABEL: round_f16:2697; RV32I: # %bb.0:2698; RV32I-NEXT: addi sp, sp, -162699; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2700; RV32I-NEXT: slli a0, a0, 162701; RV32I-NEXT: srli a0, a0, 162702; RV32I-NEXT: call __extendhfsf22703; RV32I-NEXT: call roundf2704; RV32I-NEXT: call __truncsfhf22705; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2706; RV32I-NEXT: addi sp, sp, 162707; RV32I-NEXT: ret2708;2709; RV64I-LABEL: round_f16:2710; RV64I: # %bb.0:2711; RV64I-NEXT: addi sp, sp, -162712; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2713; RV64I-NEXT: slli a0, a0, 482714; RV64I-NEXT: srli a0, a0, 482715; RV64I-NEXT: call __extendhfsf22716; RV64I-NEXT: call roundf2717; RV64I-NEXT: call __truncsfhf22718; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2719; RV64I-NEXT: addi sp, sp, 162720; RV64I-NEXT: ret2721;2722; CHECKIZFHMIN-LABEL: round_f16:2723; CHECKIZFHMIN: # %bb.0:2724; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02725; CHECKIZFHMIN-NEXT: lui a0, 3072002726; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02727; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52728; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42729; CHECKIZFHMIN-NEXT: beqz a0, .LBB23_22730; CHECKIZFHMIN-NEXT: # %bb.1:2731; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa5, rmm2732; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a0, rmm2733; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52734; CHECKIZFHMIN-NEXT: .LBB23_2:2735; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52736; CHECKIZFHMIN-NEXT: ret2737;2738; CHECKIZHINXMIN-LABEL: round_f16:2739; CHECKIZHINXMIN: # %bb.0:2740; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02741; CHECKIZHINXMIN-NEXT: lui a1, 3072002742; CHECKIZHINXMIN-NEXT: fabs.s a2, a02743; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12744; CHECKIZHINXMIN-NEXT: beqz a1, .LBB23_22745; CHECKIZHINXMIN-NEXT: # %bb.1:2746; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a0, rmm2747; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a1, rmm2748; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02749; CHECKIZHINXMIN-NEXT: .LBB23_2:2750; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02751; CHECKIZHINXMIN-NEXT: ret2752 %1 = call half @llvm.round.f16(half %a)2753 ret half %12754}2755 2756define half @roundeven_f16(half %a) nounwind {2757; CHECKIZFH-LABEL: roundeven_f16:2758; CHECKIZFH: # %bb.0:2759; CHECKIZFH-NEXT: li a0, 252760; CHECKIZFH-NEXT: slli a0, a0, 102761; CHECKIZFH-NEXT: fmv.h.x fa5, a02762; CHECKIZFH-NEXT: fabs.h fa4, fa02763; CHECKIZFH-NEXT: flt.h a0, fa4, fa52764; CHECKIZFH-NEXT: beqz a0, .LBB24_22765; CHECKIZFH-NEXT: # %bb.1:2766; CHECKIZFH-NEXT: fcvt.w.h a0, fa0, rne2767; CHECKIZFH-NEXT: fcvt.h.w fa5, a0, rne2768; CHECKIZFH-NEXT: fsgnj.h fa0, fa5, fa02769; CHECKIZFH-NEXT: .LBB24_2:2770; CHECKIZFH-NEXT: ret2771;2772; CHECKIZHINX-LABEL: roundeven_f16:2773; CHECKIZHINX: # %bb.0:2774; CHECKIZHINX-NEXT: li a1, 252775; CHECKIZHINX-NEXT: slli a1, a1, 102776; CHECKIZHINX-NEXT: fabs.h a2, a02777; CHECKIZHINX-NEXT: flt.h a1, a2, a12778; CHECKIZHINX-NEXT: beqz a1, .LBB24_22779; CHECKIZHINX-NEXT: # %bb.1:2780; CHECKIZHINX-NEXT: fcvt.w.h a1, a0, rne2781; CHECKIZHINX-NEXT: fcvt.h.w a1, a1, rne2782; CHECKIZHINX-NEXT: fsgnj.h a0, a1, a02783; CHECKIZHINX-NEXT: .LBB24_2:2784; CHECKIZHINX-NEXT: ret2785;2786; RV32I-LABEL: roundeven_f16:2787; RV32I: # %bb.0:2788; RV32I-NEXT: addi sp, sp, -162789; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2790; RV32I-NEXT: slli a0, a0, 162791; RV32I-NEXT: srli a0, a0, 162792; RV32I-NEXT: call __extendhfsf22793; RV32I-NEXT: call roundevenf2794; RV32I-NEXT: call __truncsfhf22795; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2796; RV32I-NEXT: addi sp, sp, 162797; RV32I-NEXT: ret2798;2799; RV64I-LABEL: roundeven_f16:2800; RV64I: # %bb.0:2801; RV64I-NEXT: addi sp, sp, -162802; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2803; RV64I-NEXT: slli a0, a0, 482804; RV64I-NEXT: srli a0, a0, 482805; RV64I-NEXT: call __extendhfsf22806; RV64I-NEXT: call roundevenf2807; RV64I-NEXT: call __truncsfhf22808; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2809; RV64I-NEXT: addi sp, sp, 162810; RV64I-NEXT: ret2811;2812; CHECKIZFHMIN-LABEL: roundeven_f16:2813; CHECKIZFHMIN: # %bb.0:2814; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa02815; CHECKIZFHMIN-NEXT: lui a0, 3072002816; CHECKIZFHMIN-NEXT: fmv.w.x fa4, a02817; CHECKIZFHMIN-NEXT: fabs.s fa3, fa52818; CHECKIZFHMIN-NEXT: flt.s a0, fa3, fa42819; CHECKIZFHMIN-NEXT: beqz a0, .LBB24_22820; CHECKIZFHMIN-NEXT: # %bb.1:2821; CHECKIZFHMIN-NEXT: fcvt.w.s a0, fa5, rne2822; CHECKIZFHMIN-NEXT: fcvt.s.w fa4, a0, rne2823; CHECKIZFHMIN-NEXT: fsgnj.s fa5, fa4, fa52824; CHECKIZFHMIN-NEXT: .LBB24_2:2825; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa52826; CHECKIZFHMIN-NEXT: ret2827;2828; CHECKIZHINXMIN-LABEL: roundeven_f16:2829; CHECKIZHINXMIN: # %bb.0:2830; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a02831; CHECKIZHINXMIN-NEXT: lui a1, 3072002832; CHECKIZHINXMIN-NEXT: fabs.s a2, a02833; CHECKIZHINXMIN-NEXT: flt.s a1, a2, a12834; CHECKIZHINXMIN-NEXT: beqz a1, .LBB24_22835; CHECKIZHINXMIN-NEXT: # %bb.1:2836; CHECKIZHINXMIN-NEXT: fcvt.w.s a1, a0, rne2837; CHECKIZHINXMIN-NEXT: fcvt.s.w a1, a1, rne2838; CHECKIZHINXMIN-NEXT: fsgnj.s a0, a1, a02839; CHECKIZHINXMIN-NEXT: .LBB24_2:2840; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a02841; CHECKIZHINXMIN-NEXT: ret2842 %1 = call half @llvm.roundeven.f16(half %a)2843 ret half %12844}2845 2846define i1 @isnan_d_fpclass(half %x) {2847; CHECKIZFH-LABEL: isnan_d_fpclass:2848; CHECKIZFH: # %bb.0:2849; CHECKIZFH-NEXT: fclass.h a0, fa02850; CHECKIZFH-NEXT: andi a0, a0, 7682851; CHECKIZFH-NEXT: snez a0, a02852; CHECKIZFH-NEXT: ret2853;2854; CHECKIZHINX-LABEL: isnan_d_fpclass:2855; CHECKIZHINX: # %bb.0:2856; CHECKIZHINX-NEXT: fclass.h a0, a02857; CHECKIZHINX-NEXT: andi a0, a0, 7682858; CHECKIZHINX-NEXT: snez a0, a02859; CHECKIZHINX-NEXT: ret2860;2861; RV32I-LABEL: isnan_d_fpclass:2862; RV32I: # %bb.0:2863; RV32I-NEXT: slli a0, a0, 172864; RV32I-NEXT: li a1, 312865; RV32I-NEXT: srli a0, a0, 172866; RV32I-NEXT: slli a1, a1, 102867; RV32I-NEXT: slt a0, a1, a02868; RV32I-NEXT: ret2869;2870; RV64I-LABEL: isnan_d_fpclass:2871; RV64I: # %bb.0:2872; RV64I-NEXT: slli a0, a0, 492873; RV64I-NEXT: li a1, 312874; RV64I-NEXT: srli a0, a0, 492875; RV64I-NEXT: slli a1, a1, 102876; RV64I-NEXT: slt a0, a1, a02877; RV64I-NEXT: ret2878;2879; RV32IZFHMIN-LABEL: isnan_d_fpclass:2880; RV32IZFHMIN: # %bb.0:2881; RV32IZFHMIN-NEXT: fmv.x.h a0, fa02882; RV32IZFHMIN-NEXT: li a1, 312883; RV32IZFHMIN-NEXT: slli a0, a0, 172884; RV32IZFHMIN-NEXT: srli a0, a0, 172885; RV32IZFHMIN-NEXT: slli a1, a1, 102886; RV32IZFHMIN-NEXT: slt a0, a1, a02887; RV32IZFHMIN-NEXT: ret2888;2889; RV64IZFHMIN-LABEL: isnan_d_fpclass:2890; RV64IZFHMIN: # %bb.0:2891; RV64IZFHMIN-NEXT: fmv.x.h a0, fa02892; RV64IZFHMIN-NEXT: li a1, 312893; RV64IZFHMIN-NEXT: slli a0, a0, 492894; RV64IZFHMIN-NEXT: srli a0, a0, 492895; RV64IZFHMIN-NEXT: slli a1, a1, 102896; RV64IZFHMIN-NEXT: slt a0, a1, a02897; RV64IZFHMIN-NEXT: ret2898;2899; RV32IZHINXMIN-LABEL: isnan_d_fpclass:2900; RV32IZHINXMIN: # %bb.0:2901; RV32IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x102902; RV32IZHINXMIN-NEXT: slli a0, a0, 172903; RV32IZHINXMIN-NEXT: li a1, 312904; RV32IZHINXMIN-NEXT: srli a0, a0, 172905; RV32IZHINXMIN-NEXT: slli a1, a1, 102906; RV32IZHINXMIN-NEXT: slt a0, a1, a02907; RV32IZHINXMIN-NEXT: ret2908;2909; RV64IZHINXMIN-LABEL: isnan_d_fpclass:2910; RV64IZHINXMIN: # %bb.0:2911; RV64IZHINXMIN-NEXT: # kill: def $x10_h killed $x10_h def $x102912; RV64IZHINXMIN-NEXT: slli a0, a0, 492913; RV64IZHINXMIN-NEXT: li a1, 312914; RV64IZHINXMIN-NEXT: srli a0, a0, 492915; RV64IZHINXMIN-NEXT: slli a1, a1, 102916; RV64IZHINXMIN-NEXT: slt a0, a1, a02917; RV64IZHINXMIN-NEXT: ret2918 %1 = call i1 @llvm.is.fpclass.f16(half %x, i32 3) ; nan2919 ret i1 %12920}2921 2922define half @tan_f16(half %a) nounwind {2923; RV32IZFH-LABEL: tan_f16:2924; RV32IZFH: # %bb.0:2925; RV32IZFH-NEXT: addi sp, sp, -162926; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2927; RV32IZFH-NEXT: fcvt.s.h fa0, fa02928; RV32IZFH-NEXT: call tanf2929; RV32IZFH-NEXT: fcvt.h.s fa0, fa02930; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2931; RV32IZFH-NEXT: addi sp, sp, 162932; RV32IZFH-NEXT: ret2933;2934; RV64IZFH-LABEL: tan_f16:2935; RV64IZFH: # %bb.0:2936; RV64IZFH-NEXT: addi sp, sp, -162937; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2938; RV64IZFH-NEXT: fcvt.s.h fa0, fa02939; RV64IZFH-NEXT: call tanf2940; RV64IZFH-NEXT: fcvt.h.s fa0, fa02941; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2942; RV64IZFH-NEXT: addi sp, sp, 162943; RV64IZFH-NEXT: ret2944;2945; RV32IZHINX-LABEL: tan_f16:2946; RV32IZHINX: # %bb.0:2947; RV32IZHINX-NEXT: addi sp, sp, -162948; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2949; RV32IZHINX-NEXT: fcvt.s.h a0, a02950; RV32IZHINX-NEXT: call tanf2951; RV32IZHINX-NEXT: fcvt.h.s a0, a02952; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2953; RV32IZHINX-NEXT: addi sp, sp, 162954; RV32IZHINX-NEXT: ret2955;2956; RV64IZHINX-LABEL: tan_f16:2957; RV64IZHINX: # %bb.0:2958; RV64IZHINX-NEXT: addi sp, sp, -162959; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2960; RV64IZHINX-NEXT: fcvt.s.h a0, a02961; RV64IZHINX-NEXT: call tanf2962; RV64IZHINX-NEXT: fcvt.h.s a0, a02963; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2964; RV64IZHINX-NEXT: addi sp, sp, 162965; RV64IZHINX-NEXT: ret2966;2967; RV32I-LABEL: tan_f16:2968; RV32I: # %bb.0:2969; RV32I-NEXT: addi sp, sp, -162970; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2971; RV32I-NEXT: slli a0, a0, 162972; RV32I-NEXT: srli a0, a0, 162973; RV32I-NEXT: call __extendhfsf22974; RV32I-NEXT: call tanf2975; RV32I-NEXT: call __truncsfhf22976; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2977; RV32I-NEXT: addi sp, sp, 162978; RV32I-NEXT: ret2979;2980; RV64I-LABEL: tan_f16:2981; RV64I: # %bb.0:2982; RV64I-NEXT: addi sp, sp, -162983; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2984; RV64I-NEXT: slli a0, a0, 482985; RV64I-NEXT: srli a0, a0, 482986; RV64I-NEXT: call __extendhfsf22987; RV64I-NEXT: call tanf2988; RV64I-NEXT: call __truncsfhf22989; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2990; RV64I-NEXT: addi sp, sp, 162991; RV64I-NEXT: ret2992;2993; RV32IZFHMIN-LABEL: tan_f16:2994; RV32IZFHMIN: # %bb.0:2995; RV32IZFHMIN-NEXT: addi sp, sp, -162996; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2997; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa02998; RV32IZFHMIN-NEXT: call tanf2999; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03000; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3001; RV32IZFHMIN-NEXT: addi sp, sp, 163002; RV32IZFHMIN-NEXT: ret3003;3004; RV64IZFHMIN-LABEL: tan_f16:3005; RV64IZFHMIN: # %bb.0:3006; RV64IZFHMIN-NEXT: addi sp, sp, -163007; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3008; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03009; RV64IZFHMIN-NEXT: call tanf3010; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03011; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3012; RV64IZFHMIN-NEXT: addi sp, sp, 163013; RV64IZFHMIN-NEXT: ret3014;3015; RV32IZHINXMIN-LABEL: tan_f16:3016; RV32IZHINXMIN: # %bb.0:3017; RV32IZHINXMIN-NEXT: addi sp, sp, -163018; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3019; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03020; RV32IZHINXMIN-NEXT: call tanf3021; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03022; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3023; RV32IZHINXMIN-NEXT: addi sp, sp, 163024; RV32IZHINXMIN-NEXT: ret3025;3026; RV64IZHINXMIN-LABEL: tan_f16:3027; RV64IZHINXMIN: # %bb.0:3028; RV64IZHINXMIN-NEXT: addi sp, sp, -163029; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3030; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03031; RV64IZHINXMIN-NEXT: call tanf3032; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03033; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3034; RV64IZHINXMIN-NEXT: addi sp, sp, 163035; RV64IZHINXMIN-NEXT: ret3036 %1 = call half @llvm.tan.f16(half %a)3037 ret half %13038}3039 3040define half @maximumnum_half(half %x, half %y) {3041; CHECKIZFH-LABEL: maximumnum_half:3042; CHECKIZFH: # %bb.0:3043; CHECKIZFH-NEXT: fmax.h fa0, fa0, fa13044; CHECKIZFH-NEXT: ret3045;3046; CHECKIZHINX-LABEL: maximumnum_half:3047; CHECKIZHINX: # %bb.0:3048; CHECKIZHINX-NEXT: fmax.h a0, a0, a13049; CHECKIZHINX-NEXT: ret3050;3051; RV32I-LABEL: maximumnum_half:3052; RV32I: # %bb.0:3053; RV32I-NEXT: addi sp, sp, -163054; RV32I-NEXT: .cfi_def_cfa_offset 163055; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3056; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill3057; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill3058; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill3059; RV32I-NEXT: .cfi_offset ra, -43060; RV32I-NEXT: .cfi_offset s0, -83061; RV32I-NEXT: .cfi_offset s1, -123062; RV32I-NEXT: .cfi_offset s2, -163063; RV32I-NEXT: mv s0, a13064; RV32I-NEXT: lui a1, 163065; RV32I-NEXT: addi s2, a1, -13066; RV32I-NEXT: and a0, a0, s23067; RV32I-NEXT: call __extendhfsf23068; RV32I-NEXT: mv s1, a03069; RV32I-NEXT: and a0, s0, s23070; RV32I-NEXT: call __extendhfsf23071; RV32I-NEXT: mv a1, a03072; RV32I-NEXT: mv a0, s13073; RV32I-NEXT: call fmaximum_numf3074; RV32I-NEXT: call __truncsfhf23075; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3076; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload3077; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload3078; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload3079; RV32I-NEXT: .cfi_restore ra3080; RV32I-NEXT: .cfi_restore s03081; RV32I-NEXT: .cfi_restore s13082; RV32I-NEXT: .cfi_restore s23083; RV32I-NEXT: addi sp, sp, 163084; RV32I-NEXT: .cfi_def_cfa_offset 03085; RV32I-NEXT: ret3086;3087; RV64I-LABEL: maximumnum_half:3088; RV64I: # %bb.0:3089; RV64I-NEXT: addi sp, sp, -323090; RV64I-NEXT: .cfi_def_cfa_offset 323091; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill3092; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill3093; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill3094; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill3095; RV64I-NEXT: .cfi_offset ra, -83096; RV64I-NEXT: .cfi_offset s0, -163097; RV64I-NEXT: .cfi_offset s1, -243098; RV64I-NEXT: .cfi_offset s2, -323099; RV64I-NEXT: mv s0, a13100; RV64I-NEXT: lui a1, 163101; RV64I-NEXT: addi s2, a1, -13102; RV64I-NEXT: and a0, a0, s23103; RV64I-NEXT: call __extendhfsf23104; RV64I-NEXT: mv s1, a03105; RV64I-NEXT: and a0, s0, s23106; RV64I-NEXT: call __extendhfsf23107; RV64I-NEXT: mv a1, a03108; RV64I-NEXT: mv a0, s13109; RV64I-NEXT: call fmaximum_numf3110; RV64I-NEXT: call __truncsfhf23111; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload3112; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload3113; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload3114; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload3115; RV64I-NEXT: .cfi_restore ra3116; RV64I-NEXT: .cfi_restore s03117; RV64I-NEXT: .cfi_restore s13118; RV64I-NEXT: .cfi_restore s23119; RV64I-NEXT: addi sp, sp, 323120; RV64I-NEXT: .cfi_def_cfa_offset 03121; RV64I-NEXT: ret3122;3123; CHECKIZFHMIN-LABEL: maximumnum_half:3124; CHECKIZFHMIN: # %bb.0:3125; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa13126; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa03127; CHECKIZFHMIN-NEXT: fmax.s fa5, fa4, fa53128; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa53129; CHECKIZFHMIN-NEXT: ret3130;3131; CHECKIZHINXMIN-LABEL: maximumnum_half:3132; CHECKIZHINXMIN: # %bb.0:3133; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a13134; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a03135; CHECKIZHINXMIN-NEXT: fmax.s a0, a0, a13136; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a03137; CHECKIZHINXMIN-NEXT: ret3138 %z = call half @llvm.maximumnum.f16(half %x, half %y)3139 ret half %z3140}3141 3142define half @minimumnum_half(half %x, half %y) {3143; CHECKIZFH-LABEL: minimumnum_half:3144; CHECKIZFH: # %bb.0:3145; CHECKIZFH-NEXT: fmin.h fa0, fa0, fa13146; CHECKIZFH-NEXT: ret3147;3148; CHECKIZHINX-LABEL: minimumnum_half:3149; CHECKIZHINX: # %bb.0:3150; CHECKIZHINX-NEXT: fmin.h a0, a0, a13151; CHECKIZHINX-NEXT: ret3152;3153; RV32I-LABEL: minimumnum_half:3154; RV32I: # %bb.0:3155; RV32I-NEXT: addi sp, sp, -163156; RV32I-NEXT: .cfi_def_cfa_offset 163157; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3158; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill3159; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill3160; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill3161; RV32I-NEXT: .cfi_offset ra, -43162; RV32I-NEXT: .cfi_offset s0, -83163; RV32I-NEXT: .cfi_offset s1, -123164; RV32I-NEXT: .cfi_offset s2, -163165; RV32I-NEXT: mv s0, a13166; RV32I-NEXT: lui a1, 163167; RV32I-NEXT: addi s2, a1, -13168; RV32I-NEXT: and a0, a0, s23169; RV32I-NEXT: call __extendhfsf23170; RV32I-NEXT: mv s1, a03171; RV32I-NEXT: and a0, s0, s23172; RV32I-NEXT: call __extendhfsf23173; RV32I-NEXT: mv a1, a03174; RV32I-NEXT: mv a0, s13175; RV32I-NEXT: call fminimum_numf3176; RV32I-NEXT: call __truncsfhf23177; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3178; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload3179; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload3180; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload3181; RV32I-NEXT: .cfi_restore ra3182; RV32I-NEXT: .cfi_restore s03183; RV32I-NEXT: .cfi_restore s13184; RV32I-NEXT: .cfi_restore s23185; RV32I-NEXT: addi sp, sp, 163186; RV32I-NEXT: .cfi_def_cfa_offset 03187; RV32I-NEXT: ret3188;3189; RV64I-LABEL: minimumnum_half:3190; RV64I: # %bb.0:3191; RV64I-NEXT: addi sp, sp, -323192; RV64I-NEXT: .cfi_def_cfa_offset 323193; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill3194; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill3195; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill3196; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill3197; RV64I-NEXT: .cfi_offset ra, -83198; RV64I-NEXT: .cfi_offset s0, -163199; RV64I-NEXT: .cfi_offset s1, -243200; RV64I-NEXT: .cfi_offset s2, -323201; RV64I-NEXT: mv s0, a13202; RV64I-NEXT: lui a1, 163203; RV64I-NEXT: addi s2, a1, -13204; RV64I-NEXT: and a0, a0, s23205; RV64I-NEXT: call __extendhfsf23206; RV64I-NEXT: mv s1, a03207; RV64I-NEXT: and a0, s0, s23208; RV64I-NEXT: call __extendhfsf23209; RV64I-NEXT: mv a1, a03210; RV64I-NEXT: mv a0, s13211; RV64I-NEXT: call fminimum_numf3212; RV64I-NEXT: call __truncsfhf23213; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload3214; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload3215; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload3216; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload3217; RV64I-NEXT: .cfi_restore ra3218; RV64I-NEXT: .cfi_restore s03219; RV64I-NEXT: .cfi_restore s13220; RV64I-NEXT: .cfi_restore s23221; RV64I-NEXT: addi sp, sp, 323222; RV64I-NEXT: .cfi_def_cfa_offset 03223; RV64I-NEXT: ret3224;3225; CHECKIZFHMIN-LABEL: minimumnum_half:3226; CHECKIZFHMIN: # %bb.0:3227; CHECKIZFHMIN-NEXT: fcvt.s.h fa5, fa13228; CHECKIZFHMIN-NEXT: fcvt.s.h fa4, fa03229; CHECKIZFHMIN-NEXT: fmin.s fa5, fa4, fa53230; CHECKIZFHMIN-NEXT: fcvt.h.s fa0, fa53231; CHECKIZFHMIN-NEXT: ret3232;3233; CHECKIZHINXMIN-LABEL: minimumnum_half:3234; CHECKIZHINXMIN: # %bb.0:3235; CHECKIZHINXMIN-NEXT: fcvt.s.h a1, a13236; CHECKIZHINXMIN-NEXT: fcvt.s.h a0, a03237; CHECKIZHINXMIN-NEXT: fmin.s a0, a0, a13238; CHECKIZHINXMIN-NEXT: fcvt.h.s a0, a03239; CHECKIZHINXMIN-NEXT: ret3240 %z = call half @llvm.minimumnum.f16(half %x, half %y)3241 ret half %z3242}3243 3244define half @ldexp_half(half %x, i32 signext %y) nounwind {3245; RV32IZFH-LABEL: ldexp_half:3246; RV32IZFH: # %bb.0:3247; RV32IZFH-NEXT: addi sp, sp, -163248; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3249; RV32IZFH-NEXT: fcvt.s.h fa0, fa03250; RV32IZFH-NEXT: call ldexpf3251; RV32IZFH-NEXT: fcvt.h.s fa0, fa03252; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3253; RV32IZFH-NEXT: addi sp, sp, 163254; RV32IZFH-NEXT: ret3255;3256; RV64IZFH-LABEL: ldexp_half:3257; RV64IZFH: # %bb.0:3258; RV64IZFH-NEXT: addi sp, sp, -163259; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3260; RV64IZFH-NEXT: fcvt.s.h fa0, fa03261; RV64IZFH-NEXT: call ldexpf3262; RV64IZFH-NEXT: fcvt.h.s fa0, fa03263; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3264; RV64IZFH-NEXT: addi sp, sp, 163265; RV64IZFH-NEXT: ret3266;3267; RV32IZHINX-LABEL: ldexp_half:3268; RV32IZHINX: # %bb.0:3269; RV32IZHINX-NEXT: addi sp, sp, -163270; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3271; RV32IZHINX-NEXT: fcvt.s.h a0, a03272; RV32IZHINX-NEXT: call ldexpf3273; RV32IZHINX-NEXT: fcvt.h.s a0, a03274; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3275; RV32IZHINX-NEXT: addi sp, sp, 163276; RV32IZHINX-NEXT: ret3277;3278; RV64IZHINX-LABEL: ldexp_half:3279; RV64IZHINX: # %bb.0:3280; RV64IZHINX-NEXT: addi sp, sp, -163281; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3282; RV64IZHINX-NEXT: fcvt.s.h a0, a03283; RV64IZHINX-NEXT: call ldexpf3284; RV64IZHINX-NEXT: fcvt.h.s a0, a03285; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3286; RV64IZHINX-NEXT: addi sp, sp, 163287; RV64IZHINX-NEXT: ret3288;3289; RV32I-LABEL: ldexp_half:3290; RV32I: # %bb.0:3291; RV32I-NEXT: addi sp, sp, -163292; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3293; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill3294; RV32I-NEXT: mv s0, a13295; RV32I-NEXT: slli a0, a0, 163296; RV32I-NEXT: srli a0, a0, 163297; RV32I-NEXT: call __extendhfsf23298; RV32I-NEXT: mv a1, s03299; RV32I-NEXT: call ldexpf3300; RV32I-NEXT: call __truncsfhf23301; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3302; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload3303; RV32I-NEXT: addi sp, sp, 163304; RV32I-NEXT: ret3305;3306; RV64I-LABEL: ldexp_half:3307; RV64I: # %bb.0:3308; RV64I-NEXT: addi sp, sp, -163309; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3310; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill3311; RV64I-NEXT: mv s0, a13312; RV64I-NEXT: slli a0, a0, 483313; RV64I-NEXT: srli a0, a0, 483314; RV64I-NEXT: call __extendhfsf23315; RV64I-NEXT: mv a1, s03316; RV64I-NEXT: call ldexpf3317; RV64I-NEXT: call __truncsfhf23318; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3319; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload3320; RV64I-NEXT: addi sp, sp, 163321; RV64I-NEXT: ret3322;3323; RV32IZFHMIN-LABEL: ldexp_half:3324; RV32IZFHMIN: # %bb.0:3325; RV32IZFHMIN-NEXT: addi sp, sp, -163326; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3327; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03328; RV32IZFHMIN-NEXT: call ldexpf3329; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03330; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3331; RV32IZFHMIN-NEXT: addi sp, sp, 163332; RV32IZFHMIN-NEXT: ret3333;3334; RV64IZFHMIN-LABEL: ldexp_half:3335; RV64IZFHMIN: # %bb.0:3336; RV64IZFHMIN-NEXT: addi sp, sp, -163337; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3338; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03339; RV64IZFHMIN-NEXT: call ldexpf3340; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03341; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3342; RV64IZFHMIN-NEXT: addi sp, sp, 163343; RV64IZFHMIN-NEXT: ret3344;3345; RV32IZHINXMIN-LABEL: ldexp_half:3346; RV32IZHINXMIN: # %bb.0:3347; RV32IZHINXMIN-NEXT: addi sp, sp, -163348; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3349; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03350; RV32IZHINXMIN-NEXT: call ldexpf3351; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03352; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3353; RV32IZHINXMIN-NEXT: addi sp, sp, 163354; RV32IZHINXMIN-NEXT: ret3355;3356; RV64IZHINXMIN-LABEL: ldexp_half:3357; RV64IZHINXMIN: # %bb.0:3358; RV64IZHINXMIN-NEXT: addi sp, sp, -163359; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3360; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03361; RV64IZHINXMIN-NEXT: call ldexpf3362; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03363; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3364; RV64IZHINXMIN-NEXT: addi sp, sp, 163365; RV64IZHINXMIN-NEXT: ret3366 %z = call half @llvm.ldexp.f16.i32(half %x, i32 %y)3367 ret half %z3368}3369 3370define {half, i32} @frexp_half(half %x) nounwind {3371; RV32IZFH-LABEL: frexp_half:3372; RV32IZFH: # %bb.0:3373; RV32IZFH-NEXT: addi sp, sp, -163374; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3375; RV32IZFH-NEXT: fcvt.s.h fa0, fa03376; RV32IZFH-NEXT: addi a0, sp, 83377; RV32IZFH-NEXT: call frexpf3378; RV32IZFH-NEXT: lw a0, 8(sp)3379; RV32IZFH-NEXT: fcvt.h.s fa0, fa03380; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3381; RV32IZFH-NEXT: addi sp, sp, 163382; RV32IZFH-NEXT: ret3383;3384; RV64IZFH-LABEL: frexp_half:3385; RV64IZFH: # %bb.0:3386; RV64IZFH-NEXT: addi sp, sp, -163387; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3388; RV64IZFH-NEXT: fcvt.s.h fa0, fa03389; RV64IZFH-NEXT: mv a0, sp3390; RV64IZFH-NEXT: call frexpf3391; RV64IZFH-NEXT: ld a0, 0(sp)3392; RV64IZFH-NEXT: fcvt.h.s fa0, fa03393; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3394; RV64IZFH-NEXT: addi sp, sp, 163395; RV64IZFH-NEXT: ret3396;3397; RV32IZHINX-LABEL: frexp_half:3398; RV32IZHINX: # %bb.0:3399; RV32IZHINX-NEXT: addi sp, sp, -163400; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3401; RV32IZHINX-NEXT: fcvt.s.h a0, a03402; RV32IZHINX-NEXT: addi a1, sp, 83403; RV32IZHINX-NEXT: call frexpf3404; RV32IZHINX-NEXT: lw a1, 8(sp)3405; RV32IZHINX-NEXT: fcvt.h.s a0, a03406; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3407; RV32IZHINX-NEXT: addi sp, sp, 163408; RV32IZHINX-NEXT: ret3409;3410; RV64IZHINX-LABEL: frexp_half:3411; RV64IZHINX: # %bb.0:3412; RV64IZHINX-NEXT: addi sp, sp, -163413; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3414; RV64IZHINX-NEXT: fcvt.s.h a0, a03415; RV64IZHINX-NEXT: mv a1, sp3416; RV64IZHINX-NEXT: call frexpf3417; RV64IZHINX-NEXT: ld a1, 0(sp)3418; RV64IZHINX-NEXT: fcvt.h.s a0, a03419; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3420; RV64IZHINX-NEXT: addi sp, sp, 163421; RV64IZHINX-NEXT: ret3422;3423; RV32I-LABEL: frexp_half:3424; RV32I: # %bb.0:3425; RV32I-NEXT: addi sp, sp, -163426; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3427; RV32I-NEXT: slli a0, a0, 163428; RV32I-NEXT: srli a0, a0, 163429; RV32I-NEXT: call __extendhfsf23430; RV32I-NEXT: addi a1, sp, 83431; RV32I-NEXT: call frexpf3432; RV32I-NEXT: call __truncsfhf23433; RV32I-NEXT: lw a1, 8(sp)3434; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3435; RV32I-NEXT: addi sp, sp, 163436; RV32I-NEXT: ret3437;3438; RV64I-LABEL: frexp_half:3439; RV64I: # %bb.0:3440; RV64I-NEXT: addi sp, sp, -163441; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3442; RV64I-NEXT: slli a0, a0, 483443; RV64I-NEXT: srli a0, a0, 483444; RV64I-NEXT: call __extendhfsf23445; RV64I-NEXT: addi a1, sp, 43446; RV64I-NEXT: call frexpf3447; RV64I-NEXT: call __truncsfhf23448; RV64I-NEXT: lw a1, 4(sp)3449; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3450; RV64I-NEXT: addi sp, sp, 163451; RV64I-NEXT: ret3452;3453; RV32IZFHMIN-LABEL: frexp_half:3454; RV32IZFHMIN: # %bb.0:3455; RV32IZFHMIN-NEXT: addi sp, sp, -163456; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3457; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03458; RV32IZFHMIN-NEXT: addi a0, sp, 83459; RV32IZFHMIN-NEXT: call frexpf3460; RV32IZFHMIN-NEXT: lw a0, 8(sp)3461; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03462; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3463; RV32IZFHMIN-NEXT: addi sp, sp, 163464; RV32IZFHMIN-NEXT: ret3465;3466; RV64IZFHMIN-LABEL: frexp_half:3467; RV64IZFHMIN: # %bb.0:3468; RV64IZFHMIN-NEXT: addi sp, sp, -163469; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3470; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03471; RV64IZFHMIN-NEXT: mv a0, sp3472; RV64IZFHMIN-NEXT: call frexpf3473; RV64IZFHMIN-NEXT: ld a0, 0(sp)3474; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03475; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3476; RV64IZFHMIN-NEXT: addi sp, sp, 163477; RV64IZFHMIN-NEXT: ret3478;3479; RV32IZHINXMIN-LABEL: frexp_half:3480; RV32IZHINXMIN: # %bb.0:3481; RV32IZHINXMIN-NEXT: addi sp, sp, -163482; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3483; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03484; RV32IZHINXMIN-NEXT: addi a1, sp, 83485; RV32IZHINXMIN-NEXT: call frexpf3486; RV32IZHINXMIN-NEXT: lw a1, 8(sp)3487; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03488; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3489; RV32IZHINXMIN-NEXT: addi sp, sp, 163490; RV32IZHINXMIN-NEXT: ret3491;3492; RV64IZHINXMIN-LABEL: frexp_half:3493; RV64IZHINXMIN: # %bb.0:3494; RV64IZHINXMIN-NEXT: addi sp, sp, -163495; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3496; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03497; RV64IZHINXMIN-NEXT: mv a1, sp3498; RV64IZHINXMIN-NEXT: call frexpf3499; RV64IZHINXMIN-NEXT: ld a1, 0(sp)3500; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03501; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3502; RV64IZHINXMIN-NEXT: addi sp, sp, 163503; RV64IZHINXMIN-NEXT: ret3504 %a = call {half, i32} @llvm.frexp.f16.i32(half %x)3505 ret {half, i32} %a3506}3507 3508define half @asin_f16(half %a) nounwind {3509; RV32IZFH-LABEL: asin_f16:3510; RV32IZFH: # %bb.0:3511; RV32IZFH-NEXT: addi sp, sp, -163512; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3513; RV32IZFH-NEXT: fcvt.s.h fa0, fa03514; RV32IZFH-NEXT: call asinf3515; RV32IZFH-NEXT: fcvt.h.s fa0, fa03516; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3517; RV32IZFH-NEXT: addi sp, sp, 163518; RV32IZFH-NEXT: ret3519;3520; RV64IZFH-LABEL: asin_f16:3521; RV64IZFH: # %bb.0:3522; RV64IZFH-NEXT: addi sp, sp, -163523; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3524; RV64IZFH-NEXT: fcvt.s.h fa0, fa03525; RV64IZFH-NEXT: call asinf3526; RV64IZFH-NEXT: fcvt.h.s fa0, fa03527; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3528; RV64IZFH-NEXT: addi sp, sp, 163529; RV64IZFH-NEXT: ret3530;3531; RV32IZHINX-LABEL: asin_f16:3532; RV32IZHINX: # %bb.0:3533; RV32IZHINX-NEXT: addi sp, sp, -163534; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3535; RV32IZHINX-NEXT: fcvt.s.h a0, a03536; RV32IZHINX-NEXT: call asinf3537; RV32IZHINX-NEXT: fcvt.h.s a0, a03538; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3539; RV32IZHINX-NEXT: addi sp, sp, 163540; RV32IZHINX-NEXT: ret3541;3542; RV64IZHINX-LABEL: asin_f16:3543; RV64IZHINX: # %bb.0:3544; RV64IZHINX-NEXT: addi sp, sp, -163545; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3546; RV64IZHINX-NEXT: fcvt.s.h a0, a03547; RV64IZHINX-NEXT: call asinf3548; RV64IZHINX-NEXT: fcvt.h.s a0, a03549; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3550; RV64IZHINX-NEXT: addi sp, sp, 163551; RV64IZHINX-NEXT: ret3552;3553; RV32I-LABEL: asin_f16:3554; RV32I: # %bb.0:3555; RV32I-NEXT: addi sp, sp, -163556; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3557; RV32I-NEXT: slli a0, a0, 163558; RV32I-NEXT: srli a0, a0, 163559; RV32I-NEXT: call __extendhfsf23560; RV32I-NEXT: call asinf3561; RV32I-NEXT: call __truncsfhf23562; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3563; RV32I-NEXT: addi sp, sp, 163564; RV32I-NEXT: ret3565;3566; RV64I-LABEL: asin_f16:3567; RV64I: # %bb.0:3568; RV64I-NEXT: addi sp, sp, -163569; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3570; RV64I-NEXT: slli a0, a0, 483571; RV64I-NEXT: srli a0, a0, 483572; RV64I-NEXT: call __extendhfsf23573; RV64I-NEXT: call asinf3574; RV64I-NEXT: call __truncsfhf23575; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3576; RV64I-NEXT: addi sp, sp, 163577; RV64I-NEXT: ret3578;3579; RV32IZFHMIN-LABEL: asin_f16:3580; RV32IZFHMIN: # %bb.0:3581; RV32IZFHMIN-NEXT: addi sp, sp, -163582; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3583; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03584; RV32IZFHMIN-NEXT: call asinf3585; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03586; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3587; RV32IZFHMIN-NEXT: addi sp, sp, 163588; RV32IZFHMIN-NEXT: ret3589;3590; RV64IZFHMIN-LABEL: asin_f16:3591; RV64IZFHMIN: # %bb.0:3592; RV64IZFHMIN-NEXT: addi sp, sp, -163593; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3594; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03595; RV64IZFHMIN-NEXT: call asinf3596; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03597; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3598; RV64IZFHMIN-NEXT: addi sp, sp, 163599; RV64IZFHMIN-NEXT: ret3600;3601; RV32IZHINXMIN-LABEL: asin_f16:3602; RV32IZHINXMIN: # %bb.0:3603; RV32IZHINXMIN-NEXT: addi sp, sp, -163604; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3605; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03606; RV32IZHINXMIN-NEXT: call asinf3607; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03608; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3609; RV32IZHINXMIN-NEXT: addi sp, sp, 163610; RV32IZHINXMIN-NEXT: ret3611;3612; RV64IZHINXMIN-LABEL: asin_f16:3613; RV64IZHINXMIN: # %bb.0:3614; RV64IZHINXMIN-NEXT: addi sp, sp, -163615; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3616; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03617; RV64IZHINXMIN-NEXT: call asinf3618; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03619; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3620; RV64IZHINXMIN-NEXT: addi sp, sp, 163621; RV64IZHINXMIN-NEXT: ret3622 %1 = call half @llvm.asin.f16(half %a)3623 ret half %13624}3625 3626define half @acos_f16(half %a) nounwind {3627; RV32IZFH-LABEL: acos_f16:3628; RV32IZFH: # %bb.0:3629; RV32IZFH-NEXT: addi sp, sp, -163630; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3631; RV32IZFH-NEXT: fcvt.s.h fa0, fa03632; RV32IZFH-NEXT: call acosf3633; RV32IZFH-NEXT: fcvt.h.s fa0, fa03634; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3635; RV32IZFH-NEXT: addi sp, sp, 163636; RV32IZFH-NEXT: ret3637;3638; RV64IZFH-LABEL: acos_f16:3639; RV64IZFH: # %bb.0:3640; RV64IZFH-NEXT: addi sp, sp, -163641; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3642; RV64IZFH-NEXT: fcvt.s.h fa0, fa03643; RV64IZFH-NEXT: call acosf3644; RV64IZFH-NEXT: fcvt.h.s fa0, fa03645; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3646; RV64IZFH-NEXT: addi sp, sp, 163647; RV64IZFH-NEXT: ret3648;3649; RV32IZHINX-LABEL: acos_f16:3650; RV32IZHINX: # %bb.0:3651; RV32IZHINX-NEXT: addi sp, sp, -163652; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3653; RV32IZHINX-NEXT: fcvt.s.h a0, a03654; RV32IZHINX-NEXT: call acosf3655; RV32IZHINX-NEXT: fcvt.h.s a0, a03656; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3657; RV32IZHINX-NEXT: addi sp, sp, 163658; RV32IZHINX-NEXT: ret3659;3660; RV64IZHINX-LABEL: acos_f16:3661; RV64IZHINX: # %bb.0:3662; RV64IZHINX-NEXT: addi sp, sp, -163663; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3664; RV64IZHINX-NEXT: fcvt.s.h a0, a03665; RV64IZHINX-NEXT: call acosf3666; RV64IZHINX-NEXT: fcvt.h.s a0, a03667; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3668; RV64IZHINX-NEXT: addi sp, sp, 163669; RV64IZHINX-NEXT: ret3670;3671; RV32I-LABEL: acos_f16:3672; RV32I: # %bb.0:3673; RV32I-NEXT: addi sp, sp, -163674; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3675; RV32I-NEXT: slli a0, a0, 163676; RV32I-NEXT: srli a0, a0, 163677; RV32I-NEXT: call __extendhfsf23678; RV32I-NEXT: call acosf3679; RV32I-NEXT: call __truncsfhf23680; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3681; RV32I-NEXT: addi sp, sp, 163682; RV32I-NEXT: ret3683;3684; RV64I-LABEL: acos_f16:3685; RV64I: # %bb.0:3686; RV64I-NEXT: addi sp, sp, -163687; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3688; RV64I-NEXT: slli a0, a0, 483689; RV64I-NEXT: srli a0, a0, 483690; RV64I-NEXT: call __extendhfsf23691; RV64I-NEXT: call acosf3692; RV64I-NEXT: call __truncsfhf23693; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3694; RV64I-NEXT: addi sp, sp, 163695; RV64I-NEXT: ret3696;3697; RV32IZFHMIN-LABEL: acos_f16:3698; RV32IZFHMIN: # %bb.0:3699; RV32IZFHMIN-NEXT: addi sp, sp, -163700; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3701; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03702; RV32IZFHMIN-NEXT: call acosf3703; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03704; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3705; RV32IZFHMIN-NEXT: addi sp, sp, 163706; RV32IZFHMIN-NEXT: ret3707;3708; RV64IZFHMIN-LABEL: acos_f16:3709; RV64IZFHMIN: # %bb.0:3710; RV64IZFHMIN-NEXT: addi sp, sp, -163711; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3712; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03713; RV64IZFHMIN-NEXT: call acosf3714; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03715; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3716; RV64IZFHMIN-NEXT: addi sp, sp, 163717; RV64IZFHMIN-NEXT: ret3718;3719; RV32IZHINXMIN-LABEL: acos_f16:3720; RV32IZHINXMIN: # %bb.0:3721; RV32IZHINXMIN-NEXT: addi sp, sp, -163722; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3723; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03724; RV32IZHINXMIN-NEXT: call acosf3725; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03726; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3727; RV32IZHINXMIN-NEXT: addi sp, sp, 163728; RV32IZHINXMIN-NEXT: ret3729;3730; RV64IZHINXMIN-LABEL: acos_f16:3731; RV64IZHINXMIN: # %bb.0:3732; RV64IZHINXMIN-NEXT: addi sp, sp, -163733; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3734; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03735; RV64IZHINXMIN-NEXT: call acosf3736; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03737; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3738; RV64IZHINXMIN-NEXT: addi sp, sp, 163739; RV64IZHINXMIN-NEXT: ret3740 %1 = call half @llvm.acos.f16(half %a)3741 ret half %13742}3743 3744define half @atan_f16(half %a) nounwind {3745; RV32IZFH-LABEL: atan_f16:3746; RV32IZFH: # %bb.0:3747; RV32IZFH-NEXT: addi sp, sp, -163748; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3749; RV32IZFH-NEXT: fcvt.s.h fa0, fa03750; RV32IZFH-NEXT: call atanf3751; RV32IZFH-NEXT: fcvt.h.s fa0, fa03752; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3753; RV32IZFH-NEXT: addi sp, sp, 163754; RV32IZFH-NEXT: ret3755;3756; RV64IZFH-LABEL: atan_f16:3757; RV64IZFH: # %bb.0:3758; RV64IZFH-NEXT: addi sp, sp, -163759; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3760; RV64IZFH-NEXT: fcvt.s.h fa0, fa03761; RV64IZFH-NEXT: call atanf3762; RV64IZFH-NEXT: fcvt.h.s fa0, fa03763; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3764; RV64IZFH-NEXT: addi sp, sp, 163765; RV64IZFH-NEXT: ret3766;3767; RV32IZHINX-LABEL: atan_f16:3768; RV32IZHINX: # %bb.0:3769; RV32IZHINX-NEXT: addi sp, sp, -163770; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3771; RV32IZHINX-NEXT: fcvt.s.h a0, a03772; RV32IZHINX-NEXT: call atanf3773; RV32IZHINX-NEXT: fcvt.h.s a0, a03774; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3775; RV32IZHINX-NEXT: addi sp, sp, 163776; RV32IZHINX-NEXT: ret3777;3778; RV64IZHINX-LABEL: atan_f16:3779; RV64IZHINX: # %bb.0:3780; RV64IZHINX-NEXT: addi sp, sp, -163781; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3782; RV64IZHINX-NEXT: fcvt.s.h a0, a03783; RV64IZHINX-NEXT: call atanf3784; RV64IZHINX-NEXT: fcvt.h.s a0, a03785; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3786; RV64IZHINX-NEXT: addi sp, sp, 163787; RV64IZHINX-NEXT: ret3788;3789; RV32I-LABEL: atan_f16:3790; RV32I: # %bb.0:3791; RV32I-NEXT: addi sp, sp, -163792; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3793; RV32I-NEXT: slli a0, a0, 163794; RV32I-NEXT: srli a0, a0, 163795; RV32I-NEXT: call __extendhfsf23796; RV32I-NEXT: call atanf3797; RV32I-NEXT: call __truncsfhf23798; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3799; RV32I-NEXT: addi sp, sp, 163800; RV32I-NEXT: ret3801;3802; RV64I-LABEL: atan_f16:3803; RV64I: # %bb.0:3804; RV64I-NEXT: addi sp, sp, -163805; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3806; RV64I-NEXT: slli a0, a0, 483807; RV64I-NEXT: srli a0, a0, 483808; RV64I-NEXT: call __extendhfsf23809; RV64I-NEXT: call atanf3810; RV64I-NEXT: call __truncsfhf23811; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3812; RV64I-NEXT: addi sp, sp, 163813; RV64I-NEXT: ret3814;3815; RV32IZFHMIN-LABEL: atan_f16:3816; RV32IZFHMIN: # %bb.0:3817; RV32IZFHMIN-NEXT: addi sp, sp, -163818; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3819; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03820; RV32IZFHMIN-NEXT: call atanf3821; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03822; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3823; RV32IZFHMIN-NEXT: addi sp, sp, 163824; RV32IZFHMIN-NEXT: ret3825;3826; RV64IZFHMIN-LABEL: atan_f16:3827; RV64IZFHMIN: # %bb.0:3828; RV64IZFHMIN-NEXT: addi sp, sp, -163829; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3830; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03831; RV64IZFHMIN-NEXT: call atanf3832; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03833; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3834; RV64IZFHMIN-NEXT: addi sp, sp, 163835; RV64IZFHMIN-NEXT: ret3836;3837; RV32IZHINXMIN-LABEL: atan_f16:3838; RV32IZHINXMIN: # %bb.0:3839; RV32IZHINXMIN-NEXT: addi sp, sp, -163840; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3841; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03842; RV32IZHINXMIN-NEXT: call atanf3843; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03844; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3845; RV32IZHINXMIN-NEXT: addi sp, sp, 163846; RV32IZHINXMIN-NEXT: ret3847;3848; RV64IZHINXMIN-LABEL: atan_f16:3849; RV64IZHINXMIN: # %bb.0:3850; RV64IZHINXMIN-NEXT: addi sp, sp, -163851; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3852; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a03853; RV64IZHINXMIN-NEXT: call atanf3854; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a03855; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3856; RV64IZHINXMIN-NEXT: addi sp, sp, 163857; RV64IZHINXMIN-NEXT: ret3858 %1 = call half @llvm.atan.f16(half %a)3859 ret half %13860}3861 3862define half @atan2_f16(half %a, half %b) nounwind {3863; RV32IZFH-LABEL: atan2_f16:3864; RV32IZFH: # %bb.0:3865; RV32IZFH-NEXT: addi sp, sp, -163866; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3867; RV32IZFH-NEXT: fcvt.s.h fa0, fa03868; RV32IZFH-NEXT: fcvt.s.h fa1, fa13869; RV32IZFH-NEXT: call atan2f3870; RV32IZFH-NEXT: fcvt.h.s fa0, fa03871; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3872; RV32IZFH-NEXT: addi sp, sp, 163873; RV32IZFH-NEXT: ret3874;3875; RV64IZFH-LABEL: atan2_f16:3876; RV64IZFH: # %bb.0:3877; RV64IZFH-NEXT: addi sp, sp, -163878; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3879; RV64IZFH-NEXT: fcvt.s.h fa0, fa03880; RV64IZFH-NEXT: fcvt.s.h fa1, fa13881; RV64IZFH-NEXT: call atan2f3882; RV64IZFH-NEXT: fcvt.h.s fa0, fa03883; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3884; RV64IZFH-NEXT: addi sp, sp, 163885; RV64IZFH-NEXT: ret3886;3887; RV32IZHINX-LABEL: atan2_f16:3888; RV32IZHINX: # %bb.0:3889; RV32IZHINX-NEXT: addi sp, sp, -163890; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3891; RV32IZHINX-NEXT: fcvt.s.h a0, a03892; RV32IZHINX-NEXT: fcvt.s.h a1, a13893; RV32IZHINX-NEXT: call atan2f3894; RV32IZHINX-NEXT: fcvt.h.s a0, a03895; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3896; RV32IZHINX-NEXT: addi sp, sp, 163897; RV32IZHINX-NEXT: ret3898;3899; RV64IZHINX-LABEL: atan2_f16:3900; RV64IZHINX: # %bb.0:3901; RV64IZHINX-NEXT: addi sp, sp, -163902; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3903; RV64IZHINX-NEXT: fcvt.s.h a0, a03904; RV64IZHINX-NEXT: fcvt.s.h a1, a13905; RV64IZHINX-NEXT: call atan2f3906; RV64IZHINX-NEXT: fcvt.h.s a0, a03907; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3908; RV64IZHINX-NEXT: addi sp, sp, 163909; RV64IZHINX-NEXT: ret3910;3911; RV32I-LABEL: atan2_f16:3912; RV32I: # %bb.0:3913; RV32I-NEXT: addi sp, sp, -163914; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3915; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill3916; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill3917; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill3918; RV32I-NEXT: mv s0, a13919; RV32I-NEXT: lui a1, 163920; RV32I-NEXT: addi s2, a1, -13921; RV32I-NEXT: and a0, a0, s23922; RV32I-NEXT: call __extendhfsf23923; RV32I-NEXT: mv s1, a03924; RV32I-NEXT: and a0, s0, s23925; RV32I-NEXT: call __extendhfsf23926; RV32I-NEXT: mv a1, a03927; RV32I-NEXT: mv a0, s13928; RV32I-NEXT: call atan2f3929; RV32I-NEXT: call __truncsfhf23930; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3931; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload3932; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload3933; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload3934; RV32I-NEXT: addi sp, sp, 163935; RV32I-NEXT: ret3936;3937; RV64I-LABEL: atan2_f16:3938; RV64I: # %bb.0:3939; RV64I-NEXT: addi sp, sp, -323940; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill3941; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill3942; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill3943; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill3944; RV64I-NEXT: mv s0, a13945; RV64I-NEXT: lui a1, 163946; RV64I-NEXT: addi s2, a1, -13947; RV64I-NEXT: and a0, a0, s23948; RV64I-NEXT: call __extendhfsf23949; RV64I-NEXT: mv s1, a03950; RV64I-NEXT: and a0, s0, s23951; RV64I-NEXT: call __extendhfsf23952; RV64I-NEXT: mv a1, a03953; RV64I-NEXT: mv a0, s13954; RV64I-NEXT: call atan2f3955; RV64I-NEXT: call __truncsfhf23956; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload3957; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload3958; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload3959; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload3960; RV64I-NEXT: addi sp, sp, 323961; RV64I-NEXT: ret3962;3963; RV32IZFHMIN-LABEL: atan2_f16:3964; RV32IZFHMIN: # %bb.0:3965; RV32IZFHMIN-NEXT: addi sp, sp, -163966; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3967; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa03968; RV32IZFHMIN-NEXT: fcvt.s.h fa1, fa13969; RV32IZFHMIN-NEXT: call atan2f3970; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa03971; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3972; RV32IZFHMIN-NEXT: addi sp, sp, 163973; RV32IZFHMIN-NEXT: ret3974;3975; RV64IZFHMIN-LABEL: atan2_f16:3976; RV64IZFHMIN: # %bb.0:3977; RV64IZFHMIN-NEXT: addi sp, sp, -163978; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3979; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa03980; RV64IZFHMIN-NEXT: fcvt.s.h fa1, fa13981; RV64IZFHMIN-NEXT: call atan2f3982; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa03983; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3984; RV64IZFHMIN-NEXT: addi sp, sp, 163985; RV64IZFHMIN-NEXT: ret3986;3987; RV32IZHINXMIN-LABEL: atan2_f16:3988; RV32IZHINXMIN: # %bb.0:3989; RV32IZHINXMIN-NEXT: addi sp, sp, -163990; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3991; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a03992; RV32IZHINXMIN-NEXT: fcvt.s.h a1, a13993; RV32IZHINXMIN-NEXT: call atan2f3994; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a03995; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3996; RV32IZHINXMIN-NEXT: addi sp, sp, 163997; RV32IZHINXMIN-NEXT: ret3998;3999; RV64IZHINXMIN-LABEL: atan2_f16:4000; RV64IZHINXMIN: # %bb.0:4001; RV64IZHINXMIN-NEXT: addi sp, sp, -164002; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4003; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a04004; RV64IZHINXMIN-NEXT: fcvt.s.h a1, a14005; RV64IZHINXMIN-NEXT: call atan2f4006; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a04007; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4008; RV64IZHINXMIN-NEXT: addi sp, sp, 164009; RV64IZHINXMIN-NEXT: ret4010 %1 = call half @llvm.atan2.f16(half %a, half %b)4011 ret half %14012}4013 4014define half @sinh_f16(half %a) nounwind {4015; RV32IZFH-LABEL: sinh_f16:4016; RV32IZFH: # %bb.0:4017; RV32IZFH-NEXT: addi sp, sp, -164018; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4019; RV32IZFH-NEXT: fcvt.s.h fa0, fa04020; RV32IZFH-NEXT: call sinhf4021; RV32IZFH-NEXT: fcvt.h.s fa0, fa04022; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4023; RV32IZFH-NEXT: addi sp, sp, 164024; RV32IZFH-NEXT: ret4025;4026; RV64IZFH-LABEL: sinh_f16:4027; RV64IZFH: # %bb.0:4028; RV64IZFH-NEXT: addi sp, sp, -164029; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4030; RV64IZFH-NEXT: fcvt.s.h fa0, fa04031; RV64IZFH-NEXT: call sinhf4032; RV64IZFH-NEXT: fcvt.h.s fa0, fa04033; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4034; RV64IZFH-NEXT: addi sp, sp, 164035; RV64IZFH-NEXT: ret4036;4037; RV32IZHINX-LABEL: sinh_f16:4038; RV32IZHINX: # %bb.0:4039; RV32IZHINX-NEXT: addi sp, sp, -164040; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4041; RV32IZHINX-NEXT: fcvt.s.h a0, a04042; RV32IZHINX-NEXT: call sinhf4043; RV32IZHINX-NEXT: fcvt.h.s a0, a04044; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4045; RV32IZHINX-NEXT: addi sp, sp, 164046; RV32IZHINX-NEXT: ret4047;4048; RV64IZHINX-LABEL: sinh_f16:4049; RV64IZHINX: # %bb.0:4050; RV64IZHINX-NEXT: addi sp, sp, -164051; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4052; RV64IZHINX-NEXT: fcvt.s.h a0, a04053; RV64IZHINX-NEXT: call sinhf4054; RV64IZHINX-NEXT: fcvt.h.s a0, a04055; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4056; RV64IZHINX-NEXT: addi sp, sp, 164057; RV64IZHINX-NEXT: ret4058;4059; RV32I-LABEL: sinh_f16:4060; RV32I: # %bb.0:4061; RV32I-NEXT: addi sp, sp, -164062; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4063; RV32I-NEXT: slli a0, a0, 164064; RV32I-NEXT: srli a0, a0, 164065; RV32I-NEXT: call __extendhfsf24066; RV32I-NEXT: call sinhf4067; RV32I-NEXT: call __truncsfhf24068; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4069; RV32I-NEXT: addi sp, sp, 164070; RV32I-NEXT: ret4071;4072; RV64I-LABEL: sinh_f16:4073; RV64I: # %bb.0:4074; RV64I-NEXT: addi sp, sp, -164075; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4076; RV64I-NEXT: slli a0, a0, 484077; RV64I-NEXT: srli a0, a0, 484078; RV64I-NEXT: call __extendhfsf24079; RV64I-NEXT: call sinhf4080; RV64I-NEXT: call __truncsfhf24081; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4082; RV64I-NEXT: addi sp, sp, 164083; RV64I-NEXT: ret4084;4085; RV32IZFHMIN-LABEL: sinh_f16:4086; RV32IZFHMIN: # %bb.0:4087; RV32IZFHMIN-NEXT: addi sp, sp, -164088; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4089; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa04090; RV32IZFHMIN-NEXT: call sinhf4091; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa04092; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4093; RV32IZFHMIN-NEXT: addi sp, sp, 164094; RV32IZFHMIN-NEXT: ret4095;4096; RV64IZFHMIN-LABEL: sinh_f16:4097; RV64IZFHMIN: # %bb.0:4098; RV64IZFHMIN-NEXT: addi sp, sp, -164099; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4100; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa04101; RV64IZFHMIN-NEXT: call sinhf4102; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa04103; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4104; RV64IZFHMIN-NEXT: addi sp, sp, 164105; RV64IZFHMIN-NEXT: ret4106;4107; RV32IZHINXMIN-LABEL: sinh_f16:4108; RV32IZHINXMIN: # %bb.0:4109; RV32IZHINXMIN-NEXT: addi sp, sp, -164110; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4111; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a04112; RV32IZHINXMIN-NEXT: call sinhf4113; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a04114; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4115; RV32IZHINXMIN-NEXT: addi sp, sp, 164116; RV32IZHINXMIN-NEXT: ret4117;4118; RV64IZHINXMIN-LABEL: sinh_f16:4119; RV64IZHINXMIN: # %bb.0:4120; RV64IZHINXMIN-NEXT: addi sp, sp, -164121; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4122; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a04123; RV64IZHINXMIN-NEXT: call sinhf4124; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a04125; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4126; RV64IZHINXMIN-NEXT: addi sp, sp, 164127; RV64IZHINXMIN-NEXT: ret4128 %1 = call half @llvm.sinh.f16(half %a)4129 ret half %14130}4131 4132define half @cosh_f16(half %a) nounwind {4133; RV32IZFH-LABEL: cosh_f16:4134; RV32IZFH: # %bb.0:4135; RV32IZFH-NEXT: addi sp, sp, -164136; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4137; RV32IZFH-NEXT: fcvt.s.h fa0, fa04138; RV32IZFH-NEXT: call coshf4139; RV32IZFH-NEXT: fcvt.h.s fa0, fa04140; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4141; RV32IZFH-NEXT: addi sp, sp, 164142; RV32IZFH-NEXT: ret4143;4144; RV64IZFH-LABEL: cosh_f16:4145; RV64IZFH: # %bb.0:4146; RV64IZFH-NEXT: addi sp, sp, -164147; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4148; RV64IZFH-NEXT: fcvt.s.h fa0, fa04149; RV64IZFH-NEXT: call coshf4150; RV64IZFH-NEXT: fcvt.h.s fa0, fa04151; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4152; RV64IZFH-NEXT: addi sp, sp, 164153; RV64IZFH-NEXT: ret4154;4155; RV32IZHINX-LABEL: cosh_f16:4156; RV32IZHINX: # %bb.0:4157; RV32IZHINX-NEXT: addi sp, sp, -164158; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4159; RV32IZHINX-NEXT: fcvt.s.h a0, a04160; RV32IZHINX-NEXT: call coshf4161; RV32IZHINX-NEXT: fcvt.h.s a0, a04162; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4163; RV32IZHINX-NEXT: addi sp, sp, 164164; RV32IZHINX-NEXT: ret4165;4166; RV64IZHINX-LABEL: cosh_f16:4167; RV64IZHINX: # %bb.0:4168; RV64IZHINX-NEXT: addi sp, sp, -164169; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4170; RV64IZHINX-NEXT: fcvt.s.h a0, a04171; RV64IZHINX-NEXT: call coshf4172; RV64IZHINX-NEXT: fcvt.h.s a0, a04173; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4174; RV64IZHINX-NEXT: addi sp, sp, 164175; RV64IZHINX-NEXT: ret4176;4177; RV32I-LABEL: cosh_f16:4178; RV32I: # %bb.0:4179; RV32I-NEXT: addi sp, sp, -164180; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4181; RV32I-NEXT: slli a0, a0, 164182; RV32I-NEXT: srli a0, a0, 164183; RV32I-NEXT: call __extendhfsf24184; RV32I-NEXT: call coshf4185; RV32I-NEXT: call __truncsfhf24186; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4187; RV32I-NEXT: addi sp, sp, 164188; RV32I-NEXT: ret4189;4190; RV64I-LABEL: cosh_f16:4191; RV64I: # %bb.0:4192; RV64I-NEXT: addi sp, sp, -164193; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4194; RV64I-NEXT: slli a0, a0, 484195; RV64I-NEXT: srli a0, a0, 484196; RV64I-NEXT: call __extendhfsf24197; RV64I-NEXT: call coshf4198; RV64I-NEXT: call __truncsfhf24199; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4200; RV64I-NEXT: addi sp, sp, 164201; RV64I-NEXT: ret4202;4203; RV32IZFHMIN-LABEL: cosh_f16:4204; RV32IZFHMIN: # %bb.0:4205; RV32IZFHMIN-NEXT: addi sp, sp, -164206; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4207; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa04208; RV32IZFHMIN-NEXT: call coshf4209; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa04210; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4211; RV32IZFHMIN-NEXT: addi sp, sp, 164212; RV32IZFHMIN-NEXT: ret4213;4214; RV64IZFHMIN-LABEL: cosh_f16:4215; RV64IZFHMIN: # %bb.0:4216; RV64IZFHMIN-NEXT: addi sp, sp, -164217; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4218; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa04219; RV64IZFHMIN-NEXT: call coshf4220; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa04221; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4222; RV64IZFHMIN-NEXT: addi sp, sp, 164223; RV64IZFHMIN-NEXT: ret4224;4225; RV32IZHINXMIN-LABEL: cosh_f16:4226; RV32IZHINXMIN: # %bb.0:4227; RV32IZHINXMIN-NEXT: addi sp, sp, -164228; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4229; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a04230; RV32IZHINXMIN-NEXT: call coshf4231; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a04232; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4233; RV32IZHINXMIN-NEXT: addi sp, sp, 164234; RV32IZHINXMIN-NEXT: ret4235;4236; RV64IZHINXMIN-LABEL: cosh_f16:4237; RV64IZHINXMIN: # %bb.0:4238; RV64IZHINXMIN-NEXT: addi sp, sp, -164239; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4240; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a04241; RV64IZHINXMIN-NEXT: call coshf4242; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a04243; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4244; RV64IZHINXMIN-NEXT: addi sp, sp, 164245; RV64IZHINXMIN-NEXT: ret4246 %1 = call half @llvm.cosh.f16(half %a)4247 ret half %14248}4249 4250define half @tanh_f16(half %a) nounwind {4251; RV32IZFH-LABEL: tanh_f16:4252; RV32IZFH: # %bb.0:4253; RV32IZFH-NEXT: addi sp, sp, -164254; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4255; RV32IZFH-NEXT: fcvt.s.h fa0, fa04256; RV32IZFH-NEXT: call tanhf4257; RV32IZFH-NEXT: fcvt.h.s fa0, fa04258; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4259; RV32IZFH-NEXT: addi sp, sp, 164260; RV32IZFH-NEXT: ret4261;4262; RV64IZFH-LABEL: tanh_f16:4263; RV64IZFH: # %bb.0:4264; RV64IZFH-NEXT: addi sp, sp, -164265; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4266; RV64IZFH-NEXT: fcvt.s.h fa0, fa04267; RV64IZFH-NEXT: call tanhf4268; RV64IZFH-NEXT: fcvt.h.s fa0, fa04269; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4270; RV64IZFH-NEXT: addi sp, sp, 164271; RV64IZFH-NEXT: ret4272;4273; RV32IZHINX-LABEL: tanh_f16:4274; RV32IZHINX: # %bb.0:4275; RV32IZHINX-NEXT: addi sp, sp, -164276; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4277; RV32IZHINX-NEXT: fcvt.s.h a0, a04278; RV32IZHINX-NEXT: call tanhf4279; RV32IZHINX-NEXT: fcvt.h.s a0, a04280; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4281; RV32IZHINX-NEXT: addi sp, sp, 164282; RV32IZHINX-NEXT: ret4283;4284; RV64IZHINX-LABEL: tanh_f16:4285; RV64IZHINX: # %bb.0:4286; RV64IZHINX-NEXT: addi sp, sp, -164287; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4288; RV64IZHINX-NEXT: fcvt.s.h a0, a04289; RV64IZHINX-NEXT: call tanhf4290; RV64IZHINX-NEXT: fcvt.h.s a0, a04291; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4292; RV64IZHINX-NEXT: addi sp, sp, 164293; RV64IZHINX-NEXT: ret4294;4295; RV32I-LABEL: tanh_f16:4296; RV32I: # %bb.0:4297; RV32I-NEXT: addi sp, sp, -164298; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4299; RV32I-NEXT: slli a0, a0, 164300; RV32I-NEXT: srli a0, a0, 164301; RV32I-NEXT: call __extendhfsf24302; RV32I-NEXT: call tanhf4303; RV32I-NEXT: call __truncsfhf24304; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4305; RV32I-NEXT: addi sp, sp, 164306; RV32I-NEXT: ret4307;4308; RV64I-LABEL: tanh_f16:4309; RV64I: # %bb.0:4310; RV64I-NEXT: addi sp, sp, -164311; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4312; RV64I-NEXT: slli a0, a0, 484313; RV64I-NEXT: srli a0, a0, 484314; RV64I-NEXT: call __extendhfsf24315; RV64I-NEXT: call tanhf4316; RV64I-NEXT: call __truncsfhf24317; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4318; RV64I-NEXT: addi sp, sp, 164319; RV64I-NEXT: ret4320;4321; RV32IZFHMIN-LABEL: tanh_f16:4322; RV32IZFHMIN: # %bb.0:4323; RV32IZFHMIN-NEXT: addi sp, sp, -164324; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4325; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa04326; RV32IZFHMIN-NEXT: call tanhf4327; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa04328; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4329; RV32IZFHMIN-NEXT: addi sp, sp, 164330; RV32IZFHMIN-NEXT: ret4331;4332; RV64IZFHMIN-LABEL: tanh_f16:4333; RV64IZFHMIN: # %bb.0:4334; RV64IZFHMIN-NEXT: addi sp, sp, -164335; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4336; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa04337; RV64IZFHMIN-NEXT: call tanhf4338; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa04339; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4340; RV64IZFHMIN-NEXT: addi sp, sp, 164341; RV64IZFHMIN-NEXT: ret4342;4343; RV32IZHINXMIN-LABEL: tanh_f16:4344; RV32IZHINXMIN: # %bb.0:4345; RV32IZHINXMIN-NEXT: addi sp, sp, -164346; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4347; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a04348; RV32IZHINXMIN-NEXT: call tanhf4349; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a04350; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4351; RV32IZHINXMIN-NEXT: addi sp, sp, 164352; RV32IZHINXMIN-NEXT: ret4353;4354; RV64IZHINXMIN-LABEL: tanh_f16:4355; RV64IZHINXMIN: # %bb.0:4356; RV64IZHINXMIN-NEXT: addi sp, sp, -164357; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4358; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a04359; RV64IZHINXMIN-NEXT: call tanhf4360; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a04361; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4362; RV64IZHINXMIN-NEXT: addi sp, sp, 164363; RV64IZHINXMIN-NEXT: ret4364 %1 = call half @llvm.tanh.f16(half %a)4365 ret half %14366}4367 4368define { half, half } @test_modf_f16(half %a) nounwind {4369; RV32IZFH-LABEL: test_modf_f16:4370; RV32IZFH: # %bb.0:4371; RV32IZFH-NEXT: addi sp, sp, -164372; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4373; RV32IZFH-NEXT: fcvt.s.h fa0, fa04374; RV32IZFH-NEXT: addi a0, sp, 84375; RV32IZFH-NEXT: call modff4376; RV32IZFH-NEXT: flw fa5, 8(sp)4377; RV32IZFH-NEXT: fcvt.h.s fa0, fa04378; RV32IZFH-NEXT: fcvt.h.s fa1, fa54379; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4380; RV32IZFH-NEXT: addi sp, sp, 164381; RV32IZFH-NEXT: ret4382;4383; RV64IZFH-LABEL: test_modf_f16:4384; RV64IZFH: # %bb.0:4385; RV64IZFH-NEXT: addi sp, sp, -164386; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4387; RV64IZFH-NEXT: fcvt.s.h fa0, fa04388; RV64IZFH-NEXT: addi a0, sp, 44389; RV64IZFH-NEXT: call modff4390; RV64IZFH-NEXT: flw fa5, 4(sp)4391; RV64IZFH-NEXT: fcvt.h.s fa0, fa04392; RV64IZFH-NEXT: fcvt.h.s fa1, fa54393; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4394; RV64IZFH-NEXT: addi sp, sp, 164395; RV64IZFH-NEXT: ret4396;4397; RV32IZHINX-LABEL: test_modf_f16:4398; RV32IZHINX: # %bb.0:4399; RV32IZHINX-NEXT: addi sp, sp, -164400; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4401; RV32IZHINX-NEXT: fcvt.s.h a0, a04402; RV32IZHINX-NEXT: addi a1, sp, 84403; RV32IZHINX-NEXT: call modff4404; RV32IZHINX-NEXT: lw a1, 8(sp)4405; RV32IZHINX-NEXT: fcvt.h.s a0, a04406; RV32IZHINX-NEXT: fcvt.h.s a1, a14407; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4408; RV32IZHINX-NEXT: addi sp, sp, 164409; RV32IZHINX-NEXT: ret4410;4411; RV64IZHINX-LABEL: test_modf_f16:4412; RV64IZHINX: # %bb.0:4413; RV64IZHINX-NEXT: addi sp, sp, -164414; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4415; RV64IZHINX-NEXT: fcvt.s.h a0, a04416; RV64IZHINX-NEXT: addi a1, sp, 44417; RV64IZHINX-NEXT: call modff4418; RV64IZHINX-NEXT: lw a1, 4(sp)4419; RV64IZHINX-NEXT: fcvt.h.s a0, a04420; RV64IZHINX-NEXT: fcvt.h.s a1, a14421; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4422; RV64IZHINX-NEXT: addi sp, sp, 164423; RV64IZHINX-NEXT: ret4424;4425; RV32I-LABEL: test_modf_f16:4426; RV32I: # %bb.0:4427; RV32I-NEXT: addi sp, sp, -164428; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4429; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill4430; RV32I-NEXT: slli a0, a0, 164431; RV32I-NEXT: srli a0, a0, 164432; RV32I-NEXT: call __extendhfsf24433; RV32I-NEXT: addi a1, sp, 44434; RV32I-NEXT: call modff4435; RV32I-NEXT: call __truncsfhf24436; RV32I-NEXT: mv s0, a04437; RV32I-NEXT: lw a0, 4(sp)4438; RV32I-NEXT: call __truncsfhf24439; RV32I-NEXT: mv a1, a04440; RV32I-NEXT: mv a0, s04441; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4442; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload4443; RV32I-NEXT: addi sp, sp, 164444; RV32I-NEXT: ret4445;4446; RV64I-LABEL: test_modf_f16:4447; RV64I: # %bb.0:4448; RV64I-NEXT: addi sp, sp, -324449; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill4450; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill4451; RV64I-NEXT: slli a0, a0, 484452; RV64I-NEXT: srli a0, a0, 484453; RV64I-NEXT: call __extendhfsf24454; RV64I-NEXT: addi a1, sp, 124455; RV64I-NEXT: call modff4456; RV64I-NEXT: call __truncsfhf24457; RV64I-NEXT: mv s0, a04458; RV64I-NEXT: lw a0, 12(sp)4459; RV64I-NEXT: call __truncsfhf24460; RV64I-NEXT: mv a1, a04461; RV64I-NEXT: mv a0, s04462; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload4463; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload4464; RV64I-NEXT: addi sp, sp, 324465; RV64I-NEXT: ret4466;4467; RV32IZFHMIN-LABEL: test_modf_f16:4468; RV32IZFHMIN: # %bb.0:4469; RV32IZFHMIN-NEXT: addi sp, sp, -164470; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4471; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa04472; RV32IZFHMIN-NEXT: addi a0, sp, 84473; RV32IZFHMIN-NEXT: call modff4474; RV32IZFHMIN-NEXT: flw fa5, 8(sp)4475; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa04476; RV32IZFHMIN-NEXT: fcvt.h.s fa1, fa54477; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4478; RV32IZFHMIN-NEXT: addi sp, sp, 164479; RV32IZFHMIN-NEXT: ret4480;4481; RV64IZFHMIN-LABEL: test_modf_f16:4482; RV64IZFHMIN: # %bb.0:4483; RV64IZFHMIN-NEXT: addi sp, sp, -164484; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4485; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa04486; RV64IZFHMIN-NEXT: addi a0, sp, 44487; RV64IZFHMIN-NEXT: call modff4488; RV64IZFHMIN-NEXT: flw fa5, 4(sp)4489; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa04490; RV64IZFHMIN-NEXT: fcvt.h.s fa1, fa54491; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4492; RV64IZFHMIN-NEXT: addi sp, sp, 164493; RV64IZFHMIN-NEXT: ret4494;4495; RV32IZHINXMIN-LABEL: test_modf_f16:4496; RV32IZHINXMIN: # %bb.0:4497; RV32IZHINXMIN-NEXT: addi sp, sp, -164498; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill4499; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a04500; RV32IZHINXMIN-NEXT: addi a1, sp, 84501; RV32IZHINXMIN-NEXT: call modff4502; RV32IZHINXMIN-NEXT: lw a1, 8(sp)4503; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a04504; RV32IZHINXMIN-NEXT: fcvt.h.s a1, a14505; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload4506; RV32IZHINXMIN-NEXT: addi sp, sp, 164507; RV32IZHINXMIN-NEXT: ret4508;4509; RV64IZHINXMIN-LABEL: test_modf_f16:4510; RV64IZHINXMIN: # %bb.0:4511; RV64IZHINXMIN-NEXT: addi sp, sp, -164512; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill4513; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a04514; RV64IZHINXMIN-NEXT: addi a1, sp, 44515; RV64IZHINXMIN-NEXT: call modff4516; RV64IZHINXMIN-NEXT: lw a1, 4(sp)4517; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a04518; RV64IZHINXMIN-NEXT: fcvt.h.s a1, a14519; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload4520; RV64IZHINXMIN-NEXT: addi sp, sp, 164521; RV64IZHINXMIN-NEXT: ret4522 %result = call { half, half } @llvm.modf.f16(half %a)4523 ret { half, half } %result4524}4525