280 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -target-abi=lp64 -verify-machineinstrs < %s \3; RUN: | FileCheck %s -check-prefixes=CHECK,RV64I4; RUN: llc -mtriple=riscv64 -mattr=+f -target-abi=lp64f -verify-machineinstrs < %s \5; RUN: | FileCheck %s -check-prefixes=CHECK,RV64IF6; RUN: llc -mtriple=riscv64 -mattr=+zfinx -target-abi=lp64 -verify-machineinstrs < %s \7; RUN: | FileCheck %s -check-prefixes=CHECK,RV64IZFINX8 9define i128 @fptosi_f32_to_i128(float %a) nounwind {10; CHECK-LABEL: fptosi_f32_to_i128:11; CHECK: # %bb.0:12; CHECK-NEXT: addi sp, sp, -1613; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill14; CHECK-NEXT: call __fixsfti15; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload16; CHECK-NEXT: addi sp, sp, 1617; CHECK-NEXT: ret18 %1 = fptosi float %a to i12819 ret i128 %120}21 22define i128 @fptoui_f32_to_i128(float %a) nounwind {23; CHECK-LABEL: fptoui_f32_to_i128:24; CHECK: # %bb.0:25; CHECK-NEXT: addi sp, sp, -1626; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill27; CHECK-NEXT: call __fixunssfti28; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload29; CHECK-NEXT: addi sp, sp, 1630; CHECK-NEXT: ret31 %1 = fptoui float %a to i12832 ret i128 %133}34 35define float @sitofp_i128_to_f32(i128 %a) nounwind {36; CHECK-LABEL: sitofp_i128_to_f32:37; CHECK: # %bb.0:38; CHECK-NEXT: addi sp, sp, -1639; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill40; CHECK-NEXT: call __floattisf41; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload42; CHECK-NEXT: addi sp, sp, 1643; CHECK-NEXT: ret44 %1 = sitofp i128 %a to float45 ret float %146}47 48define float @uitofp_i128_to_f32(i128 %a) nounwind {49; CHECK-LABEL: uitofp_i128_to_f32:50; CHECK: # %bb.0:51; CHECK-NEXT: addi sp, sp, -1652; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill53; CHECK-NEXT: call __floatuntisf54; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload55; CHECK-NEXT: addi sp, sp, 1656; CHECK-NEXT: ret57 %1 = uitofp i128 %a to float58 ret float %159}60 61define i128 @fptosi_sat_f32_to_i128(float %a) nounwind {62; RV64I-LABEL: fptosi_sat_f32_to_i128:63; RV64I: # %bb.0:64; RV64I-NEXT: addi sp, sp, -6465; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill66; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill67; RV64I-NEXT: sd s1, 40(sp) # 8-byte Folded Spill68; RV64I-NEXT: sd s2, 32(sp) # 8-byte Folded Spill69; RV64I-NEXT: sd s3, 24(sp) # 8-byte Folded Spill70; RV64I-NEXT: sd s4, 16(sp) # 8-byte Folded Spill71; RV64I-NEXT: sd s5, 8(sp) # 8-byte Folded Spill72; RV64I-NEXT: mv s1, a073; RV64I-NEXT: lui a1, 104448074; RV64I-NEXT: call __gesf275; RV64I-NEXT: mv s2, a076; RV64I-NEXT: mv a0, s177; RV64I-NEXT: call __fixsfti78; RV64I-NEXT: mv s0, a079; RV64I-NEXT: mv s3, a180; RV64I-NEXT: li s5, -181; RV64I-NEXT: bgez s2, .LBB4_282; RV64I-NEXT: # %bb.1:83; RV64I-NEXT: slli s3, s5, 6384; RV64I-NEXT: .LBB4_2:85; RV64I-NEXT: lui a1, 52019286; RV64I-NEXT: addi a1, a1, -187; RV64I-NEXT: mv a0, s188; RV64I-NEXT: call __gtsf289; RV64I-NEXT: mv s4, a090; RV64I-NEXT: blez a0, .LBB4_491; RV64I-NEXT: # %bb.3:92; RV64I-NEXT: srli s3, s5, 193; RV64I-NEXT: .LBB4_4:94; RV64I-NEXT: mv a0, s195; RV64I-NEXT: mv a1, s196; RV64I-NEXT: call __unordsf297; RV64I-NEXT: snez a0, a098; RV64I-NEXT: srli a1, s2, 6399; RV64I-NEXT: sgtz a2, s4100; RV64I-NEXT: addi a0, a0, -1101; RV64I-NEXT: addi a3, a1, -1102; RV64I-NEXT: and a1, a0, s3103; RV64I-NEXT: and a3, a3, s0104; RV64I-NEXT: neg a2, a2105; RV64I-NEXT: or a2, a2, a3106; RV64I-NEXT: and a0, a0, a2107; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload108; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload109; RV64I-NEXT: ld s1, 40(sp) # 8-byte Folded Reload110; RV64I-NEXT: ld s2, 32(sp) # 8-byte Folded Reload111; RV64I-NEXT: ld s3, 24(sp) # 8-byte Folded Reload112; RV64I-NEXT: ld s4, 16(sp) # 8-byte Folded Reload113; RV64I-NEXT: ld s5, 8(sp) # 8-byte Folded Reload114; RV64I-NEXT: addi sp, sp, 64115; RV64I-NEXT: ret116;117; RV64IF-LABEL: fptosi_sat_f32_to_i128:118; RV64IF: # %bb.0:119; RV64IF-NEXT: addi sp, sp, -32120; RV64IF-NEXT: sd ra, 24(sp) # 8-byte Folded Spill121; RV64IF-NEXT: sd s0, 16(sp) # 8-byte Folded Spill122; RV64IF-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill123; RV64IF-NEXT: fmv.s fs0, fa0124; RV64IF-NEXT: lui a0, 1044480125; RV64IF-NEXT: fmv.w.x fa5, a0126; RV64IF-NEXT: fle.s s0, fa5, fa0127; RV64IF-NEXT: call __fixsfti128; RV64IF-NEXT: li a2, -1129; RV64IF-NEXT: bnez s0, .LBB4_2130; RV64IF-NEXT: # %bb.1:131; RV64IF-NEXT: slli a1, a2, 63132; RV64IF-NEXT: .LBB4_2:133; RV64IF-NEXT: lui a3, 520192134; RV64IF-NEXT: addi a3, a3, -1135; RV64IF-NEXT: fmv.w.x fa5, a3136; RV64IF-NEXT: flt.s a3, fa5, fs0137; RV64IF-NEXT: beqz a3, .LBB4_4138; RV64IF-NEXT: # %bb.3:139; RV64IF-NEXT: srli a1, a2, 1140; RV64IF-NEXT: .LBB4_4:141; RV64IF-NEXT: feq.s a2, fs0, fs0142; RV64IF-NEXT: neg a4, s0143; RV64IF-NEXT: neg a3, a3144; RV64IF-NEXT: neg a2, a2145; RV64IF-NEXT: and a0, a4, a0146; RV64IF-NEXT: and a1, a2, a1147; RV64IF-NEXT: or a0, a3, a0148; RV64IF-NEXT: and a0, a2, a0149; RV64IF-NEXT: ld ra, 24(sp) # 8-byte Folded Reload150; RV64IF-NEXT: ld s0, 16(sp) # 8-byte Folded Reload151; RV64IF-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload152; RV64IF-NEXT: addi sp, sp, 32153; RV64IF-NEXT: ret154;155; RV64IZFINX-LABEL: fptosi_sat_f32_to_i128:156; RV64IZFINX: # %bb.0:157; RV64IZFINX-NEXT: addi sp, sp, -32158; RV64IZFINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill159; RV64IZFINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill160; RV64IZFINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill161; RV64IZFINX-NEXT: mv s0, a0162; RV64IZFINX-NEXT: lui a0, 1044480163; RV64IZFINX-NEXT: fle.s s1, a0, s0164; RV64IZFINX-NEXT: mv a0, s0165; RV64IZFINX-NEXT: call __fixsfti166; RV64IZFINX-NEXT: li a2, -1167; RV64IZFINX-NEXT: bnez s1, .LBB4_2168; RV64IZFINX-NEXT: # %bb.1:169; RV64IZFINX-NEXT: slli a1, a2, 63170; RV64IZFINX-NEXT: .LBB4_2:171; RV64IZFINX-NEXT: lui a3, 520192172; RV64IZFINX-NEXT: addi a3, a3, -1173; RV64IZFINX-NEXT: flt.s a3, a3, s0174; RV64IZFINX-NEXT: beqz a3, .LBB4_4175; RV64IZFINX-NEXT: # %bb.3:176; RV64IZFINX-NEXT: srli a1, a2, 1177; RV64IZFINX-NEXT: .LBB4_4:178; RV64IZFINX-NEXT: feq.s a2, s0, s0179; RV64IZFINX-NEXT: neg a4, s1180; RV64IZFINX-NEXT: neg a3, a3181; RV64IZFINX-NEXT: neg a2, a2182; RV64IZFINX-NEXT: and a0, a4, a0183; RV64IZFINX-NEXT: and a1, a2, a1184; RV64IZFINX-NEXT: or a0, a3, a0185; RV64IZFINX-NEXT: and a0, a2, a0186; RV64IZFINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload187; RV64IZFINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload188; RV64IZFINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload189; RV64IZFINX-NEXT: addi sp, sp, 32190; RV64IZFINX-NEXT: ret191 %1 = tail call i128 @llvm.fptosi.sat.i128.f32(float %a)192 ret i128 %1193}194 195define i128 @fptoui_sat_f32_to_i128(float %a) nounwind {196; RV64I-LABEL: fptoui_sat_f32_to_i128:197; RV64I: # %bb.0:198; RV64I-NEXT: addi sp, sp, -32199; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill200; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill201; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill202; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill203; RV64I-NEXT: mv s0, a0204; RV64I-NEXT: lui a1, 522240205; RV64I-NEXT: addi a1, a1, -1206; RV64I-NEXT: call __gtsf2207; RV64I-NEXT: sgtz a0, a0208; RV64I-NEXT: neg s1, a0209; RV64I-NEXT: mv a0, s0210; RV64I-NEXT: li a1, 0211; RV64I-NEXT: call __gesf2212; RV64I-NEXT: srli a0, a0, 63213; RV64I-NEXT: addi s2, a0, -1214; RV64I-NEXT: mv a0, s0215; RV64I-NEXT: call __fixunssfti216; RV64I-NEXT: and a0, s2, a0217; RV64I-NEXT: and a1, s2, a1218; RV64I-NEXT: or a0, s1, a0219; RV64I-NEXT: or a1, s1, a1220; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload221; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload222; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload223; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload224; RV64I-NEXT: addi sp, sp, 32225; RV64I-NEXT: ret226;227; RV64IF-LABEL: fptoui_sat_f32_to_i128:228; RV64IF: # %bb.0:229; RV64IF-NEXT: addi sp, sp, -32230; RV64IF-NEXT: sd ra, 24(sp) # 8-byte Folded Spill231; RV64IF-NEXT: sd s0, 16(sp) # 8-byte Folded Spill232; RV64IF-NEXT: fsw fs0, 12(sp) # 4-byte Folded Spill233; RV64IF-NEXT: fmv.s fs0, fa0234; RV64IF-NEXT: fmv.w.x fa5, zero235; RV64IF-NEXT: fle.s a0, fa5, fa0236; RV64IF-NEXT: neg s0, a0237; RV64IF-NEXT: call __fixunssfti238; RV64IF-NEXT: and a0, s0, a0239; RV64IF-NEXT: lui a2, 522240240; RV64IF-NEXT: and a1, s0, a1241; RV64IF-NEXT: addi a2, a2, -1242; RV64IF-NEXT: fmv.w.x fa5, a2243; RV64IF-NEXT: flt.s a2, fa5, fs0244; RV64IF-NEXT: neg a2, a2245; RV64IF-NEXT: or a0, a2, a0246; RV64IF-NEXT: or a1, a2, a1247; RV64IF-NEXT: ld ra, 24(sp) # 8-byte Folded Reload248; RV64IF-NEXT: ld s0, 16(sp) # 8-byte Folded Reload249; RV64IF-NEXT: flw fs0, 12(sp) # 4-byte Folded Reload250; RV64IF-NEXT: addi sp, sp, 32251; RV64IF-NEXT: ret252;253; RV64IZFINX-LABEL: fptoui_sat_f32_to_i128:254; RV64IZFINX: # %bb.0:255; RV64IZFINX-NEXT: addi sp, sp, -32256; RV64IZFINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill257; RV64IZFINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill258; RV64IZFINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill259; RV64IZFINX-NEXT: mv s0, a0260; RV64IZFINX-NEXT: fle.s a0, zero, a0261; RV64IZFINX-NEXT: neg s1, a0262; RV64IZFINX-NEXT: mv a0, s0263; RV64IZFINX-NEXT: call __fixunssfti264; RV64IZFINX-NEXT: and a0, s1, a0265; RV64IZFINX-NEXT: lui a2, 522240266; RV64IZFINX-NEXT: and a1, s1, a1267; RV64IZFINX-NEXT: addi a2, a2, -1268; RV64IZFINX-NEXT: flt.s a2, a2, s0269; RV64IZFINX-NEXT: neg a2, a2270; RV64IZFINX-NEXT: or a0, a2, a0271; RV64IZFINX-NEXT: or a1, a2, a1272; RV64IZFINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload273; RV64IZFINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload274; RV64IZFINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload275; RV64IZFINX-NEXT: addi sp, sp, 32276; RV64IZFINX-NEXT: ret277 %1 = tail call i128 @llvm.fptoui.sat.i128.f32(float %a)278 ret i128 %1279}280