362 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -verify-machineinstrs \3; RUN: -target-abi lp64 < %s | FileCheck %s -check-prefixes=CHECK,RV64I4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \5; RUN: -target-abi lp64f < %s | FileCheck %s -check-prefixes=CHECK,RV64IZFH6; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \7; RUN: -target-abi lp64 < %s | FileCheck %s -check-prefixes=CHECK,RV64IZHINX8 9define half @sitofp_i128_to_f16(i128 %a) nounwind {10; RV64I-LABEL: sitofp_i128_to_f16:11; RV64I: # %bb.0:12; RV64I-NEXT: addi sp, sp, -1613; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill14; RV64I-NEXT: call __floattisf15; RV64I-NEXT: call __truncsfhf216; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload17; RV64I-NEXT: addi sp, sp, 1618; RV64I-NEXT: ret19;20; RV64IZFH-LABEL: sitofp_i128_to_f16:21; RV64IZFH: # %bb.0:22; RV64IZFH-NEXT: addi sp, sp, -1623; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill24; RV64IZFH-NEXT: call __floattihf25; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload26; RV64IZFH-NEXT: addi sp, sp, 1627; RV64IZFH-NEXT: ret28;29; RV64IZHINX-LABEL: sitofp_i128_to_f16:30; RV64IZHINX: # %bb.0:31; RV64IZHINX-NEXT: addi sp, sp, -1632; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill33; RV64IZHINX-NEXT: call __floattihf34; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload35; RV64IZHINX-NEXT: addi sp, sp, 1636; RV64IZHINX-NEXT: ret37 %1 = sitofp i128 %a to half38 ret half %139}40 41define half @uitofp_i128_to_f16(i128 %a) nounwind {42; RV64I-LABEL: uitofp_i128_to_f16:43; RV64I: # %bb.0:44; RV64I-NEXT: addi sp, sp, -1645; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill46; RV64I-NEXT: call __floatuntisf47; RV64I-NEXT: call __truncsfhf248; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload49; RV64I-NEXT: addi sp, sp, 1650; RV64I-NEXT: ret51;52; RV64IZFH-LABEL: uitofp_i128_to_f16:53; RV64IZFH: # %bb.0:54; RV64IZFH-NEXT: addi sp, sp, -1655; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill56; RV64IZFH-NEXT: call __floatuntihf57; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload58; RV64IZFH-NEXT: addi sp, sp, 1659; RV64IZFH-NEXT: ret60;61; RV64IZHINX-LABEL: uitofp_i128_to_f16:62; RV64IZHINX: # %bb.0:63; RV64IZHINX-NEXT: addi sp, sp, -1664; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill65; RV64IZHINX-NEXT: call __floatuntihf66; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload67; RV64IZHINX-NEXT: addi sp, sp, 1668; RV64IZHINX-NEXT: ret69 %1 = uitofp i128 %a to half70 ret half %171}72 73define i128 @fptosi_f16_to_i128(half %a) nounwind {74; RV64I-LABEL: fptosi_f16_to_i128:75; RV64I: # %bb.0:76; RV64I-NEXT: addi sp, sp, -1677; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill78; RV64I-NEXT: call __extendhfsf279; RV64I-NEXT: call __fixsfti80; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload81; RV64I-NEXT: addi sp, sp, 1682; RV64I-NEXT: ret83;84; RV64IZFH-LABEL: fptosi_f16_to_i128:85; RV64IZFH: # %bb.0:86; RV64IZFH-NEXT: addi sp, sp, -1687; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill88; RV64IZFH-NEXT: call __fixhfti89; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload90; RV64IZFH-NEXT: addi sp, sp, 1691; RV64IZFH-NEXT: ret92;93; RV64IZHINX-LABEL: fptosi_f16_to_i128:94; RV64IZHINX: # %bb.0:95; RV64IZHINX-NEXT: addi sp, sp, -1696; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill97; RV64IZHINX-NEXT: call __fixhfti98; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload99; RV64IZHINX-NEXT: addi sp, sp, 16100; RV64IZHINX-NEXT: ret101 %1 = fptosi half %a to i128102 ret i128 %1103}104 105define i128 @fptoui_f16_to_i128(half %a) nounwind {106; RV64I-LABEL: fptoui_f16_to_i128:107; RV64I: # %bb.0:108; RV64I-NEXT: addi sp, sp, -16109; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill110; RV64I-NEXT: call __extendhfsf2111; RV64I-NEXT: call __fixunssfti112; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload113; RV64I-NEXT: addi sp, sp, 16114; RV64I-NEXT: ret115;116; RV64IZFH-LABEL: fptoui_f16_to_i128:117; RV64IZFH: # %bb.0:118; RV64IZFH-NEXT: addi sp, sp, -16119; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill120; RV64IZFH-NEXT: call __fixunshfti121; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload122; RV64IZFH-NEXT: addi sp, sp, 16123; RV64IZFH-NEXT: ret124;125; RV64IZHINX-LABEL: fptoui_f16_to_i128:126; RV64IZHINX: # %bb.0:127; RV64IZHINX-NEXT: addi sp, sp, -16128; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill129; RV64IZHINX-NEXT: call __fixunshfti130; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload131; RV64IZHINX-NEXT: addi sp, sp, 16132; RV64IZHINX-NEXT: ret133 %1 = fptoui half %a to i128134 ret i128 %1135}136 137define i128 @fptosi_sat_f16_to_i128(half %a) nounwind {138; RV64I-LABEL: fptosi_sat_f16_to_i128:139; RV64I: # %bb.0:140; RV64I-NEXT: addi sp, sp, -64141; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill142; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill143; RV64I-NEXT: sd s1, 40(sp) # 8-byte Folded Spill144; RV64I-NEXT: sd s2, 32(sp) # 8-byte Folded Spill145; RV64I-NEXT: sd s3, 24(sp) # 8-byte Folded Spill146; RV64I-NEXT: sd s4, 16(sp) # 8-byte Folded Spill147; RV64I-NEXT: sd s5, 8(sp) # 8-byte Folded Spill148; RV64I-NEXT: call __extendhfsf2149; RV64I-NEXT: mv s2, a0150; RV64I-NEXT: lui a1, 1044480151; RV64I-NEXT: call __gesf2152; RV64I-NEXT: mv s0, a0153; RV64I-NEXT: mv a0, s2154; RV64I-NEXT: call __fixsfti155; RV64I-NEXT: mv s1, a0156; RV64I-NEXT: mv s3, a1157; RV64I-NEXT: li s5, -1158; RV64I-NEXT: bgez s0, .LBB4_2159; RV64I-NEXT: # %bb.1:160; RV64I-NEXT: slli s3, s5, 63161; RV64I-NEXT: .LBB4_2:162; RV64I-NEXT: lui a1, 520192163; RV64I-NEXT: addi a1, a1, -1164; RV64I-NEXT: mv a0, s2165; RV64I-NEXT: call __gtsf2166; RV64I-NEXT: mv s4, a0167; RV64I-NEXT: blez a0, .LBB4_4168; RV64I-NEXT: # %bb.3:169; RV64I-NEXT: srli s3, s5, 1170; RV64I-NEXT: .LBB4_4:171; RV64I-NEXT: mv a0, s2172; RV64I-NEXT: mv a1, s2173; RV64I-NEXT: call __unordsf2174; RV64I-NEXT: snez a0, a0175; RV64I-NEXT: sgtz a1, s4176; RV64I-NEXT: srli s0, s0, 63177; RV64I-NEXT: addi a0, a0, -1178; RV64I-NEXT: neg a2, a1179; RV64I-NEXT: addi s0, s0, -1180; RV64I-NEXT: and a1, a0, s3181; RV64I-NEXT: and s0, s0, s1182; RV64I-NEXT: or a2, a2, s0183; RV64I-NEXT: and a0, a0, a2184; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload185; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload186; RV64I-NEXT: ld s1, 40(sp) # 8-byte Folded Reload187; RV64I-NEXT: ld s2, 32(sp) # 8-byte Folded Reload188; RV64I-NEXT: ld s3, 24(sp) # 8-byte Folded Reload189; RV64I-NEXT: ld s4, 16(sp) # 8-byte Folded Reload190; RV64I-NEXT: ld s5, 8(sp) # 8-byte Folded Reload191; RV64I-NEXT: addi sp, sp, 64192; RV64I-NEXT: ret193;194; RV64IZFH-LABEL: fptosi_sat_f16_to_i128:195; RV64IZFH: # %bb.0:196; RV64IZFH-NEXT: addi sp, sp, -32197; RV64IZFH-NEXT: sd ra, 24(sp) # 8-byte Folded Spill198; RV64IZFH-NEXT: sd s0, 16(sp) # 8-byte Folded Spill199; RV64IZFH-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill200; RV64IZFH-NEXT: fcvt.s.h fs0, fa0201; RV64IZFH-NEXT: lui a0, 1044480202; RV64IZFH-NEXT: fmv.w.x fa5, a0203; RV64IZFH-NEXT: fle.s s0, fa5, fs0204; RV64IZFH-NEXT: fmv.s fa0, fs0205; RV64IZFH-NEXT: call __fixsfti206; RV64IZFH-NEXT: li a2, -1207; RV64IZFH-NEXT: bnez s0, .LBB4_2208; RV64IZFH-NEXT: # %bb.1:209; RV64IZFH-NEXT: slli a1, a2, 63210; RV64IZFH-NEXT: .LBB4_2:211; RV64IZFH-NEXT: lui a3, 520192212; RV64IZFH-NEXT: addi a3, a3, -1213; RV64IZFH-NEXT: fmv.w.x fa5, a3214; RV64IZFH-NEXT: flt.s a3, fa5, fs0215; RV64IZFH-NEXT: beqz a3, .LBB4_4216; RV64IZFH-NEXT: # %bb.3:217; RV64IZFH-NEXT: srli a1, a2, 1218; RV64IZFH-NEXT: .LBB4_4:219; RV64IZFH-NEXT: feq.s a2, fs0, fs0220; RV64IZFH-NEXT: neg a4, s0221; RV64IZFH-NEXT: neg a3, a3222; RV64IZFH-NEXT: neg a2, a2223; RV64IZFH-NEXT: and a0, a4, a0224; RV64IZFH-NEXT: and a1, a2, a1225; RV64IZFH-NEXT: or a0, a3, a0226; RV64IZFH-NEXT: and a0, a2, a0227; RV64IZFH-NEXT: ld ra, 24(sp) # 8-byte Folded Reload228; RV64IZFH-NEXT: ld s0, 16(sp) # 8-byte Folded Reload229; RV64IZFH-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload230; RV64IZFH-NEXT: addi sp, sp, 32231; RV64IZFH-NEXT: ret232;233; RV64IZHINX-LABEL: fptosi_sat_f16_to_i128:234; RV64IZHINX: # %bb.0:235; RV64IZHINX-NEXT: addi sp, sp, -32236; RV64IZHINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill237; RV64IZHINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill238; RV64IZHINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill239; RV64IZHINX-NEXT: fcvt.s.h s0, a0240; RV64IZHINX-NEXT: lui a0, 1044480241; RV64IZHINX-NEXT: fle.s s1, a0, s0242; RV64IZHINX-NEXT: mv a0, s0243; RV64IZHINX-NEXT: call __fixsfti244; RV64IZHINX-NEXT: li a2, -1245; RV64IZHINX-NEXT: bnez s1, .LBB4_2246; RV64IZHINX-NEXT: # %bb.1:247; RV64IZHINX-NEXT: slli a1, a2, 63248; RV64IZHINX-NEXT: .LBB4_2:249; RV64IZHINX-NEXT: lui a3, 520192250; RV64IZHINX-NEXT: addi a3, a3, -1251; RV64IZHINX-NEXT: flt.s a3, a3, s0252; RV64IZHINX-NEXT: beqz a3, .LBB4_4253; RV64IZHINX-NEXT: # %bb.3:254; RV64IZHINX-NEXT: srli a1, a2, 1255; RV64IZHINX-NEXT: .LBB4_4:256; RV64IZHINX-NEXT: feq.s a2, s0, s0257; RV64IZHINX-NEXT: neg a4, s1258; RV64IZHINX-NEXT: neg a3, a3259; RV64IZHINX-NEXT: neg a2, a2260; RV64IZHINX-NEXT: and a0, a4, a0261; RV64IZHINX-NEXT: and a1, a2, a1262; RV64IZHINX-NEXT: or a0, a3, a0263; RV64IZHINX-NEXT: and a0, a2, a0264; RV64IZHINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload265; RV64IZHINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload266; RV64IZHINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload267; RV64IZHINX-NEXT: addi sp, sp, 32268; RV64IZHINX-NEXT: ret269 %1 = tail call i128 @llvm.fptosi.sat.i128.f16(half %a)270 ret i128 %1271}272 273define i128 @fptoui_sat_f16_to_i128(half %a) nounwind {274; RV64I-LABEL: fptoui_sat_f16_to_i128:275; RV64I: # %bb.0:276; RV64I-NEXT: addi sp, sp, -32277; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill278; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill279; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill280; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill281; RV64I-NEXT: call __extendhfsf2282; RV64I-NEXT: mv s0, a0283; RV64I-NEXT: lui a1, 522240284; RV64I-NEXT: addi a1, a1, -1285; RV64I-NEXT: call __gtsf2286; RV64I-NEXT: sgtz a0, a0287; RV64I-NEXT: neg s1, a0288; RV64I-NEXT: mv a0, s0289; RV64I-NEXT: li a1, 0290; RV64I-NEXT: call __gesf2291; RV64I-NEXT: srli a0, a0, 63292; RV64I-NEXT: addi s2, a0, -1293; RV64I-NEXT: mv a0, s0294; RV64I-NEXT: call __fixunssfti295; RV64I-NEXT: and a0, s2, a0296; RV64I-NEXT: and a1, s2, a1297; RV64I-NEXT: or a0, s1, a0298; RV64I-NEXT: or a1, s1, a1299; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload300; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload301; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload302; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload303; RV64I-NEXT: addi sp, sp, 32304; RV64I-NEXT: ret305;306; RV64IZFH-LABEL: fptoui_sat_f16_to_i128:307; RV64IZFH: # %bb.0:308; RV64IZFH-NEXT: addi sp, sp, -32309; RV64IZFH-NEXT: sd ra, 24(sp) # 8-byte Folded Spill310; RV64IZFH-NEXT: sd s0, 16(sp) # 8-byte Folded Spill311; RV64IZFH-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill312; RV64IZFH-NEXT: fcvt.s.h fs0, fa0313; RV64IZFH-NEXT: fmv.w.x fa5, zero314; RV64IZFH-NEXT: fle.s a0, fa5, fs0315; RV64IZFH-NEXT: neg s0, a0316; RV64IZFH-NEXT: fmv.s fa0, fs0317; RV64IZFH-NEXT: call __fixunssfti318; RV64IZFH-NEXT: and a0, s0, a0319; RV64IZFH-NEXT: lui a2, 522240320; RV64IZFH-NEXT: and a1, s0, a1321; RV64IZFH-NEXT: addi a2, a2, -1322; RV64IZFH-NEXT: fmv.w.x fa5, a2323; RV64IZFH-NEXT: flt.s a2, fa5, fs0324; RV64IZFH-NEXT: neg a2, a2325; RV64IZFH-NEXT: or a0, a2, a0326; RV64IZFH-NEXT: or a1, a2, a1327; RV64IZFH-NEXT: ld ra, 24(sp) # 8-byte Folded Reload328; RV64IZFH-NEXT: ld s0, 16(sp) # 8-byte Folded Reload329; RV64IZFH-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload330; RV64IZFH-NEXT: addi sp, sp, 32331; RV64IZFH-NEXT: ret332;333; RV64IZHINX-LABEL: fptoui_sat_f16_to_i128:334; RV64IZHINX: # %bb.0:335; RV64IZHINX-NEXT: addi sp, sp, -32336; RV64IZHINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill337; RV64IZHINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill338; RV64IZHINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill339; RV64IZHINX-NEXT: fcvt.s.h s0, a0340; RV64IZHINX-NEXT: fle.s a0, zero, s0341; RV64IZHINX-NEXT: neg s1, a0342; RV64IZHINX-NEXT: mv a0, s0343; RV64IZHINX-NEXT: call __fixunssfti344; RV64IZHINX-NEXT: and a0, s1, a0345; RV64IZHINX-NEXT: lui a2, 522240346; RV64IZHINX-NEXT: and a1, s1, a1347; RV64IZHINX-NEXT: addi a2, a2, -1348; RV64IZHINX-NEXT: flt.s a2, a2, s0349; RV64IZHINX-NEXT: neg a2, a2350; RV64IZHINX-NEXT: or a0, a2, a0351; RV64IZHINX-NEXT: or a1, a2, a1352; RV64IZHINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload353; RV64IZHINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload354; RV64IZHINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload355; RV64IZHINX-NEXT: addi sp, sp, 32356; RV64IZHINX-NEXT: ret357 %1 = tail call i128 @llvm.fptoui.sat.i128.f16(half %a)358 ret i128 %1359}360;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:361; CHECK: {{.*}}362