3875 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32f | FileCheck -check-prefixes=RV32,RV32IF %s4; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \5; RUN: -target-abi=lp64f | FileCheck -check-prefixes=RV64,RV64IF %s6; RUN: llc -mtriple=riscv32 -mattr=+f,+d -verify-machineinstrs < %s \7; RUN: -target-abi=ilp32d | FileCheck -check-prefixes=RV32,RV32IFD %s8; RUN: llc -mtriple=riscv64 -mattr=+f,+d -verify-machineinstrs < %s \9; RUN: -target-abi=lp64d | FileCheck -check-prefixes=RV64,RV64IFD %s10 11; i32 saturate12 13define i32 @stest_f64i32(double %x) {14; RV32IF-LABEL: stest_f64i32:15; RV32IF: # %bb.0: # %entry16; RV32IF-NEXT: addi sp, sp, -1617; RV32IF-NEXT: .cfi_def_cfa_offset 1618; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill19; RV32IF-NEXT: .cfi_offset ra, -420; RV32IF-NEXT: call __fixdfdi21; RV32IF-NEXT: lui a2, 52428822; RV32IF-NEXT: addi a3, a2, -123; RV32IF-NEXT: beqz a1, .LBB0_224; RV32IF-NEXT: # %bb.1: # %entry25; RV32IF-NEXT: srli a4, a1, 3126; RV32IF-NEXT: j .LBB0_327; RV32IF-NEXT: .LBB0_2:28; RV32IF-NEXT: sltu a4, a0, a329; RV32IF-NEXT: .LBB0_3: # %entry30; RV32IF-NEXT: neg a5, a431; RV32IF-NEXT: and a1, a5, a132; RV32IF-NEXT: bnez a4, .LBB0_533; RV32IF-NEXT: # %bb.4: # %entry34; RV32IF-NEXT: mv a0, a335; RV32IF-NEXT: .LBB0_5: # %entry36; RV32IF-NEXT: li a3, -137; RV32IF-NEXT: beq a1, a3, .LBB0_738; RV32IF-NEXT: # %bb.6: # %entry39; RV32IF-NEXT: srli a1, a1, 3140; RV32IF-NEXT: xori a1, a1, 141; RV32IF-NEXT: beqz a1, .LBB0_842; RV32IF-NEXT: j .LBB0_943; RV32IF-NEXT: .LBB0_7:44; RV32IF-NEXT: sltu a1, a2, a045; RV32IF-NEXT: bnez a1, .LBB0_946; RV32IF-NEXT: .LBB0_8: # %entry47; RV32IF-NEXT: lui a0, 52428848; RV32IF-NEXT: .LBB0_9: # %entry49; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload50; RV32IF-NEXT: .cfi_restore ra51; RV32IF-NEXT: addi sp, sp, 1652; RV32IF-NEXT: .cfi_def_cfa_offset 053; RV32IF-NEXT: ret54;55; RV64IF-LABEL: stest_f64i32:56; RV64IF: # %bb.0: # %entry57; RV64IF-NEXT: addi sp, sp, -1658; RV64IF-NEXT: .cfi_def_cfa_offset 1659; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill60; RV64IF-NEXT: .cfi_offset ra, -861; RV64IF-NEXT: call __fixdfdi62; RV64IF-NEXT: lui a1, 52428863; RV64IF-NEXT: addiw a2, a1, -164; RV64IF-NEXT: blt a0, a2, .LBB0_265; RV64IF-NEXT: # %bb.1: # %entry66; RV64IF-NEXT: mv a0, a267; RV64IF-NEXT: .LBB0_2: # %entry68; RV64IF-NEXT: blt a1, a0, .LBB0_469; RV64IF-NEXT: # %bb.3: # %entry70; RV64IF-NEXT: lui a0, 52428871; RV64IF-NEXT: .LBB0_4: # %entry72; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload73; RV64IF-NEXT: .cfi_restore ra74; RV64IF-NEXT: addi sp, sp, 1675; RV64IF-NEXT: .cfi_def_cfa_offset 076; RV64IF-NEXT: ret77;78; RV32IFD-LABEL: stest_f64i32:79; RV32IFD: # %bb.0: # %entry80; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz81; RV32IFD-NEXT: feq.d a1, fa0, fa082; RV32IFD-NEXT: seqz a1, a183; RV32IFD-NEXT: addi a1, a1, -184; RV32IFD-NEXT: and a0, a1, a085; RV32IFD-NEXT: ret86;87; RV64IFD-LABEL: stest_f64i32:88; RV64IFD: # %bb.0: # %entry89; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz90; RV64IFD-NEXT: lui a1, 52428891; RV64IFD-NEXT: addiw a2, a1, -192; RV64IFD-NEXT: bge a0, a2, .LBB0_393; RV64IFD-NEXT: # %bb.1: # %entry94; RV64IFD-NEXT: bge a1, a0, .LBB0_495; RV64IFD-NEXT: .LBB0_2: # %entry96; RV64IFD-NEXT: ret97; RV64IFD-NEXT: .LBB0_3: # %entry98; RV64IFD-NEXT: mv a0, a299; RV64IFD-NEXT: blt a1, a2, .LBB0_2100; RV64IFD-NEXT: .LBB0_4: # %entry101; RV64IFD-NEXT: lui a0, 524288102; RV64IFD-NEXT: ret103entry:104 %conv = fptosi double %x to i64105 %0 = icmp slt i64 %conv, 2147483647106 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647107 %1 = icmp sgt i64 %spec.store.select, -2147483648108 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648109 %conv6 = trunc i64 %spec.store.select7 to i32110 ret i32 %conv6111}112 113define i32 @utest_f64i32(double %x) {114; RV32IF-LABEL: utest_f64i32:115; RV32IF: # %bb.0: # %entry116; RV32IF-NEXT: addi sp, sp, -16117; RV32IF-NEXT: .cfi_def_cfa_offset 16118; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill119; RV32IF-NEXT: .cfi_offset ra, -4120; RV32IF-NEXT: call __fixunsdfdi121; RV32IF-NEXT: sltiu a2, a0, -1122; RV32IF-NEXT: seqz a1, a1123; RV32IF-NEXT: and a1, a1, a2124; RV32IF-NEXT: addi a1, a1, -1125; RV32IF-NEXT: or a0, a1, a0126; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload127; RV32IF-NEXT: .cfi_restore ra128; RV32IF-NEXT: addi sp, sp, 16129; RV32IF-NEXT: .cfi_def_cfa_offset 0130; RV32IF-NEXT: ret131;132; RV64IF-LABEL: utest_f64i32:133; RV64IF: # %bb.0: # %entry134; RV64IF-NEXT: addi sp, sp, -16135; RV64IF-NEXT: .cfi_def_cfa_offset 16136; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill137; RV64IF-NEXT: .cfi_offset ra, -8138; RV64IF-NEXT: call __fixunsdfdi139; RV64IF-NEXT: li a1, -1140; RV64IF-NEXT: srli a1, a1, 32141; RV64IF-NEXT: bltu a0, a1, .LBB1_2142; RV64IF-NEXT: # %bb.1: # %entry143; RV64IF-NEXT: mv a0, a1144; RV64IF-NEXT: .LBB1_2: # %entry145; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload146; RV64IF-NEXT: .cfi_restore ra147; RV64IF-NEXT: addi sp, sp, 16148; RV64IF-NEXT: .cfi_def_cfa_offset 0149; RV64IF-NEXT: ret150;151; RV32IFD-LABEL: utest_f64i32:152; RV32IFD: # %bb.0: # %entry153; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz154; RV32IFD-NEXT: feq.d a1, fa0, fa0155; RV32IFD-NEXT: seqz a1, a1156; RV32IFD-NEXT: addi a1, a1, -1157; RV32IFD-NEXT: and a0, a1, a0158; RV32IFD-NEXT: ret159;160; RV64IFD-LABEL: utest_f64i32:161; RV64IFD: # %bb.0: # %entry162; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz163; RV64IFD-NEXT: li a1, -1164; RV64IFD-NEXT: srli a1, a1, 32165; RV64IFD-NEXT: bltu a0, a1, .LBB1_2166; RV64IFD-NEXT: # %bb.1: # %entry167; RV64IFD-NEXT: mv a0, a1168; RV64IFD-NEXT: .LBB1_2: # %entry169; RV64IFD-NEXT: ret170entry:171 %conv = fptoui double %x to i64172 %0 = icmp ult i64 %conv, 4294967295173 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295174 %conv6 = trunc i64 %spec.store.select to i32175 ret i32 %conv6176}177 178define i32 @ustest_f64i32(double %x) {179; RV32IF-LABEL: ustest_f64i32:180; RV32IF: # %bb.0: # %entry181; RV32IF-NEXT: addi sp, sp, -16182; RV32IF-NEXT: .cfi_def_cfa_offset 16183; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill184; RV32IF-NEXT: .cfi_offset ra, -4185; RV32IF-NEXT: call __fixdfdi186; RV32IF-NEXT: beqz a1, .LBB2_2187; RV32IF-NEXT: # %bb.1: # %entry188; RV32IF-NEXT: srli a2, a1, 31189; RV32IF-NEXT: j .LBB2_3190; RV32IF-NEXT: .LBB2_2:191; RV32IF-NEXT: sltiu a2, a0, -1192; RV32IF-NEXT: .LBB2_3: # %entry193; RV32IF-NEXT: addi a3, a2, -1194; RV32IF-NEXT: neg a2, a2195; RV32IF-NEXT: and a1, a2, a1196; RV32IF-NEXT: or a0, a3, a0197; RV32IF-NEXT: beqz a1, .LBB2_5198; RV32IF-NEXT: # %bb.4: # %entry199; RV32IF-NEXT: sgtz a1, a1200; RV32IF-NEXT: j .LBB2_6201; RV32IF-NEXT: .LBB2_5:202; RV32IF-NEXT: snez a1, a0203; RV32IF-NEXT: .LBB2_6: # %entry204; RV32IF-NEXT: neg a1, a1205; RV32IF-NEXT: and a0, a1, a0206; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload207; RV32IF-NEXT: .cfi_restore ra208; RV32IF-NEXT: addi sp, sp, 16209; RV32IF-NEXT: .cfi_def_cfa_offset 0210; RV32IF-NEXT: ret211;212; RV64IF-LABEL: ustest_f64i32:213; RV64IF: # %bb.0: # %entry214; RV64IF-NEXT: addi sp, sp, -16215; RV64IF-NEXT: .cfi_def_cfa_offset 16216; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill217; RV64IF-NEXT: .cfi_offset ra, -8218; RV64IF-NEXT: call __fixdfdi219; RV64IF-NEXT: li a1, -1220; RV64IF-NEXT: srli a1, a1, 32221; RV64IF-NEXT: blt a0, a1, .LBB2_2222; RV64IF-NEXT: # %bb.1: # %entry223; RV64IF-NEXT: mv a0, a1224; RV64IF-NEXT: .LBB2_2: # %entry225; RV64IF-NEXT: sgtz a1, a0226; RV64IF-NEXT: neg a1, a1227; RV64IF-NEXT: and a0, a1, a0228; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload229; RV64IF-NEXT: .cfi_restore ra230; RV64IF-NEXT: addi sp, sp, 16231; RV64IF-NEXT: .cfi_def_cfa_offset 0232; RV64IF-NEXT: ret233;234; RV32IFD-LABEL: ustest_f64i32:235; RV32IFD: # %bb.0: # %entry236; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz237; RV32IFD-NEXT: feq.d a1, fa0, fa0238; RV32IFD-NEXT: seqz a1, a1239; RV32IFD-NEXT: addi a1, a1, -1240; RV32IFD-NEXT: and a0, a1, a0241; RV32IFD-NEXT: ret242;243; RV64IFD-LABEL: ustest_f64i32:244; RV64IFD: # %bb.0: # %entry245; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz246; RV64IFD-NEXT: li a1, -1247; RV64IFD-NEXT: srli a1, a1, 32248; RV64IFD-NEXT: blt a0, a1, .LBB2_2249; RV64IFD-NEXT: # %bb.1: # %entry250; RV64IFD-NEXT: mv a0, a1251; RV64IFD-NEXT: .LBB2_2: # %entry252; RV64IFD-NEXT: sgtz a1, a0253; RV64IFD-NEXT: neg a1, a1254; RV64IFD-NEXT: and a0, a1, a0255; RV64IFD-NEXT: ret256entry:257 %conv = fptosi double %x to i64258 %0 = icmp slt i64 %conv, 4294967295259 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295260 %1 = icmp sgt i64 %spec.store.select, 0261 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0262 %conv6 = trunc i64 %spec.store.select7 to i32263 ret i32 %conv6264}265 266define i32 @stest_f32i32(float %x) {267; RV32-LABEL: stest_f32i32:268; RV32: # %bb.0: # %entry269; RV32-NEXT: fcvt.w.s a0, fa0, rtz270; RV32-NEXT: feq.s a1, fa0, fa0271; RV32-NEXT: seqz a1, a1272; RV32-NEXT: addi a1, a1, -1273; RV32-NEXT: and a0, a1, a0274; RV32-NEXT: ret275;276; RV64-LABEL: stest_f32i32:277; RV64: # %bb.0: # %entry278; RV64-NEXT: fcvt.l.s a0, fa0, rtz279; RV64-NEXT: lui a1, 524288280; RV64-NEXT: addiw a2, a1, -1281; RV64-NEXT: bge a0, a2, .LBB3_3282; RV64-NEXT: # %bb.1: # %entry283; RV64-NEXT: bge a1, a0, .LBB3_4284; RV64-NEXT: .LBB3_2: # %entry285; RV64-NEXT: ret286; RV64-NEXT: .LBB3_3: # %entry287; RV64-NEXT: mv a0, a2288; RV64-NEXT: blt a1, a2, .LBB3_2289; RV64-NEXT: .LBB3_4: # %entry290; RV64-NEXT: lui a0, 524288291; RV64-NEXT: ret292entry:293 %conv = fptosi float %x to i64294 %0 = icmp slt i64 %conv, 2147483647295 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647296 %1 = icmp sgt i64 %spec.store.select, -2147483648297 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648298 %conv6 = trunc i64 %spec.store.select7 to i32299 ret i32 %conv6300}301 302define i32 @utest_f32i32(float %x) {303; RV32-LABEL: utest_f32i32:304; RV32: # %bb.0: # %entry305; RV32-NEXT: fcvt.wu.s a0, fa0, rtz306; RV32-NEXT: feq.s a1, fa0, fa0307; RV32-NEXT: seqz a1, a1308; RV32-NEXT: addi a1, a1, -1309; RV32-NEXT: and a0, a1, a0310; RV32-NEXT: ret311;312; RV64-LABEL: utest_f32i32:313; RV64: # %bb.0: # %entry314; RV64-NEXT: fcvt.lu.s a0, fa0, rtz315; RV64-NEXT: li a1, -1316; RV64-NEXT: srli a1, a1, 32317; RV64-NEXT: bltu a0, a1, .LBB4_2318; RV64-NEXT: # %bb.1: # %entry319; RV64-NEXT: mv a0, a1320; RV64-NEXT: .LBB4_2: # %entry321; RV64-NEXT: ret322entry:323 %conv = fptoui float %x to i64324 %0 = icmp ult i64 %conv, 4294967295325 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295326 %conv6 = trunc i64 %spec.store.select to i32327 ret i32 %conv6328}329 330define i32 @ustest_f32i32(float %x) {331; RV32-LABEL: ustest_f32i32:332; RV32: # %bb.0: # %entry333; RV32-NEXT: fcvt.wu.s a0, fa0, rtz334; RV32-NEXT: feq.s a1, fa0, fa0335; RV32-NEXT: seqz a1, a1336; RV32-NEXT: addi a1, a1, -1337; RV32-NEXT: and a0, a1, a0338; RV32-NEXT: ret339;340; RV64-LABEL: ustest_f32i32:341; RV64: # %bb.0: # %entry342; RV64-NEXT: fcvt.l.s a0, fa0, rtz343; RV64-NEXT: li a1, -1344; RV64-NEXT: srli a1, a1, 32345; RV64-NEXT: blt a0, a1, .LBB5_2346; RV64-NEXT: # %bb.1: # %entry347; RV64-NEXT: mv a0, a1348; RV64-NEXT: .LBB5_2: # %entry349; RV64-NEXT: sgtz a1, a0350; RV64-NEXT: neg a1, a1351; RV64-NEXT: and a0, a1, a0352; RV64-NEXT: ret353entry:354 %conv = fptosi float %x to i64355 %0 = icmp slt i64 %conv, 4294967295356 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295357 %1 = icmp sgt i64 %spec.store.select, 0358 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0359 %conv6 = trunc i64 %spec.store.select7 to i32360 ret i32 %conv6361}362 363define i32 @stest_f16i32(half %x) {364; RV32-LABEL: stest_f16i32:365; RV32: # %bb.0: # %entry366; RV32-NEXT: addi sp, sp, -16367; RV32-NEXT: .cfi_def_cfa_offset 16368; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill369; RV32-NEXT: .cfi_offset ra, -4370; RV32-NEXT: call __extendhfsf2371; RV32-NEXT: call __fixsfdi372; RV32-NEXT: lui a2, 524288373; RV32-NEXT: addi a3, a2, -1374; RV32-NEXT: beqz a1, .LBB6_2375; RV32-NEXT: # %bb.1: # %entry376; RV32-NEXT: srli a4, a1, 31377; RV32-NEXT: j .LBB6_3378; RV32-NEXT: .LBB6_2:379; RV32-NEXT: sltu a4, a0, a3380; RV32-NEXT: .LBB6_3: # %entry381; RV32-NEXT: neg a5, a4382; RV32-NEXT: and a1, a5, a1383; RV32-NEXT: bnez a4, .LBB6_5384; RV32-NEXT: # %bb.4: # %entry385; RV32-NEXT: mv a0, a3386; RV32-NEXT: .LBB6_5: # %entry387; RV32-NEXT: li a3, -1388; RV32-NEXT: beq a1, a3, .LBB6_7389; RV32-NEXT: # %bb.6: # %entry390; RV32-NEXT: srli a1, a1, 31391; RV32-NEXT: xori a1, a1, 1392; RV32-NEXT: beqz a1, .LBB6_8393; RV32-NEXT: j .LBB6_9394; RV32-NEXT: .LBB6_7:395; RV32-NEXT: sltu a1, a2, a0396; RV32-NEXT: bnez a1, .LBB6_9397; RV32-NEXT: .LBB6_8: # %entry398; RV32-NEXT: lui a0, 524288399; RV32-NEXT: .LBB6_9: # %entry400; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload401; RV32-NEXT: .cfi_restore ra402; RV32-NEXT: addi sp, sp, 16403; RV32-NEXT: .cfi_def_cfa_offset 0404; RV32-NEXT: ret405;406; RV64-LABEL: stest_f16i32:407; RV64: # %bb.0: # %entry408; RV64-NEXT: addi sp, sp, -16409; RV64-NEXT: .cfi_def_cfa_offset 16410; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill411; RV64-NEXT: .cfi_offset ra, -8412; RV64-NEXT: call __extendhfsf2413; RV64-NEXT: fcvt.l.s a0, fa0, rtz414; RV64-NEXT: lui a1, 524288415; RV64-NEXT: addiw a2, a1, -1416; RV64-NEXT: blt a0, a2, .LBB6_2417; RV64-NEXT: # %bb.1: # %entry418; RV64-NEXT: mv a0, a2419; RV64-NEXT: .LBB6_2: # %entry420; RV64-NEXT: blt a1, a0, .LBB6_4421; RV64-NEXT: # %bb.3: # %entry422; RV64-NEXT: lui a0, 524288423; RV64-NEXT: .LBB6_4: # %entry424; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload425; RV64-NEXT: .cfi_restore ra426; RV64-NEXT: addi sp, sp, 16427; RV64-NEXT: .cfi_def_cfa_offset 0428; RV64-NEXT: ret429entry:430 %conv = fptosi half %x to i64431 %0 = icmp slt i64 %conv, 2147483647432 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647433 %1 = icmp sgt i64 %spec.store.select, -2147483648434 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648435 %conv6 = trunc i64 %spec.store.select7 to i32436 ret i32 %conv6437}438 439define i32 @utest_f16i32(half %x) {440; RV32-LABEL: utest_f16i32:441; RV32: # %bb.0: # %entry442; RV32-NEXT: addi sp, sp, -16443; RV32-NEXT: .cfi_def_cfa_offset 16444; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill445; RV32-NEXT: .cfi_offset ra, -4446; RV32-NEXT: call __extendhfsf2447; RV32-NEXT: call __fixunssfdi448; RV32-NEXT: sltiu a2, a0, -1449; RV32-NEXT: seqz a1, a1450; RV32-NEXT: and a1, a1, a2451; RV32-NEXT: addi a1, a1, -1452; RV32-NEXT: or a0, a1, a0453; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload454; RV32-NEXT: .cfi_restore ra455; RV32-NEXT: addi sp, sp, 16456; RV32-NEXT: .cfi_def_cfa_offset 0457; RV32-NEXT: ret458;459; RV64-LABEL: utest_f16i32:460; RV64: # %bb.0: # %entry461; RV64-NEXT: addi sp, sp, -16462; RV64-NEXT: .cfi_def_cfa_offset 16463; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill464; RV64-NEXT: .cfi_offset ra, -8465; RV64-NEXT: call __extendhfsf2466; RV64-NEXT: fcvt.lu.s a0, fa0, rtz467; RV64-NEXT: li a1, -1468; RV64-NEXT: srli a1, a1, 32469; RV64-NEXT: bltu a0, a1, .LBB7_2470; RV64-NEXT: # %bb.1: # %entry471; RV64-NEXT: mv a0, a1472; RV64-NEXT: .LBB7_2: # %entry473; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload474; RV64-NEXT: .cfi_restore ra475; RV64-NEXT: addi sp, sp, 16476; RV64-NEXT: .cfi_def_cfa_offset 0477; RV64-NEXT: ret478entry:479 %conv = fptoui half %x to i64480 %0 = icmp ult i64 %conv, 4294967295481 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295482 %conv6 = trunc i64 %spec.store.select to i32483 ret i32 %conv6484}485 486define i32 @ustest_f16i32(half %x) {487; RV32-LABEL: ustest_f16i32:488; RV32: # %bb.0: # %entry489; RV32-NEXT: addi sp, sp, -16490; RV32-NEXT: .cfi_def_cfa_offset 16491; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill492; RV32-NEXT: .cfi_offset ra, -4493; RV32-NEXT: call __extendhfsf2494; RV32-NEXT: call __fixsfdi495; RV32-NEXT: beqz a1, .LBB8_2496; RV32-NEXT: # %bb.1: # %entry497; RV32-NEXT: srli a2, a1, 31498; RV32-NEXT: j .LBB8_3499; RV32-NEXT: .LBB8_2:500; RV32-NEXT: sltiu a2, a0, -1501; RV32-NEXT: .LBB8_3: # %entry502; RV32-NEXT: addi a3, a2, -1503; RV32-NEXT: neg a2, a2504; RV32-NEXT: and a1, a2, a1505; RV32-NEXT: or a0, a3, a0506; RV32-NEXT: beqz a1, .LBB8_5507; RV32-NEXT: # %bb.4: # %entry508; RV32-NEXT: sgtz a1, a1509; RV32-NEXT: j .LBB8_6510; RV32-NEXT: .LBB8_5:511; RV32-NEXT: snez a1, a0512; RV32-NEXT: .LBB8_6: # %entry513; RV32-NEXT: neg a1, a1514; RV32-NEXT: and a0, a1, a0515; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload516; RV32-NEXT: .cfi_restore ra517; RV32-NEXT: addi sp, sp, 16518; RV32-NEXT: .cfi_def_cfa_offset 0519; RV32-NEXT: ret520;521; RV64-LABEL: ustest_f16i32:522; RV64: # %bb.0: # %entry523; RV64-NEXT: addi sp, sp, -16524; RV64-NEXT: .cfi_def_cfa_offset 16525; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill526; RV64-NEXT: .cfi_offset ra, -8527; RV64-NEXT: call __extendhfsf2528; RV64-NEXT: fcvt.l.s a0, fa0, rtz529; RV64-NEXT: li a1, -1530; RV64-NEXT: srli a1, a1, 32531; RV64-NEXT: blt a0, a1, .LBB8_2532; RV64-NEXT: # %bb.1: # %entry533; RV64-NEXT: mv a0, a1534; RV64-NEXT: .LBB8_2: # %entry535; RV64-NEXT: sgtz a1, a0536; RV64-NEXT: neg a1, a1537; RV64-NEXT: and a0, a1, a0538; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload539; RV64-NEXT: .cfi_restore ra540; RV64-NEXT: addi sp, sp, 16541; RV64-NEXT: .cfi_def_cfa_offset 0542; RV64-NEXT: ret543entry:544 %conv = fptosi half %x to i64545 %0 = icmp slt i64 %conv, 4294967295546 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295547 %1 = icmp sgt i64 %spec.store.select, 0548 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0549 %conv6 = trunc i64 %spec.store.select7 to i32550 ret i32 %conv6551}552 553; i16 saturate554 555define i16 @stest_f64i16(double %x) {556; RV32IF-LABEL: stest_f64i16:557; RV32IF: # %bb.0: # %entry558; RV32IF-NEXT: addi sp, sp, -16559; RV32IF-NEXT: .cfi_def_cfa_offset 16560; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill561; RV32IF-NEXT: .cfi_offset ra, -4562; RV32IF-NEXT: call __fixdfsi563; RV32IF-NEXT: lui a1, 8564; RV32IF-NEXT: addi a1, a1, -1565; RV32IF-NEXT: blt a0, a1, .LBB9_2566; RV32IF-NEXT: # %bb.1: # %entry567; RV32IF-NEXT: mv a0, a1568; RV32IF-NEXT: .LBB9_2: # %entry569; RV32IF-NEXT: lui a1, 1048568570; RV32IF-NEXT: blt a1, a0, .LBB9_4571; RV32IF-NEXT: # %bb.3: # %entry572; RV32IF-NEXT: lui a0, 1048568573; RV32IF-NEXT: .LBB9_4: # %entry574; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload575; RV32IF-NEXT: .cfi_restore ra576; RV32IF-NEXT: addi sp, sp, 16577; RV32IF-NEXT: .cfi_def_cfa_offset 0578; RV32IF-NEXT: ret579;580; RV64IF-LABEL: stest_f64i16:581; RV64IF: # %bb.0: # %entry582; RV64IF-NEXT: addi sp, sp, -16583; RV64IF-NEXT: .cfi_def_cfa_offset 16584; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill585; RV64IF-NEXT: .cfi_offset ra, -8586; RV64IF-NEXT: call __fixdfsi587; RV64IF-NEXT: lui a1, 8588; RV64IF-NEXT: addi a1, a1, -1589; RV64IF-NEXT: blt a0, a1, .LBB9_2590; RV64IF-NEXT: # %bb.1: # %entry591; RV64IF-NEXT: mv a0, a1592; RV64IF-NEXT: .LBB9_2: # %entry593; RV64IF-NEXT: lui a1, 1048568594; RV64IF-NEXT: blt a1, a0, .LBB9_4595; RV64IF-NEXT: # %bb.3: # %entry596; RV64IF-NEXT: lui a0, 1048568597; RV64IF-NEXT: .LBB9_4: # %entry598; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload599; RV64IF-NEXT: .cfi_restore ra600; RV64IF-NEXT: addi sp, sp, 16601; RV64IF-NEXT: .cfi_def_cfa_offset 0602; RV64IF-NEXT: ret603;604; RV32IFD-LABEL: stest_f64i16:605; RV32IFD: # %bb.0: # %entry606; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz607; RV32IFD-NEXT: lui a1, 8608; RV32IFD-NEXT: addi a1, a1, -1609; RV32IFD-NEXT: bge a0, a1, .LBB9_3610; RV32IFD-NEXT: # %bb.1: # %entry611; RV32IFD-NEXT: lui a1, 1048568612; RV32IFD-NEXT: bge a1, a0, .LBB9_4613; RV32IFD-NEXT: .LBB9_2: # %entry614; RV32IFD-NEXT: ret615; RV32IFD-NEXT: .LBB9_3: # %entry616; RV32IFD-NEXT: mv a0, a1617; RV32IFD-NEXT: lui a1, 1048568618; RV32IFD-NEXT: blt a1, a0, .LBB9_2619; RV32IFD-NEXT: .LBB9_4: # %entry620; RV32IFD-NEXT: lui a0, 1048568621; RV32IFD-NEXT: ret622;623; RV64IFD-LABEL: stest_f64i16:624; RV64IFD: # %bb.0: # %entry625; RV64IFD-NEXT: fcvt.w.d a0, fa0, rtz626; RV64IFD-NEXT: lui a1, 8627; RV64IFD-NEXT: addi a1, a1, -1628; RV64IFD-NEXT: bge a0, a1, .LBB9_3629; RV64IFD-NEXT: # %bb.1: # %entry630; RV64IFD-NEXT: lui a1, 1048568631; RV64IFD-NEXT: bge a1, a0, .LBB9_4632; RV64IFD-NEXT: .LBB9_2: # %entry633; RV64IFD-NEXT: ret634; RV64IFD-NEXT: .LBB9_3: # %entry635; RV64IFD-NEXT: mv a0, a1636; RV64IFD-NEXT: lui a1, 1048568637; RV64IFD-NEXT: blt a1, a0, .LBB9_2638; RV64IFD-NEXT: .LBB9_4: # %entry639; RV64IFD-NEXT: lui a0, 1048568640; RV64IFD-NEXT: ret641entry:642 %conv = fptosi double %x to i32643 %0 = icmp slt i32 %conv, 32767644 %spec.store.select = select i1 %0, i32 %conv, i32 32767645 %1 = icmp sgt i32 %spec.store.select, -32768646 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768647 %conv6 = trunc i32 %spec.store.select7 to i16648 ret i16 %conv6649}650 651define i16 @utest_f64i16(double %x) {652; RV32IF-LABEL: utest_f64i16:653; RV32IF: # %bb.0: # %entry654; RV32IF-NEXT: addi sp, sp, -16655; RV32IF-NEXT: .cfi_def_cfa_offset 16656; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill657; RV32IF-NEXT: .cfi_offset ra, -4658; RV32IF-NEXT: call __fixunsdfsi659; RV32IF-NEXT: lui a1, 16660; RV32IF-NEXT: addi a1, a1, -1661; RV32IF-NEXT: bltu a0, a1, .LBB10_2662; RV32IF-NEXT: # %bb.1: # %entry663; RV32IF-NEXT: mv a0, a1664; RV32IF-NEXT: .LBB10_2: # %entry665; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload666; RV32IF-NEXT: .cfi_restore ra667; RV32IF-NEXT: addi sp, sp, 16668; RV32IF-NEXT: .cfi_def_cfa_offset 0669; RV32IF-NEXT: ret670;671; RV64IF-LABEL: utest_f64i16:672; RV64IF: # %bb.0: # %entry673; RV64IF-NEXT: addi sp, sp, -16674; RV64IF-NEXT: .cfi_def_cfa_offset 16675; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill676; RV64IF-NEXT: .cfi_offset ra, -8677; RV64IF-NEXT: call __fixunsdfsi678; RV64IF-NEXT: lui a1, 16679; RV64IF-NEXT: addi a1, a1, -1680; RV64IF-NEXT: bltu a0, a1, .LBB10_2681; RV64IF-NEXT: # %bb.1: # %entry682; RV64IF-NEXT: mv a0, a1683; RV64IF-NEXT: .LBB10_2: # %entry684; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload685; RV64IF-NEXT: .cfi_restore ra686; RV64IF-NEXT: addi sp, sp, 16687; RV64IF-NEXT: .cfi_def_cfa_offset 0688; RV64IF-NEXT: ret689;690; RV32IFD-LABEL: utest_f64i16:691; RV32IFD: # %bb.0: # %entry692; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz693; RV32IFD-NEXT: lui a1, 16694; RV32IFD-NEXT: addi a1, a1, -1695; RV32IFD-NEXT: bltu a0, a1, .LBB10_2696; RV32IFD-NEXT: # %bb.1: # %entry697; RV32IFD-NEXT: mv a0, a1698; RV32IFD-NEXT: .LBB10_2: # %entry699; RV32IFD-NEXT: ret700;701; RV64IFD-LABEL: utest_f64i16:702; RV64IFD: # %bb.0: # %entry703; RV64IFD-NEXT: fcvt.wu.d a0, fa0, rtz704; RV64IFD-NEXT: lui a1, 16705; RV64IFD-NEXT: addi a1, a1, -1706; RV64IFD-NEXT: bltu a0, a1, .LBB10_2707; RV64IFD-NEXT: # %bb.1: # %entry708; RV64IFD-NEXT: mv a0, a1709; RV64IFD-NEXT: .LBB10_2: # %entry710; RV64IFD-NEXT: ret711entry:712 %conv = fptoui double %x to i32713 %0 = icmp ult i32 %conv, 65535714 %spec.store.select = select i1 %0, i32 %conv, i32 65535715 %conv6 = trunc i32 %spec.store.select to i16716 ret i16 %conv6717}718 719define i16 @ustest_f64i16(double %x) {720; RV32IF-LABEL: ustest_f64i16:721; RV32IF: # %bb.0: # %entry722; RV32IF-NEXT: addi sp, sp, -16723; RV32IF-NEXT: .cfi_def_cfa_offset 16724; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill725; RV32IF-NEXT: .cfi_offset ra, -4726; RV32IF-NEXT: call __fixdfsi727; RV32IF-NEXT: lui a1, 16728; RV32IF-NEXT: addi a1, a1, -1729; RV32IF-NEXT: blt a0, a1, .LBB11_2730; RV32IF-NEXT: # %bb.1: # %entry731; RV32IF-NEXT: mv a0, a1732; RV32IF-NEXT: .LBB11_2: # %entry733; RV32IF-NEXT: sgtz a1, a0734; RV32IF-NEXT: neg a1, a1735; RV32IF-NEXT: and a0, a1, a0736; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload737; RV32IF-NEXT: .cfi_restore ra738; RV32IF-NEXT: addi sp, sp, 16739; RV32IF-NEXT: .cfi_def_cfa_offset 0740; RV32IF-NEXT: ret741;742; RV64IF-LABEL: ustest_f64i16:743; RV64IF: # %bb.0: # %entry744; RV64IF-NEXT: addi sp, sp, -16745; RV64IF-NEXT: .cfi_def_cfa_offset 16746; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill747; RV64IF-NEXT: .cfi_offset ra, -8748; RV64IF-NEXT: call __fixdfsi749; RV64IF-NEXT: lui a1, 16750; RV64IF-NEXT: addi a1, a1, -1751; RV64IF-NEXT: blt a0, a1, .LBB11_2752; RV64IF-NEXT: # %bb.1: # %entry753; RV64IF-NEXT: mv a0, a1754; RV64IF-NEXT: .LBB11_2: # %entry755; RV64IF-NEXT: sgtz a1, a0756; RV64IF-NEXT: neg a1, a1757; RV64IF-NEXT: and a0, a1, a0758; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload759; RV64IF-NEXT: .cfi_restore ra760; RV64IF-NEXT: addi sp, sp, 16761; RV64IF-NEXT: .cfi_def_cfa_offset 0762; RV64IF-NEXT: ret763;764; RV32IFD-LABEL: ustest_f64i16:765; RV32IFD: # %bb.0: # %entry766; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz767; RV32IFD-NEXT: lui a1, 16768; RV32IFD-NEXT: addi a1, a1, -1769; RV32IFD-NEXT: blt a0, a1, .LBB11_2770; RV32IFD-NEXT: # %bb.1: # %entry771; RV32IFD-NEXT: mv a0, a1772; RV32IFD-NEXT: .LBB11_2: # %entry773; RV32IFD-NEXT: sgtz a1, a0774; RV32IFD-NEXT: neg a1, a1775; RV32IFD-NEXT: and a0, a1, a0776; RV32IFD-NEXT: ret777;778; RV64IFD-LABEL: ustest_f64i16:779; RV64IFD: # %bb.0: # %entry780; RV64IFD-NEXT: fcvt.w.d a0, fa0, rtz781; RV64IFD-NEXT: lui a1, 16782; RV64IFD-NEXT: addi a1, a1, -1783; RV64IFD-NEXT: blt a0, a1, .LBB11_2784; RV64IFD-NEXT: # %bb.1: # %entry785; RV64IFD-NEXT: mv a0, a1786; RV64IFD-NEXT: .LBB11_2: # %entry787; RV64IFD-NEXT: sgtz a1, a0788; RV64IFD-NEXT: neg a1, a1789; RV64IFD-NEXT: and a0, a1, a0790; RV64IFD-NEXT: ret791entry:792 %conv = fptosi double %x to i32793 %0 = icmp slt i32 %conv, 65535794 %spec.store.select = select i1 %0, i32 %conv, i32 65535795 %1 = icmp sgt i32 %spec.store.select, 0796 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0797 %conv6 = trunc i32 %spec.store.select7 to i16798 ret i16 %conv6799}800 801define i16 @stest_f32i16(float %x) {802; RV32-LABEL: stest_f32i16:803; RV32: # %bb.0: # %entry804; RV32-NEXT: fcvt.w.s a0, fa0, rtz805; RV32-NEXT: lui a1, 8806; RV32-NEXT: addi a1, a1, -1807; RV32-NEXT: bge a0, a1, .LBB12_3808; RV32-NEXT: # %bb.1: # %entry809; RV32-NEXT: lui a1, 1048568810; RV32-NEXT: bge a1, a0, .LBB12_4811; RV32-NEXT: .LBB12_2: # %entry812; RV32-NEXT: ret813; RV32-NEXT: .LBB12_3: # %entry814; RV32-NEXT: mv a0, a1815; RV32-NEXT: lui a1, 1048568816; RV32-NEXT: blt a1, a0, .LBB12_2817; RV32-NEXT: .LBB12_4: # %entry818; RV32-NEXT: lui a0, 1048568819; RV32-NEXT: ret820;821; RV64-LABEL: stest_f32i16:822; RV64: # %bb.0: # %entry823; RV64-NEXT: fcvt.w.s a0, fa0, rtz824; RV64-NEXT: lui a1, 8825; RV64-NEXT: addi a1, a1, -1826; RV64-NEXT: bge a0, a1, .LBB12_3827; RV64-NEXT: # %bb.1: # %entry828; RV64-NEXT: lui a1, 1048568829; RV64-NEXT: bge a1, a0, .LBB12_4830; RV64-NEXT: .LBB12_2: # %entry831; RV64-NEXT: ret832; RV64-NEXT: .LBB12_3: # %entry833; RV64-NEXT: mv a0, a1834; RV64-NEXT: lui a1, 1048568835; RV64-NEXT: blt a1, a0, .LBB12_2836; RV64-NEXT: .LBB12_4: # %entry837; RV64-NEXT: lui a0, 1048568838; RV64-NEXT: ret839entry:840 %conv = fptosi float %x to i32841 %0 = icmp slt i32 %conv, 32767842 %spec.store.select = select i1 %0, i32 %conv, i32 32767843 %1 = icmp sgt i32 %spec.store.select, -32768844 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768845 %conv6 = trunc i32 %spec.store.select7 to i16846 ret i16 %conv6847}848 849define i16 @utest_f32i16(float %x) {850; RV32-LABEL: utest_f32i16:851; RV32: # %bb.0: # %entry852; RV32-NEXT: fcvt.wu.s a0, fa0, rtz853; RV32-NEXT: lui a1, 16854; RV32-NEXT: addi a1, a1, -1855; RV32-NEXT: bltu a0, a1, .LBB13_2856; RV32-NEXT: # %bb.1: # %entry857; RV32-NEXT: mv a0, a1858; RV32-NEXT: .LBB13_2: # %entry859; RV32-NEXT: ret860;861; RV64-LABEL: utest_f32i16:862; RV64: # %bb.0: # %entry863; RV64-NEXT: fcvt.wu.s a0, fa0, rtz864; RV64-NEXT: lui a1, 16865; RV64-NEXT: addi a1, a1, -1866; RV64-NEXT: bltu a0, a1, .LBB13_2867; RV64-NEXT: # %bb.1: # %entry868; RV64-NEXT: mv a0, a1869; RV64-NEXT: .LBB13_2: # %entry870; RV64-NEXT: ret871entry:872 %conv = fptoui float %x to i32873 %0 = icmp ult i32 %conv, 65535874 %spec.store.select = select i1 %0, i32 %conv, i32 65535875 %conv6 = trunc i32 %spec.store.select to i16876 ret i16 %conv6877}878 879define i16 @ustest_f32i16(float %x) {880; RV32-LABEL: ustest_f32i16:881; RV32: # %bb.0: # %entry882; RV32-NEXT: fcvt.w.s a0, fa0, rtz883; RV32-NEXT: lui a1, 16884; RV32-NEXT: addi a1, a1, -1885; RV32-NEXT: blt a0, a1, .LBB14_2886; RV32-NEXT: # %bb.1: # %entry887; RV32-NEXT: mv a0, a1888; RV32-NEXT: .LBB14_2: # %entry889; RV32-NEXT: sgtz a1, a0890; RV32-NEXT: neg a1, a1891; RV32-NEXT: and a0, a1, a0892; RV32-NEXT: ret893;894; RV64-LABEL: ustest_f32i16:895; RV64: # %bb.0: # %entry896; RV64-NEXT: fcvt.w.s a0, fa0, rtz897; RV64-NEXT: lui a1, 16898; RV64-NEXT: addi a1, a1, -1899; RV64-NEXT: blt a0, a1, .LBB14_2900; RV64-NEXT: # %bb.1: # %entry901; RV64-NEXT: mv a0, a1902; RV64-NEXT: .LBB14_2: # %entry903; RV64-NEXT: sgtz a1, a0904; RV64-NEXT: neg a1, a1905; RV64-NEXT: and a0, a1, a0906; RV64-NEXT: ret907entry:908 %conv = fptosi float %x to i32909 %0 = icmp slt i32 %conv, 65535910 %spec.store.select = select i1 %0, i32 %conv, i32 65535911 %1 = icmp sgt i32 %spec.store.select, 0912 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0913 %conv6 = trunc i32 %spec.store.select7 to i16914 ret i16 %conv6915}916 917define i16 @stest_f16i16(half %x) {918; RV32-LABEL: stest_f16i16:919; RV32: # %bb.0: # %entry920; RV32-NEXT: addi sp, sp, -16921; RV32-NEXT: .cfi_def_cfa_offset 16922; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill923; RV32-NEXT: .cfi_offset ra, -4924; RV32-NEXT: call __extendhfsf2925; RV32-NEXT: fcvt.w.s a0, fa0, rtz926; RV32-NEXT: lui a1, 8927; RV32-NEXT: addi a1, a1, -1928; RV32-NEXT: blt a0, a1, .LBB15_2929; RV32-NEXT: # %bb.1: # %entry930; RV32-NEXT: mv a0, a1931; RV32-NEXT: .LBB15_2: # %entry932; RV32-NEXT: lui a1, 1048568933; RV32-NEXT: blt a1, a0, .LBB15_4934; RV32-NEXT: # %bb.3: # %entry935; RV32-NEXT: lui a0, 1048568936; RV32-NEXT: .LBB15_4: # %entry937; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload938; RV32-NEXT: .cfi_restore ra939; RV32-NEXT: addi sp, sp, 16940; RV32-NEXT: .cfi_def_cfa_offset 0941; RV32-NEXT: ret942;943; RV64-LABEL: stest_f16i16:944; RV64: # %bb.0: # %entry945; RV64-NEXT: addi sp, sp, -16946; RV64-NEXT: .cfi_def_cfa_offset 16947; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill948; RV64-NEXT: .cfi_offset ra, -8949; RV64-NEXT: call __extendhfsf2950; RV64-NEXT: fcvt.l.s a0, fa0, rtz951; RV64-NEXT: lui a1, 8952; RV64-NEXT: addi a1, a1, -1953; RV64-NEXT: blt a0, a1, .LBB15_2954; RV64-NEXT: # %bb.1: # %entry955; RV64-NEXT: mv a0, a1956; RV64-NEXT: .LBB15_2: # %entry957; RV64-NEXT: lui a1, 1048568958; RV64-NEXT: blt a1, a0, .LBB15_4959; RV64-NEXT: # %bb.3: # %entry960; RV64-NEXT: lui a0, 1048568961; RV64-NEXT: .LBB15_4: # %entry962; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload963; RV64-NEXT: .cfi_restore ra964; RV64-NEXT: addi sp, sp, 16965; RV64-NEXT: .cfi_def_cfa_offset 0966; RV64-NEXT: ret967entry:968 %conv = fptosi half %x to i32969 %0 = icmp slt i32 %conv, 32767970 %spec.store.select = select i1 %0, i32 %conv, i32 32767971 %1 = icmp sgt i32 %spec.store.select, -32768972 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768973 %conv6 = trunc i32 %spec.store.select7 to i16974 ret i16 %conv6975}976 977define i16 @utest_f16i16(half %x) {978; RV32-LABEL: utest_f16i16:979; RV32: # %bb.0: # %entry980; RV32-NEXT: addi sp, sp, -16981; RV32-NEXT: .cfi_def_cfa_offset 16982; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill983; RV32-NEXT: .cfi_offset ra, -4984; RV32-NEXT: call __extendhfsf2985; RV32-NEXT: fcvt.wu.s a0, fa0, rtz986; RV32-NEXT: lui a1, 16987; RV32-NEXT: addi a1, a1, -1988; RV32-NEXT: bltu a0, a1, .LBB16_2989; RV32-NEXT: # %bb.1: # %entry990; RV32-NEXT: mv a0, a1991; RV32-NEXT: .LBB16_2: # %entry992; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload993; RV32-NEXT: .cfi_restore ra994; RV32-NEXT: addi sp, sp, 16995; RV32-NEXT: .cfi_def_cfa_offset 0996; RV32-NEXT: ret997;998; RV64-LABEL: utest_f16i16:999; RV64: # %bb.0: # %entry1000; RV64-NEXT: addi sp, sp, -161001; RV64-NEXT: .cfi_def_cfa_offset 161002; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1003; RV64-NEXT: .cfi_offset ra, -81004; RV64-NEXT: call __extendhfsf21005; RV64-NEXT: fcvt.lu.s a0, fa0, rtz1006; RV64-NEXT: lui a1, 161007; RV64-NEXT: addi a1, a1, -11008; RV64-NEXT: bltu a0, a1, .LBB16_21009; RV64-NEXT: # %bb.1: # %entry1010; RV64-NEXT: mv a0, a11011; RV64-NEXT: .LBB16_2: # %entry1012; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1013; RV64-NEXT: .cfi_restore ra1014; RV64-NEXT: addi sp, sp, 161015; RV64-NEXT: .cfi_def_cfa_offset 01016; RV64-NEXT: ret1017entry:1018 %conv = fptoui half %x to i321019 %0 = icmp ult i32 %conv, 655351020 %spec.store.select = select i1 %0, i32 %conv, i32 655351021 %conv6 = trunc i32 %spec.store.select to i161022 ret i16 %conv61023}1024 1025define i16 @ustest_f16i16(half %x) {1026; RV32-LABEL: ustest_f16i16:1027; RV32: # %bb.0: # %entry1028; RV32-NEXT: addi sp, sp, -161029; RV32-NEXT: .cfi_def_cfa_offset 161030; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1031; RV32-NEXT: .cfi_offset ra, -41032; RV32-NEXT: call __extendhfsf21033; RV32-NEXT: fcvt.w.s a0, fa0, rtz1034; RV32-NEXT: lui a1, 161035; RV32-NEXT: addi a1, a1, -11036; RV32-NEXT: blt a0, a1, .LBB17_21037; RV32-NEXT: # %bb.1: # %entry1038; RV32-NEXT: mv a0, a11039; RV32-NEXT: .LBB17_2: # %entry1040; RV32-NEXT: sgtz a1, a01041; RV32-NEXT: neg a1, a11042; RV32-NEXT: and a0, a1, a01043; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1044; RV32-NEXT: .cfi_restore ra1045; RV32-NEXT: addi sp, sp, 161046; RV32-NEXT: .cfi_def_cfa_offset 01047; RV32-NEXT: ret1048;1049; RV64-LABEL: ustest_f16i16:1050; RV64: # %bb.0: # %entry1051; RV64-NEXT: addi sp, sp, -161052; RV64-NEXT: .cfi_def_cfa_offset 161053; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1054; RV64-NEXT: .cfi_offset ra, -81055; RV64-NEXT: call __extendhfsf21056; RV64-NEXT: fcvt.l.s a0, fa0, rtz1057; RV64-NEXT: lui a1, 161058; RV64-NEXT: addi a1, a1, -11059; RV64-NEXT: blt a0, a1, .LBB17_21060; RV64-NEXT: # %bb.1: # %entry1061; RV64-NEXT: mv a0, a11062; RV64-NEXT: .LBB17_2: # %entry1063; RV64-NEXT: sgtz a1, a01064; RV64-NEXT: neg a1, a11065; RV64-NEXT: and a0, a1, a01066; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1067; RV64-NEXT: .cfi_restore ra1068; RV64-NEXT: addi sp, sp, 161069; RV64-NEXT: .cfi_def_cfa_offset 01070; RV64-NEXT: ret1071entry:1072 %conv = fptosi half %x to i321073 %0 = icmp slt i32 %conv, 655351074 %spec.store.select = select i1 %0, i32 %conv, i32 655351075 %1 = icmp sgt i32 %spec.store.select, 01076 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 01077 %conv6 = trunc i32 %spec.store.select7 to i161078 ret i16 %conv61079}1080 1081; i64 saturate1082 1083define i64 @stest_f64i64(double %x) {1084; RV32IF-LABEL: stest_f64i64:1085; RV32IF: # %bb.0: # %entry1086; RV32IF-NEXT: addi sp, sp, -321087; RV32IF-NEXT: .cfi_def_cfa_offset 321088; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1089; RV32IF-NEXT: .cfi_offset ra, -41090; RV32IF-NEXT: mv a2, a11091; RV32IF-NEXT: mv a1, a01092; RV32IF-NEXT: addi a0, sp, 81093; RV32IF-NEXT: call __fixdfti1094; RV32IF-NEXT: lw a3, 8(sp)1095; RV32IF-NEXT: lw a1, 12(sp)1096; RV32IF-NEXT: lw a2, 16(sp)1097; RV32IF-NEXT: lw a4, 20(sp)1098; RV32IF-NEXT: lui a0, 5242881099; RV32IF-NEXT: addi a5, a0, -11100; RV32IF-NEXT: beq a1, a5, .LBB18_21101; RV32IF-NEXT: # %bb.1: # %entry1102; RV32IF-NEXT: sltu a6, a1, a51103; RV32IF-NEXT: or a7, a2, a41104; RV32IF-NEXT: bnez a7, .LBB18_31105; RV32IF-NEXT: j .LBB18_41106; RV32IF-NEXT: .LBB18_2:1107; RV32IF-NEXT: sltiu a6, a3, -11108; RV32IF-NEXT: or a7, a2, a41109; RV32IF-NEXT: beqz a7, .LBB18_41110; RV32IF-NEXT: .LBB18_3: # %entry1111; RV32IF-NEXT: srli a6, a4, 311112; RV32IF-NEXT: .LBB18_4: # %entry1113; RV32IF-NEXT: neg a7, a61114; RV32IF-NEXT: addi t0, a6, -11115; RV32IF-NEXT: bnez a6, .LBB18_61116; RV32IF-NEXT: # %bb.5: # %entry1117; RV32IF-NEXT: mv a1, a51118; RV32IF-NEXT: .LBB18_6: # %entry1119; RV32IF-NEXT: or a3, t0, a31120; RV32IF-NEXT: and a4, a7, a41121; RV32IF-NEXT: and a2, a7, a21122; RV32IF-NEXT: beq a1, a0, .LBB18_81123; RV32IF-NEXT: # %bb.7: # %entry1124; RV32IF-NEXT: sltu a0, a0, a11125; RV32IF-NEXT: j .LBB18_91126; RV32IF-NEXT: .LBB18_8:1127; RV32IF-NEXT: snez a0, a31128; RV32IF-NEXT: .LBB18_9: # %entry1129; RV32IF-NEXT: and a2, a2, a41130; RV32IF-NEXT: li a5, -11131; RV32IF-NEXT: beq a2, a5, .LBB18_111132; RV32IF-NEXT: # %bb.10: # %entry1133; RV32IF-NEXT: srli a4, a4, 311134; RV32IF-NEXT: xori a0, a4, 11135; RV32IF-NEXT: .LBB18_11: # %entry1136; RV32IF-NEXT: bnez a0, .LBB18_131137; RV32IF-NEXT: # %bb.12: # %entry1138; RV32IF-NEXT: lui a1, 5242881139; RV32IF-NEXT: .LBB18_13: # %entry1140; RV32IF-NEXT: neg a0, a01141; RV32IF-NEXT: and a0, a0, a31142; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1143; RV32IF-NEXT: .cfi_restore ra1144; RV32IF-NEXT: addi sp, sp, 321145; RV32IF-NEXT: .cfi_def_cfa_offset 01146; RV32IF-NEXT: ret1147;1148; RV64IF-LABEL: stest_f64i64:1149; RV64IF: # %bb.0: # %entry1150; RV64IF-NEXT: addi sp, sp, -161151; RV64IF-NEXT: .cfi_def_cfa_offset 161152; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1153; RV64IF-NEXT: .cfi_offset ra, -81154; RV64IF-NEXT: call __fixdfti1155; RV64IF-NEXT: li a2, -11156; RV64IF-NEXT: srli a3, a2, 11157; RV64IF-NEXT: beqz a1, .LBB18_21158; RV64IF-NEXT: # %bb.1: # %entry1159; RV64IF-NEXT: srli a4, a1, 631160; RV64IF-NEXT: j .LBB18_31161; RV64IF-NEXT: .LBB18_2:1162; RV64IF-NEXT: sltu a4, a0, a31163; RV64IF-NEXT: .LBB18_3: # %entry1164; RV64IF-NEXT: neg a5, a41165; RV64IF-NEXT: and a5, a5, a11166; RV64IF-NEXT: bnez a4, .LBB18_51167; RV64IF-NEXT: # %bb.4: # %entry1168; RV64IF-NEXT: mv a0, a31169; RV64IF-NEXT: .LBB18_5: # %entry1170; RV64IF-NEXT: slli a1, a2, 631171; RV64IF-NEXT: beq a5, a2, .LBB18_71172; RV64IF-NEXT: # %bb.6: # %entry1173; RV64IF-NEXT: srli a5, a5, 631174; RV64IF-NEXT: xori a2, a5, 11175; RV64IF-NEXT: beqz a2, .LBB18_81176; RV64IF-NEXT: j .LBB18_91177; RV64IF-NEXT: .LBB18_7:1178; RV64IF-NEXT: sltu a2, a1, a01179; RV64IF-NEXT: bnez a2, .LBB18_91180; RV64IF-NEXT: .LBB18_8: # %entry1181; RV64IF-NEXT: mv a0, a11182; RV64IF-NEXT: .LBB18_9: # %entry1183; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1184; RV64IF-NEXT: .cfi_restore ra1185; RV64IF-NEXT: addi sp, sp, 161186; RV64IF-NEXT: .cfi_def_cfa_offset 01187; RV64IF-NEXT: ret1188;1189; RV32IFD-LABEL: stest_f64i64:1190; RV32IFD: # %bb.0: # %entry1191; RV32IFD-NEXT: addi sp, sp, -321192; RV32IFD-NEXT: .cfi_def_cfa_offset 321193; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1194; RV32IFD-NEXT: .cfi_offset ra, -41195; RV32IFD-NEXT: addi a0, sp, 81196; RV32IFD-NEXT: call __fixdfti1197; RV32IFD-NEXT: lw a3, 8(sp)1198; RV32IFD-NEXT: lw a1, 12(sp)1199; RV32IFD-NEXT: lw a2, 16(sp)1200; RV32IFD-NEXT: lw a4, 20(sp)1201; RV32IFD-NEXT: lui a0, 5242881202; RV32IFD-NEXT: addi a5, a0, -11203; RV32IFD-NEXT: beq a1, a5, .LBB18_21204; RV32IFD-NEXT: # %bb.1: # %entry1205; RV32IFD-NEXT: sltu a6, a1, a51206; RV32IFD-NEXT: or a7, a2, a41207; RV32IFD-NEXT: bnez a7, .LBB18_31208; RV32IFD-NEXT: j .LBB18_41209; RV32IFD-NEXT: .LBB18_2:1210; RV32IFD-NEXT: sltiu a6, a3, -11211; RV32IFD-NEXT: or a7, a2, a41212; RV32IFD-NEXT: beqz a7, .LBB18_41213; RV32IFD-NEXT: .LBB18_3: # %entry1214; RV32IFD-NEXT: srli a6, a4, 311215; RV32IFD-NEXT: .LBB18_4: # %entry1216; RV32IFD-NEXT: neg a7, a61217; RV32IFD-NEXT: addi t0, a6, -11218; RV32IFD-NEXT: bnez a6, .LBB18_61219; RV32IFD-NEXT: # %bb.5: # %entry1220; RV32IFD-NEXT: mv a1, a51221; RV32IFD-NEXT: .LBB18_6: # %entry1222; RV32IFD-NEXT: or a3, t0, a31223; RV32IFD-NEXT: and a4, a7, a41224; RV32IFD-NEXT: and a2, a7, a21225; RV32IFD-NEXT: beq a1, a0, .LBB18_81226; RV32IFD-NEXT: # %bb.7: # %entry1227; RV32IFD-NEXT: sltu a0, a0, a11228; RV32IFD-NEXT: j .LBB18_91229; RV32IFD-NEXT: .LBB18_8:1230; RV32IFD-NEXT: snez a0, a31231; RV32IFD-NEXT: .LBB18_9: # %entry1232; RV32IFD-NEXT: and a2, a2, a41233; RV32IFD-NEXT: li a5, -11234; RV32IFD-NEXT: beq a2, a5, .LBB18_111235; RV32IFD-NEXT: # %bb.10: # %entry1236; RV32IFD-NEXT: srli a4, a4, 311237; RV32IFD-NEXT: xori a0, a4, 11238; RV32IFD-NEXT: .LBB18_11: # %entry1239; RV32IFD-NEXT: bnez a0, .LBB18_131240; RV32IFD-NEXT: # %bb.12: # %entry1241; RV32IFD-NEXT: lui a1, 5242881242; RV32IFD-NEXT: .LBB18_13: # %entry1243; RV32IFD-NEXT: neg a0, a01244; RV32IFD-NEXT: and a0, a0, a31245; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1246; RV32IFD-NEXT: .cfi_restore ra1247; RV32IFD-NEXT: addi sp, sp, 321248; RV32IFD-NEXT: .cfi_def_cfa_offset 01249; RV32IFD-NEXT: ret1250;1251; RV64IFD-LABEL: stest_f64i64:1252; RV64IFD: # %bb.0: # %entry1253; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz1254; RV64IFD-NEXT: feq.d a1, fa0, fa01255; RV64IFD-NEXT: seqz a1, a11256; RV64IFD-NEXT: addi a1, a1, -11257; RV64IFD-NEXT: and a0, a1, a01258; RV64IFD-NEXT: ret1259entry:1260 %conv = fptosi double %x to i1281261 %0 = icmp slt i128 %conv, 92233720368547758071262 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071263 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081264 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081265 %conv6 = trunc i128 %spec.store.select7 to i641266 ret i64 %conv61267}1268 1269define i64 @utest_f64i64(double %x) {1270; RV32IF-LABEL: utest_f64i64:1271; RV32IF: # %bb.0: # %entry1272; RV32IF-NEXT: addi sp, sp, -321273; RV32IF-NEXT: .cfi_def_cfa_offset 321274; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1275; RV32IF-NEXT: .cfi_offset ra, -41276; RV32IF-NEXT: mv a2, a11277; RV32IF-NEXT: mv a1, a01278; RV32IF-NEXT: addi a0, sp, 81279; RV32IF-NEXT: call __fixunsdfti1280; RV32IF-NEXT: lw a0, 16(sp)1281; RV32IF-NEXT: lw a1, 20(sp)1282; RV32IF-NEXT: lw a2, 12(sp)1283; RV32IF-NEXT: lw a3, 8(sp)1284; RV32IF-NEXT: or a4, a1, a01285; RV32IF-NEXT: xori a0, a0, 11286; RV32IF-NEXT: seqz a4, a41287; RV32IF-NEXT: or a0, a0, a11288; RV32IF-NEXT: seqz a0, a01289; RV32IF-NEXT: addi a0, a0, -11290; RV32IF-NEXT: and a0, a0, a41291; RV32IF-NEXT: neg a1, a01292; RV32IF-NEXT: and a0, a1, a31293; RV32IF-NEXT: and a1, a1, a21294; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1295; RV32IF-NEXT: .cfi_restore ra1296; RV32IF-NEXT: addi sp, sp, 321297; RV32IF-NEXT: .cfi_def_cfa_offset 01298; RV32IF-NEXT: ret1299;1300; RV64-LABEL: utest_f64i64:1301; RV64: # %bb.0: # %entry1302; RV64-NEXT: addi sp, sp, -161303; RV64-NEXT: .cfi_def_cfa_offset 161304; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1305; RV64-NEXT: .cfi_offset ra, -81306; RV64-NEXT: call __fixunsdfti1307; RV64-NEXT: snez a1, a11308; RV64-NEXT: addi a1, a1, -11309; RV64-NEXT: and a0, a1, a01310; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1311; RV64-NEXT: .cfi_restore ra1312; RV64-NEXT: addi sp, sp, 161313; RV64-NEXT: .cfi_def_cfa_offset 01314; RV64-NEXT: ret1315;1316; RV32IFD-LABEL: utest_f64i64:1317; RV32IFD: # %bb.0: # %entry1318; RV32IFD-NEXT: addi sp, sp, -321319; RV32IFD-NEXT: .cfi_def_cfa_offset 321320; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1321; RV32IFD-NEXT: .cfi_offset ra, -41322; RV32IFD-NEXT: addi a0, sp, 81323; RV32IFD-NEXT: call __fixunsdfti1324; RV32IFD-NEXT: lw a0, 16(sp)1325; RV32IFD-NEXT: lw a1, 20(sp)1326; RV32IFD-NEXT: lw a2, 12(sp)1327; RV32IFD-NEXT: lw a3, 8(sp)1328; RV32IFD-NEXT: or a4, a1, a01329; RV32IFD-NEXT: xori a0, a0, 11330; RV32IFD-NEXT: seqz a4, a41331; RV32IFD-NEXT: or a0, a0, a11332; RV32IFD-NEXT: seqz a0, a01333; RV32IFD-NEXT: addi a0, a0, -11334; RV32IFD-NEXT: and a0, a0, a41335; RV32IFD-NEXT: neg a1, a01336; RV32IFD-NEXT: and a0, a1, a31337; RV32IFD-NEXT: and a1, a1, a21338; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1339; RV32IFD-NEXT: .cfi_restore ra1340; RV32IFD-NEXT: addi sp, sp, 321341; RV32IFD-NEXT: .cfi_def_cfa_offset 01342; RV32IFD-NEXT: ret1343entry:1344 %conv = fptoui double %x to i1281345 %0 = icmp ult i128 %conv, 184467440737095516161346 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161347 %conv6 = trunc i128 %spec.store.select to i641348 ret i64 %conv61349}1350 1351define i64 @ustest_f64i64(double %x) {1352; RV32IF-LABEL: ustest_f64i64:1353; RV32IF: # %bb.0: # %entry1354; RV32IF-NEXT: addi sp, sp, -321355; RV32IF-NEXT: .cfi_def_cfa_offset 321356; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1357; RV32IF-NEXT: .cfi_offset ra, -41358; RV32IF-NEXT: mv a2, a11359; RV32IF-NEXT: mv a1, a01360; RV32IF-NEXT: addi a0, sp, 81361; RV32IF-NEXT: call __fixdfti1362; RV32IF-NEXT: lw a1, 20(sp)1363; RV32IF-NEXT: lw a0, 16(sp)1364; RV32IF-NEXT: beqz a1, .LBB20_21365; RV32IF-NEXT: # %bb.1: # %entry1366; RV32IF-NEXT: srli a2, a1, 311367; RV32IF-NEXT: j .LBB20_31368; RV32IF-NEXT: .LBB20_2:1369; RV32IF-NEXT: seqz a2, a01370; RV32IF-NEXT: .LBB20_3: # %entry1371; RV32IF-NEXT: xori a3, a0, 11372; RV32IF-NEXT: or a3, a3, a11373; RV32IF-NEXT: seqz a3, a31374; RV32IF-NEXT: addi a3, a3, -11375; RV32IF-NEXT: and a3, a3, a21376; RV32IF-NEXT: neg a2, a31377; RV32IF-NEXT: bnez a3, .LBB20_51378; RV32IF-NEXT: # %bb.4: # %entry1379; RV32IF-NEXT: li a0, 11380; RV32IF-NEXT: .LBB20_5: # %entry1381; RV32IF-NEXT: lw a4, 8(sp)1382; RV32IF-NEXT: lw a3, 12(sp)1383; RV32IF-NEXT: and a5, a2, a11384; RV32IF-NEXT: beqz a5, .LBB20_71385; RV32IF-NEXT: # %bb.6: # %entry1386; RV32IF-NEXT: sgtz a1, a51387; RV32IF-NEXT: j .LBB20_81388; RV32IF-NEXT: .LBB20_7:1389; RV32IF-NEXT: snez a1, a01390; RV32IF-NEXT: .LBB20_8: # %entry1391; RV32IF-NEXT: and a4, a2, a41392; RV32IF-NEXT: or a0, a0, a51393; RV32IF-NEXT: and a2, a2, a31394; RV32IF-NEXT: bnez a0, .LBB20_101395; RV32IF-NEXT: # %bb.9:1396; RV32IF-NEXT: or a0, a4, a21397; RV32IF-NEXT: snez a1, a01398; RV32IF-NEXT: .LBB20_10: # %entry1399; RV32IF-NEXT: neg a1, a11400; RV32IF-NEXT: and a0, a1, a41401; RV32IF-NEXT: and a1, a1, a21402; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1403; RV32IF-NEXT: .cfi_restore ra1404; RV32IF-NEXT: addi sp, sp, 321405; RV32IF-NEXT: .cfi_def_cfa_offset 01406; RV32IF-NEXT: ret1407;1408; RV64-LABEL: ustest_f64i64:1409; RV64: # %bb.0: # %entry1410; RV64-NEXT: addi sp, sp, -161411; RV64-NEXT: .cfi_def_cfa_offset 161412; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1413; RV64-NEXT: .cfi_offset ra, -81414; RV64-NEXT: call __fixdfti1415; RV64-NEXT: slti a2, a1, 11416; RV64-NEXT: blez a1, .LBB20_21417; RV64-NEXT: # %bb.1: # %entry1418; RV64-NEXT: li a1, 11419; RV64-NEXT: .LBB20_2: # %entry1420; RV64-NEXT: neg a2, a21421; RV64-NEXT: and a0, a2, a01422; RV64-NEXT: beqz a1, .LBB20_41423; RV64-NEXT: # %bb.3: # %entry1424; RV64-NEXT: sgtz a1, a11425; RV64-NEXT: j .LBB20_51426; RV64-NEXT: .LBB20_4:1427; RV64-NEXT: snez a1, a01428; RV64-NEXT: .LBB20_5: # %entry1429; RV64-NEXT: neg a1, a11430; RV64-NEXT: and a0, a1, a01431; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1432; RV64-NEXT: .cfi_restore ra1433; RV64-NEXT: addi sp, sp, 161434; RV64-NEXT: .cfi_def_cfa_offset 01435; RV64-NEXT: ret1436;1437; RV32IFD-LABEL: ustest_f64i64:1438; RV32IFD: # %bb.0: # %entry1439; RV32IFD-NEXT: addi sp, sp, -321440; RV32IFD-NEXT: .cfi_def_cfa_offset 321441; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1442; RV32IFD-NEXT: .cfi_offset ra, -41443; RV32IFD-NEXT: addi a0, sp, 81444; RV32IFD-NEXT: call __fixdfti1445; RV32IFD-NEXT: lw a1, 20(sp)1446; RV32IFD-NEXT: lw a0, 16(sp)1447; RV32IFD-NEXT: beqz a1, .LBB20_21448; RV32IFD-NEXT: # %bb.1: # %entry1449; RV32IFD-NEXT: srli a2, a1, 311450; RV32IFD-NEXT: j .LBB20_31451; RV32IFD-NEXT: .LBB20_2:1452; RV32IFD-NEXT: seqz a2, a01453; RV32IFD-NEXT: .LBB20_3: # %entry1454; RV32IFD-NEXT: xori a3, a0, 11455; RV32IFD-NEXT: or a3, a3, a11456; RV32IFD-NEXT: seqz a3, a31457; RV32IFD-NEXT: addi a3, a3, -11458; RV32IFD-NEXT: and a3, a3, a21459; RV32IFD-NEXT: neg a2, a31460; RV32IFD-NEXT: bnez a3, .LBB20_51461; RV32IFD-NEXT: # %bb.4: # %entry1462; RV32IFD-NEXT: li a0, 11463; RV32IFD-NEXT: .LBB20_5: # %entry1464; RV32IFD-NEXT: lw a4, 8(sp)1465; RV32IFD-NEXT: lw a3, 12(sp)1466; RV32IFD-NEXT: and a5, a2, a11467; RV32IFD-NEXT: beqz a5, .LBB20_71468; RV32IFD-NEXT: # %bb.6: # %entry1469; RV32IFD-NEXT: sgtz a1, a51470; RV32IFD-NEXT: j .LBB20_81471; RV32IFD-NEXT: .LBB20_7:1472; RV32IFD-NEXT: snez a1, a01473; RV32IFD-NEXT: .LBB20_8: # %entry1474; RV32IFD-NEXT: and a4, a2, a41475; RV32IFD-NEXT: or a0, a0, a51476; RV32IFD-NEXT: and a2, a2, a31477; RV32IFD-NEXT: bnez a0, .LBB20_101478; RV32IFD-NEXT: # %bb.9:1479; RV32IFD-NEXT: or a0, a4, a21480; RV32IFD-NEXT: snez a1, a01481; RV32IFD-NEXT: .LBB20_10: # %entry1482; RV32IFD-NEXT: neg a1, a11483; RV32IFD-NEXT: and a0, a1, a41484; RV32IFD-NEXT: and a1, a1, a21485; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1486; RV32IFD-NEXT: .cfi_restore ra1487; RV32IFD-NEXT: addi sp, sp, 321488; RV32IFD-NEXT: .cfi_def_cfa_offset 01489; RV32IFD-NEXT: ret1490entry:1491 %conv = fptosi double %x to i1281492 %0 = icmp slt i128 %conv, 184467440737095516161493 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161494 %1 = icmp sgt i128 %spec.store.select, 01495 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01496 %conv6 = trunc i128 %spec.store.select7 to i641497 ret i64 %conv61498}1499 1500define i64 @stest_f32i64(float %x) {1501; RV32-LABEL: stest_f32i64:1502; RV32: # %bb.0: # %entry1503; RV32-NEXT: addi sp, sp, -321504; RV32-NEXT: .cfi_def_cfa_offset 321505; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1506; RV32-NEXT: .cfi_offset ra, -41507; RV32-NEXT: addi a0, sp, 81508; RV32-NEXT: call __fixsfti1509; RV32-NEXT: lw a3, 8(sp)1510; RV32-NEXT: lw a1, 12(sp)1511; RV32-NEXT: lw a2, 16(sp)1512; RV32-NEXT: lw a4, 20(sp)1513; RV32-NEXT: lui a0, 5242881514; RV32-NEXT: addi a5, a0, -11515; RV32-NEXT: beq a1, a5, .LBB21_21516; RV32-NEXT: # %bb.1: # %entry1517; RV32-NEXT: sltu a6, a1, a51518; RV32-NEXT: or a7, a2, a41519; RV32-NEXT: bnez a7, .LBB21_31520; RV32-NEXT: j .LBB21_41521; RV32-NEXT: .LBB21_2:1522; RV32-NEXT: sltiu a6, a3, -11523; RV32-NEXT: or a7, a2, a41524; RV32-NEXT: beqz a7, .LBB21_41525; RV32-NEXT: .LBB21_3: # %entry1526; RV32-NEXT: srli a6, a4, 311527; RV32-NEXT: .LBB21_4: # %entry1528; RV32-NEXT: neg a7, a61529; RV32-NEXT: addi t0, a6, -11530; RV32-NEXT: bnez a6, .LBB21_61531; RV32-NEXT: # %bb.5: # %entry1532; RV32-NEXT: mv a1, a51533; RV32-NEXT: .LBB21_6: # %entry1534; RV32-NEXT: or a3, t0, a31535; RV32-NEXT: and a4, a7, a41536; RV32-NEXT: and a2, a7, a21537; RV32-NEXT: beq a1, a0, .LBB21_81538; RV32-NEXT: # %bb.7: # %entry1539; RV32-NEXT: sltu a0, a0, a11540; RV32-NEXT: j .LBB21_91541; RV32-NEXT: .LBB21_8:1542; RV32-NEXT: snez a0, a31543; RV32-NEXT: .LBB21_9: # %entry1544; RV32-NEXT: and a2, a2, a41545; RV32-NEXT: li a5, -11546; RV32-NEXT: beq a2, a5, .LBB21_111547; RV32-NEXT: # %bb.10: # %entry1548; RV32-NEXT: srli a4, a4, 311549; RV32-NEXT: xori a0, a4, 11550; RV32-NEXT: .LBB21_11: # %entry1551; RV32-NEXT: bnez a0, .LBB21_131552; RV32-NEXT: # %bb.12: # %entry1553; RV32-NEXT: lui a1, 5242881554; RV32-NEXT: .LBB21_13: # %entry1555; RV32-NEXT: neg a0, a01556; RV32-NEXT: and a0, a0, a31557; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1558; RV32-NEXT: .cfi_restore ra1559; RV32-NEXT: addi sp, sp, 321560; RV32-NEXT: .cfi_def_cfa_offset 01561; RV32-NEXT: ret1562;1563; RV64-LABEL: stest_f32i64:1564; RV64: # %bb.0: # %entry1565; RV64-NEXT: fcvt.l.s a0, fa0, rtz1566; RV64-NEXT: feq.s a1, fa0, fa01567; RV64-NEXT: seqz a1, a11568; RV64-NEXT: addi a1, a1, -11569; RV64-NEXT: and a0, a1, a01570; RV64-NEXT: ret1571entry:1572 %conv = fptosi float %x to i1281573 %0 = icmp slt i128 %conv, 92233720368547758071574 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071575 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081576 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081577 %conv6 = trunc i128 %spec.store.select7 to i641578 ret i64 %conv61579}1580 1581define i64 @utest_f32i64(float %x) {1582; RV32-LABEL: utest_f32i64:1583; RV32: # %bb.0: # %entry1584; RV32-NEXT: addi sp, sp, -321585; RV32-NEXT: .cfi_def_cfa_offset 321586; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1587; RV32-NEXT: .cfi_offset ra, -41588; RV32-NEXT: addi a0, sp, 81589; RV32-NEXT: call __fixunssfti1590; RV32-NEXT: lw a0, 16(sp)1591; RV32-NEXT: lw a1, 20(sp)1592; RV32-NEXT: lw a2, 12(sp)1593; RV32-NEXT: lw a3, 8(sp)1594; RV32-NEXT: or a4, a1, a01595; RV32-NEXT: xori a0, a0, 11596; RV32-NEXT: seqz a4, a41597; RV32-NEXT: or a0, a0, a11598; RV32-NEXT: seqz a0, a01599; RV32-NEXT: addi a0, a0, -11600; RV32-NEXT: and a0, a0, a41601; RV32-NEXT: neg a1, a01602; RV32-NEXT: and a0, a1, a31603; RV32-NEXT: and a1, a1, a21604; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1605; RV32-NEXT: .cfi_restore ra1606; RV32-NEXT: addi sp, sp, 321607; RV32-NEXT: .cfi_def_cfa_offset 01608; RV32-NEXT: ret1609;1610; RV64-LABEL: utest_f32i64:1611; RV64: # %bb.0: # %entry1612; RV64-NEXT: addi sp, sp, -161613; RV64-NEXT: .cfi_def_cfa_offset 161614; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1615; RV64-NEXT: .cfi_offset ra, -81616; RV64-NEXT: call __fixunssfti1617; RV64-NEXT: snez a1, a11618; RV64-NEXT: addi a1, a1, -11619; RV64-NEXT: and a0, a1, a01620; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1621; RV64-NEXT: .cfi_restore ra1622; RV64-NEXT: addi sp, sp, 161623; RV64-NEXT: .cfi_def_cfa_offset 01624; RV64-NEXT: ret1625entry:1626 %conv = fptoui float %x to i1281627 %0 = icmp ult i128 %conv, 184467440737095516161628 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161629 %conv6 = trunc i128 %spec.store.select to i641630 ret i64 %conv61631}1632 1633define i64 @ustest_f32i64(float %x) {1634; RV32-LABEL: ustest_f32i64:1635; RV32: # %bb.0: # %entry1636; RV32-NEXT: addi sp, sp, -321637; RV32-NEXT: .cfi_def_cfa_offset 321638; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1639; RV32-NEXT: .cfi_offset ra, -41640; RV32-NEXT: addi a0, sp, 81641; RV32-NEXT: call __fixsfti1642; RV32-NEXT: lw a1, 20(sp)1643; RV32-NEXT: lw a0, 16(sp)1644; RV32-NEXT: beqz a1, .LBB23_21645; RV32-NEXT: # %bb.1: # %entry1646; RV32-NEXT: srli a2, a1, 311647; RV32-NEXT: j .LBB23_31648; RV32-NEXT: .LBB23_2:1649; RV32-NEXT: seqz a2, a01650; RV32-NEXT: .LBB23_3: # %entry1651; RV32-NEXT: xori a3, a0, 11652; RV32-NEXT: or a3, a3, a11653; RV32-NEXT: seqz a3, a31654; RV32-NEXT: addi a3, a3, -11655; RV32-NEXT: and a3, a3, a21656; RV32-NEXT: neg a2, a31657; RV32-NEXT: bnez a3, .LBB23_51658; RV32-NEXT: # %bb.4: # %entry1659; RV32-NEXT: li a0, 11660; RV32-NEXT: .LBB23_5: # %entry1661; RV32-NEXT: lw a4, 8(sp)1662; RV32-NEXT: lw a3, 12(sp)1663; RV32-NEXT: and a5, a2, a11664; RV32-NEXT: beqz a5, .LBB23_71665; RV32-NEXT: # %bb.6: # %entry1666; RV32-NEXT: sgtz a1, a51667; RV32-NEXT: j .LBB23_81668; RV32-NEXT: .LBB23_7:1669; RV32-NEXT: snez a1, a01670; RV32-NEXT: .LBB23_8: # %entry1671; RV32-NEXT: and a4, a2, a41672; RV32-NEXT: or a0, a0, a51673; RV32-NEXT: and a2, a2, a31674; RV32-NEXT: bnez a0, .LBB23_101675; RV32-NEXT: # %bb.9:1676; RV32-NEXT: or a0, a4, a21677; RV32-NEXT: snez a1, a01678; RV32-NEXT: .LBB23_10: # %entry1679; RV32-NEXT: neg a1, a11680; RV32-NEXT: and a0, a1, a41681; RV32-NEXT: and a1, a1, a21682; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1683; RV32-NEXT: .cfi_restore ra1684; RV32-NEXT: addi sp, sp, 321685; RV32-NEXT: .cfi_def_cfa_offset 01686; RV32-NEXT: ret1687;1688; RV64-LABEL: ustest_f32i64:1689; RV64: # %bb.0: # %entry1690; RV64-NEXT: addi sp, sp, -161691; RV64-NEXT: .cfi_def_cfa_offset 161692; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1693; RV64-NEXT: .cfi_offset ra, -81694; RV64-NEXT: call __fixsfti1695; RV64-NEXT: slti a2, a1, 11696; RV64-NEXT: blez a1, .LBB23_21697; RV64-NEXT: # %bb.1: # %entry1698; RV64-NEXT: li a1, 11699; RV64-NEXT: .LBB23_2: # %entry1700; RV64-NEXT: neg a2, a21701; RV64-NEXT: and a0, a2, a01702; RV64-NEXT: beqz a1, .LBB23_41703; RV64-NEXT: # %bb.3: # %entry1704; RV64-NEXT: sgtz a1, a11705; RV64-NEXT: j .LBB23_51706; RV64-NEXT: .LBB23_4:1707; RV64-NEXT: snez a1, a01708; RV64-NEXT: .LBB23_5: # %entry1709; RV64-NEXT: neg a1, a11710; RV64-NEXT: and a0, a1, a01711; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1712; RV64-NEXT: .cfi_restore ra1713; RV64-NEXT: addi sp, sp, 161714; RV64-NEXT: .cfi_def_cfa_offset 01715; RV64-NEXT: ret1716entry:1717 %conv = fptosi float %x to i1281718 %0 = icmp slt i128 %conv, 184467440737095516161719 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161720 %1 = icmp sgt i128 %spec.store.select, 01721 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01722 %conv6 = trunc i128 %spec.store.select7 to i641723 ret i64 %conv61724}1725 1726define i64 @stest_f16i64(half %x) {1727; RV32-LABEL: stest_f16i64:1728; RV32: # %bb.0: # %entry1729; RV32-NEXT: addi sp, sp, -321730; RV32-NEXT: .cfi_def_cfa_offset 321731; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1732; RV32-NEXT: .cfi_offset ra, -41733; RV32-NEXT: call __extendhfsf21734; RV32-NEXT: addi a0, sp, 81735; RV32-NEXT: call __fixsfti1736; RV32-NEXT: lw a3, 8(sp)1737; RV32-NEXT: lw a1, 12(sp)1738; RV32-NEXT: lw a2, 16(sp)1739; RV32-NEXT: lw a4, 20(sp)1740; RV32-NEXT: lui a0, 5242881741; RV32-NEXT: addi a5, a0, -11742; RV32-NEXT: beq a1, a5, .LBB24_21743; RV32-NEXT: # %bb.1: # %entry1744; RV32-NEXT: sltu a6, a1, a51745; RV32-NEXT: or a7, a2, a41746; RV32-NEXT: bnez a7, .LBB24_31747; RV32-NEXT: j .LBB24_41748; RV32-NEXT: .LBB24_2:1749; RV32-NEXT: sltiu a6, a3, -11750; RV32-NEXT: or a7, a2, a41751; RV32-NEXT: beqz a7, .LBB24_41752; RV32-NEXT: .LBB24_3: # %entry1753; RV32-NEXT: srli a6, a4, 311754; RV32-NEXT: .LBB24_4: # %entry1755; RV32-NEXT: neg a7, a61756; RV32-NEXT: addi t0, a6, -11757; RV32-NEXT: bnez a6, .LBB24_61758; RV32-NEXT: # %bb.5: # %entry1759; RV32-NEXT: mv a1, a51760; RV32-NEXT: .LBB24_6: # %entry1761; RV32-NEXT: or a3, t0, a31762; RV32-NEXT: and a4, a7, a41763; RV32-NEXT: and a2, a7, a21764; RV32-NEXT: beq a1, a0, .LBB24_81765; RV32-NEXT: # %bb.7: # %entry1766; RV32-NEXT: sltu a0, a0, a11767; RV32-NEXT: j .LBB24_91768; RV32-NEXT: .LBB24_8:1769; RV32-NEXT: snez a0, a31770; RV32-NEXT: .LBB24_9: # %entry1771; RV32-NEXT: and a2, a2, a41772; RV32-NEXT: li a5, -11773; RV32-NEXT: beq a2, a5, .LBB24_111774; RV32-NEXT: # %bb.10: # %entry1775; RV32-NEXT: srli a4, a4, 311776; RV32-NEXT: xori a0, a4, 11777; RV32-NEXT: .LBB24_11: # %entry1778; RV32-NEXT: bnez a0, .LBB24_131779; RV32-NEXT: # %bb.12: # %entry1780; RV32-NEXT: lui a1, 5242881781; RV32-NEXT: .LBB24_13: # %entry1782; RV32-NEXT: neg a0, a01783; RV32-NEXT: and a0, a0, a31784; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1785; RV32-NEXT: .cfi_restore ra1786; RV32-NEXT: addi sp, sp, 321787; RV32-NEXT: .cfi_def_cfa_offset 01788; RV32-NEXT: ret1789;1790; RV64-LABEL: stest_f16i64:1791; RV64: # %bb.0: # %entry1792; RV64-NEXT: addi sp, sp, -161793; RV64-NEXT: .cfi_def_cfa_offset 161794; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1795; RV64-NEXT: .cfi_offset ra, -81796; RV64-NEXT: call __extendhfsf21797; RV64-NEXT: call __fixsfti1798; RV64-NEXT: li a2, -11799; RV64-NEXT: srli a3, a2, 11800; RV64-NEXT: beqz a1, .LBB24_21801; RV64-NEXT: # %bb.1: # %entry1802; RV64-NEXT: srli a4, a1, 631803; RV64-NEXT: j .LBB24_31804; RV64-NEXT: .LBB24_2:1805; RV64-NEXT: sltu a4, a0, a31806; RV64-NEXT: .LBB24_3: # %entry1807; RV64-NEXT: neg a5, a41808; RV64-NEXT: and a5, a5, a11809; RV64-NEXT: bnez a4, .LBB24_51810; RV64-NEXT: # %bb.4: # %entry1811; RV64-NEXT: mv a0, a31812; RV64-NEXT: .LBB24_5: # %entry1813; RV64-NEXT: slli a1, a2, 631814; RV64-NEXT: beq a5, a2, .LBB24_71815; RV64-NEXT: # %bb.6: # %entry1816; RV64-NEXT: srli a5, a5, 631817; RV64-NEXT: xori a2, a5, 11818; RV64-NEXT: beqz a2, .LBB24_81819; RV64-NEXT: j .LBB24_91820; RV64-NEXT: .LBB24_7:1821; RV64-NEXT: sltu a2, a1, a01822; RV64-NEXT: bnez a2, .LBB24_91823; RV64-NEXT: .LBB24_8: # %entry1824; RV64-NEXT: mv a0, a11825; RV64-NEXT: .LBB24_9: # %entry1826; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1827; RV64-NEXT: .cfi_restore ra1828; RV64-NEXT: addi sp, sp, 161829; RV64-NEXT: .cfi_def_cfa_offset 01830; RV64-NEXT: ret1831entry:1832 %conv = fptosi half %x to i1281833 %0 = icmp slt i128 %conv, 92233720368547758071834 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071835 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081836 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081837 %conv6 = trunc i128 %spec.store.select7 to i641838 ret i64 %conv61839}1840 1841define i64 @utesth_f16i64(half %x) {1842; RV32-LABEL: utesth_f16i64:1843; RV32: # %bb.0: # %entry1844; RV32-NEXT: addi sp, sp, -321845; RV32-NEXT: .cfi_def_cfa_offset 321846; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1847; RV32-NEXT: .cfi_offset ra, -41848; RV32-NEXT: call __extendhfsf21849; RV32-NEXT: addi a0, sp, 81850; RV32-NEXT: call __fixunssfti1851; RV32-NEXT: lw a0, 16(sp)1852; RV32-NEXT: lw a1, 20(sp)1853; RV32-NEXT: lw a2, 12(sp)1854; RV32-NEXT: lw a3, 8(sp)1855; RV32-NEXT: or a4, a1, a01856; RV32-NEXT: xori a0, a0, 11857; RV32-NEXT: seqz a4, a41858; RV32-NEXT: or a0, a0, a11859; RV32-NEXT: seqz a0, a01860; RV32-NEXT: addi a0, a0, -11861; RV32-NEXT: and a0, a0, a41862; RV32-NEXT: neg a1, a01863; RV32-NEXT: and a0, a1, a31864; RV32-NEXT: and a1, a1, a21865; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1866; RV32-NEXT: .cfi_restore ra1867; RV32-NEXT: addi sp, sp, 321868; RV32-NEXT: .cfi_def_cfa_offset 01869; RV32-NEXT: ret1870;1871; RV64-LABEL: utesth_f16i64:1872; RV64: # %bb.0: # %entry1873; RV64-NEXT: addi sp, sp, -161874; RV64-NEXT: .cfi_def_cfa_offset 161875; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1876; RV64-NEXT: .cfi_offset ra, -81877; RV64-NEXT: call __extendhfsf21878; RV64-NEXT: call __fixunssfti1879; RV64-NEXT: snez a1, a11880; RV64-NEXT: addi a1, a1, -11881; RV64-NEXT: and a0, a1, a01882; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1883; RV64-NEXT: .cfi_restore ra1884; RV64-NEXT: addi sp, sp, 161885; RV64-NEXT: .cfi_def_cfa_offset 01886; RV64-NEXT: ret1887entry:1888 %conv = fptoui half %x to i1281889 %0 = icmp ult i128 %conv, 184467440737095516161890 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161891 %conv6 = trunc i128 %spec.store.select to i641892 ret i64 %conv61893}1894 1895define i64 @ustest_f16i64(half %x) {1896; RV32-LABEL: ustest_f16i64:1897; RV32: # %bb.0: # %entry1898; RV32-NEXT: addi sp, sp, -321899; RV32-NEXT: .cfi_def_cfa_offset 321900; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1901; RV32-NEXT: .cfi_offset ra, -41902; RV32-NEXT: call __extendhfsf21903; RV32-NEXT: addi a0, sp, 81904; RV32-NEXT: call __fixsfti1905; RV32-NEXT: lw a1, 20(sp)1906; RV32-NEXT: lw a0, 16(sp)1907; RV32-NEXT: beqz a1, .LBB26_21908; RV32-NEXT: # %bb.1: # %entry1909; RV32-NEXT: srli a2, a1, 311910; RV32-NEXT: j .LBB26_31911; RV32-NEXT: .LBB26_2:1912; RV32-NEXT: seqz a2, a01913; RV32-NEXT: .LBB26_3: # %entry1914; RV32-NEXT: xori a3, a0, 11915; RV32-NEXT: or a3, a3, a11916; RV32-NEXT: seqz a3, a31917; RV32-NEXT: addi a3, a3, -11918; RV32-NEXT: and a3, a3, a21919; RV32-NEXT: neg a2, a31920; RV32-NEXT: bnez a3, .LBB26_51921; RV32-NEXT: # %bb.4: # %entry1922; RV32-NEXT: li a0, 11923; RV32-NEXT: .LBB26_5: # %entry1924; RV32-NEXT: lw a4, 8(sp)1925; RV32-NEXT: lw a3, 12(sp)1926; RV32-NEXT: and a5, a2, a11927; RV32-NEXT: beqz a5, .LBB26_71928; RV32-NEXT: # %bb.6: # %entry1929; RV32-NEXT: sgtz a1, a51930; RV32-NEXT: j .LBB26_81931; RV32-NEXT: .LBB26_7:1932; RV32-NEXT: snez a1, a01933; RV32-NEXT: .LBB26_8: # %entry1934; RV32-NEXT: and a4, a2, a41935; RV32-NEXT: or a0, a0, a51936; RV32-NEXT: and a2, a2, a31937; RV32-NEXT: bnez a0, .LBB26_101938; RV32-NEXT: # %bb.9:1939; RV32-NEXT: or a0, a4, a21940; RV32-NEXT: snez a1, a01941; RV32-NEXT: .LBB26_10: # %entry1942; RV32-NEXT: neg a1, a11943; RV32-NEXT: and a0, a1, a41944; RV32-NEXT: and a1, a1, a21945; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1946; RV32-NEXT: .cfi_restore ra1947; RV32-NEXT: addi sp, sp, 321948; RV32-NEXT: .cfi_def_cfa_offset 01949; RV32-NEXT: ret1950;1951; RV64-LABEL: ustest_f16i64:1952; RV64: # %bb.0: # %entry1953; RV64-NEXT: addi sp, sp, -161954; RV64-NEXT: .cfi_def_cfa_offset 161955; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1956; RV64-NEXT: .cfi_offset ra, -81957; RV64-NEXT: call __extendhfsf21958; RV64-NEXT: call __fixsfti1959; RV64-NEXT: slti a2, a1, 11960; RV64-NEXT: blez a1, .LBB26_21961; RV64-NEXT: # %bb.1: # %entry1962; RV64-NEXT: li a1, 11963; RV64-NEXT: .LBB26_2: # %entry1964; RV64-NEXT: neg a2, a21965; RV64-NEXT: and a0, a2, a01966; RV64-NEXT: beqz a1, .LBB26_41967; RV64-NEXT: # %bb.3: # %entry1968; RV64-NEXT: sgtz a1, a11969; RV64-NEXT: j .LBB26_51970; RV64-NEXT: .LBB26_4:1971; RV64-NEXT: snez a1, a01972; RV64-NEXT: .LBB26_5: # %entry1973; RV64-NEXT: neg a1, a11974; RV64-NEXT: and a0, a1, a01975; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1976; RV64-NEXT: .cfi_restore ra1977; RV64-NEXT: addi sp, sp, 161978; RV64-NEXT: .cfi_def_cfa_offset 01979; RV64-NEXT: ret1980entry:1981 %conv = fptosi half %x to i1281982 %0 = icmp slt i128 %conv, 184467440737095516161983 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161984 %1 = icmp sgt i128 %spec.store.select, 01985 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01986 %conv6 = trunc i128 %spec.store.select7 to i641987 ret i64 %conv61988}1989 1990; i32 saturate1991 1992define i32 @stest_f64i32_mm(double %x) {1993; RV32IF-LABEL: stest_f64i32_mm:1994; RV32IF: # %bb.0: # %entry1995; RV32IF-NEXT: addi sp, sp, -161996; RV32IF-NEXT: .cfi_def_cfa_offset 161997; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1998; RV32IF-NEXT: .cfi_offset ra, -41999; RV32IF-NEXT: call __fixdfdi2000; RV32IF-NEXT: lui a2, 5242882001; RV32IF-NEXT: addi a3, a2, -12002; RV32IF-NEXT: beqz a1, .LBB27_22003; RV32IF-NEXT: # %bb.1: # %entry2004; RV32IF-NEXT: srli a4, a1, 312005; RV32IF-NEXT: j .LBB27_32006; RV32IF-NEXT: .LBB27_2:2007; RV32IF-NEXT: sltu a4, a0, a32008; RV32IF-NEXT: .LBB27_3: # %entry2009; RV32IF-NEXT: neg a5, a42010; RV32IF-NEXT: and a1, a5, a12011; RV32IF-NEXT: bnez a4, .LBB27_52012; RV32IF-NEXT: # %bb.4: # %entry2013; RV32IF-NEXT: mv a0, a32014; RV32IF-NEXT: .LBB27_5: # %entry2015; RV32IF-NEXT: li a3, -12016; RV32IF-NEXT: beq a1, a3, .LBB27_72017; RV32IF-NEXT: # %bb.6: # %entry2018; RV32IF-NEXT: srli a1, a1, 312019; RV32IF-NEXT: xori a1, a1, 12020; RV32IF-NEXT: beqz a1, .LBB27_82021; RV32IF-NEXT: j .LBB27_92022; RV32IF-NEXT: .LBB27_7:2023; RV32IF-NEXT: sltu a1, a2, a02024; RV32IF-NEXT: bnez a1, .LBB27_92025; RV32IF-NEXT: .LBB27_8: # %entry2026; RV32IF-NEXT: lui a0, 5242882027; RV32IF-NEXT: .LBB27_9: # %entry2028; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2029; RV32IF-NEXT: .cfi_restore ra2030; RV32IF-NEXT: addi sp, sp, 162031; RV32IF-NEXT: .cfi_def_cfa_offset 02032; RV32IF-NEXT: ret2033;2034; RV64IF-LABEL: stest_f64i32_mm:2035; RV64IF: # %bb.0: # %entry2036; RV64IF-NEXT: addi sp, sp, -162037; RV64IF-NEXT: .cfi_def_cfa_offset 162038; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2039; RV64IF-NEXT: .cfi_offset ra, -82040; RV64IF-NEXT: call __fixdfdi2041; RV64IF-NEXT: lui a1, 5242882042; RV64IF-NEXT: addiw a2, a1, -12043; RV64IF-NEXT: blt a0, a2, .LBB27_22044; RV64IF-NEXT: # %bb.1: # %entry2045; RV64IF-NEXT: mv a0, a22046; RV64IF-NEXT: .LBB27_2: # %entry2047; RV64IF-NEXT: blt a1, a0, .LBB27_42048; RV64IF-NEXT: # %bb.3: # %entry2049; RV64IF-NEXT: lui a0, 5242882050; RV64IF-NEXT: .LBB27_4: # %entry2051; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2052; RV64IF-NEXT: .cfi_restore ra2053; RV64IF-NEXT: addi sp, sp, 162054; RV64IF-NEXT: .cfi_def_cfa_offset 02055; RV64IF-NEXT: ret2056;2057; RV32IFD-LABEL: stest_f64i32_mm:2058; RV32IFD: # %bb.0: # %entry2059; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz2060; RV32IFD-NEXT: feq.d a1, fa0, fa02061; RV32IFD-NEXT: seqz a1, a12062; RV32IFD-NEXT: addi a1, a1, -12063; RV32IFD-NEXT: and a0, a1, a02064; RV32IFD-NEXT: ret2065;2066; RV64IFD-LABEL: stest_f64i32_mm:2067; RV64IFD: # %bb.0: # %entry2068; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz2069; RV64IFD-NEXT: lui a1, 5242882070; RV64IFD-NEXT: addiw a2, a1, -12071; RV64IFD-NEXT: bge a0, a2, .LBB27_32072; RV64IFD-NEXT: # %bb.1: # %entry2073; RV64IFD-NEXT: bge a1, a0, .LBB27_42074; RV64IFD-NEXT: .LBB27_2: # %entry2075; RV64IFD-NEXT: ret2076; RV64IFD-NEXT: .LBB27_3: # %entry2077; RV64IFD-NEXT: mv a0, a22078; RV64IFD-NEXT: blt a1, a2, .LBB27_22079; RV64IFD-NEXT: .LBB27_4: # %entry2080; RV64IFD-NEXT: lui a0, 5242882081; RV64IFD-NEXT: ret2082entry:2083 %conv = fptosi double %x to i642084 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)2085 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)2086 %conv6 = trunc i64 %spec.store.select7 to i322087 ret i32 %conv62088}2089 2090define i32 @utest_f64i32_mm(double %x) {2091; RV32IF-LABEL: utest_f64i32_mm:2092; RV32IF: # %bb.0: # %entry2093; RV32IF-NEXT: addi sp, sp, -162094; RV32IF-NEXT: .cfi_def_cfa_offset 162095; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2096; RV32IF-NEXT: .cfi_offset ra, -42097; RV32IF-NEXT: call __fixunsdfdi2098; RV32IF-NEXT: seqz a1, a12099; RV32IF-NEXT: addi a1, a1, -12100; RV32IF-NEXT: or a0, a1, a02101; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2102; RV32IF-NEXT: .cfi_restore ra2103; RV32IF-NEXT: addi sp, sp, 162104; RV32IF-NEXT: .cfi_def_cfa_offset 02105; RV32IF-NEXT: ret2106;2107; RV64IF-LABEL: utest_f64i32_mm:2108; RV64IF: # %bb.0: # %entry2109; RV64IF-NEXT: addi sp, sp, -162110; RV64IF-NEXT: .cfi_def_cfa_offset 162111; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2112; RV64IF-NEXT: .cfi_offset ra, -82113; RV64IF-NEXT: call __fixunsdfdi2114; RV64IF-NEXT: li a1, -12115; RV64IF-NEXT: srli a1, a1, 322116; RV64IF-NEXT: bltu a0, a1, .LBB28_22117; RV64IF-NEXT: # %bb.1: # %entry2118; RV64IF-NEXT: mv a0, a12119; RV64IF-NEXT: .LBB28_2: # %entry2120; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2121; RV64IF-NEXT: .cfi_restore ra2122; RV64IF-NEXT: addi sp, sp, 162123; RV64IF-NEXT: .cfi_def_cfa_offset 02124; RV64IF-NEXT: ret2125;2126; RV32IFD-LABEL: utest_f64i32_mm:2127; RV32IFD: # %bb.0: # %entry2128; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz2129; RV32IFD-NEXT: feq.d a1, fa0, fa02130; RV32IFD-NEXT: seqz a1, a12131; RV32IFD-NEXT: addi a1, a1, -12132; RV32IFD-NEXT: and a0, a1, a02133; RV32IFD-NEXT: ret2134;2135; RV64IFD-LABEL: utest_f64i32_mm:2136; RV64IFD: # %bb.0: # %entry2137; RV64IFD-NEXT: fcvt.lu.d a0, fa0, rtz2138; RV64IFD-NEXT: li a1, -12139; RV64IFD-NEXT: srli a1, a1, 322140; RV64IFD-NEXT: bltu a0, a1, .LBB28_22141; RV64IFD-NEXT: # %bb.1: # %entry2142; RV64IFD-NEXT: mv a0, a12143; RV64IFD-NEXT: .LBB28_2: # %entry2144; RV64IFD-NEXT: ret2145entry:2146 %conv = fptoui double %x to i642147 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)2148 %conv6 = trunc i64 %spec.store.select to i322149 ret i32 %conv62150}2151 2152define i32 @ustest_f64i32_mm(double %x) {2153; RV32IF-LABEL: ustest_f64i32_mm:2154; RV32IF: # %bb.0: # %entry2155; RV32IF-NEXT: addi sp, sp, -162156; RV32IF-NEXT: .cfi_def_cfa_offset 162157; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2158; RV32IF-NEXT: .cfi_offset ra, -42159; RV32IF-NEXT: call __fixdfdi2160; RV32IF-NEXT: bnez a1, .LBB29_22161; RV32IF-NEXT: # %bb.1: # %entry2162; RV32IF-NEXT: li a2, 12163; RV32IF-NEXT: j .LBB29_32164; RV32IF-NEXT: .LBB29_2:2165; RV32IF-NEXT: slti a2, a1, 12166; RV32IF-NEXT: .LBB29_3: # %entry2167; RV32IF-NEXT: addi a3, a2, -12168; RV32IF-NEXT: neg a2, a22169; RV32IF-NEXT: or a0, a3, a02170; RV32IF-NEXT: and a1, a2, a12171; RV32IF-NEXT: srli a1, a1, 312172; RV32IF-NEXT: addi a1, a1, -12173; RV32IF-NEXT: and a0, a1, a02174; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2175; RV32IF-NEXT: .cfi_restore ra2176; RV32IF-NEXT: addi sp, sp, 162177; RV32IF-NEXT: .cfi_def_cfa_offset 02178; RV32IF-NEXT: ret2179;2180; RV64IF-LABEL: ustest_f64i32_mm:2181; RV64IF: # %bb.0: # %entry2182; RV64IF-NEXT: addi sp, sp, -162183; RV64IF-NEXT: .cfi_def_cfa_offset 162184; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2185; RV64IF-NEXT: .cfi_offset ra, -82186; RV64IF-NEXT: call __fixdfdi2187; RV64IF-NEXT: li a1, -12188; RV64IF-NEXT: srli a1, a1, 322189; RV64IF-NEXT: blt a0, a1, .LBB29_22190; RV64IF-NEXT: # %bb.1: # %entry2191; RV64IF-NEXT: mv a0, a12192; RV64IF-NEXT: .LBB29_2: # %entry2193; RV64IF-NEXT: sgtz a1, a02194; RV64IF-NEXT: neg a1, a12195; RV64IF-NEXT: and a0, a1, a02196; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2197; RV64IF-NEXT: .cfi_restore ra2198; RV64IF-NEXT: addi sp, sp, 162199; RV64IF-NEXT: .cfi_def_cfa_offset 02200; RV64IF-NEXT: ret2201;2202; RV32IFD-LABEL: ustest_f64i32_mm:2203; RV32IFD: # %bb.0: # %entry2204; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz2205; RV32IFD-NEXT: feq.d a1, fa0, fa02206; RV32IFD-NEXT: seqz a1, a12207; RV32IFD-NEXT: addi a1, a1, -12208; RV32IFD-NEXT: and a0, a1, a02209; RV32IFD-NEXT: ret2210;2211; RV64IFD-LABEL: ustest_f64i32_mm:2212; RV64IFD: # %bb.0: # %entry2213; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz2214; RV64IFD-NEXT: li a1, -12215; RV64IFD-NEXT: srli a1, a1, 322216; RV64IFD-NEXT: blt a0, a1, .LBB29_22217; RV64IFD-NEXT: # %bb.1: # %entry2218; RV64IFD-NEXT: mv a0, a12219; RV64IFD-NEXT: .LBB29_2: # %entry2220; RV64IFD-NEXT: sgtz a1, a02221; RV64IFD-NEXT: neg a1, a12222; RV64IFD-NEXT: and a0, a1, a02223; RV64IFD-NEXT: ret2224entry:2225 %conv = fptosi double %x to i642226 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)2227 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)2228 %conv6 = trunc i64 %spec.store.select7 to i322229 ret i32 %conv62230}2231 2232define i32 @stest_f32i32_mm(float %x) {2233; RV32-LABEL: stest_f32i32_mm:2234; RV32: # %bb.0: # %entry2235; RV32-NEXT: fcvt.w.s a0, fa0, rtz2236; RV32-NEXT: feq.s a1, fa0, fa02237; RV32-NEXT: seqz a1, a12238; RV32-NEXT: addi a1, a1, -12239; RV32-NEXT: and a0, a1, a02240; RV32-NEXT: ret2241;2242; RV64-LABEL: stest_f32i32_mm:2243; RV64: # %bb.0: # %entry2244; RV64-NEXT: fcvt.l.s a0, fa0, rtz2245; RV64-NEXT: lui a1, 5242882246; RV64-NEXT: addiw a2, a1, -12247; RV64-NEXT: bge a0, a2, .LBB30_32248; RV64-NEXT: # %bb.1: # %entry2249; RV64-NEXT: bge a1, a0, .LBB30_42250; RV64-NEXT: .LBB30_2: # %entry2251; RV64-NEXT: ret2252; RV64-NEXT: .LBB30_3: # %entry2253; RV64-NEXT: mv a0, a22254; RV64-NEXT: blt a1, a2, .LBB30_22255; RV64-NEXT: .LBB30_4: # %entry2256; RV64-NEXT: lui a0, 5242882257; RV64-NEXT: ret2258entry:2259 %conv = fptosi float %x to i642260 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)2261 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)2262 %conv6 = trunc i64 %spec.store.select7 to i322263 ret i32 %conv62264}2265 2266define i32 @utest_f32i32_mm(float %x) {2267; RV32-LABEL: utest_f32i32_mm:2268; RV32: # %bb.0: # %entry2269; RV32-NEXT: fcvt.wu.s a0, fa0, rtz2270; RV32-NEXT: feq.s a1, fa0, fa02271; RV32-NEXT: seqz a1, a12272; RV32-NEXT: addi a1, a1, -12273; RV32-NEXT: and a0, a1, a02274; RV32-NEXT: ret2275;2276; RV64-LABEL: utest_f32i32_mm:2277; RV64: # %bb.0: # %entry2278; RV64-NEXT: fcvt.lu.s a0, fa0, rtz2279; RV64-NEXT: li a1, -12280; RV64-NEXT: srli a1, a1, 322281; RV64-NEXT: bltu a0, a1, .LBB31_22282; RV64-NEXT: # %bb.1: # %entry2283; RV64-NEXT: mv a0, a12284; RV64-NEXT: .LBB31_2: # %entry2285; RV64-NEXT: ret2286entry:2287 %conv = fptoui float %x to i642288 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)2289 %conv6 = trunc i64 %spec.store.select to i322290 ret i32 %conv62291}2292 2293define i32 @ustest_f32i32_mm(float %x) {2294; RV32-LABEL: ustest_f32i32_mm:2295; RV32: # %bb.0: # %entry2296; RV32-NEXT: fcvt.wu.s a0, fa0, rtz2297; RV32-NEXT: feq.s a1, fa0, fa02298; RV32-NEXT: seqz a1, a12299; RV32-NEXT: addi a1, a1, -12300; RV32-NEXT: and a0, a1, a02301; RV32-NEXT: ret2302;2303; RV64-LABEL: ustest_f32i32_mm:2304; RV64: # %bb.0: # %entry2305; RV64-NEXT: fcvt.l.s a0, fa0, rtz2306; RV64-NEXT: li a1, -12307; RV64-NEXT: srli a1, a1, 322308; RV64-NEXT: blt a0, a1, .LBB32_22309; RV64-NEXT: # %bb.1: # %entry2310; RV64-NEXT: mv a0, a12311; RV64-NEXT: .LBB32_2: # %entry2312; RV64-NEXT: sgtz a1, a02313; RV64-NEXT: neg a1, a12314; RV64-NEXT: and a0, a1, a02315; RV64-NEXT: ret2316entry:2317 %conv = fptosi float %x to i642318 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)2319 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)2320 %conv6 = trunc i64 %spec.store.select7 to i322321 ret i32 %conv62322}2323 2324define i32 @stest_f16i32_mm(half %x) {2325; RV32-LABEL: stest_f16i32_mm:2326; RV32: # %bb.0: # %entry2327; RV32-NEXT: addi sp, sp, -162328; RV32-NEXT: .cfi_def_cfa_offset 162329; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2330; RV32-NEXT: .cfi_offset ra, -42331; RV32-NEXT: call __extendhfsf22332; RV32-NEXT: call __fixsfdi2333; RV32-NEXT: lui a2, 5242882334; RV32-NEXT: addi a3, a2, -12335; RV32-NEXT: beqz a1, .LBB33_22336; RV32-NEXT: # %bb.1: # %entry2337; RV32-NEXT: srli a4, a1, 312338; RV32-NEXT: j .LBB33_32339; RV32-NEXT: .LBB33_2:2340; RV32-NEXT: sltu a4, a0, a32341; RV32-NEXT: .LBB33_3: # %entry2342; RV32-NEXT: neg a5, a42343; RV32-NEXT: and a1, a5, a12344; RV32-NEXT: bnez a4, .LBB33_52345; RV32-NEXT: # %bb.4: # %entry2346; RV32-NEXT: mv a0, a32347; RV32-NEXT: .LBB33_5: # %entry2348; RV32-NEXT: li a3, -12349; RV32-NEXT: beq a1, a3, .LBB33_72350; RV32-NEXT: # %bb.6: # %entry2351; RV32-NEXT: srli a1, a1, 312352; RV32-NEXT: xori a1, a1, 12353; RV32-NEXT: beqz a1, .LBB33_82354; RV32-NEXT: j .LBB33_92355; RV32-NEXT: .LBB33_7:2356; RV32-NEXT: sltu a1, a2, a02357; RV32-NEXT: bnez a1, .LBB33_92358; RV32-NEXT: .LBB33_8: # %entry2359; RV32-NEXT: lui a0, 5242882360; RV32-NEXT: .LBB33_9: # %entry2361; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2362; RV32-NEXT: .cfi_restore ra2363; RV32-NEXT: addi sp, sp, 162364; RV32-NEXT: .cfi_def_cfa_offset 02365; RV32-NEXT: ret2366;2367; RV64-LABEL: stest_f16i32_mm:2368; RV64: # %bb.0: # %entry2369; RV64-NEXT: addi sp, sp, -162370; RV64-NEXT: .cfi_def_cfa_offset 162371; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2372; RV64-NEXT: .cfi_offset ra, -82373; RV64-NEXT: call __extendhfsf22374; RV64-NEXT: fcvt.l.s a0, fa0, rtz2375; RV64-NEXT: lui a1, 5242882376; RV64-NEXT: addiw a2, a1, -12377; RV64-NEXT: blt a0, a2, .LBB33_22378; RV64-NEXT: # %bb.1: # %entry2379; RV64-NEXT: mv a0, a22380; RV64-NEXT: .LBB33_2: # %entry2381; RV64-NEXT: blt a1, a0, .LBB33_42382; RV64-NEXT: # %bb.3: # %entry2383; RV64-NEXT: lui a0, 5242882384; RV64-NEXT: .LBB33_4: # %entry2385; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2386; RV64-NEXT: .cfi_restore ra2387; RV64-NEXT: addi sp, sp, 162388; RV64-NEXT: .cfi_def_cfa_offset 02389; RV64-NEXT: ret2390entry:2391 %conv = fptosi half %x to i642392 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)2393 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)2394 %conv6 = trunc i64 %spec.store.select7 to i322395 ret i32 %conv62396}2397 2398define i32 @utesth_f16i32_mm(half %x) {2399; RV32-LABEL: utesth_f16i32_mm:2400; RV32: # %bb.0: # %entry2401; RV32-NEXT: addi sp, sp, -162402; RV32-NEXT: .cfi_def_cfa_offset 162403; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2404; RV32-NEXT: .cfi_offset ra, -42405; RV32-NEXT: call __extendhfsf22406; RV32-NEXT: call __fixunssfdi2407; RV32-NEXT: seqz a1, a12408; RV32-NEXT: addi a1, a1, -12409; RV32-NEXT: or a0, a1, a02410; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2411; RV32-NEXT: .cfi_restore ra2412; RV32-NEXT: addi sp, sp, 162413; RV32-NEXT: .cfi_def_cfa_offset 02414; RV32-NEXT: ret2415;2416; RV64-LABEL: utesth_f16i32_mm:2417; RV64: # %bb.0: # %entry2418; RV64-NEXT: addi sp, sp, -162419; RV64-NEXT: .cfi_def_cfa_offset 162420; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2421; RV64-NEXT: .cfi_offset ra, -82422; RV64-NEXT: call __extendhfsf22423; RV64-NEXT: fcvt.lu.s a0, fa0, rtz2424; RV64-NEXT: li a1, -12425; RV64-NEXT: srli a1, a1, 322426; RV64-NEXT: bltu a0, a1, .LBB34_22427; RV64-NEXT: # %bb.1: # %entry2428; RV64-NEXT: mv a0, a12429; RV64-NEXT: .LBB34_2: # %entry2430; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2431; RV64-NEXT: .cfi_restore ra2432; RV64-NEXT: addi sp, sp, 162433; RV64-NEXT: .cfi_def_cfa_offset 02434; RV64-NEXT: ret2435entry:2436 %conv = fptoui half %x to i642437 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)2438 %conv6 = trunc i64 %spec.store.select to i322439 ret i32 %conv62440}2441 2442define i32 @ustest_f16i32_mm(half %x) {2443; RV32-LABEL: ustest_f16i32_mm:2444; RV32: # %bb.0: # %entry2445; RV32-NEXT: addi sp, sp, -162446; RV32-NEXT: .cfi_def_cfa_offset 162447; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2448; RV32-NEXT: .cfi_offset ra, -42449; RV32-NEXT: call __extendhfsf22450; RV32-NEXT: call __fixsfdi2451; RV32-NEXT: bnez a1, .LBB35_22452; RV32-NEXT: # %bb.1: # %entry2453; RV32-NEXT: li a2, 12454; RV32-NEXT: j .LBB35_32455; RV32-NEXT: .LBB35_2:2456; RV32-NEXT: slti a2, a1, 12457; RV32-NEXT: .LBB35_3: # %entry2458; RV32-NEXT: addi a3, a2, -12459; RV32-NEXT: neg a2, a22460; RV32-NEXT: or a0, a3, a02461; RV32-NEXT: and a1, a2, a12462; RV32-NEXT: srli a1, a1, 312463; RV32-NEXT: addi a1, a1, -12464; RV32-NEXT: and a0, a1, a02465; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2466; RV32-NEXT: .cfi_restore ra2467; RV32-NEXT: addi sp, sp, 162468; RV32-NEXT: .cfi_def_cfa_offset 02469; RV32-NEXT: ret2470;2471; RV64-LABEL: ustest_f16i32_mm:2472; RV64: # %bb.0: # %entry2473; RV64-NEXT: addi sp, sp, -162474; RV64-NEXT: .cfi_def_cfa_offset 162475; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2476; RV64-NEXT: .cfi_offset ra, -82477; RV64-NEXT: call __extendhfsf22478; RV64-NEXT: fcvt.l.s a0, fa0, rtz2479; RV64-NEXT: li a1, -12480; RV64-NEXT: srli a1, a1, 322481; RV64-NEXT: blt a0, a1, .LBB35_22482; RV64-NEXT: # %bb.1: # %entry2483; RV64-NEXT: mv a0, a12484; RV64-NEXT: .LBB35_2: # %entry2485; RV64-NEXT: sgtz a1, a02486; RV64-NEXT: neg a1, a12487; RV64-NEXT: and a0, a1, a02488; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2489; RV64-NEXT: .cfi_restore ra2490; RV64-NEXT: addi sp, sp, 162491; RV64-NEXT: .cfi_def_cfa_offset 02492; RV64-NEXT: ret2493entry:2494 %conv = fptosi half %x to i642495 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)2496 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)2497 %conv6 = trunc i64 %spec.store.select7 to i322498 ret i32 %conv62499}2500 2501; i16 saturate2502 2503define i16 @stest_f64i16_mm(double %x) {2504; RV32IF-LABEL: stest_f64i16_mm:2505; RV32IF: # %bb.0: # %entry2506; RV32IF-NEXT: addi sp, sp, -162507; RV32IF-NEXT: .cfi_def_cfa_offset 162508; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2509; RV32IF-NEXT: .cfi_offset ra, -42510; RV32IF-NEXT: call __fixdfsi2511; RV32IF-NEXT: lui a1, 82512; RV32IF-NEXT: addi a1, a1, -12513; RV32IF-NEXT: blt a0, a1, .LBB36_22514; RV32IF-NEXT: # %bb.1: # %entry2515; RV32IF-NEXT: mv a0, a12516; RV32IF-NEXT: .LBB36_2: # %entry2517; RV32IF-NEXT: lui a1, 10485682518; RV32IF-NEXT: blt a1, a0, .LBB36_42519; RV32IF-NEXT: # %bb.3: # %entry2520; RV32IF-NEXT: lui a0, 10485682521; RV32IF-NEXT: .LBB36_4: # %entry2522; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2523; RV32IF-NEXT: .cfi_restore ra2524; RV32IF-NEXT: addi sp, sp, 162525; RV32IF-NEXT: .cfi_def_cfa_offset 02526; RV32IF-NEXT: ret2527;2528; RV64IF-LABEL: stest_f64i16_mm:2529; RV64IF: # %bb.0: # %entry2530; RV64IF-NEXT: addi sp, sp, -162531; RV64IF-NEXT: .cfi_def_cfa_offset 162532; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2533; RV64IF-NEXT: .cfi_offset ra, -82534; RV64IF-NEXT: call __fixdfsi2535; RV64IF-NEXT: lui a1, 82536; RV64IF-NEXT: addi a1, a1, -12537; RV64IF-NEXT: blt a0, a1, .LBB36_22538; RV64IF-NEXT: # %bb.1: # %entry2539; RV64IF-NEXT: mv a0, a12540; RV64IF-NEXT: .LBB36_2: # %entry2541; RV64IF-NEXT: lui a1, 10485682542; RV64IF-NEXT: blt a1, a0, .LBB36_42543; RV64IF-NEXT: # %bb.3: # %entry2544; RV64IF-NEXT: lui a0, 10485682545; RV64IF-NEXT: .LBB36_4: # %entry2546; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2547; RV64IF-NEXT: .cfi_restore ra2548; RV64IF-NEXT: addi sp, sp, 162549; RV64IF-NEXT: .cfi_def_cfa_offset 02550; RV64IF-NEXT: ret2551;2552; RV32IFD-LABEL: stest_f64i16_mm:2553; RV32IFD: # %bb.0: # %entry2554; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz2555; RV32IFD-NEXT: lui a1, 82556; RV32IFD-NEXT: addi a1, a1, -12557; RV32IFD-NEXT: bge a0, a1, .LBB36_32558; RV32IFD-NEXT: # %bb.1: # %entry2559; RV32IFD-NEXT: lui a1, 10485682560; RV32IFD-NEXT: bge a1, a0, .LBB36_42561; RV32IFD-NEXT: .LBB36_2: # %entry2562; RV32IFD-NEXT: ret2563; RV32IFD-NEXT: .LBB36_3: # %entry2564; RV32IFD-NEXT: mv a0, a12565; RV32IFD-NEXT: lui a1, 10485682566; RV32IFD-NEXT: blt a1, a0, .LBB36_22567; RV32IFD-NEXT: .LBB36_4: # %entry2568; RV32IFD-NEXT: lui a0, 10485682569; RV32IFD-NEXT: ret2570;2571; RV64IFD-LABEL: stest_f64i16_mm:2572; RV64IFD: # %bb.0: # %entry2573; RV64IFD-NEXT: fcvt.w.d a0, fa0, rtz2574; RV64IFD-NEXT: lui a1, 82575; RV64IFD-NEXT: addi a1, a1, -12576; RV64IFD-NEXT: bge a0, a1, .LBB36_32577; RV64IFD-NEXT: # %bb.1: # %entry2578; RV64IFD-NEXT: lui a1, 10485682579; RV64IFD-NEXT: bge a1, a0, .LBB36_42580; RV64IFD-NEXT: .LBB36_2: # %entry2581; RV64IFD-NEXT: ret2582; RV64IFD-NEXT: .LBB36_3: # %entry2583; RV64IFD-NEXT: mv a0, a12584; RV64IFD-NEXT: lui a1, 10485682585; RV64IFD-NEXT: blt a1, a0, .LBB36_22586; RV64IFD-NEXT: .LBB36_4: # %entry2587; RV64IFD-NEXT: lui a0, 10485682588; RV64IFD-NEXT: ret2589entry:2590 %conv = fptosi double %x to i322591 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2592 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2593 %conv6 = trunc i32 %spec.store.select7 to i162594 ret i16 %conv62595}2596 2597define i16 @utest_f64i16_mm(double %x) {2598; RV32IF-LABEL: utest_f64i16_mm:2599; RV32IF: # %bb.0: # %entry2600; RV32IF-NEXT: addi sp, sp, -162601; RV32IF-NEXT: .cfi_def_cfa_offset 162602; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2603; RV32IF-NEXT: .cfi_offset ra, -42604; RV32IF-NEXT: call __fixunsdfsi2605; RV32IF-NEXT: lui a1, 162606; RV32IF-NEXT: addi a1, a1, -12607; RV32IF-NEXT: bltu a0, a1, .LBB37_22608; RV32IF-NEXT: # %bb.1: # %entry2609; RV32IF-NEXT: mv a0, a12610; RV32IF-NEXT: .LBB37_2: # %entry2611; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2612; RV32IF-NEXT: .cfi_restore ra2613; RV32IF-NEXT: addi sp, sp, 162614; RV32IF-NEXT: .cfi_def_cfa_offset 02615; RV32IF-NEXT: ret2616;2617; RV64IF-LABEL: utest_f64i16_mm:2618; RV64IF: # %bb.0: # %entry2619; RV64IF-NEXT: addi sp, sp, -162620; RV64IF-NEXT: .cfi_def_cfa_offset 162621; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2622; RV64IF-NEXT: .cfi_offset ra, -82623; RV64IF-NEXT: call __fixunsdfsi2624; RV64IF-NEXT: lui a1, 162625; RV64IF-NEXT: addi a1, a1, -12626; RV64IF-NEXT: bltu a0, a1, .LBB37_22627; RV64IF-NEXT: # %bb.1: # %entry2628; RV64IF-NEXT: mv a0, a12629; RV64IF-NEXT: .LBB37_2: # %entry2630; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2631; RV64IF-NEXT: .cfi_restore ra2632; RV64IF-NEXT: addi sp, sp, 162633; RV64IF-NEXT: .cfi_def_cfa_offset 02634; RV64IF-NEXT: ret2635;2636; RV32IFD-LABEL: utest_f64i16_mm:2637; RV32IFD: # %bb.0: # %entry2638; RV32IFD-NEXT: fcvt.wu.d a0, fa0, rtz2639; RV32IFD-NEXT: lui a1, 162640; RV32IFD-NEXT: addi a1, a1, -12641; RV32IFD-NEXT: bltu a0, a1, .LBB37_22642; RV32IFD-NEXT: # %bb.1: # %entry2643; RV32IFD-NEXT: mv a0, a12644; RV32IFD-NEXT: .LBB37_2: # %entry2645; RV32IFD-NEXT: ret2646;2647; RV64IFD-LABEL: utest_f64i16_mm:2648; RV64IFD: # %bb.0: # %entry2649; RV64IFD-NEXT: fcvt.wu.d a0, fa0, rtz2650; RV64IFD-NEXT: lui a1, 162651; RV64IFD-NEXT: addi a1, a1, -12652; RV64IFD-NEXT: bltu a0, a1, .LBB37_22653; RV64IFD-NEXT: # %bb.1: # %entry2654; RV64IFD-NEXT: mv a0, a12655; RV64IFD-NEXT: .LBB37_2: # %entry2656; RV64IFD-NEXT: ret2657entry:2658 %conv = fptoui double %x to i322659 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2660 %conv6 = trunc i32 %spec.store.select to i162661 ret i16 %conv62662}2663 2664define i16 @ustest_f64i16_mm(double %x) {2665; RV32IF-LABEL: ustest_f64i16_mm:2666; RV32IF: # %bb.0: # %entry2667; RV32IF-NEXT: addi sp, sp, -162668; RV32IF-NEXT: .cfi_def_cfa_offset 162669; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2670; RV32IF-NEXT: .cfi_offset ra, -42671; RV32IF-NEXT: call __fixdfsi2672; RV32IF-NEXT: lui a1, 162673; RV32IF-NEXT: addi a1, a1, -12674; RV32IF-NEXT: blt a0, a1, .LBB38_22675; RV32IF-NEXT: # %bb.1: # %entry2676; RV32IF-NEXT: mv a0, a12677; RV32IF-NEXT: .LBB38_2: # %entry2678; RV32IF-NEXT: sgtz a1, a02679; RV32IF-NEXT: neg a1, a12680; RV32IF-NEXT: and a0, a1, a02681; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2682; RV32IF-NEXT: .cfi_restore ra2683; RV32IF-NEXT: addi sp, sp, 162684; RV32IF-NEXT: .cfi_def_cfa_offset 02685; RV32IF-NEXT: ret2686;2687; RV64IF-LABEL: ustest_f64i16_mm:2688; RV64IF: # %bb.0: # %entry2689; RV64IF-NEXT: addi sp, sp, -162690; RV64IF-NEXT: .cfi_def_cfa_offset 162691; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2692; RV64IF-NEXT: .cfi_offset ra, -82693; RV64IF-NEXT: call __fixdfsi2694; RV64IF-NEXT: lui a1, 162695; RV64IF-NEXT: addi a1, a1, -12696; RV64IF-NEXT: blt a0, a1, .LBB38_22697; RV64IF-NEXT: # %bb.1: # %entry2698; RV64IF-NEXT: mv a0, a12699; RV64IF-NEXT: .LBB38_2: # %entry2700; RV64IF-NEXT: sgtz a1, a02701; RV64IF-NEXT: neg a1, a12702; RV64IF-NEXT: and a0, a1, a02703; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2704; RV64IF-NEXT: .cfi_restore ra2705; RV64IF-NEXT: addi sp, sp, 162706; RV64IF-NEXT: .cfi_def_cfa_offset 02707; RV64IF-NEXT: ret2708;2709; RV32IFD-LABEL: ustest_f64i16_mm:2710; RV32IFD: # %bb.0: # %entry2711; RV32IFD-NEXT: fcvt.w.d a0, fa0, rtz2712; RV32IFD-NEXT: lui a1, 162713; RV32IFD-NEXT: addi a1, a1, -12714; RV32IFD-NEXT: blt a0, a1, .LBB38_22715; RV32IFD-NEXT: # %bb.1: # %entry2716; RV32IFD-NEXT: mv a0, a12717; RV32IFD-NEXT: .LBB38_2: # %entry2718; RV32IFD-NEXT: sgtz a1, a02719; RV32IFD-NEXT: neg a1, a12720; RV32IFD-NEXT: and a0, a1, a02721; RV32IFD-NEXT: ret2722;2723; RV64IFD-LABEL: ustest_f64i16_mm:2724; RV64IFD: # %bb.0: # %entry2725; RV64IFD-NEXT: fcvt.w.d a0, fa0, rtz2726; RV64IFD-NEXT: lui a1, 162727; RV64IFD-NEXT: addi a1, a1, -12728; RV64IFD-NEXT: blt a0, a1, .LBB38_22729; RV64IFD-NEXT: # %bb.1: # %entry2730; RV64IFD-NEXT: mv a0, a12731; RV64IFD-NEXT: .LBB38_2: # %entry2732; RV64IFD-NEXT: sgtz a1, a02733; RV64IFD-NEXT: neg a1, a12734; RV64IFD-NEXT: and a0, a1, a02735; RV64IFD-NEXT: ret2736entry:2737 %conv = fptosi double %x to i322738 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)2739 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)2740 %conv6 = trunc i32 %spec.store.select7 to i162741 ret i16 %conv62742}2743 2744define i16 @stest_f32i16_mm(float %x) {2745; RV32-LABEL: stest_f32i16_mm:2746; RV32: # %bb.0: # %entry2747; RV32-NEXT: fcvt.w.s a0, fa0, rtz2748; RV32-NEXT: lui a1, 82749; RV32-NEXT: addi a1, a1, -12750; RV32-NEXT: bge a0, a1, .LBB39_32751; RV32-NEXT: # %bb.1: # %entry2752; RV32-NEXT: lui a1, 10485682753; RV32-NEXT: bge a1, a0, .LBB39_42754; RV32-NEXT: .LBB39_2: # %entry2755; RV32-NEXT: ret2756; RV32-NEXT: .LBB39_3: # %entry2757; RV32-NEXT: mv a0, a12758; RV32-NEXT: lui a1, 10485682759; RV32-NEXT: blt a1, a0, .LBB39_22760; RV32-NEXT: .LBB39_4: # %entry2761; RV32-NEXT: lui a0, 10485682762; RV32-NEXT: ret2763;2764; RV64-LABEL: stest_f32i16_mm:2765; RV64: # %bb.0: # %entry2766; RV64-NEXT: fcvt.w.s a0, fa0, rtz2767; RV64-NEXT: lui a1, 82768; RV64-NEXT: addi a1, a1, -12769; RV64-NEXT: bge a0, a1, .LBB39_32770; RV64-NEXT: # %bb.1: # %entry2771; RV64-NEXT: lui a1, 10485682772; RV64-NEXT: bge a1, a0, .LBB39_42773; RV64-NEXT: .LBB39_2: # %entry2774; RV64-NEXT: ret2775; RV64-NEXT: .LBB39_3: # %entry2776; RV64-NEXT: mv a0, a12777; RV64-NEXT: lui a1, 10485682778; RV64-NEXT: blt a1, a0, .LBB39_22779; RV64-NEXT: .LBB39_4: # %entry2780; RV64-NEXT: lui a0, 10485682781; RV64-NEXT: ret2782entry:2783 %conv = fptosi float %x to i322784 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2785 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2786 %conv6 = trunc i32 %spec.store.select7 to i162787 ret i16 %conv62788}2789 2790define i16 @utest_f32i16_mm(float %x) {2791; RV32-LABEL: utest_f32i16_mm:2792; RV32: # %bb.0: # %entry2793; RV32-NEXT: fcvt.wu.s a0, fa0, rtz2794; RV32-NEXT: lui a1, 162795; RV32-NEXT: addi a1, a1, -12796; RV32-NEXT: bltu a0, a1, .LBB40_22797; RV32-NEXT: # %bb.1: # %entry2798; RV32-NEXT: mv a0, a12799; RV32-NEXT: .LBB40_2: # %entry2800; RV32-NEXT: ret2801;2802; RV64-LABEL: utest_f32i16_mm:2803; RV64: # %bb.0: # %entry2804; RV64-NEXT: fcvt.wu.s a0, fa0, rtz2805; RV64-NEXT: lui a1, 162806; RV64-NEXT: addi a1, a1, -12807; RV64-NEXT: bltu a0, a1, .LBB40_22808; RV64-NEXT: # %bb.1: # %entry2809; RV64-NEXT: mv a0, a12810; RV64-NEXT: .LBB40_2: # %entry2811; RV64-NEXT: ret2812entry:2813 %conv = fptoui float %x to i322814 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2815 %conv6 = trunc i32 %spec.store.select to i162816 ret i16 %conv62817}2818 2819define i16 @ustest_f32i16_mm(float %x) {2820; RV32-LABEL: ustest_f32i16_mm:2821; RV32: # %bb.0: # %entry2822; RV32-NEXT: fcvt.w.s a0, fa0, rtz2823; RV32-NEXT: lui a1, 162824; RV32-NEXT: addi a1, a1, -12825; RV32-NEXT: blt a0, a1, .LBB41_22826; RV32-NEXT: # %bb.1: # %entry2827; RV32-NEXT: mv a0, a12828; RV32-NEXT: .LBB41_2: # %entry2829; RV32-NEXT: sgtz a1, a02830; RV32-NEXT: neg a1, a12831; RV32-NEXT: and a0, a1, a02832; RV32-NEXT: ret2833;2834; RV64-LABEL: ustest_f32i16_mm:2835; RV64: # %bb.0: # %entry2836; RV64-NEXT: fcvt.w.s a0, fa0, rtz2837; RV64-NEXT: lui a1, 162838; RV64-NEXT: addi a1, a1, -12839; RV64-NEXT: blt a0, a1, .LBB41_22840; RV64-NEXT: # %bb.1: # %entry2841; RV64-NEXT: mv a0, a12842; RV64-NEXT: .LBB41_2: # %entry2843; RV64-NEXT: sgtz a1, a02844; RV64-NEXT: neg a1, a12845; RV64-NEXT: and a0, a1, a02846; RV64-NEXT: ret2847entry:2848 %conv = fptosi float %x to i322849 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)2850 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)2851 %conv6 = trunc i32 %spec.store.select7 to i162852 ret i16 %conv62853}2854 2855define i16 @stest_f16i16_mm(half %x) {2856; RV32-LABEL: stest_f16i16_mm:2857; RV32: # %bb.0: # %entry2858; RV32-NEXT: addi sp, sp, -162859; RV32-NEXT: .cfi_def_cfa_offset 162860; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2861; RV32-NEXT: .cfi_offset ra, -42862; RV32-NEXT: call __extendhfsf22863; RV32-NEXT: fcvt.w.s a0, fa0, rtz2864; RV32-NEXT: lui a1, 82865; RV32-NEXT: addi a1, a1, -12866; RV32-NEXT: blt a0, a1, .LBB42_22867; RV32-NEXT: # %bb.1: # %entry2868; RV32-NEXT: mv a0, a12869; RV32-NEXT: .LBB42_2: # %entry2870; RV32-NEXT: lui a1, 10485682871; RV32-NEXT: blt a1, a0, .LBB42_42872; RV32-NEXT: # %bb.3: # %entry2873; RV32-NEXT: lui a0, 10485682874; RV32-NEXT: .LBB42_4: # %entry2875; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2876; RV32-NEXT: .cfi_restore ra2877; RV32-NEXT: addi sp, sp, 162878; RV32-NEXT: .cfi_def_cfa_offset 02879; RV32-NEXT: ret2880;2881; RV64-LABEL: stest_f16i16_mm:2882; RV64: # %bb.0: # %entry2883; RV64-NEXT: addi sp, sp, -162884; RV64-NEXT: .cfi_def_cfa_offset 162885; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2886; RV64-NEXT: .cfi_offset ra, -82887; RV64-NEXT: call __extendhfsf22888; RV64-NEXT: fcvt.l.s a0, fa0, rtz2889; RV64-NEXT: lui a1, 82890; RV64-NEXT: addi a1, a1, -12891; RV64-NEXT: blt a0, a1, .LBB42_22892; RV64-NEXT: # %bb.1: # %entry2893; RV64-NEXT: mv a0, a12894; RV64-NEXT: .LBB42_2: # %entry2895; RV64-NEXT: lui a1, 10485682896; RV64-NEXT: blt a1, a0, .LBB42_42897; RV64-NEXT: # %bb.3: # %entry2898; RV64-NEXT: lui a0, 10485682899; RV64-NEXT: .LBB42_4: # %entry2900; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2901; RV64-NEXT: .cfi_restore ra2902; RV64-NEXT: addi sp, sp, 162903; RV64-NEXT: .cfi_def_cfa_offset 02904; RV64-NEXT: ret2905entry:2906 %conv = fptosi half %x to i322907 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2908 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2909 %conv6 = trunc i32 %spec.store.select7 to i162910 ret i16 %conv62911}2912 2913define i16 @utesth_f16i16_mm(half %x) {2914; RV32-LABEL: utesth_f16i16_mm:2915; RV32: # %bb.0: # %entry2916; RV32-NEXT: addi sp, sp, -162917; RV32-NEXT: .cfi_def_cfa_offset 162918; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2919; RV32-NEXT: .cfi_offset ra, -42920; RV32-NEXT: call __extendhfsf22921; RV32-NEXT: fcvt.wu.s a0, fa0, rtz2922; RV32-NEXT: lui a1, 162923; RV32-NEXT: addi a1, a1, -12924; RV32-NEXT: bltu a0, a1, .LBB43_22925; RV32-NEXT: # %bb.1: # %entry2926; RV32-NEXT: mv a0, a12927; RV32-NEXT: .LBB43_2: # %entry2928; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2929; RV32-NEXT: .cfi_restore ra2930; RV32-NEXT: addi sp, sp, 162931; RV32-NEXT: .cfi_def_cfa_offset 02932; RV32-NEXT: ret2933;2934; RV64-LABEL: utesth_f16i16_mm:2935; RV64: # %bb.0: # %entry2936; RV64-NEXT: addi sp, sp, -162937; RV64-NEXT: .cfi_def_cfa_offset 162938; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2939; RV64-NEXT: .cfi_offset ra, -82940; RV64-NEXT: call __extendhfsf22941; RV64-NEXT: fcvt.lu.s a0, fa0, rtz2942; RV64-NEXT: lui a1, 162943; RV64-NEXT: addi a1, a1, -12944; RV64-NEXT: bltu a0, a1, .LBB43_22945; RV64-NEXT: # %bb.1: # %entry2946; RV64-NEXT: mv a0, a12947; RV64-NEXT: .LBB43_2: # %entry2948; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload2949; RV64-NEXT: .cfi_restore ra2950; RV64-NEXT: addi sp, sp, 162951; RV64-NEXT: .cfi_def_cfa_offset 02952; RV64-NEXT: ret2953entry:2954 %conv = fptoui half %x to i322955 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2956 %conv6 = trunc i32 %spec.store.select to i162957 ret i16 %conv62958}2959 2960define i16 @ustest_f16i16_mm(half %x) {2961; RV32-LABEL: ustest_f16i16_mm:2962; RV32: # %bb.0: # %entry2963; RV32-NEXT: addi sp, sp, -162964; RV32-NEXT: .cfi_def_cfa_offset 162965; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill2966; RV32-NEXT: .cfi_offset ra, -42967; RV32-NEXT: call __extendhfsf22968; RV32-NEXT: fcvt.w.s a0, fa0, rtz2969; RV32-NEXT: lui a1, 162970; RV32-NEXT: addi a1, a1, -12971; RV32-NEXT: blt a0, a1, .LBB44_22972; RV32-NEXT: # %bb.1: # %entry2973; RV32-NEXT: mv a0, a12974; RV32-NEXT: .LBB44_2: # %entry2975; RV32-NEXT: sgtz a1, a02976; RV32-NEXT: neg a1, a12977; RV32-NEXT: and a0, a1, a02978; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload2979; RV32-NEXT: .cfi_restore ra2980; RV32-NEXT: addi sp, sp, 162981; RV32-NEXT: .cfi_def_cfa_offset 02982; RV32-NEXT: ret2983;2984; RV64-LABEL: ustest_f16i16_mm:2985; RV64: # %bb.0: # %entry2986; RV64-NEXT: addi sp, sp, -162987; RV64-NEXT: .cfi_def_cfa_offset 162988; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill2989; RV64-NEXT: .cfi_offset ra, -82990; RV64-NEXT: call __extendhfsf22991; RV64-NEXT: fcvt.l.s a0, fa0, rtz2992; RV64-NEXT: lui a1, 162993; RV64-NEXT: addi a1, a1, -12994; RV64-NEXT: blt a0, a1, .LBB44_22995; RV64-NEXT: # %bb.1: # %entry2996; RV64-NEXT: mv a0, a12997; RV64-NEXT: .LBB44_2: # %entry2998; RV64-NEXT: sgtz a1, a02999; RV64-NEXT: neg a1, a13000; RV64-NEXT: and a0, a1, a03001; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3002; RV64-NEXT: .cfi_restore ra3003; RV64-NEXT: addi sp, sp, 163004; RV64-NEXT: .cfi_def_cfa_offset 03005; RV64-NEXT: ret3006entry:3007 %conv = fptosi half %x to i323008 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)3009 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)3010 %conv6 = trunc i32 %spec.store.select7 to i163011 ret i16 %conv63012}3013 3014; i64 saturate3015 3016define i64 @stest_f64i64_mm(double %x) {3017; RV32IF-LABEL: stest_f64i64_mm:3018; RV32IF: # %bb.0: # %entry3019; RV32IF-NEXT: addi sp, sp, -323020; RV32IF-NEXT: .cfi_def_cfa_offset 323021; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3022; RV32IF-NEXT: .cfi_offset ra, -43023; RV32IF-NEXT: mv a2, a13024; RV32IF-NEXT: mv a1, a03025; RV32IF-NEXT: addi a0, sp, 83026; RV32IF-NEXT: call __fixdfti3027; RV32IF-NEXT: lw a3, 8(sp)3028; RV32IF-NEXT: lw a1, 12(sp)3029; RV32IF-NEXT: lw a2, 16(sp)3030; RV32IF-NEXT: lw a4, 20(sp)3031; RV32IF-NEXT: lui a0, 5242883032; RV32IF-NEXT: addi a5, a0, -13033; RV32IF-NEXT: beq a1, a5, .LBB45_23034; RV32IF-NEXT: # %bb.1: # %entry3035; RV32IF-NEXT: sltu a6, a1, a53036; RV32IF-NEXT: or a7, a2, a43037; RV32IF-NEXT: bnez a7, .LBB45_33038; RV32IF-NEXT: j .LBB45_43039; RV32IF-NEXT: .LBB45_2:3040; RV32IF-NEXT: sltiu a6, a3, -13041; RV32IF-NEXT: or a7, a2, a43042; RV32IF-NEXT: beqz a7, .LBB45_43043; RV32IF-NEXT: .LBB45_3: # %entry3044; RV32IF-NEXT: srli a6, a4, 313045; RV32IF-NEXT: .LBB45_4: # %entry3046; RV32IF-NEXT: neg a7, a63047; RV32IF-NEXT: addi t0, a6, -13048; RV32IF-NEXT: bnez a6, .LBB45_63049; RV32IF-NEXT: # %bb.5: # %entry3050; RV32IF-NEXT: mv a1, a53051; RV32IF-NEXT: .LBB45_6: # %entry3052; RV32IF-NEXT: or a3, t0, a33053; RV32IF-NEXT: and a4, a7, a43054; RV32IF-NEXT: and a2, a7, a23055; RV32IF-NEXT: beq a1, a0, .LBB45_83056; RV32IF-NEXT: # %bb.7: # %entry3057; RV32IF-NEXT: sltu a0, a0, a13058; RV32IF-NEXT: j .LBB45_93059; RV32IF-NEXT: .LBB45_8:3060; RV32IF-NEXT: snez a0, a33061; RV32IF-NEXT: .LBB45_9: # %entry3062; RV32IF-NEXT: and a2, a2, a43063; RV32IF-NEXT: li a5, -13064; RV32IF-NEXT: beq a2, a5, .LBB45_113065; RV32IF-NEXT: # %bb.10: # %entry3066; RV32IF-NEXT: srli a4, a4, 313067; RV32IF-NEXT: xori a0, a4, 13068; RV32IF-NEXT: .LBB45_11: # %entry3069; RV32IF-NEXT: bnez a0, .LBB45_133070; RV32IF-NEXT: # %bb.12: # %entry3071; RV32IF-NEXT: lui a1, 5242883072; RV32IF-NEXT: .LBB45_13: # %entry3073; RV32IF-NEXT: neg a0, a03074; RV32IF-NEXT: and a0, a0, a33075; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3076; RV32IF-NEXT: .cfi_restore ra3077; RV32IF-NEXT: addi sp, sp, 323078; RV32IF-NEXT: .cfi_def_cfa_offset 03079; RV32IF-NEXT: ret3080;3081; RV64IF-LABEL: stest_f64i64_mm:3082; RV64IF: # %bb.0: # %entry3083; RV64IF-NEXT: addi sp, sp, -163084; RV64IF-NEXT: .cfi_def_cfa_offset 163085; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3086; RV64IF-NEXT: .cfi_offset ra, -83087; RV64IF-NEXT: call __fixdfti3088; RV64IF-NEXT: li a2, -13089; RV64IF-NEXT: srli a3, a2, 13090; RV64IF-NEXT: beqz a1, .LBB45_23091; RV64IF-NEXT: # %bb.1: # %entry3092; RV64IF-NEXT: srli a4, a1, 633093; RV64IF-NEXT: j .LBB45_33094; RV64IF-NEXT: .LBB45_2:3095; RV64IF-NEXT: sltu a4, a0, a33096; RV64IF-NEXT: .LBB45_3: # %entry3097; RV64IF-NEXT: neg a5, a43098; RV64IF-NEXT: and a5, a5, a13099; RV64IF-NEXT: bnez a4, .LBB45_53100; RV64IF-NEXT: # %bb.4: # %entry3101; RV64IF-NEXT: mv a0, a33102; RV64IF-NEXT: .LBB45_5: # %entry3103; RV64IF-NEXT: slli a1, a2, 633104; RV64IF-NEXT: beq a5, a2, .LBB45_73105; RV64IF-NEXT: # %bb.6: # %entry3106; RV64IF-NEXT: srli a5, a5, 633107; RV64IF-NEXT: xori a2, a5, 13108; RV64IF-NEXT: beqz a2, .LBB45_83109; RV64IF-NEXT: j .LBB45_93110; RV64IF-NEXT: .LBB45_7:3111; RV64IF-NEXT: sltu a2, a1, a03112; RV64IF-NEXT: bnez a2, .LBB45_93113; RV64IF-NEXT: .LBB45_8: # %entry3114; RV64IF-NEXT: mv a0, a13115; RV64IF-NEXT: .LBB45_9: # %entry3116; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3117; RV64IF-NEXT: .cfi_restore ra3118; RV64IF-NEXT: addi sp, sp, 163119; RV64IF-NEXT: .cfi_def_cfa_offset 03120; RV64IF-NEXT: ret3121;3122; RV32IFD-LABEL: stest_f64i64_mm:3123; RV32IFD: # %bb.0: # %entry3124; RV32IFD-NEXT: addi sp, sp, -323125; RV32IFD-NEXT: .cfi_def_cfa_offset 323126; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3127; RV32IFD-NEXT: .cfi_offset ra, -43128; RV32IFD-NEXT: addi a0, sp, 83129; RV32IFD-NEXT: call __fixdfti3130; RV32IFD-NEXT: lw a3, 8(sp)3131; RV32IFD-NEXT: lw a1, 12(sp)3132; RV32IFD-NEXT: lw a2, 16(sp)3133; RV32IFD-NEXT: lw a4, 20(sp)3134; RV32IFD-NEXT: lui a0, 5242883135; RV32IFD-NEXT: addi a5, a0, -13136; RV32IFD-NEXT: beq a1, a5, .LBB45_23137; RV32IFD-NEXT: # %bb.1: # %entry3138; RV32IFD-NEXT: sltu a6, a1, a53139; RV32IFD-NEXT: or a7, a2, a43140; RV32IFD-NEXT: bnez a7, .LBB45_33141; RV32IFD-NEXT: j .LBB45_43142; RV32IFD-NEXT: .LBB45_2:3143; RV32IFD-NEXT: sltiu a6, a3, -13144; RV32IFD-NEXT: or a7, a2, a43145; RV32IFD-NEXT: beqz a7, .LBB45_43146; RV32IFD-NEXT: .LBB45_3: # %entry3147; RV32IFD-NEXT: srli a6, a4, 313148; RV32IFD-NEXT: .LBB45_4: # %entry3149; RV32IFD-NEXT: neg a7, a63150; RV32IFD-NEXT: addi t0, a6, -13151; RV32IFD-NEXT: bnez a6, .LBB45_63152; RV32IFD-NEXT: # %bb.5: # %entry3153; RV32IFD-NEXT: mv a1, a53154; RV32IFD-NEXT: .LBB45_6: # %entry3155; RV32IFD-NEXT: or a3, t0, a33156; RV32IFD-NEXT: and a4, a7, a43157; RV32IFD-NEXT: and a2, a7, a23158; RV32IFD-NEXT: beq a1, a0, .LBB45_83159; RV32IFD-NEXT: # %bb.7: # %entry3160; RV32IFD-NEXT: sltu a0, a0, a13161; RV32IFD-NEXT: j .LBB45_93162; RV32IFD-NEXT: .LBB45_8:3163; RV32IFD-NEXT: snez a0, a33164; RV32IFD-NEXT: .LBB45_9: # %entry3165; RV32IFD-NEXT: and a2, a2, a43166; RV32IFD-NEXT: li a5, -13167; RV32IFD-NEXT: beq a2, a5, .LBB45_113168; RV32IFD-NEXT: # %bb.10: # %entry3169; RV32IFD-NEXT: srli a4, a4, 313170; RV32IFD-NEXT: xori a0, a4, 13171; RV32IFD-NEXT: .LBB45_11: # %entry3172; RV32IFD-NEXT: bnez a0, .LBB45_133173; RV32IFD-NEXT: # %bb.12: # %entry3174; RV32IFD-NEXT: lui a1, 5242883175; RV32IFD-NEXT: .LBB45_13: # %entry3176; RV32IFD-NEXT: neg a0, a03177; RV32IFD-NEXT: and a0, a0, a33178; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3179; RV32IFD-NEXT: .cfi_restore ra3180; RV32IFD-NEXT: addi sp, sp, 323181; RV32IFD-NEXT: .cfi_def_cfa_offset 03182; RV32IFD-NEXT: ret3183;3184; RV64IFD-LABEL: stest_f64i64_mm:3185; RV64IFD: # %bb.0: # %entry3186; RV64IFD-NEXT: fcvt.l.d a0, fa0, rtz3187; RV64IFD-NEXT: feq.d a1, fa0, fa03188; RV64IFD-NEXT: seqz a1, a13189; RV64IFD-NEXT: addi a1, a1, -13190; RV64IFD-NEXT: and a0, a1, a03191; RV64IFD-NEXT: ret3192entry:3193 %conv = fptosi double %x to i1283194 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)3195 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)3196 %conv6 = trunc i128 %spec.store.select7 to i643197 ret i64 %conv63198}3199 3200define i64 @utest_f64i64_mm(double %x) {3201; RV32IF-LABEL: utest_f64i64_mm:3202; RV32IF: # %bb.0: # %entry3203; RV32IF-NEXT: addi sp, sp, -323204; RV32IF-NEXT: .cfi_def_cfa_offset 323205; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3206; RV32IF-NEXT: .cfi_offset ra, -43207; RV32IF-NEXT: mv a2, a13208; RV32IF-NEXT: mv a1, a03209; RV32IF-NEXT: addi a0, sp, 83210; RV32IF-NEXT: call __fixunsdfti3211; RV32IF-NEXT: lw a0, 16(sp)3212; RV32IF-NEXT: lw a1, 20(sp)3213; RV32IF-NEXT: lw a2, 12(sp)3214; RV32IF-NEXT: lw a3, 8(sp)3215; RV32IF-NEXT: or a4, a1, a03216; RV32IF-NEXT: xori a0, a0, 13217; RV32IF-NEXT: seqz a4, a43218; RV32IF-NEXT: or a0, a0, a13219; RV32IF-NEXT: seqz a0, a03220; RV32IF-NEXT: addi a0, a0, -13221; RV32IF-NEXT: and a0, a0, a43222; RV32IF-NEXT: neg a1, a03223; RV32IF-NEXT: and a0, a1, a33224; RV32IF-NEXT: and a1, a1, a23225; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3226; RV32IF-NEXT: .cfi_restore ra3227; RV32IF-NEXT: addi sp, sp, 323228; RV32IF-NEXT: .cfi_def_cfa_offset 03229; RV32IF-NEXT: ret3230;3231; RV64-LABEL: utest_f64i64_mm:3232; RV64: # %bb.0: # %entry3233; RV64-NEXT: addi sp, sp, -163234; RV64-NEXT: .cfi_def_cfa_offset 163235; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3236; RV64-NEXT: .cfi_offset ra, -83237; RV64-NEXT: call __fixunsdfti3238; RV64-NEXT: snez a1, a13239; RV64-NEXT: addi a1, a1, -13240; RV64-NEXT: and a0, a1, a03241; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3242; RV64-NEXT: .cfi_restore ra3243; RV64-NEXT: addi sp, sp, 163244; RV64-NEXT: .cfi_def_cfa_offset 03245; RV64-NEXT: ret3246;3247; RV32IFD-LABEL: utest_f64i64_mm:3248; RV32IFD: # %bb.0: # %entry3249; RV32IFD-NEXT: addi sp, sp, -323250; RV32IFD-NEXT: .cfi_def_cfa_offset 323251; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3252; RV32IFD-NEXT: .cfi_offset ra, -43253; RV32IFD-NEXT: addi a0, sp, 83254; RV32IFD-NEXT: call __fixunsdfti3255; RV32IFD-NEXT: lw a0, 16(sp)3256; RV32IFD-NEXT: lw a1, 20(sp)3257; RV32IFD-NEXT: lw a2, 12(sp)3258; RV32IFD-NEXT: lw a3, 8(sp)3259; RV32IFD-NEXT: or a4, a1, a03260; RV32IFD-NEXT: xori a0, a0, 13261; RV32IFD-NEXT: seqz a4, a43262; RV32IFD-NEXT: or a0, a0, a13263; RV32IFD-NEXT: seqz a0, a03264; RV32IFD-NEXT: addi a0, a0, -13265; RV32IFD-NEXT: and a0, a0, a43266; RV32IFD-NEXT: neg a1, a03267; RV32IFD-NEXT: and a0, a1, a33268; RV32IFD-NEXT: and a1, a1, a23269; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3270; RV32IFD-NEXT: .cfi_restore ra3271; RV32IFD-NEXT: addi sp, sp, 323272; RV32IFD-NEXT: .cfi_def_cfa_offset 03273; RV32IFD-NEXT: ret3274entry:3275 %conv = fptoui double %x to i1283276 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)3277 %conv6 = trunc i128 %spec.store.select to i643278 ret i64 %conv63279}3280 3281define i64 @ustest_f64i64_mm(double %x) {3282; RV32IF-LABEL: ustest_f64i64_mm:3283; RV32IF: # %bb.0: # %entry3284; RV32IF-NEXT: addi sp, sp, -323285; RV32IF-NEXT: .cfi_def_cfa_offset 323286; RV32IF-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3287; RV32IF-NEXT: .cfi_offset ra, -43288; RV32IF-NEXT: mv a2, a13289; RV32IF-NEXT: mv a1, a03290; RV32IF-NEXT: addi a0, sp, 83291; RV32IF-NEXT: call __fixdfti3292; RV32IF-NEXT: lw a0, 8(sp)3293; RV32IF-NEXT: lw a1, 12(sp)3294; RV32IF-NEXT: lw a2, 20(sp)3295; RV32IF-NEXT: lw a3, 16(sp)3296; RV32IF-NEXT: beqz a2, .LBB47_23297; RV32IF-NEXT: # %bb.1: # %entry3298; RV32IF-NEXT: srli a4, a2, 313299; RV32IF-NEXT: j .LBB47_33300; RV32IF-NEXT: .LBB47_2:3301; RV32IF-NEXT: seqz a4, a33302; RV32IF-NEXT: .LBB47_3: # %entry3303; RV32IF-NEXT: xori a3, a3, 13304; RV32IF-NEXT: or a3, a3, a23305; RV32IF-NEXT: seqz a3, a33306; RV32IF-NEXT: addi a3, a3, -13307; RV32IF-NEXT: and a3, a3, a43308; RV32IF-NEXT: neg a3, a33309; RV32IF-NEXT: and a1, a3, a13310; RV32IF-NEXT: and a0, a3, a03311; RV32IF-NEXT: and a2, a3, a23312; RV32IF-NEXT: srli a2, a2, 313313; RV32IF-NEXT: addi a2, a2, -13314; RV32IF-NEXT: and a0, a2, a03315; RV32IF-NEXT: and a1, a2, a13316; RV32IF-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3317; RV32IF-NEXT: .cfi_restore ra3318; RV32IF-NEXT: addi sp, sp, 323319; RV32IF-NEXT: .cfi_def_cfa_offset 03320; RV32IF-NEXT: ret3321;3322; RV64-LABEL: ustest_f64i64_mm:3323; RV64: # %bb.0: # %entry3324; RV64-NEXT: addi sp, sp, -163325; RV64-NEXT: .cfi_def_cfa_offset 163326; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3327; RV64-NEXT: .cfi_offset ra, -83328; RV64-NEXT: call __fixdfti3329; RV64-NEXT: mv a2, a13330; RV64-NEXT: blez a1, .LBB47_23331; RV64-NEXT: # %bb.1: # %entry3332; RV64-NEXT: li a2, 13333; RV64-NEXT: .LBB47_2: # %entry3334; RV64-NEXT: slti a1, a1, 13335; RV64-NEXT: srli a2, a2, 633336; RV64-NEXT: neg a1, a13337; RV64-NEXT: and a0, a1, a03338; RV64-NEXT: addi a2, a2, -13339; RV64-NEXT: and a0, a2, a03340; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3341; RV64-NEXT: .cfi_restore ra3342; RV64-NEXT: addi sp, sp, 163343; RV64-NEXT: .cfi_def_cfa_offset 03344; RV64-NEXT: ret3345;3346; RV32IFD-LABEL: ustest_f64i64_mm:3347; RV32IFD: # %bb.0: # %entry3348; RV32IFD-NEXT: addi sp, sp, -323349; RV32IFD-NEXT: .cfi_def_cfa_offset 323350; RV32IFD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3351; RV32IFD-NEXT: .cfi_offset ra, -43352; RV32IFD-NEXT: addi a0, sp, 83353; RV32IFD-NEXT: call __fixdfti3354; RV32IFD-NEXT: lw a0, 8(sp)3355; RV32IFD-NEXT: lw a1, 12(sp)3356; RV32IFD-NEXT: lw a2, 20(sp)3357; RV32IFD-NEXT: lw a3, 16(sp)3358; RV32IFD-NEXT: beqz a2, .LBB47_23359; RV32IFD-NEXT: # %bb.1: # %entry3360; RV32IFD-NEXT: srli a4, a2, 313361; RV32IFD-NEXT: j .LBB47_33362; RV32IFD-NEXT: .LBB47_2:3363; RV32IFD-NEXT: seqz a4, a33364; RV32IFD-NEXT: .LBB47_3: # %entry3365; RV32IFD-NEXT: xori a3, a3, 13366; RV32IFD-NEXT: or a3, a3, a23367; RV32IFD-NEXT: seqz a3, a33368; RV32IFD-NEXT: addi a3, a3, -13369; RV32IFD-NEXT: and a3, a3, a43370; RV32IFD-NEXT: neg a3, a33371; RV32IFD-NEXT: and a1, a3, a13372; RV32IFD-NEXT: and a0, a3, a03373; RV32IFD-NEXT: and a2, a3, a23374; RV32IFD-NEXT: srli a2, a2, 313375; RV32IFD-NEXT: addi a2, a2, -13376; RV32IFD-NEXT: and a0, a2, a03377; RV32IFD-NEXT: and a1, a2, a13378; RV32IFD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3379; RV32IFD-NEXT: .cfi_restore ra3380; RV32IFD-NEXT: addi sp, sp, 323381; RV32IFD-NEXT: .cfi_def_cfa_offset 03382; RV32IFD-NEXT: ret3383entry:3384 %conv = fptosi double %x to i1283385 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)3386 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)3387 %conv6 = trunc i128 %spec.store.select7 to i643388 ret i64 %conv63389}3390 3391define i64 @stest_f32i64_mm(float %x) {3392; RV32-LABEL: stest_f32i64_mm:3393; RV32: # %bb.0: # %entry3394; RV32-NEXT: addi sp, sp, -323395; RV32-NEXT: .cfi_def_cfa_offset 323396; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3397; RV32-NEXT: .cfi_offset ra, -43398; RV32-NEXT: addi a0, sp, 83399; RV32-NEXT: call __fixsfti3400; RV32-NEXT: lw a3, 8(sp)3401; RV32-NEXT: lw a1, 12(sp)3402; RV32-NEXT: lw a2, 16(sp)3403; RV32-NEXT: lw a4, 20(sp)3404; RV32-NEXT: lui a0, 5242883405; RV32-NEXT: addi a5, a0, -13406; RV32-NEXT: beq a1, a5, .LBB48_23407; RV32-NEXT: # %bb.1: # %entry3408; RV32-NEXT: sltu a6, a1, a53409; RV32-NEXT: or a7, a2, a43410; RV32-NEXT: bnez a7, .LBB48_33411; RV32-NEXT: j .LBB48_43412; RV32-NEXT: .LBB48_2:3413; RV32-NEXT: sltiu a6, a3, -13414; RV32-NEXT: or a7, a2, a43415; RV32-NEXT: beqz a7, .LBB48_43416; RV32-NEXT: .LBB48_3: # %entry3417; RV32-NEXT: srli a6, a4, 313418; RV32-NEXT: .LBB48_4: # %entry3419; RV32-NEXT: neg a7, a63420; RV32-NEXT: addi t0, a6, -13421; RV32-NEXT: bnez a6, .LBB48_63422; RV32-NEXT: # %bb.5: # %entry3423; RV32-NEXT: mv a1, a53424; RV32-NEXT: .LBB48_6: # %entry3425; RV32-NEXT: or a3, t0, a33426; RV32-NEXT: and a4, a7, a43427; RV32-NEXT: and a2, a7, a23428; RV32-NEXT: beq a1, a0, .LBB48_83429; RV32-NEXT: # %bb.7: # %entry3430; RV32-NEXT: sltu a0, a0, a13431; RV32-NEXT: j .LBB48_93432; RV32-NEXT: .LBB48_8:3433; RV32-NEXT: snez a0, a33434; RV32-NEXT: .LBB48_9: # %entry3435; RV32-NEXT: and a2, a2, a43436; RV32-NEXT: li a5, -13437; RV32-NEXT: beq a2, a5, .LBB48_113438; RV32-NEXT: # %bb.10: # %entry3439; RV32-NEXT: srli a4, a4, 313440; RV32-NEXT: xori a0, a4, 13441; RV32-NEXT: .LBB48_11: # %entry3442; RV32-NEXT: bnez a0, .LBB48_133443; RV32-NEXT: # %bb.12: # %entry3444; RV32-NEXT: lui a1, 5242883445; RV32-NEXT: .LBB48_13: # %entry3446; RV32-NEXT: neg a0, a03447; RV32-NEXT: and a0, a0, a33448; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3449; RV32-NEXT: .cfi_restore ra3450; RV32-NEXT: addi sp, sp, 323451; RV32-NEXT: .cfi_def_cfa_offset 03452; RV32-NEXT: ret3453;3454; RV64-LABEL: stest_f32i64_mm:3455; RV64: # %bb.0: # %entry3456; RV64-NEXT: fcvt.l.s a0, fa0, rtz3457; RV64-NEXT: feq.s a1, fa0, fa03458; RV64-NEXT: seqz a1, a13459; RV64-NEXT: addi a1, a1, -13460; RV64-NEXT: and a0, a1, a03461; RV64-NEXT: ret3462entry:3463 %conv = fptosi float %x to i1283464 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)3465 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)3466 %conv6 = trunc i128 %spec.store.select7 to i643467 ret i64 %conv63468}3469 3470define i64 @utest_f32i64_mm(float %x) {3471; RV32-LABEL: utest_f32i64_mm:3472; RV32: # %bb.0: # %entry3473; RV32-NEXT: addi sp, sp, -323474; RV32-NEXT: .cfi_def_cfa_offset 323475; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3476; RV32-NEXT: .cfi_offset ra, -43477; RV32-NEXT: addi a0, sp, 83478; RV32-NEXT: call __fixunssfti3479; RV32-NEXT: lw a0, 16(sp)3480; RV32-NEXT: lw a1, 20(sp)3481; RV32-NEXT: lw a2, 12(sp)3482; RV32-NEXT: lw a3, 8(sp)3483; RV32-NEXT: or a4, a1, a03484; RV32-NEXT: xori a0, a0, 13485; RV32-NEXT: seqz a4, a43486; RV32-NEXT: or a0, a0, a13487; RV32-NEXT: seqz a0, a03488; RV32-NEXT: addi a0, a0, -13489; RV32-NEXT: and a0, a0, a43490; RV32-NEXT: neg a1, a03491; RV32-NEXT: and a0, a1, a33492; RV32-NEXT: and a1, a1, a23493; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3494; RV32-NEXT: .cfi_restore ra3495; RV32-NEXT: addi sp, sp, 323496; RV32-NEXT: .cfi_def_cfa_offset 03497; RV32-NEXT: ret3498;3499; RV64-LABEL: utest_f32i64_mm:3500; RV64: # %bb.0: # %entry3501; RV64-NEXT: addi sp, sp, -163502; RV64-NEXT: .cfi_def_cfa_offset 163503; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3504; RV64-NEXT: .cfi_offset ra, -83505; RV64-NEXT: call __fixunssfti3506; RV64-NEXT: snez a1, a13507; RV64-NEXT: addi a1, a1, -13508; RV64-NEXT: and a0, a1, a03509; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3510; RV64-NEXT: .cfi_restore ra3511; RV64-NEXT: addi sp, sp, 163512; RV64-NEXT: .cfi_def_cfa_offset 03513; RV64-NEXT: ret3514entry:3515 %conv = fptoui float %x to i1283516 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)3517 %conv6 = trunc i128 %spec.store.select to i643518 ret i64 %conv63519}3520 3521define i64 @ustest_f32i64_mm(float %x) {3522; RV32-LABEL: ustest_f32i64_mm:3523; RV32: # %bb.0: # %entry3524; RV32-NEXT: addi sp, sp, -323525; RV32-NEXT: .cfi_def_cfa_offset 323526; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3527; RV32-NEXT: .cfi_offset ra, -43528; RV32-NEXT: addi a0, sp, 83529; RV32-NEXT: call __fixsfti3530; RV32-NEXT: lw a0, 8(sp)3531; RV32-NEXT: lw a1, 12(sp)3532; RV32-NEXT: lw a2, 20(sp)3533; RV32-NEXT: lw a3, 16(sp)3534; RV32-NEXT: beqz a2, .LBB50_23535; RV32-NEXT: # %bb.1: # %entry3536; RV32-NEXT: srli a4, a2, 313537; RV32-NEXT: j .LBB50_33538; RV32-NEXT: .LBB50_2:3539; RV32-NEXT: seqz a4, a33540; RV32-NEXT: .LBB50_3: # %entry3541; RV32-NEXT: xori a3, a3, 13542; RV32-NEXT: or a3, a3, a23543; RV32-NEXT: seqz a3, a33544; RV32-NEXT: addi a3, a3, -13545; RV32-NEXT: and a3, a3, a43546; RV32-NEXT: neg a3, a33547; RV32-NEXT: and a1, a3, a13548; RV32-NEXT: and a0, a3, a03549; RV32-NEXT: and a2, a3, a23550; RV32-NEXT: srli a2, a2, 313551; RV32-NEXT: addi a2, a2, -13552; RV32-NEXT: and a0, a2, a03553; RV32-NEXT: and a1, a2, a13554; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3555; RV32-NEXT: .cfi_restore ra3556; RV32-NEXT: addi sp, sp, 323557; RV32-NEXT: .cfi_def_cfa_offset 03558; RV32-NEXT: ret3559;3560; RV64-LABEL: ustest_f32i64_mm:3561; RV64: # %bb.0: # %entry3562; RV64-NEXT: addi sp, sp, -163563; RV64-NEXT: .cfi_def_cfa_offset 163564; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3565; RV64-NEXT: .cfi_offset ra, -83566; RV64-NEXT: call __fixsfti3567; RV64-NEXT: mv a2, a13568; RV64-NEXT: blez a1, .LBB50_23569; RV64-NEXT: # %bb.1: # %entry3570; RV64-NEXT: li a2, 13571; RV64-NEXT: .LBB50_2: # %entry3572; RV64-NEXT: slti a1, a1, 13573; RV64-NEXT: srli a2, a2, 633574; RV64-NEXT: neg a1, a13575; RV64-NEXT: and a0, a1, a03576; RV64-NEXT: addi a2, a2, -13577; RV64-NEXT: and a0, a2, a03578; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3579; RV64-NEXT: .cfi_restore ra3580; RV64-NEXT: addi sp, sp, 163581; RV64-NEXT: .cfi_def_cfa_offset 03582; RV64-NEXT: ret3583entry:3584 %conv = fptosi float %x to i1283585 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)3586 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)3587 %conv6 = trunc i128 %spec.store.select7 to i643588 ret i64 %conv63589}3590 3591define i64 @stest_f16i64_mm(half %x) {3592; RV32-LABEL: stest_f16i64_mm:3593; RV32: # %bb.0: # %entry3594; RV32-NEXT: addi sp, sp, -323595; RV32-NEXT: .cfi_def_cfa_offset 323596; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3597; RV32-NEXT: .cfi_offset ra, -43598; RV32-NEXT: call __extendhfsf23599; RV32-NEXT: addi a0, sp, 83600; RV32-NEXT: call __fixsfti3601; RV32-NEXT: lw a3, 8(sp)3602; RV32-NEXT: lw a1, 12(sp)3603; RV32-NEXT: lw a2, 16(sp)3604; RV32-NEXT: lw a4, 20(sp)3605; RV32-NEXT: lui a0, 5242883606; RV32-NEXT: addi a5, a0, -13607; RV32-NEXT: beq a1, a5, .LBB51_23608; RV32-NEXT: # %bb.1: # %entry3609; RV32-NEXT: sltu a6, a1, a53610; RV32-NEXT: or a7, a2, a43611; RV32-NEXT: bnez a7, .LBB51_33612; RV32-NEXT: j .LBB51_43613; RV32-NEXT: .LBB51_2:3614; RV32-NEXT: sltiu a6, a3, -13615; RV32-NEXT: or a7, a2, a43616; RV32-NEXT: beqz a7, .LBB51_43617; RV32-NEXT: .LBB51_3: # %entry3618; RV32-NEXT: srli a6, a4, 313619; RV32-NEXT: .LBB51_4: # %entry3620; RV32-NEXT: neg a7, a63621; RV32-NEXT: addi t0, a6, -13622; RV32-NEXT: bnez a6, .LBB51_63623; RV32-NEXT: # %bb.5: # %entry3624; RV32-NEXT: mv a1, a53625; RV32-NEXT: .LBB51_6: # %entry3626; RV32-NEXT: or a3, t0, a33627; RV32-NEXT: and a4, a7, a43628; RV32-NEXT: and a2, a7, a23629; RV32-NEXT: beq a1, a0, .LBB51_83630; RV32-NEXT: # %bb.7: # %entry3631; RV32-NEXT: sltu a0, a0, a13632; RV32-NEXT: j .LBB51_93633; RV32-NEXT: .LBB51_8:3634; RV32-NEXT: snez a0, a33635; RV32-NEXT: .LBB51_9: # %entry3636; RV32-NEXT: and a2, a2, a43637; RV32-NEXT: li a5, -13638; RV32-NEXT: beq a2, a5, .LBB51_113639; RV32-NEXT: # %bb.10: # %entry3640; RV32-NEXT: srli a4, a4, 313641; RV32-NEXT: xori a0, a4, 13642; RV32-NEXT: .LBB51_11: # %entry3643; RV32-NEXT: bnez a0, .LBB51_133644; RV32-NEXT: # %bb.12: # %entry3645; RV32-NEXT: lui a1, 5242883646; RV32-NEXT: .LBB51_13: # %entry3647; RV32-NEXT: neg a0, a03648; RV32-NEXT: and a0, a0, a33649; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3650; RV32-NEXT: .cfi_restore ra3651; RV32-NEXT: addi sp, sp, 323652; RV32-NEXT: .cfi_def_cfa_offset 03653; RV32-NEXT: ret3654;3655; RV64-LABEL: stest_f16i64_mm:3656; RV64: # %bb.0: # %entry3657; RV64-NEXT: addi sp, sp, -163658; RV64-NEXT: .cfi_def_cfa_offset 163659; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3660; RV64-NEXT: .cfi_offset ra, -83661; RV64-NEXT: call __extendhfsf23662; RV64-NEXT: call __fixsfti3663; RV64-NEXT: li a2, -13664; RV64-NEXT: srli a3, a2, 13665; RV64-NEXT: beqz a1, .LBB51_23666; RV64-NEXT: # %bb.1: # %entry3667; RV64-NEXT: srli a4, a1, 633668; RV64-NEXT: j .LBB51_33669; RV64-NEXT: .LBB51_2:3670; RV64-NEXT: sltu a4, a0, a33671; RV64-NEXT: .LBB51_3: # %entry3672; RV64-NEXT: neg a5, a43673; RV64-NEXT: and a5, a5, a13674; RV64-NEXT: bnez a4, .LBB51_53675; RV64-NEXT: # %bb.4: # %entry3676; RV64-NEXT: mv a0, a33677; RV64-NEXT: .LBB51_5: # %entry3678; RV64-NEXT: slli a1, a2, 633679; RV64-NEXT: beq a5, a2, .LBB51_73680; RV64-NEXT: # %bb.6: # %entry3681; RV64-NEXT: srli a5, a5, 633682; RV64-NEXT: xori a2, a5, 13683; RV64-NEXT: beqz a2, .LBB51_83684; RV64-NEXT: j .LBB51_93685; RV64-NEXT: .LBB51_7:3686; RV64-NEXT: sltu a2, a1, a03687; RV64-NEXT: bnez a2, .LBB51_93688; RV64-NEXT: .LBB51_8: # %entry3689; RV64-NEXT: mv a0, a13690; RV64-NEXT: .LBB51_9: # %entry3691; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3692; RV64-NEXT: .cfi_restore ra3693; RV64-NEXT: addi sp, sp, 163694; RV64-NEXT: .cfi_def_cfa_offset 03695; RV64-NEXT: ret3696entry:3697 %conv = fptosi half %x to i1283698 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)3699 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)3700 %conv6 = trunc i128 %spec.store.select7 to i643701 ret i64 %conv63702}3703 3704define i64 @utesth_f16i64_mm(half %x) {3705; RV32-LABEL: utesth_f16i64_mm:3706; RV32: # %bb.0: # %entry3707; RV32-NEXT: addi sp, sp, -323708; RV32-NEXT: .cfi_def_cfa_offset 323709; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3710; RV32-NEXT: .cfi_offset ra, -43711; RV32-NEXT: call __extendhfsf23712; RV32-NEXT: addi a0, sp, 83713; RV32-NEXT: call __fixunssfti3714; RV32-NEXT: lw a0, 16(sp)3715; RV32-NEXT: lw a1, 20(sp)3716; RV32-NEXT: lw a2, 12(sp)3717; RV32-NEXT: lw a3, 8(sp)3718; RV32-NEXT: or a4, a1, a03719; RV32-NEXT: xori a0, a0, 13720; RV32-NEXT: seqz a4, a43721; RV32-NEXT: or a0, a0, a13722; RV32-NEXT: seqz a0, a03723; RV32-NEXT: addi a0, a0, -13724; RV32-NEXT: and a0, a0, a43725; RV32-NEXT: neg a1, a03726; RV32-NEXT: and a0, a1, a33727; RV32-NEXT: and a1, a1, a23728; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3729; RV32-NEXT: .cfi_restore ra3730; RV32-NEXT: addi sp, sp, 323731; RV32-NEXT: .cfi_def_cfa_offset 03732; RV32-NEXT: ret3733;3734; RV64-LABEL: utesth_f16i64_mm:3735; RV64: # %bb.0: # %entry3736; RV64-NEXT: addi sp, sp, -163737; RV64-NEXT: .cfi_def_cfa_offset 163738; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3739; RV64-NEXT: .cfi_offset ra, -83740; RV64-NEXT: call __extendhfsf23741; RV64-NEXT: call __fixunssfti3742; RV64-NEXT: snez a1, a13743; RV64-NEXT: addi a1, a1, -13744; RV64-NEXT: and a0, a1, a03745; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3746; RV64-NEXT: .cfi_restore ra3747; RV64-NEXT: addi sp, sp, 163748; RV64-NEXT: .cfi_def_cfa_offset 03749; RV64-NEXT: ret3750entry:3751 %conv = fptoui half %x to i1283752 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)3753 %conv6 = trunc i128 %spec.store.select to i643754 ret i64 %conv63755}3756 3757define i64 @ustest_f16i64_mm(half %x) {3758; RV32-LABEL: ustest_f16i64_mm:3759; RV32: # %bb.0: # %entry3760; RV32-NEXT: addi sp, sp, -323761; RV32-NEXT: .cfi_def_cfa_offset 323762; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill3763; RV32-NEXT: .cfi_offset ra, -43764; RV32-NEXT: call __extendhfsf23765; RV32-NEXT: addi a0, sp, 83766; RV32-NEXT: call __fixsfti3767; RV32-NEXT: lw a0, 8(sp)3768; RV32-NEXT: lw a1, 12(sp)3769; RV32-NEXT: lw a2, 20(sp)3770; RV32-NEXT: lw a3, 16(sp)3771; RV32-NEXT: beqz a2, .LBB53_23772; RV32-NEXT: # %bb.1: # %entry3773; RV32-NEXT: srli a4, a2, 313774; RV32-NEXT: j .LBB53_33775; RV32-NEXT: .LBB53_2:3776; RV32-NEXT: seqz a4, a33777; RV32-NEXT: .LBB53_3: # %entry3778; RV32-NEXT: xori a3, a3, 13779; RV32-NEXT: or a3, a3, a23780; RV32-NEXT: seqz a3, a33781; RV32-NEXT: addi a3, a3, -13782; RV32-NEXT: and a3, a3, a43783; RV32-NEXT: neg a3, a33784; RV32-NEXT: and a1, a3, a13785; RV32-NEXT: and a0, a3, a03786; RV32-NEXT: and a2, a3, a23787; RV32-NEXT: srli a2, a2, 313788; RV32-NEXT: addi a2, a2, -13789; RV32-NEXT: and a0, a2, a03790; RV32-NEXT: and a1, a2, a13791; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload3792; RV32-NEXT: .cfi_restore ra3793; RV32-NEXT: addi sp, sp, 323794; RV32-NEXT: .cfi_def_cfa_offset 03795; RV32-NEXT: ret3796;3797; RV64-LABEL: ustest_f16i64_mm:3798; RV64: # %bb.0: # %entry3799; RV64-NEXT: addi sp, sp, -163800; RV64-NEXT: .cfi_def_cfa_offset 163801; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3802; RV64-NEXT: .cfi_offset ra, -83803; RV64-NEXT: call __extendhfsf23804; RV64-NEXT: call __fixsfti3805; RV64-NEXT: mv a2, a13806; RV64-NEXT: blez a1, .LBB53_23807; RV64-NEXT: # %bb.1: # %entry3808; RV64-NEXT: li a2, 13809; RV64-NEXT: .LBB53_2: # %entry3810; RV64-NEXT: slti a1, a1, 13811; RV64-NEXT: srli a2, a2, 633812; RV64-NEXT: neg a1, a13813; RV64-NEXT: and a0, a1, a03814; RV64-NEXT: addi a2, a2, -13815; RV64-NEXT: and a0, a2, a03816; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3817; RV64-NEXT: .cfi_restore ra3818; RV64-NEXT: addi sp, sp, 163819; RV64-NEXT: .cfi_def_cfa_offset 03820; RV64-NEXT: ret3821entry:3822 %conv = fptosi half %x to i1283823 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)3824 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)3825 %conv6 = trunc i128 %spec.store.select7 to i643826 ret i64 %conv63827}3828 3829; i32 non saturate3830 3831define i32 @ustest_f16i32_nsat(half %x) {3832; RV32-LABEL: ustest_f16i32_nsat:3833; RV32: # %bb.0:3834; RV32-NEXT: addi sp, sp, -163835; RV32-NEXT: .cfi_def_cfa_offset 163836; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill3837; RV32-NEXT: .cfi_offset ra, -43838; RV32-NEXT: call __extendhfsf23839; RV32-NEXT: fcvt.w.s a0, fa0, rtz3840; RV32-NEXT: srai a1, a0, 313841; RV32-NEXT: and a0, a1, a03842; RV32-NEXT: sgtz a1, a03843; RV32-NEXT: neg a1, a13844; RV32-NEXT: and a0, a1, a03845; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload3846; RV32-NEXT: .cfi_restore ra3847; RV32-NEXT: addi sp, sp, 163848; RV32-NEXT: .cfi_def_cfa_offset 03849; RV32-NEXT: ret3850;3851; RV64-LABEL: ustest_f16i32_nsat:3852; RV64: # %bb.0:3853; RV64-NEXT: addi sp, sp, -163854; RV64-NEXT: .cfi_def_cfa_offset 163855; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill3856; RV64-NEXT: .cfi_offset ra, -83857; RV64-NEXT: call __extendhfsf23858; RV64-NEXT: fcvt.l.s a0, fa0, rtz3859; RV64-NEXT: srai a1, a0, 633860; RV64-NEXT: and a0, a1, a03861; RV64-NEXT: sgtz a1, a03862; RV64-NEXT: neg a1, a13863; RV64-NEXT: and a0, a1, a03864; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload3865; RV64-NEXT: .cfi_restore ra3866; RV64-NEXT: addi sp, sp, 163867; RV64-NEXT: .cfi_def_cfa_offset 03868; RV64-NEXT: ret3869 %conv = fptosi half %x to i323870 %spec.store.select = call i32 @llvm.smin.i32(i32 0, i32 %conv)3871 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)3872 ret i32 %spec.store.select73873}3874 3875