4039 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv6m-none-eabi -float-abi=soft %s -o - | FileCheck %s --check-prefixes=SOFT3; RUN: llc -mtriple=thumbv7m-none-eabihf -mattr=+vfp2sp %s -o - | FileCheck %s --check-prefixes=VFP,VFP24; RUN: llc -mtriple=thumbv8.1m.main-none-eabihf -mattr=+fullfp16,+fp64 %s -o - | FileCheck %s --check-prefixes=VFP,FULL5 6; i32 saturate7 8define i32 @stest_f64i32(double %x) {9; SOFT-LABEL: stest_f64i32:10; SOFT: @ %bb.0: @ %entry11; SOFT-NEXT: .save {r4, lr}12; SOFT-NEXT: push {r4, lr}13; SOFT-NEXT: bl __aeabi_d2lz14; SOFT-NEXT: movs r2, #015; SOFT-NEXT: ldr r3, .LCPI0_016; SOFT-NEXT: subs r4, r0, r317; SOFT-NEXT: mov r4, r118; SOFT-NEXT: sbcs r4, r219; SOFT-NEXT: blt .LBB0_220; SOFT-NEXT: @ %bb.1: @ %entry21; SOFT-NEXT: mov r1, r222; SOFT-NEXT: .LBB0_2: @ %entry23; SOFT-NEXT: blt .LBB0_424; SOFT-NEXT: @ %bb.3: @ %entry25; SOFT-NEXT: mov r0, r326; SOFT-NEXT: .LBB0_4: @ %entry27; SOFT-NEXT: mvns r3, r228; SOFT-NEXT: movs r2, #129; SOFT-NEXT: lsls r2, r2, #3130; SOFT-NEXT: subs r4, r2, r031; SOFT-NEXT: sbcs r3, r132; SOFT-NEXT: blt .LBB0_633; SOFT-NEXT: @ %bb.5: @ %entry34; SOFT-NEXT: mov r0, r235; SOFT-NEXT: .LBB0_6: @ %entry36; SOFT-NEXT: pop {r4, pc}37; SOFT-NEXT: .p2align 238; SOFT-NEXT: @ %bb.7:39; SOFT-NEXT: .LCPI0_0:40; SOFT-NEXT: .long 2147483647 @ 0x7fffffff41;42; VFP2-LABEL: stest_f64i32:43; VFP2: @ %bb.0: @ %entry44; VFP2-NEXT: .save {r7, lr}45; VFP2-NEXT: push {r7, lr}46; VFP2-NEXT: vmov r0, r1, d047; VFP2-NEXT: bl __aeabi_d2lz48; VFP2-NEXT: mvn r12, #-214748364849; VFP2-NEXT: subs.w r3, r0, r1250; VFP2-NEXT: mov.w r2, #051; VFP2-NEXT: sbcs r3, r1, #052; VFP2-NEXT: it lt53; VFP2-NEXT: movlt r2, #154; VFP2-NEXT: cmp r2, #055; VFP2-NEXT: ite ne56; VFP2-NEXT: movne r2, r157; VFP2-NEXT: moveq r0, r1258; VFP2-NEXT: mov.w r1, #-159; VFP2-NEXT: rsbs.w r3, r0, #-214748364860; VFP2-NEXT: sbcs r1, r261; VFP2-NEXT: it ge62; VFP2-NEXT: movge.w r0, #-214748364863; VFP2-NEXT: pop {r7, pc}64;65; FULL-LABEL: stest_f64i32:66; FULL: @ %bb.0: @ %entry67; FULL-NEXT: vcvt.s32.f64 s0, d068; FULL-NEXT: vmov r0, s069; FULL-NEXT: bx lr70entry:71 %conv = fptosi double %x to i6472 %0 = icmp slt i64 %conv, 214748364773 %spec.store.select = select i1 %0, i64 %conv, i64 214748364774 %1 = icmp sgt i64 %spec.store.select, -214748364875 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -214748364876 %conv6 = trunc i64 %spec.store.select7 to i3277 ret i32 %conv678}79 80define i32 @utest_f64i32(double %x) {81; SOFT-LABEL: utest_f64i32:82; SOFT: @ %bb.0: @ %entry83; SOFT-NEXT: .save {r7, lr}84; SOFT-NEXT: push {r7, lr}85; SOFT-NEXT: bl __aeabi_d2ulz86; SOFT-NEXT: movs r2, #087; SOFT-NEXT: adds r3, r0, #188; SOFT-NEXT: sbcs r1, r289; SOFT-NEXT: blo .LBB1_290; SOFT-NEXT: @ %bb.1: @ %entry91; SOFT-NEXT: mvns r0, r292; SOFT-NEXT: .LBB1_2: @ %entry93; SOFT-NEXT: pop {r7, pc}94;95; VFP2-LABEL: utest_f64i32:96; VFP2: @ %bb.0: @ %entry97; VFP2-NEXT: .save {r7, lr}98; VFP2-NEXT: push {r7, lr}99; VFP2-NEXT: vmov r0, r1, d0100; VFP2-NEXT: bl __aeabi_d2ulz101; VFP2-NEXT: subs.w r2, r0, #-1102; VFP2-NEXT: sbcs r1, r1, #0103; VFP2-NEXT: it hs104; VFP2-NEXT: movhs.w r0, #-1105; VFP2-NEXT: pop {r7, pc}106;107; FULL-LABEL: utest_f64i32:108; FULL: @ %bb.0: @ %entry109; FULL-NEXT: vcvt.u32.f64 s0, d0110; FULL-NEXT: vmov r0, s0111; FULL-NEXT: bx lr112entry:113 %conv = fptoui double %x to i64114 %0 = icmp ult i64 %conv, 4294967295115 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295116 %conv6 = trunc i64 %spec.store.select to i32117 ret i32 %conv6118}119 120define i32 @ustest_f64i32(double %x) {121; SOFT-LABEL: ustest_f64i32:122; SOFT: @ %bb.0: @ %entry123; SOFT-NEXT: .save {r4, lr}124; SOFT-NEXT: push {r4, lr}125; SOFT-NEXT: bl __aeabi_d2lz126; SOFT-NEXT: movs r2, #0127; SOFT-NEXT: mvns r3, r2128; SOFT-NEXT: adds r4, r0, #1129; SOFT-NEXT: mov r4, r1130; SOFT-NEXT: sbcs r4, r2131; SOFT-NEXT: blt .LBB2_2132; SOFT-NEXT: @ %bb.1: @ %entry133; SOFT-NEXT: mov r1, r2134; SOFT-NEXT: .LBB2_2: @ %entry135; SOFT-NEXT: blt .LBB2_4136; SOFT-NEXT: @ %bb.3: @ %entry137; SOFT-NEXT: mov r0, r3138; SOFT-NEXT: .LBB2_4: @ %entry139; SOFT-NEXT: rsbs r3, r0, #0140; SOFT-NEXT: mov r3, r2141; SOFT-NEXT: sbcs r3, r1142; SOFT-NEXT: blt .LBB2_7143; SOFT-NEXT: @ %bb.5: @ %entry144; SOFT-NEXT: cmp r2, #0145; SOFT-NEXT: beq .LBB2_8146; SOFT-NEXT: .LBB2_6: @ %entry147; SOFT-NEXT: pop {r4, pc}148; SOFT-NEXT: .LBB2_7:149; SOFT-NEXT: movs r2, #1150; SOFT-NEXT: cmp r2, #0151; SOFT-NEXT: bne .LBB2_6152; SOFT-NEXT: .LBB2_8: @ %entry153; SOFT-NEXT: mov r0, r2154; SOFT-NEXT: pop {r4, pc}155;156; VFP2-LABEL: ustest_f64i32:157; VFP2: @ %bb.0: @ %entry158; VFP2-NEXT: .save {r7, lr}159; VFP2-NEXT: push {r7, lr}160; VFP2-NEXT: vmov r0, r1, d0161; VFP2-NEXT: bl __aeabi_d2lz162; VFP2-NEXT: subs.w r3, r0, #-1163; VFP2-NEXT: mov.w r2, #0164; VFP2-NEXT: sbcs r3, r1, #0165; VFP2-NEXT: mov.w r3, #0166; VFP2-NEXT: it lt167; VFP2-NEXT: movlt r3, #1168; VFP2-NEXT: cmp r3, #0169; VFP2-NEXT: ite ne170; VFP2-NEXT: movne r3, r1171; VFP2-NEXT: moveq.w r0, #-1172; VFP2-NEXT: rsbs r1, r0, #0173; VFP2-NEXT: sbcs.w r1, r2, r3174; VFP2-NEXT: it lt175; VFP2-NEXT: movlt r2, #1176; VFP2-NEXT: cmp r2, #0177; VFP2-NEXT: it eq178; VFP2-NEXT: moveq r0, r2179; VFP2-NEXT: pop {r7, pc}180;181; FULL-LABEL: ustest_f64i32:182; FULL: @ %bb.0: @ %entry183; FULL-NEXT: vcvt.u32.f64 s0, d0184; FULL-NEXT: vmov r0, s0185; FULL-NEXT: bx lr186entry:187 %conv = fptosi double %x to i64188 %0 = icmp slt i64 %conv, 4294967295189 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295190 %1 = icmp sgt i64 %spec.store.select, 0191 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0192 %conv6 = trunc i64 %spec.store.select7 to i32193 ret i32 %conv6194}195 196define i32 @stest_f32i32(float %x) {197; SOFT-LABEL: stest_f32i32:198; SOFT: @ %bb.0: @ %entry199; SOFT-NEXT: .save {r4, lr}200; SOFT-NEXT: push {r4, lr}201; SOFT-NEXT: bl __aeabi_f2lz202; SOFT-NEXT: movs r2, #0203; SOFT-NEXT: ldr r3, .LCPI3_0204; SOFT-NEXT: subs r4, r0, r3205; SOFT-NEXT: mov r4, r1206; SOFT-NEXT: sbcs r4, r2207; SOFT-NEXT: blt .LBB3_2208; SOFT-NEXT: @ %bb.1: @ %entry209; SOFT-NEXT: mov r1, r2210; SOFT-NEXT: .LBB3_2: @ %entry211; SOFT-NEXT: blt .LBB3_4212; SOFT-NEXT: @ %bb.3: @ %entry213; SOFT-NEXT: mov r0, r3214; SOFT-NEXT: .LBB3_4: @ %entry215; SOFT-NEXT: mvns r3, r2216; SOFT-NEXT: movs r2, #1217; SOFT-NEXT: lsls r2, r2, #31218; SOFT-NEXT: subs r4, r2, r0219; SOFT-NEXT: sbcs r3, r1220; SOFT-NEXT: blt .LBB3_6221; SOFT-NEXT: @ %bb.5: @ %entry222; SOFT-NEXT: mov r0, r2223; SOFT-NEXT: .LBB3_6: @ %entry224; SOFT-NEXT: pop {r4, pc}225; SOFT-NEXT: .p2align 2226; SOFT-NEXT: @ %bb.7:227; SOFT-NEXT: .LCPI3_0:228; SOFT-NEXT: .long 2147483647 @ 0x7fffffff229;230; VFP-LABEL: stest_f32i32:231; VFP: @ %bb.0: @ %entry232; VFP-NEXT: vcvt.s32.f32 s0, s0233; VFP-NEXT: vmov r0, s0234; VFP-NEXT: bx lr235entry:236 %conv = fptosi float %x to i64237 %0 = icmp slt i64 %conv, 2147483647238 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647239 %1 = icmp sgt i64 %spec.store.select, -2147483648240 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648241 %conv6 = trunc i64 %spec.store.select7 to i32242 ret i32 %conv6243}244 245define i32 @utest_f32i32(float %x) {246; SOFT-LABEL: utest_f32i32:247; SOFT: @ %bb.0: @ %entry248; SOFT-NEXT: .save {r7, lr}249; SOFT-NEXT: push {r7, lr}250; SOFT-NEXT: bl __aeabi_f2ulz251; SOFT-NEXT: movs r2, #0252; SOFT-NEXT: adds r3, r0, #1253; SOFT-NEXT: sbcs r1, r2254; SOFT-NEXT: blo .LBB4_2255; SOFT-NEXT: @ %bb.1: @ %entry256; SOFT-NEXT: mvns r0, r2257; SOFT-NEXT: .LBB4_2: @ %entry258; SOFT-NEXT: pop {r7, pc}259;260; VFP-LABEL: utest_f32i32:261; VFP: @ %bb.0: @ %entry262; VFP-NEXT: vcvt.u32.f32 s0, s0263; VFP-NEXT: vmov r0, s0264; VFP-NEXT: bx lr265entry:266 %conv = fptoui float %x to i64267 %0 = icmp ult i64 %conv, 4294967295268 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295269 %conv6 = trunc i64 %spec.store.select to i32270 ret i32 %conv6271}272 273define i32 @ustest_f32i32(float %x) {274; SOFT-LABEL: ustest_f32i32:275; SOFT: @ %bb.0: @ %entry276; SOFT-NEXT: .save {r4, lr}277; SOFT-NEXT: push {r4, lr}278; SOFT-NEXT: bl __aeabi_f2lz279; SOFT-NEXT: movs r2, #0280; SOFT-NEXT: mvns r3, r2281; SOFT-NEXT: adds r4, r0, #1282; SOFT-NEXT: mov r4, r1283; SOFT-NEXT: sbcs r4, r2284; SOFT-NEXT: blt .LBB5_2285; SOFT-NEXT: @ %bb.1: @ %entry286; SOFT-NEXT: mov r1, r2287; SOFT-NEXT: .LBB5_2: @ %entry288; SOFT-NEXT: blt .LBB5_4289; SOFT-NEXT: @ %bb.3: @ %entry290; SOFT-NEXT: mov r0, r3291; SOFT-NEXT: .LBB5_4: @ %entry292; SOFT-NEXT: rsbs r3, r0, #0293; SOFT-NEXT: mov r3, r2294; SOFT-NEXT: sbcs r3, r1295; SOFT-NEXT: blt .LBB5_7296; SOFT-NEXT: @ %bb.5: @ %entry297; SOFT-NEXT: cmp r2, #0298; SOFT-NEXT: beq .LBB5_8299; SOFT-NEXT: .LBB5_6: @ %entry300; SOFT-NEXT: pop {r4, pc}301; SOFT-NEXT: .LBB5_7:302; SOFT-NEXT: movs r2, #1303; SOFT-NEXT: cmp r2, #0304; SOFT-NEXT: bne .LBB5_6305; SOFT-NEXT: .LBB5_8: @ %entry306; SOFT-NEXT: mov r0, r2307; SOFT-NEXT: pop {r4, pc}308;309; VFP-LABEL: ustest_f32i32:310; VFP: @ %bb.0: @ %entry311; VFP-NEXT: vcvt.u32.f32 s0, s0312; VFP-NEXT: vmov r0, s0313; VFP-NEXT: bx lr314entry:315 %conv = fptosi float %x to i64316 %0 = icmp slt i64 %conv, 4294967295317 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295318 %1 = icmp sgt i64 %spec.store.select, 0319 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0320 %conv6 = trunc i64 %spec.store.select7 to i32321 ret i32 %conv6322}323 324define i32 @stest_f16i32(half %x) {325; SOFT-LABEL: stest_f16i32:326; SOFT: @ %bb.0: @ %entry327; SOFT-NEXT: .save {r4, lr}328; SOFT-NEXT: push {r4, lr}329; SOFT-NEXT: uxth r0, r0330; SOFT-NEXT: bl __aeabi_h2f331; SOFT-NEXT: bl __aeabi_f2lz332; SOFT-NEXT: movs r2, #0333; SOFT-NEXT: ldr r3, .LCPI6_0334; SOFT-NEXT: subs r4, r0, r3335; SOFT-NEXT: mov r4, r1336; SOFT-NEXT: sbcs r4, r2337; SOFT-NEXT: blt .LBB6_2338; SOFT-NEXT: @ %bb.1: @ %entry339; SOFT-NEXT: mov r1, r2340; SOFT-NEXT: .LBB6_2: @ %entry341; SOFT-NEXT: blt .LBB6_4342; SOFT-NEXT: @ %bb.3: @ %entry343; SOFT-NEXT: mov r0, r3344; SOFT-NEXT: .LBB6_4: @ %entry345; SOFT-NEXT: mvns r3, r2346; SOFT-NEXT: movs r2, #1347; SOFT-NEXT: lsls r2, r2, #31348; SOFT-NEXT: subs r4, r2, r0349; SOFT-NEXT: sbcs r3, r1350; SOFT-NEXT: blt .LBB6_6351; SOFT-NEXT: @ %bb.5: @ %entry352; SOFT-NEXT: mov r0, r2353; SOFT-NEXT: .LBB6_6: @ %entry354; SOFT-NEXT: pop {r4, pc}355; SOFT-NEXT: .p2align 2356; SOFT-NEXT: @ %bb.7:357; SOFT-NEXT: .LCPI6_0:358; SOFT-NEXT: .long 2147483647 @ 0x7fffffff359;360; VFP2-LABEL: stest_f16i32:361; VFP2: @ %bb.0: @ %entry362; VFP2-NEXT: .save {r7, lr}363; VFP2-NEXT: push {r7, lr}364; VFP2-NEXT: vmov r0, s0365; VFP2-NEXT: bl __aeabi_h2f366; VFP2-NEXT: vmov s0, r0367; VFP2-NEXT: vcvt.s32.f32 s0, s0368; VFP2-NEXT: vmov r0, s0369; VFP2-NEXT: pop {r7, pc}370;371; FULL-LABEL: stest_f16i32:372; FULL: @ %bb.0: @ %entry373; FULL-NEXT: vcvt.s32.f16 s0, s0374; FULL-NEXT: vmov r0, s0375; FULL-NEXT: bx lr376entry:377 %conv = fptosi half %x to i64378 %0 = icmp slt i64 %conv, 2147483647379 %spec.store.select = select i1 %0, i64 %conv, i64 2147483647380 %1 = icmp sgt i64 %spec.store.select, -2147483648381 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648382 %conv6 = trunc i64 %spec.store.select7 to i32383 ret i32 %conv6384}385 386define i32 @utest_f16i32(half %x) {387; SOFT-LABEL: utest_f16i32:388; SOFT: @ %bb.0: @ %entry389; SOFT-NEXT: .save {r7, lr}390; SOFT-NEXT: push {r7, lr}391; SOFT-NEXT: uxth r0, r0392; SOFT-NEXT: bl __aeabi_h2f393; SOFT-NEXT: bl __aeabi_f2ulz394; SOFT-NEXT: movs r2, #0395; SOFT-NEXT: adds r3, r0, #1396; SOFT-NEXT: sbcs r1, r2397; SOFT-NEXT: blo .LBB7_2398; SOFT-NEXT: @ %bb.1: @ %entry399; SOFT-NEXT: mvns r0, r2400; SOFT-NEXT: .LBB7_2: @ %entry401; SOFT-NEXT: pop {r7, pc}402;403; VFP2-LABEL: utest_f16i32:404; VFP2: @ %bb.0: @ %entry405; VFP2-NEXT: .save {r7, lr}406; VFP2-NEXT: push {r7, lr}407; VFP2-NEXT: vmov r0, s0408; VFP2-NEXT: bl __aeabi_h2f409; VFP2-NEXT: vmov s0, r0410; VFP2-NEXT: vcvt.u32.f32 s0, s0411; VFP2-NEXT: vmov r0, s0412; VFP2-NEXT: pop {r7, pc}413;414; FULL-LABEL: utest_f16i32:415; FULL: @ %bb.0: @ %entry416; FULL-NEXT: vcvt.u32.f16 s0, s0417; FULL-NEXT: vmov r0, s0418; FULL-NEXT: bx lr419entry:420 %conv = fptoui half %x to i64421 %0 = icmp ult i64 %conv, 4294967295422 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295423 %conv6 = trunc i64 %spec.store.select to i32424 ret i32 %conv6425}426 427define i32 @ustest_f16i32(half %x) {428; SOFT-LABEL: ustest_f16i32:429; SOFT: @ %bb.0: @ %entry430; SOFT-NEXT: .save {r4, lr}431; SOFT-NEXT: push {r4, lr}432; SOFT-NEXT: uxth r0, r0433; SOFT-NEXT: bl __aeabi_h2f434; SOFT-NEXT: bl __aeabi_f2lz435; SOFT-NEXT: movs r2, #0436; SOFT-NEXT: mvns r3, r2437; SOFT-NEXT: adds r4, r0, #1438; SOFT-NEXT: mov r4, r1439; SOFT-NEXT: sbcs r4, r2440; SOFT-NEXT: blt .LBB8_2441; SOFT-NEXT: @ %bb.1: @ %entry442; SOFT-NEXT: mov r1, r2443; SOFT-NEXT: .LBB8_2: @ %entry444; SOFT-NEXT: blt .LBB8_4445; SOFT-NEXT: @ %bb.3: @ %entry446; SOFT-NEXT: mov r0, r3447; SOFT-NEXT: .LBB8_4: @ %entry448; SOFT-NEXT: rsbs r3, r0, #0449; SOFT-NEXT: mov r3, r2450; SOFT-NEXT: sbcs r3, r1451; SOFT-NEXT: blt .LBB8_7452; SOFT-NEXT: @ %bb.5: @ %entry453; SOFT-NEXT: cmp r2, #0454; SOFT-NEXT: beq .LBB8_8455; SOFT-NEXT: .LBB8_6: @ %entry456; SOFT-NEXT: pop {r4, pc}457; SOFT-NEXT: .LBB8_7:458; SOFT-NEXT: movs r2, #1459; SOFT-NEXT: cmp r2, #0460; SOFT-NEXT: bne .LBB8_6461; SOFT-NEXT: .LBB8_8: @ %entry462; SOFT-NEXT: mov r0, r2463; SOFT-NEXT: pop {r4, pc}464;465; VFP2-LABEL: ustest_f16i32:466; VFP2: @ %bb.0: @ %entry467; VFP2-NEXT: .save {r7, lr}468; VFP2-NEXT: push {r7, lr}469; VFP2-NEXT: vmov r0, s0470; VFP2-NEXT: bl __aeabi_h2f471; VFP2-NEXT: vmov s0, r0472; VFP2-NEXT: vcvt.u32.f32 s0, s0473; VFP2-NEXT: vmov r0, s0474; VFP2-NEXT: pop {r7, pc}475;476; FULL-LABEL: ustest_f16i32:477; FULL: @ %bb.0: @ %entry478; FULL-NEXT: vcvt.u32.f16 s0, s0479; FULL-NEXT: vmov r0, s0480; FULL-NEXT: bx lr481entry:482 %conv = fptosi half %x to i64483 %0 = icmp slt i64 %conv, 4294967295484 %spec.store.select = select i1 %0, i64 %conv, i64 4294967295485 %1 = icmp sgt i64 %spec.store.select, 0486 %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0487 %conv6 = trunc i64 %spec.store.select7 to i32488 ret i32 %conv6489}490 491; i16 saturate492 493define i16 @stest_f64i16(double %x) {494; SOFT-LABEL: stest_f64i16:495; SOFT: @ %bb.0: @ %entry496; SOFT-NEXT: .save {r7, lr}497; SOFT-NEXT: push {r7, lr}498; SOFT-NEXT: bl __aeabi_d2iz499; SOFT-NEXT: ldr r1, .LCPI9_0500; SOFT-NEXT: cmp r0, r1501; SOFT-NEXT: blt .LBB9_2502; SOFT-NEXT: @ %bb.1: @ %entry503; SOFT-NEXT: mov r0, r1504; SOFT-NEXT: .LBB9_2: @ %entry505; SOFT-NEXT: ldr r1, .LCPI9_1506; SOFT-NEXT: cmp r0, r1507; SOFT-NEXT: bgt .LBB9_4508; SOFT-NEXT: @ %bb.3: @ %entry509; SOFT-NEXT: mov r0, r1510; SOFT-NEXT: .LBB9_4: @ %entry511; SOFT-NEXT: pop {r7, pc}512; SOFT-NEXT: .p2align 2513; SOFT-NEXT: @ %bb.5:514; SOFT-NEXT: .LCPI9_0:515; SOFT-NEXT: .long 32767 @ 0x7fff516; SOFT-NEXT: .LCPI9_1:517; SOFT-NEXT: .long 4294934528 @ 0xffff8000518;519; VFP2-LABEL: stest_f64i16:520; VFP2: @ %bb.0: @ %entry521; VFP2-NEXT: .save {r7, lr}522; VFP2-NEXT: push {r7, lr}523; VFP2-NEXT: vmov r0, r1, d0524; VFP2-NEXT: bl __aeabi_d2iz525; VFP2-NEXT: ssat r0, #16, r0526; VFP2-NEXT: pop {r7, pc}527;528; FULL-LABEL: stest_f64i16:529; FULL: @ %bb.0: @ %entry530; FULL-NEXT: vcvt.s32.f64 s0, d0531; FULL-NEXT: vmov r0, s0532; FULL-NEXT: ssat r0, #16, r0533; FULL-NEXT: bx lr534entry:535 %conv = fptosi double %x to i32536 %0 = icmp slt i32 %conv, 32767537 %spec.store.select = select i1 %0, i32 %conv, i32 32767538 %1 = icmp sgt i32 %spec.store.select, -32768539 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768540 %conv6 = trunc i32 %spec.store.select7 to i16541 ret i16 %conv6542}543 544define i16 @utest_f64i16(double %x) {545; SOFT-LABEL: utest_f64i16:546; SOFT: @ %bb.0: @ %entry547; SOFT-NEXT: .save {r7, lr}548; SOFT-NEXT: push {r7, lr}549; SOFT-NEXT: bl __aeabi_d2uiz550; SOFT-NEXT: ldr r1, .LCPI10_0551; SOFT-NEXT: cmp r0, r1552; SOFT-NEXT: blo .LBB10_2553; SOFT-NEXT: @ %bb.1: @ %entry554; SOFT-NEXT: mov r0, r1555; SOFT-NEXT: .LBB10_2: @ %entry556; SOFT-NEXT: pop {r7, pc}557; SOFT-NEXT: .p2align 2558; SOFT-NEXT: @ %bb.3:559; SOFT-NEXT: .LCPI10_0:560; SOFT-NEXT: .long 65535 @ 0xffff561;562; VFP2-LABEL: utest_f64i16:563; VFP2: @ %bb.0: @ %entry564; VFP2-NEXT: .save {r7, lr}565; VFP2-NEXT: push {r7, lr}566; VFP2-NEXT: vmov r0, r1, d0567; VFP2-NEXT: bl __aeabi_d2uiz568; VFP2-NEXT: movw r1, #65535569; VFP2-NEXT: cmp r0, r1570; VFP2-NEXT: it hs571; VFP2-NEXT: movhs r0, r1572; VFP2-NEXT: pop {r7, pc}573;574; FULL-LABEL: utest_f64i16:575; FULL: @ %bb.0: @ %entry576; FULL-NEXT: vcvt.u32.f64 s0, d0577; FULL-NEXT: movw r1, #65535578; FULL-NEXT: vmov r0, s0579; FULL-NEXT: cmp r0, r1580; FULL-NEXT: csel r0, r0, r1, lo581; FULL-NEXT: bx lr582entry:583 %conv = fptoui double %x to i32584 %0 = icmp ult i32 %conv, 65535585 %spec.store.select = select i1 %0, i32 %conv, i32 65535586 %conv6 = trunc i32 %spec.store.select to i16587 ret i16 %conv6588}589 590define i16 @ustest_f64i16(double %x) {591; SOFT-LABEL: ustest_f64i16:592; SOFT: @ %bb.0: @ %entry593; SOFT-NEXT: .save {r7, lr}594; SOFT-NEXT: push {r7, lr}595; SOFT-NEXT: bl __aeabi_d2iz596; SOFT-NEXT: ldr r1, .LCPI11_0597; SOFT-NEXT: cmp r0, r1598; SOFT-NEXT: blt .LBB11_2599; SOFT-NEXT: @ %bb.1: @ %entry600; SOFT-NEXT: mov r0, r1601; SOFT-NEXT: .LBB11_2: @ %entry602; SOFT-NEXT: asrs r1, r0, #31603; SOFT-NEXT: bics r0, r1604; SOFT-NEXT: pop {r7, pc}605; SOFT-NEXT: .p2align 2606; SOFT-NEXT: @ %bb.3:607; SOFT-NEXT: .LCPI11_0:608; SOFT-NEXT: .long 65535 @ 0xffff609;610; VFP2-LABEL: ustest_f64i16:611; VFP2: @ %bb.0: @ %entry612; VFP2-NEXT: .save {r7, lr}613; VFP2-NEXT: push {r7, lr}614; VFP2-NEXT: vmov r0, r1, d0615; VFP2-NEXT: bl __aeabi_d2iz616; VFP2-NEXT: movw r1, #65535617; VFP2-NEXT: cmp r0, r1618; VFP2-NEXT: it lt619; VFP2-NEXT: movlt r1, r0620; VFP2-NEXT: bic.w r0, r1, r1, asr #31621; VFP2-NEXT: pop {r7, pc}622;623; FULL-LABEL: ustest_f64i16:624; FULL: @ %bb.0: @ %entry625; FULL-NEXT: vcvt.s32.f64 s0, d0626; FULL-NEXT: movw r1, #65535627; FULL-NEXT: vmov r0, s0628; FULL-NEXT: cmp r0, r1629; FULL-NEXT: csel r0, r0, r1, lt630; FULL-NEXT: bic.w r0, r0, r0, asr #31631; FULL-NEXT: bx lr632entry:633 %conv = fptosi double %x to i32634 %0 = icmp slt i32 %conv, 65535635 %spec.store.select = select i1 %0, i32 %conv, i32 65535636 %1 = icmp sgt i32 %spec.store.select, 0637 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0638 %conv6 = trunc i32 %spec.store.select7 to i16639 ret i16 %conv6640}641 642define i16 @stest_f32i16(float %x) {643; SOFT-LABEL: stest_f32i16:644; SOFT: @ %bb.0: @ %entry645; SOFT-NEXT: .save {r7, lr}646; SOFT-NEXT: push {r7, lr}647; SOFT-NEXT: bl __aeabi_f2iz648; SOFT-NEXT: ldr r1, .LCPI12_0649; SOFT-NEXT: cmp r0, r1650; SOFT-NEXT: blt .LBB12_2651; SOFT-NEXT: @ %bb.1: @ %entry652; SOFT-NEXT: mov r0, r1653; SOFT-NEXT: .LBB12_2: @ %entry654; SOFT-NEXT: ldr r1, .LCPI12_1655; SOFT-NEXT: cmp r0, r1656; SOFT-NEXT: bgt .LBB12_4657; SOFT-NEXT: @ %bb.3: @ %entry658; SOFT-NEXT: mov r0, r1659; SOFT-NEXT: .LBB12_4: @ %entry660; SOFT-NEXT: pop {r7, pc}661; SOFT-NEXT: .p2align 2662; SOFT-NEXT: @ %bb.5:663; SOFT-NEXT: .LCPI12_0:664; SOFT-NEXT: .long 32767 @ 0x7fff665; SOFT-NEXT: .LCPI12_1:666; SOFT-NEXT: .long 4294934528 @ 0xffff8000667;668; VFP-LABEL: stest_f32i16:669; VFP: @ %bb.0: @ %entry670; VFP-NEXT: vcvt.s32.f32 s0, s0671; VFP-NEXT: vmov r0, s0672; VFP-NEXT: ssat r0, #16, r0673; VFP-NEXT: bx lr674entry:675 %conv = fptosi float %x to i32676 %0 = icmp slt i32 %conv, 32767677 %spec.store.select = select i1 %0, i32 %conv, i32 32767678 %1 = icmp sgt i32 %spec.store.select, -32768679 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768680 %conv6 = trunc i32 %spec.store.select7 to i16681 ret i16 %conv6682}683 684define i16 @utest_f32i16(float %x) {685; SOFT-LABEL: utest_f32i16:686; SOFT: @ %bb.0: @ %entry687; SOFT-NEXT: .save {r7, lr}688; SOFT-NEXT: push {r7, lr}689; SOFT-NEXT: bl __aeabi_f2uiz690; SOFT-NEXT: ldr r1, .LCPI13_0691; SOFT-NEXT: cmp r0, r1692; SOFT-NEXT: blo .LBB13_2693; SOFT-NEXT: @ %bb.1: @ %entry694; SOFT-NEXT: mov r0, r1695; SOFT-NEXT: .LBB13_2: @ %entry696; SOFT-NEXT: pop {r7, pc}697; SOFT-NEXT: .p2align 2698; SOFT-NEXT: @ %bb.3:699; SOFT-NEXT: .LCPI13_0:700; SOFT-NEXT: .long 65535 @ 0xffff701;702; VFP2-LABEL: utest_f32i16:703; VFP2: @ %bb.0: @ %entry704; VFP2-NEXT: vcvt.u32.f32 s0, s0705; VFP2-NEXT: movw r0, #65535706; VFP2-NEXT: vmov r1, s0707; VFP2-NEXT: cmp r1, r0708; VFP2-NEXT: it lo709; VFP2-NEXT: movlo r0, r1710; VFP2-NEXT: bx lr711;712; FULL-LABEL: utest_f32i16:713; FULL: @ %bb.0: @ %entry714; FULL-NEXT: vcvt.u32.f32 s0, s0715; FULL-NEXT: movw r1, #65535716; FULL-NEXT: vmov r0, s0717; FULL-NEXT: cmp r0, r1718; FULL-NEXT: csel r0, r0, r1, lo719; FULL-NEXT: bx lr720entry:721 %conv = fptoui float %x to i32722 %0 = icmp ult i32 %conv, 65535723 %spec.store.select = select i1 %0, i32 %conv, i32 65535724 %conv6 = trunc i32 %spec.store.select to i16725 ret i16 %conv6726}727 728define i16 @ustest_f32i16(float %x) {729; SOFT-LABEL: ustest_f32i16:730; SOFT: @ %bb.0: @ %entry731; SOFT-NEXT: .save {r7, lr}732; SOFT-NEXT: push {r7, lr}733; SOFT-NEXT: bl __aeabi_f2iz734; SOFT-NEXT: ldr r1, .LCPI14_0735; SOFT-NEXT: cmp r0, r1736; SOFT-NEXT: blt .LBB14_2737; SOFT-NEXT: @ %bb.1: @ %entry738; SOFT-NEXT: mov r0, r1739; SOFT-NEXT: .LBB14_2: @ %entry740; SOFT-NEXT: asrs r1, r0, #31741; SOFT-NEXT: bics r0, r1742; SOFT-NEXT: pop {r7, pc}743; SOFT-NEXT: .p2align 2744; SOFT-NEXT: @ %bb.3:745; SOFT-NEXT: .LCPI14_0:746; SOFT-NEXT: .long 65535 @ 0xffff747;748; VFP2-LABEL: ustest_f32i16:749; VFP2: @ %bb.0: @ %entry750; VFP2-NEXT: vcvt.s32.f32 s0, s0751; VFP2-NEXT: movw r1, #65535752; VFP2-NEXT: vmov r0, s0753; VFP2-NEXT: cmp r0, r1754; VFP2-NEXT: it lt755; VFP2-NEXT: movlt r1, r0756; VFP2-NEXT: bic.w r0, r1, r1, asr #31757; VFP2-NEXT: bx lr758;759; FULL-LABEL: ustest_f32i16:760; FULL: @ %bb.0: @ %entry761; FULL-NEXT: vcvt.s32.f32 s0, s0762; FULL-NEXT: movw r1, #65535763; FULL-NEXT: vmov r0, s0764; FULL-NEXT: cmp r0, r1765; FULL-NEXT: csel r0, r0, r1, lt766; FULL-NEXT: bic.w r0, r0, r0, asr #31767; FULL-NEXT: bx lr768entry:769 %conv = fptosi float %x to i32770 %0 = icmp slt i32 %conv, 65535771 %spec.store.select = select i1 %0, i32 %conv, i32 65535772 %1 = icmp sgt i32 %spec.store.select, 0773 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0774 %conv6 = trunc i32 %spec.store.select7 to i16775 ret i16 %conv6776}777 778define i16 @stest_f16i16(half %x) {779; SOFT-LABEL: stest_f16i16:780; SOFT: @ %bb.0: @ %entry781; SOFT-NEXT: .save {r7, lr}782; SOFT-NEXT: push {r7, lr}783; SOFT-NEXT: uxth r0, r0784; SOFT-NEXT: bl __aeabi_h2f785; SOFT-NEXT: bl __aeabi_f2iz786; SOFT-NEXT: ldr r1, .LCPI15_0787; SOFT-NEXT: cmp r0, r1788; SOFT-NEXT: blt .LBB15_2789; SOFT-NEXT: @ %bb.1: @ %entry790; SOFT-NEXT: mov r0, r1791; SOFT-NEXT: .LBB15_2: @ %entry792; SOFT-NEXT: ldr r1, .LCPI15_1793; SOFT-NEXT: cmp r0, r1794; SOFT-NEXT: bgt .LBB15_4795; SOFT-NEXT: @ %bb.3: @ %entry796; SOFT-NEXT: mov r0, r1797; SOFT-NEXT: .LBB15_4: @ %entry798; SOFT-NEXT: pop {r7, pc}799; SOFT-NEXT: .p2align 2800; SOFT-NEXT: @ %bb.5:801; SOFT-NEXT: .LCPI15_0:802; SOFT-NEXT: .long 32767 @ 0x7fff803; SOFT-NEXT: .LCPI15_1:804; SOFT-NEXT: .long 4294934528 @ 0xffff8000805;806; VFP2-LABEL: stest_f16i16:807; VFP2: @ %bb.0: @ %entry808; VFP2-NEXT: .save {r7, lr}809; VFP2-NEXT: push {r7, lr}810; VFP2-NEXT: vmov r0, s0811; VFP2-NEXT: bl __aeabi_h2f812; VFP2-NEXT: vmov s0, r0813; VFP2-NEXT: vcvt.s32.f32 s0, s0814; VFP2-NEXT: vmov r0, s0815; VFP2-NEXT: ssat r0, #16, r0816; VFP2-NEXT: pop {r7, pc}817;818; FULL-LABEL: stest_f16i16:819; FULL: @ %bb.0: @ %entry820; FULL-NEXT: vcvt.s32.f16 s0, s0821; FULL-NEXT: vmov r0, s0822; FULL-NEXT: ssat r0, #16, r0823; FULL-NEXT: bx lr824entry:825 %conv = fptosi half %x to i32826 %0 = icmp slt i32 %conv, 32767827 %spec.store.select = select i1 %0, i32 %conv, i32 32767828 %1 = icmp sgt i32 %spec.store.select, -32768829 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768830 %conv6 = trunc i32 %spec.store.select7 to i16831 ret i16 %conv6832}833 834define i16 @utesth_f16i16(half %x) {835; SOFT-LABEL: utesth_f16i16:836; SOFT: @ %bb.0: @ %entry837; SOFT-NEXT: .save {r7, lr}838; SOFT-NEXT: push {r7, lr}839; SOFT-NEXT: uxth r0, r0840; SOFT-NEXT: bl __aeabi_h2f841; SOFT-NEXT: bl __aeabi_f2uiz842; SOFT-NEXT: ldr r1, .LCPI16_0843; SOFT-NEXT: cmp r0, r1844; SOFT-NEXT: blo .LBB16_2845; SOFT-NEXT: @ %bb.1: @ %entry846; SOFT-NEXT: mov r0, r1847; SOFT-NEXT: .LBB16_2: @ %entry848; SOFT-NEXT: pop {r7, pc}849; SOFT-NEXT: .p2align 2850; SOFT-NEXT: @ %bb.3:851; SOFT-NEXT: .LCPI16_0:852; SOFT-NEXT: .long 65535 @ 0xffff853;854; VFP2-LABEL: utesth_f16i16:855; VFP2: @ %bb.0: @ %entry856; VFP2-NEXT: .save {r7, lr}857; VFP2-NEXT: push {r7, lr}858; VFP2-NEXT: vmov r0, s0859; VFP2-NEXT: bl __aeabi_h2f860; VFP2-NEXT: vmov s0, r0861; VFP2-NEXT: movw r0, #65535862; VFP2-NEXT: vcvt.u32.f32 s0, s0863; VFP2-NEXT: vmov r1, s0864; VFP2-NEXT: cmp r1, r0865; VFP2-NEXT: it lo866; VFP2-NEXT: movlo r0, r1867; VFP2-NEXT: pop {r7, pc}868;869; FULL-LABEL: utesth_f16i16:870; FULL: @ %bb.0: @ %entry871; FULL-NEXT: vcvt.u32.f16 s0, s0872; FULL-NEXT: movw r1, #65535873; FULL-NEXT: vmov r0, s0874; FULL-NEXT: cmp r0, r1875; FULL-NEXT: csel r0, r0, r1, lo876; FULL-NEXT: bx lr877entry:878 %conv = fptoui half %x to i32879 %0 = icmp ult i32 %conv, 65535880 %spec.store.select = select i1 %0, i32 %conv, i32 65535881 %conv6 = trunc i32 %spec.store.select to i16882 ret i16 %conv6883}884 885define i16 @ustest_f16i16(half %x) {886; SOFT-LABEL: ustest_f16i16:887; SOFT: @ %bb.0: @ %entry888; SOFT-NEXT: .save {r7, lr}889; SOFT-NEXT: push {r7, lr}890; SOFT-NEXT: uxth r0, r0891; SOFT-NEXT: bl __aeabi_h2f892; SOFT-NEXT: bl __aeabi_f2iz893; SOFT-NEXT: ldr r1, .LCPI17_0894; SOFT-NEXT: cmp r0, r1895; SOFT-NEXT: blt .LBB17_2896; SOFT-NEXT: @ %bb.1: @ %entry897; SOFT-NEXT: mov r0, r1898; SOFT-NEXT: .LBB17_2: @ %entry899; SOFT-NEXT: asrs r1, r0, #31900; SOFT-NEXT: bics r0, r1901; SOFT-NEXT: pop {r7, pc}902; SOFT-NEXT: .p2align 2903; SOFT-NEXT: @ %bb.3:904; SOFT-NEXT: .LCPI17_0:905; SOFT-NEXT: .long 65535 @ 0xffff906;907; VFP2-LABEL: ustest_f16i16:908; VFP2: @ %bb.0: @ %entry909; VFP2-NEXT: .save {r7, lr}910; VFP2-NEXT: push {r7, lr}911; VFP2-NEXT: vmov r0, s0912; VFP2-NEXT: bl __aeabi_h2f913; VFP2-NEXT: vmov s0, r0914; VFP2-NEXT: movw r1, #65535915; VFP2-NEXT: vcvt.s32.f32 s0, s0916; VFP2-NEXT: vmov r0, s0917; VFP2-NEXT: cmp r0, r1918; VFP2-NEXT: it lt919; VFP2-NEXT: movlt r1, r0920; VFP2-NEXT: bic.w r0, r1, r1, asr #31921; VFP2-NEXT: pop {r7, pc}922;923; FULL-LABEL: ustest_f16i16:924; FULL: @ %bb.0: @ %entry925; FULL-NEXT: vcvt.s32.f16 s0, s0926; FULL-NEXT: movw r1, #65535927; FULL-NEXT: vmov r0, s0928; FULL-NEXT: cmp r0, r1929; FULL-NEXT: csel r0, r0, r1, lt930; FULL-NEXT: bic.w r0, r0, r0, asr #31931; FULL-NEXT: bx lr932entry:933 %conv = fptosi half %x to i32934 %0 = icmp slt i32 %conv, 65535935 %spec.store.select = select i1 %0, i32 %conv, i32 65535936 %1 = icmp sgt i32 %spec.store.select, 0937 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0938 %conv6 = trunc i32 %spec.store.select7 to i16939 ret i16 %conv6940}941 942; i64 saturate943 944define i64 @stest_f64i64(double %x) {945; SOFT-LABEL: stest_f64i64:946; SOFT: @ %bb.0: @ %entry947; SOFT-NEXT: .save {r4, r5, r6, r7, lr}948; SOFT-NEXT: push {r4, r5, r6, r7, lr}949; SOFT-NEXT: .pad #4950; SOFT-NEXT: sub sp, #4951; SOFT-NEXT: bl __fixdfti952; SOFT-NEXT: movs r4, #0953; SOFT-NEXT: mvns r5, r4954; SOFT-NEXT: ldr r6, .LCPI18_0955; SOFT-NEXT: adds r7, r0, #1956; SOFT-NEXT: mov r7, r1957; SOFT-NEXT: sbcs r7, r6958; SOFT-NEXT: mov r7, r2959; SOFT-NEXT: sbcs r7, r4960; SOFT-NEXT: mov r7, r3961; SOFT-NEXT: sbcs r7, r4962; SOFT-NEXT: bge .LBB18_8963; SOFT-NEXT: @ %bb.1: @ %entry964; SOFT-NEXT: bge .LBB18_9965; SOFT-NEXT: .LBB18_2: @ %entry966; SOFT-NEXT: bge .LBB18_10967; SOFT-NEXT: .LBB18_3: @ %entry968; SOFT-NEXT: blt .LBB18_5969; SOFT-NEXT: .LBB18_4: @ %entry970; SOFT-NEXT: mov r0, r5971; SOFT-NEXT: .LBB18_5: @ %entry972; SOFT-NEXT: movs r6, #1973; SOFT-NEXT: lsls r6, r6, #31974; SOFT-NEXT: rsbs r7, r0, #0975; SOFT-NEXT: mov r7, r6976; SOFT-NEXT: sbcs r7, r1977; SOFT-NEXT: mov r7, r5978; SOFT-NEXT: sbcs r7, r2979; SOFT-NEXT: sbcs r5, r3980; SOFT-NEXT: bge .LBB18_11981; SOFT-NEXT: @ %bb.6: @ %entry982; SOFT-NEXT: bge .LBB18_12983; SOFT-NEXT: .LBB18_7: @ %entry984; SOFT-NEXT: add sp, #4985; SOFT-NEXT: pop {r4, r5, r6, r7, pc}986; SOFT-NEXT: .LBB18_8: @ %entry987; SOFT-NEXT: mov r3, r4988; SOFT-NEXT: blt .LBB18_2989; SOFT-NEXT: .LBB18_9: @ %entry990; SOFT-NEXT: mov r2, r4991; SOFT-NEXT: blt .LBB18_3992; SOFT-NEXT: .LBB18_10: @ %entry993; SOFT-NEXT: mov r1, r6994; SOFT-NEXT: bge .LBB18_4995; SOFT-NEXT: b .LBB18_5996; SOFT-NEXT: .LBB18_11: @ %entry997; SOFT-NEXT: mov r0, r4998; SOFT-NEXT: blt .LBB18_7999; SOFT-NEXT: .LBB18_12: @ %entry1000; SOFT-NEXT: mov r1, r61001; SOFT-NEXT: add sp, #41002; SOFT-NEXT: pop {r4, r5, r6, r7, pc}1003; SOFT-NEXT: .p2align 21004; SOFT-NEXT: @ %bb.13:1005; SOFT-NEXT: .LCPI18_0:1006; SOFT-NEXT: .long 2147483647 @ 0x7fffffff1007;1008; VFP2-LABEL: stest_f64i64:1009; VFP2: @ %bb.0: @ %entry1010; VFP2-NEXT: .save {r4, r5, r7, lr}1011; VFP2-NEXT: push {r4, r5, r7, lr}1012; VFP2-NEXT: bl __fixdfti1013; VFP2-NEXT: subs.w r4, r0, #-11014; VFP2-NEXT: mvn lr, #-21474836481015; VFP2-NEXT: sbcs.w r4, r1, lr1016; VFP2-NEXT: mov.w r12, #01017; VFP2-NEXT: sbcs r4, r2, #01018; VFP2-NEXT: sbcs r4, r3, #01019; VFP2-NEXT: mov.w r4, #01020; VFP2-NEXT: it lt1021; VFP2-NEXT: movlt r4, #11022; VFP2-NEXT: cmp r4, #01023; VFP2-NEXT: itet eq1024; VFP2-NEXT: moveq r3, r41025; VFP2-NEXT: movne r4, r21026; VFP2-NEXT: moveq r1, lr1027; VFP2-NEXT: mov.w r2, #-11028; VFP2-NEXT: it eq1029; VFP2-NEXT: moveq r0, r21030; VFP2-NEXT: rsbs r5, r0, #01031; VFP2-NEXT: mov.w lr, #-21474836481032; VFP2-NEXT: sbcs.w r5, lr, r11033; VFP2-NEXT: sbcs.w r4, r2, r41034; VFP2-NEXT: sbcs r2, r31035; VFP2-NEXT: itt ge1036; VFP2-NEXT: movge r0, r121037; VFP2-NEXT: movge r1, lr1038; VFP2-NEXT: pop {r4, r5, r7, pc}1039;1040; FULL-LABEL: stest_f64i64:1041; FULL: @ %bb.0: @ %entry1042; FULL-NEXT: .save {r4, r5, r7, lr}1043; FULL-NEXT: push {r4, r5, r7, lr}1044; FULL-NEXT: bl __fixdfti1045; FULL-NEXT: subs.w lr, r0, #-11046; FULL-NEXT: mvn r12, #-21474836481047; FULL-NEXT: sbcs.w lr, r1, r121048; FULL-NEXT: sbcs lr, r2, #01049; FULL-NEXT: sbcs lr, r3, #01050; FULL-NEXT: cset lr, lt1051; FULL-NEXT: cmp.w lr, #01052; FULL-NEXT: csel r5, r3, lr, ne1053; FULL-NEXT: mov.w r3, #-11054; FULL-NEXT: csel r0, r0, r3, ne1055; FULL-NEXT: csel r1, r1, r12, ne1056; FULL-NEXT: csel r2, r2, lr, ne1057; FULL-NEXT: rsbs r4, r0, #01058; FULL-NEXT: mov.w r12, #-21474836481059; FULL-NEXT: sbcs.w r4, r12, r11060; FULL-NEXT: sbcs.w r2, r3, r21061; FULL-NEXT: sbcs.w r2, r3, r51062; FULL-NEXT: it ge1063; FULL-NEXT: movge r0, #01064; FULL-NEXT: csel r1, r1, r12, lt1065; FULL-NEXT: pop {r4, r5, r7, pc}1066entry:1067 %conv = fptosi double %x to i1281068 %0 = icmp slt i128 %conv, 92233720368547758071069 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071070 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081071 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081072 %conv6 = trunc i128 %spec.store.select7 to i641073 ret i64 %conv61074}1075 1076define i64 @utest_f64i64(double %x) {1077; SOFT-LABEL: utest_f64i64:1078; SOFT: @ %bb.0: @ %entry1079; SOFT-NEXT: .save {r4, lr}1080; SOFT-NEXT: push {r4, lr}1081; SOFT-NEXT: bl __fixunsdfti1082; SOFT-NEXT: movs r4, #01083; SOFT-NEXT: subs r2, r2, #11084; SOFT-NEXT: sbcs r3, r41085; SOFT-NEXT: bhs .LBB19_31086; SOFT-NEXT: @ %bb.1: @ %entry1087; SOFT-NEXT: bhs .LBB19_41088; SOFT-NEXT: .LBB19_2: @ %entry1089; SOFT-NEXT: pop {r4, pc}1090; SOFT-NEXT: .LBB19_3: @ %entry1091; SOFT-NEXT: mov r0, r41092; SOFT-NEXT: blo .LBB19_21093; SOFT-NEXT: .LBB19_4: @ %entry1094; SOFT-NEXT: mov r1, r41095; SOFT-NEXT: pop {r4, pc}1096;1097; VFP2-LABEL: utest_f64i64:1098; VFP2: @ %bb.0: @ %entry1099; VFP2-NEXT: .save {r7, lr}1100; VFP2-NEXT: push {r7, lr}1101; VFP2-NEXT: bl __fixunsdfti1102; VFP2-NEXT: subs r2, #11103; VFP2-NEXT: mov.w r12, #01104; VFP2-NEXT: sbcs r2, r3, #01105; VFP2-NEXT: itt hs1106; VFP2-NEXT: movhs r0, r121107; VFP2-NEXT: movhs r1, r121108; VFP2-NEXT: pop {r7, pc}1109;1110; FULL-LABEL: utest_f64i64:1111; FULL: @ %bb.0: @ %entry1112; FULL-NEXT: .save {r7, lr}1113; FULL-NEXT: push {r7, lr}1114; FULL-NEXT: bl __fixunsdfti1115; FULL-NEXT: subs r2, #11116; FULL-NEXT: mov.w r12, #01117; FULL-NEXT: sbcs r2, r3, #01118; FULL-NEXT: csel r0, r0, r12, lo1119; FULL-NEXT: csel r1, r1, r12, lo1120; FULL-NEXT: pop {r7, pc}1121entry:1122 %conv = fptoui double %x to i1281123 %0 = icmp ult i128 %conv, 184467440737095516161124 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161125 %conv6 = trunc i128 %spec.store.select to i641126 ret i64 %conv61127}1128 1129define i64 @ustest_f64i64(double %x) {1130; SOFT-LABEL: ustest_f64i64:1131; SOFT: @ %bb.0: @ %entry1132; SOFT-NEXT: .save {r4, lr}1133; SOFT-NEXT: push {r4, lr}1134; SOFT-NEXT: bl __fixdfti1135; SOFT-NEXT: movs r4, #01136; SOFT-NEXT: subs r2, r2, #11137; SOFT-NEXT: mov r2, r31138; SOFT-NEXT: sbcs r2, r41139; SOFT-NEXT: bge .LBB20_51140; SOFT-NEXT: @ %bb.1: @ %entry1141; SOFT-NEXT: bge .LBB20_61142; SOFT-NEXT: .LBB20_2: @ %entry1143; SOFT-NEXT: blt .LBB20_41144; SOFT-NEXT: .LBB20_3: @ %entry1145; SOFT-NEXT: mov r3, r41146; SOFT-NEXT: .LBB20_4: @ %entry1147; SOFT-NEXT: asrs r2, r3, #311148; SOFT-NEXT: bics r0, r21149; SOFT-NEXT: bics r1, r21150; SOFT-NEXT: pop {r4, pc}1151; SOFT-NEXT: .LBB20_5: @ %entry1152; SOFT-NEXT: mov r1, r41153; SOFT-NEXT: blt .LBB20_21154; SOFT-NEXT: .LBB20_6: @ %entry1155; SOFT-NEXT: mov r0, r41156; SOFT-NEXT: bge .LBB20_31157; SOFT-NEXT: b .LBB20_41158;1159; VFP2-LABEL: ustest_f64i64:1160; VFP2: @ %bb.0: @ %entry1161; VFP2-NEXT: .save {r7, lr}1162; VFP2-NEXT: push {r7, lr}1163; VFP2-NEXT: bl __fixdfti1164; VFP2-NEXT: subs r2, #11165; VFP2-NEXT: mov.w r12, #01166; VFP2-NEXT: sbcs r2, r3, #01167; VFP2-NEXT: itt ge1168; VFP2-NEXT: movge r3, r121169; VFP2-NEXT: movge r0, r121170; VFP2-NEXT: it ge1171; VFP2-NEXT: movge r1, r121172; VFP2-NEXT: bic.w r0, r0, r3, asr #311173; VFP2-NEXT: bic.w r1, r1, r3, asr #311174; VFP2-NEXT: pop {r7, pc}1175;1176; FULL-LABEL: ustest_f64i64:1177; FULL: @ %bb.0: @ %entry1178; FULL-NEXT: .save {r7, lr}1179; FULL-NEXT: push {r7, lr}1180; FULL-NEXT: bl __fixdfti1181; FULL-NEXT: subs r2, #11182; FULL-NEXT: mov.w r12, #01183; FULL-NEXT: sbcs r2, r3, #01184; FULL-NEXT: csel r2, r3, r12, lt1185; FULL-NEXT: csel r0, r0, r12, lt1186; FULL-NEXT: csel r1, r1, r12, lt1187; FULL-NEXT: bic.w r0, r0, r2, asr #311188; FULL-NEXT: bic.w r1, r1, r2, asr #311189; FULL-NEXT: pop {r7, pc}1190entry:1191 %conv = fptosi double %x to i1281192 %0 = icmp slt i128 %conv, 184467440737095516161193 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161194 %1 = icmp sgt i128 %spec.store.select, 01195 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01196 %conv6 = trunc i128 %spec.store.select7 to i641197 ret i64 %conv61198}1199 1200define i64 @stest_f32i64(float %x) {1201; SOFT-LABEL: stest_f32i64:1202; SOFT: @ %bb.0: @ %entry1203; SOFT-NEXT: .save {r4, r5, r6, r7, lr}1204; SOFT-NEXT: push {r4, r5, r6, r7, lr}1205; SOFT-NEXT: .pad #41206; SOFT-NEXT: sub sp, #41207; SOFT-NEXT: bl __fixsfti1208; SOFT-NEXT: movs r4, #01209; SOFT-NEXT: mvns r5, r41210; SOFT-NEXT: ldr r6, .LCPI21_01211; SOFT-NEXT: adds r7, r0, #11212; SOFT-NEXT: mov r7, r11213; SOFT-NEXT: sbcs r7, r61214; SOFT-NEXT: mov r7, r21215; SOFT-NEXT: sbcs r7, r41216; SOFT-NEXT: mov r7, r31217; SOFT-NEXT: sbcs r7, r41218; SOFT-NEXT: bge .LBB21_81219; SOFT-NEXT: @ %bb.1: @ %entry1220; SOFT-NEXT: bge .LBB21_91221; SOFT-NEXT: .LBB21_2: @ %entry1222; SOFT-NEXT: bge .LBB21_101223; SOFT-NEXT: .LBB21_3: @ %entry1224; SOFT-NEXT: blt .LBB21_51225; SOFT-NEXT: .LBB21_4: @ %entry1226; SOFT-NEXT: mov r0, r51227; SOFT-NEXT: .LBB21_5: @ %entry1228; SOFT-NEXT: movs r6, #11229; SOFT-NEXT: lsls r6, r6, #311230; SOFT-NEXT: rsbs r7, r0, #01231; SOFT-NEXT: mov r7, r61232; SOFT-NEXT: sbcs r7, r11233; SOFT-NEXT: mov r7, r51234; SOFT-NEXT: sbcs r7, r21235; SOFT-NEXT: sbcs r5, r31236; SOFT-NEXT: bge .LBB21_111237; SOFT-NEXT: @ %bb.6: @ %entry1238; SOFT-NEXT: bge .LBB21_121239; SOFT-NEXT: .LBB21_7: @ %entry1240; SOFT-NEXT: add sp, #41241; SOFT-NEXT: pop {r4, r5, r6, r7, pc}1242; SOFT-NEXT: .LBB21_8: @ %entry1243; SOFT-NEXT: mov r3, r41244; SOFT-NEXT: blt .LBB21_21245; SOFT-NEXT: .LBB21_9: @ %entry1246; SOFT-NEXT: mov r2, r41247; SOFT-NEXT: blt .LBB21_31248; SOFT-NEXT: .LBB21_10: @ %entry1249; SOFT-NEXT: mov r1, r61250; SOFT-NEXT: bge .LBB21_41251; SOFT-NEXT: b .LBB21_51252; SOFT-NEXT: .LBB21_11: @ %entry1253; SOFT-NEXT: mov r0, r41254; SOFT-NEXT: blt .LBB21_71255; SOFT-NEXT: .LBB21_12: @ %entry1256; SOFT-NEXT: mov r1, r61257; SOFT-NEXT: add sp, #41258; SOFT-NEXT: pop {r4, r5, r6, r7, pc}1259; SOFT-NEXT: .p2align 21260; SOFT-NEXT: @ %bb.13:1261; SOFT-NEXT: .LCPI21_0:1262; SOFT-NEXT: .long 2147483647 @ 0x7fffffff1263;1264; VFP2-LABEL: stest_f32i64:1265; VFP2: @ %bb.0: @ %entry1266; VFP2-NEXT: .save {r4, r5, r7, lr}1267; VFP2-NEXT: push {r4, r5, r7, lr}1268; VFP2-NEXT: bl __fixsfti1269; VFP2-NEXT: subs.w r4, r0, #-11270; VFP2-NEXT: mvn lr, #-21474836481271; VFP2-NEXT: sbcs.w r4, r1, lr1272; VFP2-NEXT: mov.w r12, #01273; VFP2-NEXT: sbcs r4, r2, #01274; VFP2-NEXT: sbcs r4, r3, #01275; VFP2-NEXT: mov.w r4, #01276; VFP2-NEXT: it lt1277; VFP2-NEXT: movlt r4, #11278; VFP2-NEXT: cmp r4, #01279; VFP2-NEXT: itet eq1280; VFP2-NEXT: moveq r3, r41281; VFP2-NEXT: movne r4, r21282; VFP2-NEXT: moveq r1, lr1283; VFP2-NEXT: mov.w r2, #-11284; VFP2-NEXT: it eq1285; VFP2-NEXT: moveq r0, r21286; VFP2-NEXT: rsbs r5, r0, #01287; VFP2-NEXT: mov.w lr, #-21474836481288; VFP2-NEXT: sbcs.w r5, lr, r11289; VFP2-NEXT: sbcs.w r4, r2, r41290; VFP2-NEXT: sbcs r2, r31291; VFP2-NEXT: itt ge1292; VFP2-NEXT: movge r0, r121293; VFP2-NEXT: movge r1, lr1294; VFP2-NEXT: pop {r4, r5, r7, pc}1295;1296; FULL-LABEL: stest_f32i64:1297; FULL: @ %bb.0: @ %entry1298; FULL-NEXT: .save {r4, r5, r7, lr}1299; FULL-NEXT: push {r4, r5, r7, lr}1300; FULL-NEXT: bl __fixsfti1301; FULL-NEXT: subs.w lr, r0, #-11302; FULL-NEXT: mvn r12, #-21474836481303; FULL-NEXT: sbcs.w lr, r1, r121304; FULL-NEXT: sbcs lr, r2, #01305; FULL-NEXT: sbcs lr, r3, #01306; FULL-NEXT: cset lr, lt1307; FULL-NEXT: cmp.w lr, #01308; FULL-NEXT: csel r5, r3, lr, ne1309; FULL-NEXT: mov.w r3, #-11310; FULL-NEXT: csel r0, r0, r3, ne1311; FULL-NEXT: csel r1, r1, r12, ne1312; FULL-NEXT: csel r2, r2, lr, ne1313; FULL-NEXT: rsbs r4, r0, #01314; FULL-NEXT: mov.w r12, #-21474836481315; FULL-NEXT: sbcs.w r4, r12, r11316; FULL-NEXT: sbcs.w r2, r3, r21317; FULL-NEXT: sbcs.w r2, r3, r51318; FULL-NEXT: it ge1319; FULL-NEXT: movge r0, #01320; FULL-NEXT: csel r1, r1, r12, lt1321; FULL-NEXT: pop {r4, r5, r7, pc}1322entry:1323 %conv = fptosi float %x to i1281324 %0 = icmp slt i128 %conv, 92233720368547758071325 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071326 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081327 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081328 %conv6 = trunc i128 %spec.store.select7 to i641329 ret i64 %conv61330}1331 1332define i64 @utest_f32i64(float %x) {1333; SOFT-LABEL: utest_f32i64:1334; SOFT: @ %bb.0: @ %entry1335; SOFT-NEXT: .save {r4, lr}1336; SOFT-NEXT: push {r4, lr}1337; SOFT-NEXT: bl __fixunssfti1338; SOFT-NEXT: movs r4, #01339; SOFT-NEXT: subs r2, r2, #11340; SOFT-NEXT: sbcs r3, r41341; SOFT-NEXT: bhs .LBB22_31342; SOFT-NEXT: @ %bb.1: @ %entry1343; SOFT-NEXT: bhs .LBB22_41344; SOFT-NEXT: .LBB22_2: @ %entry1345; SOFT-NEXT: pop {r4, pc}1346; SOFT-NEXT: .LBB22_3: @ %entry1347; SOFT-NEXT: mov r0, r41348; SOFT-NEXT: blo .LBB22_21349; SOFT-NEXT: .LBB22_4: @ %entry1350; SOFT-NEXT: mov r1, r41351; SOFT-NEXT: pop {r4, pc}1352;1353; VFP2-LABEL: utest_f32i64:1354; VFP2: @ %bb.0: @ %entry1355; VFP2-NEXT: .save {r7, lr}1356; VFP2-NEXT: push {r7, lr}1357; VFP2-NEXT: bl __fixunssfti1358; VFP2-NEXT: subs r2, #11359; VFP2-NEXT: mov.w r12, #01360; VFP2-NEXT: sbcs r2, r3, #01361; VFP2-NEXT: itt hs1362; VFP2-NEXT: movhs r0, r121363; VFP2-NEXT: movhs r1, r121364; VFP2-NEXT: pop {r7, pc}1365;1366; FULL-LABEL: utest_f32i64:1367; FULL: @ %bb.0: @ %entry1368; FULL-NEXT: .save {r7, lr}1369; FULL-NEXT: push {r7, lr}1370; FULL-NEXT: bl __fixunssfti1371; FULL-NEXT: subs r2, #11372; FULL-NEXT: mov.w r12, #01373; FULL-NEXT: sbcs r2, r3, #01374; FULL-NEXT: csel r0, r0, r12, lo1375; FULL-NEXT: csel r1, r1, r12, lo1376; FULL-NEXT: pop {r7, pc}1377entry:1378 %conv = fptoui float %x to i1281379 %0 = icmp ult i128 %conv, 184467440737095516161380 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161381 %conv6 = trunc i128 %spec.store.select to i641382 ret i64 %conv61383}1384 1385define i64 @ustest_f32i64(float %x) {1386; SOFT-LABEL: ustest_f32i64:1387; SOFT: @ %bb.0: @ %entry1388; SOFT-NEXT: .save {r4, lr}1389; SOFT-NEXT: push {r4, lr}1390; SOFT-NEXT: bl __fixsfti1391; SOFT-NEXT: movs r4, #01392; SOFT-NEXT: subs r2, r2, #11393; SOFT-NEXT: mov r2, r31394; SOFT-NEXT: sbcs r2, r41395; SOFT-NEXT: bge .LBB23_51396; SOFT-NEXT: @ %bb.1: @ %entry1397; SOFT-NEXT: bge .LBB23_61398; SOFT-NEXT: .LBB23_2: @ %entry1399; SOFT-NEXT: blt .LBB23_41400; SOFT-NEXT: .LBB23_3: @ %entry1401; SOFT-NEXT: mov r3, r41402; SOFT-NEXT: .LBB23_4: @ %entry1403; SOFT-NEXT: asrs r2, r3, #311404; SOFT-NEXT: bics r0, r21405; SOFT-NEXT: bics r1, r21406; SOFT-NEXT: pop {r4, pc}1407; SOFT-NEXT: .LBB23_5: @ %entry1408; SOFT-NEXT: mov r1, r41409; SOFT-NEXT: blt .LBB23_21410; SOFT-NEXT: .LBB23_6: @ %entry1411; SOFT-NEXT: mov r0, r41412; SOFT-NEXT: bge .LBB23_31413; SOFT-NEXT: b .LBB23_41414;1415; VFP2-LABEL: ustest_f32i64:1416; VFP2: @ %bb.0: @ %entry1417; VFP2-NEXT: .save {r7, lr}1418; VFP2-NEXT: push {r7, lr}1419; VFP2-NEXT: bl __fixsfti1420; VFP2-NEXT: subs r2, #11421; VFP2-NEXT: mov.w r12, #01422; VFP2-NEXT: sbcs r2, r3, #01423; VFP2-NEXT: itt ge1424; VFP2-NEXT: movge r3, r121425; VFP2-NEXT: movge r0, r121426; VFP2-NEXT: it ge1427; VFP2-NEXT: movge r1, r121428; VFP2-NEXT: bic.w r0, r0, r3, asr #311429; VFP2-NEXT: bic.w r1, r1, r3, asr #311430; VFP2-NEXT: pop {r7, pc}1431;1432; FULL-LABEL: ustest_f32i64:1433; FULL: @ %bb.0: @ %entry1434; FULL-NEXT: .save {r7, lr}1435; FULL-NEXT: push {r7, lr}1436; FULL-NEXT: bl __fixsfti1437; FULL-NEXT: subs r2, #11438; FULL-NEXT: mov.w r12, #01439; FULL-NEXT: sbcs r2, r3, #01440; FULL-NEXT: csel r2, r3, r12, lt1441; FULL-NEXT: csel r0, r0, r12, lt1442; FULL-NEXT: csel r1, r1, r12, lt1443; FULL-NEXT: bic.w r0, r0, r2, asr #311444; FULL-NEXT: bic.w r1, r1, r2, asr #311445; FULL-NEXT: pop {r7, pc}1446entry:1447 %conv = fptosi float %x to i1281448 %0 = icmp slt i128 %conv, 184467440737095516161449 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161450 %1 = icmp sgt i128 %spec.store.select, 01451 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01452 %conv6 = trunc i128 %spec.store.select7 to i641453 ret i64 %conv61454}1455 1456define i64 @stest_f16i64(half %x) {1457; SOFT-LABEL: stest_f16i64:1458; SOFT: @ %bb.0: @ %entry1459; SOFT-NEXT: .save {r4, r5, r6, r7, lr}1460; SOFT-NEXT: push {r4, r5, r6, r7, lr}1461; SOFT-NEXT: .pad #41462; SOFT-NEXT: sub sp, #41463; SOFT-NEXT: uxth r0, r01464; SOFT-NEXT: bl __aeabi_h2f1465; SOFT-NEXT: bl __fixsfti1466; SOFT-NEXT: movs r4, #01467; SOFT-NEXT: mvns r5, r41468; SOFT-NEXT: ldr r6, .LCPI24_01469; SOFT-NEXT: adds r7, r0, #11470; SOFT-NEXT: mov r7, r11471; SOFT-NEXT: sbcs r7, r61472; SOFT-NEXT: mov r7, r21473; SOFT-NEXT: sbcs r7, r41474; SOFT-NEXT: mov r7, r31475; SOFT-NEXT: sbcs r7, r41476; SOFT-NEXT: bge .LBB24_81477; SOFT-NEXT: @ %bb.1: @ %entry1478; SOFT-NEXT: bge .LBB24_91479; SOFT-NEXT: .LBB24_2: @ %entry1480; SOFT-NEXT: bge .LBB24_101481; SOFT-NEXT: .LBB24_3: @ %entry1482; SOFT-NEXT: blt .LBB24_51483; SOFT-NEXT: .LBB24_4: @ %entry1484; SOFT-NEXT: mov r0, r51485; SOFT-NEXT: .LBB24_5: @ %entry1486; SOFT-NEXT: movs r6, #11487; SOFT-NEXT: lsls r6, r6, #311488; SOFT-NEXT: rsbs r7, r0, #01489; SOFT-NEXT: mov r7, r61490; SOFT-NEXT: sbcs r7, r11491; SOFT-NEXT: mov r7, r51492; SOFT-NEXT: sbcs r7, r21493; SOFT-NEXT: sbcs r5, r31494; SOFT-NEXT: bge .LBB24_111495; SOFT-NEXT: @ %bb.6: @ %entry1496; SOFT-NEXT: bge .LBB24_121497; SOFT-NEXT: .LBB24_7: @ %entry1498; SOFT-NEXT: add sp, #41499; SOFT-NEXT: pop {r4, r5, r6, r7, pc}1500; SOFT-NEXT: .LBB24_8: @ %entry1501; SOFT-NEXT: mov r3, r41502; SOFT-NEXT: blt .LBB24_21503; SOFT-NEXT: .LBB24_9: @ %entry1504; SOFT-NEXT: mov r2, r41505; SOFT-NEXT: blt .LBB24_31506; SOFT-NEXT: .LBB24_10: @ %entry1507; SOFT-NEXT: mov r1, r61508; SOFT-NEXT: bge .LBB24_41509; SOFT-NEXT: b .LBB24_51510; SOFT-NEXT: .LBB24_11: @ %entry1511; SOFT-NEXT: mov r0, r41512; SOFT-NEXT: blt .LBB24_71513; SOFT-NEXT: .LBB24_12: @ %entry1514; SOFT-NEXT: mov r1, r61515; SOFT-NEXT: add sp, #41516; SOFT-NEXT: pop {r4, r5, r6, r7, pc}1517; SOFT-NEXT: .p2align 21518; SOFT-NEXT: @ %bb.13:1519; SOFT-NEXT: .LCPI24_0:1520; SOFT-NEXT: .long 2147483647 @ 0x7fffffff1521;1522; VFP2-LABEL: stest_f16i64:1523; VFP2: @ %bb.0: @ %entry1524; VFP2-NEXT: .save {r4, r5, r7, lr}1525; VFP2-NEXT: push {r4, r5, r7, lr}1526; VFP2-NEXT: vmov r0, s01527; VFP2-NEXT: bl __aeabi_h2f1528; VFP2-NEXT: vmov s0, r01529; VFP2-NEXT: bl __fixsfti1530; VFP2-NEXT: subs.w r4, r0, #-11531; VFP2-NEXT: mvn lr, #-21474836481532; VFP2-NEXT: sbcs.w r4, r1, lr1533; VFP2-NEXT: mov.w r12, #01534; VFP2-NEXT: sbcs r4, r2, #01535; VFP2-NEXT: sbcs r4, r3, #01536; VFP2-NEXT: mov.w r4, #01537; VFP2-NEXT: it lt1538; VFP2-NEXT: movlt r4, #11539; VFP2-NEXT: cmp r4, #01540; VFP2-NEXT: itet eq1541; VFP2-NEXT: moveq r3, r41542; VFP2-NEXT: movne r4, r21543; VFP2-NEXT: moveq r1, lr1544; VFP2-NEXT: mov.w r2, #-11545; VFP2-NEXT: it eq1546; VFP2-NEXT: moveq r0, r21547; VFP2-NEXT: rsbs r5, r0, #01548; VFP2-NEXT: mov.w lr, #-21474836481549; VFP2-NEXT: sbcs.w r5, lr, r11550; VFP2-NEXT: sbcs.w r4, r2, r41551; VFP2-NEXT: sbcs r2, r31552; VFP2-NEXT: itt ge1553; VFP2-NEXT: movge r0, r121554; VFP2-NEXT: movge r1, lr1555; VFP2-NEXT: pop {r4, r5, r7, pc}1556;1557; FULL-LABEL: stest_f16i64:1558; FULL: @ %bb.0: @ %entry1559; FULL-NEXT: .save {r4, r5, r7, lr}1560; FULL-NEXT: push {r4, r5, r7, lr}1561; FULL-NEXT: vmov.f16 r0, s01562; FULL-NEXT: vmov s0, r01563; FULL-NEXT: bl __fixhfti1564; FULL-NEXT: subs.w lr, r0, #-11565; FULL-NEXT: mvn r12, #-21474836481566; FULL-NEXT: sbcs.w lr, r1, r121567; FULL-NEXT: sbcs lr, r2, #01568; FULL-NEXT: sbcs lr, r3, #01569; FULL-NEXT: cset lr, lt1570; FULL-NEXT: cmp.w lr, #01571; FULL-NEXT: csel r5, r3, lr, ne1572; FULL-NEXT: mov.w r3, #-11573; FULL-NEXT: csel r0, r0, r3, ne1574; FULL-NEXT: csel r1, r1, r12, ne1575; FULL-NEXT: csel r2, r2, lr, ne1576; FULL-NEXT: rsbs r4, r0, #01577; FULL-NEXT: mov.w r12, #-21474836481578; FULL-NEXT: sbcs.w r4, r12, r11579; FULL-NEXT: sbcs.w r2, r3, r21580; FULL-NEXT: sbcs.w r2, r3, r51581; FULL-NEXT: it ge1582; FULL-NEXT: movge r0, #01583; FULL-NEXT: csel r1, r1, r12, lt1584; FULL-NEXT: pop {r4, r5, r7, pc}1585entry:1586 %conv = fptosi half %x to i1281587 %0 = icmp slt i128 %conv, 92233720368547758071588 %spec.store.select = select i1 %0, i128 %conv, i128 92233720368547758071589 %1 = icmp sgt i128 %spec.store.select, -92233720368547758081590 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -92233720368547758081591 %conv6 = trunc i128 %spec.store.select7 to i641592 ret i64 %conv61593}1594 1595define i64 @utesth_f16i64(half %x) {1596; SOFT-LABEL: utesth_f16i64:1597; SOFT: @ %bb.0: @ %entry1598; SOFT-NEXT: .save {r4, lr}1599; SOFT-NEXT: push {r4, lr}1600; SOFT-NEXT: uxth r0, r01601; SOFT-NEXT: bl __aeabi_h2f1602; SOFT-NEXT: bl __fixunssfti1603; SOFT-NEXT: movs r4, #01604; SOFT-NEXT: subs r2, r2, #11605; SOFT-NEXT: sbcs r3, r41606; SOFT-NEXT: bhs .LBB25_31607; SOFT-NEXT: @ %bb.1: @ %entry1608; SOFT-NEXT: bhs .LBB25_41609; SOFT-NEXT: .LBB25_2: @ %entry1610; SOFT-NEXT: pop {r4, pc}1611; SOFT-NEXT: .LBB25_3: @ %entry1612; SOFT-NEXT: mov r0, r41613; SOFT-NEXT: blo .LBB25_21614; SOFT-NEXT: .LBB25_4: @ %entry1615; SOFT-NEXT: mov r1, r41616; SOFT-NEXT: pop {r4, pc}1617;1618; VFP2-LABEL: utesth_f16i64:1619; VFP2: @ %bb.0: @ %entry1620; VFP2-NEXT: .save {r7, lr}1621; VFP2-NEXT: push {r7, lr}1622; VFP2-NEXT: vmov r0, s01623; VFP2-NEXT: bl __aeabi_h2f1624; VFP2-NEXT: vmov s0, r01625; VFP2-NEXT: bl __fixunssfti1626; VFP2-NEXT: subs r2, #11627; VFP2-NEXT: mov.w r12, #01628; VFP2-NEXT: sbcs r2, r3, #01629; VFP2-NEXT: itt hs1630; VFP2-NEXT: movhs r0, r121631; VFP2-NEXT: movhs r1, r121632; VFP2-NEXT: pop {r7, pc}1633;1634; FULL-LABEL: utesth_f16i64:1635; FULL: @ %bb.0: @ %entry1636; FULL-NEXT: .save {r7, lr}1637; FULL-NEXT: push {r7, lr}1638; FULL-NEXT: vmov.f16 r0, s01639; FULL-NEXT: vmov s0, r01640; FULL-NEXT: bl __fixunshfti1641; FULL-NEXT: subs r2, #11642; FULL-NEXT: mov.w r12, #01643; FULL-NEXT: sbcs r2, r3, #01644; FULL-NEXT: csel r0, r0, r12, lo1645; FULL-NEXT: csel r1, r1, r12, lo1646; FULL-NEXT: pop {r7, pc}1647entry:1648 %conv = fptoui half %x to i1281649 %0 = icmp ult i128 %conv, 184467440737095516161650 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161651 %conv6 = trunc i128 %spec.store.select to i641652 ret i64 %conv61653}1654 1655define i64 @ustest_f16i64(half %x) {1656; SOFT-LABEL: ustest_f16i64:1657; SOFT: @ %bb.0: @ %entry1658; SOFT-NEXT: .save {r4, lr}1659; SOFT-NEXT: push {r4, lr}1660; SOFT-NEXT: uxth r0, r01661; SOFT-NEXT: bl __aeabi_h2f1662; SOFT-NEXT: bl __fixsfti1663; SOFT-NEXT: movs r4, #01664; SOFT-NEXT: subs r2, r2, #11665; SOFT-NEXT: mov r2, r31666; SOFT-NEXT: sbcs r2, r41667; SOFT-NEXT: bge .LBB26_51668; SOFT-NEXT: @ %bb.1: @ %entry1669; SOFT-NEXT: bge .LBB26_61670; SOFT-NEXT: .LBB26_2: @ %entry1671; SOFT-NEXT: blt .LBB26_41672; SOFT-NEXT: .LBB26_3: @ %entry1673; SOFT-NEXT: mov r3, r41674; SOFT-NEXT: .LBB26_4: @ %entry1675; SOFT-NEXT: asrs r2, r3, #311676; SOFT-NEXT: bics r0, r21677; SOFT-NEXT: bics r1, r21678; SOFT-NEXT: pop {r4, pc}1679; SOFT-NEXT: .LBB26_5: @ %entry1680; SOFT-NEXT: mov r1, r41681; SOFT-NEXT: blt .LBB26_21682; SOFT-NEXT: .LBB26_6: @ %entry1683; SOFT-NEXT: mov r0, r41684; SOFT-NEXT: bge .LBB26_31685; SOFT-NEXT: b .LBB26_41686;1687; VFP2-LABEL: ustest_f16i64:1688; VFP2: @ %bb.0: @ %entry1689; VFP2-NEXT: .save {r7, lr}1690; VFP2-NEXT: push {r7, lr}1691; VFP2-NEXT: vmov r0, s01692; VFP2-NEXT: bl __aeabi_h2f1693; VFP2-NEXT: vmov s0, r01694; VFP2-NEXT: bl __fixsfti1695; VFP2-NEXT: subs r2, #11696; VFP2-NEXT: mov.w r12, #01697; VFP2-NEXT: sbcs r2, r3, #01698; VFP2-NEXT: itt ge1699; VFP2-NEXT: movge r3, r121700; VFP2-NEXT: movge r0, r121701; VFP2-NEXT: it ge1702; VFP2-NEXT: movge r1, r121703; VFP2-NEXT: bic.w r0, r0, r3, asr #311704; VFP2-NEXT: bic.w r1, r1, r3, asr #311705; VFP2-NEXT: pop {r7, pc}1706;1707; FULL-LABEL: ustest_f16i64:1708; FULL: @ %bb.0: @ %entry1709; FULL-NEXT: .save {r7, lr}1710; FULL-NEXT: push {r7, lr}1711; FULL-NEXT: vmov.f16 r0, s01712; FULL-NEXT: vmov s0, r01713; FULL-NEXT: bl __fixhfti1714; FULL-NEXT: subs r2, #11715; FULL-NEXT: mov.w r12, #01716; FULL-NEXT: sbcs r2, r3, #01717; FULL-NEXT: csel r2, r3, r12, lt1718; FULL-NEXT: csel r0, r0, r12, lt1719; FULL-NEXT: csel r1, r1, r12, lt1720; FULL-NEXT: bic.w r0, r0, r2, asr #311721; FULL-NEXT: bic.w r1, r1, r2, asr #311722; FULL-NEXT: pop {r7, pc}1723entry:1724 %conv = fptosi half %x to i1281725 %0 = icmp slt i128 %conv, 184467440737095516161726 %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161727 %1 = icmp sgt i128 %spec.store.select, 01728 %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01729 %conv6 = trunc i128 %spec.store.select7 to i641730 ret i64 %conv61731}1732 1733 1734 1735 1736; i32 saturate1737 1738define i32 @stest_f64i32_mm(double %x) {1739; SOFT-LABEL: stest_f64i32_mm:1740; SOFT: @ %bb.0: @ %entry1741; SOFT-NEXT: .save {r4, r5, r7, lr}1742; SOFT-NEXT: push {r4, r5, r7, lr}1743; SOFT-NEXT: bl __aeabi_d2lz1744; SOFT-NEXT: movs r2, #11745; SOFT-NEXT: movs r3, #01746; SOFT-NEXT: ldr r4, .LCPI27_01747; SOFT-NEXT: subs r5, r0, r41748; SOFT-NEXT: mov r5, r11749; SOFT-NEXT: sbcs r5, r31750; SOFT-NEXT: bge .LBB27_71751; SOFT-NEXT: @ %bb.1: @ %entry1752; SOFT-NEXT: mov r4, r21753; SOFT-NEXT: bge .LBB27_81754; SOFT-NEXT: .LBB27_2: @ %entry1755; SOFT-NEXT: cmp r4, #01756; SOFT-NEXT: bne .LBB27_41757; SOFT-NEXT: .LBB27_3: @ %entry1758; SOFT-NEXT: mov r1, r41759; SOFT-NEXT: .LBB27_4: @ %entry1760; SOFT-NEXT: mvns r3, r31761; SOFT-NEXT: lsls r2, r2, #311762; SOFT-NEXT: subs r4, r2, r01763; SOFT-NEXT: sbcs r3, r11764; SOFT-NEXT: blt .LBB27_61765; SOFT-NEXT: @ %bb.5: @ %entry1766; SOFT-NEXT: mov r0, r21767; SOFT-NEXT: .LBB27_6: @ %entry1768; SOFT-NEXT: pop {r4, r5, r7, pc}1769; SOFT-NEXT: .LBB27_7: @ %entry1770; SOFT-NEXT: mov r0, r41771; SOFT-NEXT: mov r4, r21772; SOFT-NEXT: blt .LBB27_21773; SOFT-NEXT: .LBB27_8: @ %entry1774; SOFT-NEXT: mov r4, r31775; SOFT-NEXT: cmp r4, #01776; SOFT-NEXT: beq .LBB27_31777; SOFT-NEXT: b .LBB27_41778; SOFT-NEXT: .p2align 21779; SOFT-NEXT: @ %bb.9:1780; SOFT-NEXT: .LCPI27_0:1781; SOFT-NEXT: .long 2147483647 @ 0x7fffffff1782;1783; VFP2-LABEL: stest_f64i32_mm:1784; VFP2: @ %bb.0: @ %entry1785; VFP2-NEXT: .save {r7, lr}1786; VFP2-NEXT: push {r7, lr}1787; VFP2-NEXT: vmov r0, r1, d01788; VFP2-NEXT: bl __aeabi_d2lz1789; VFP2-NEXT: mvn r2, #-21474836481790; VFP2-NEXT: subs r3, r0, r21791; VFP2-NEXT: sbcs r3, r1, #01792; VFP2-NEXT: it ge1793; VFP2-NEXT: movge r0, r21794; VFP2-NEXT: mov.w r2, #01795; VFP2-NEXT: it lt1796; VFP2-NEXT: movlt r2, #11797; VFP2-NEXT: cmp r2, #01798; VFP2-NEXT: it ne1799; VFP2-NEXT: movne r2, r11800; VFP2-NEXT: mov.w r1, #-11801; VFP2-NEXT: rsbs.w r3, r0, #-21474836481802; VFP2-NEXT: sbcs r1, r21803; VFP2-NEXT: it ge1804; VFP2-NEXT: movge.w r0, #-21474836481805; VFP2-NEXT: pop {r7, pc}1806;1807; FULL-LABEL: stest_f64i32_mm:1808; FULL: @ %bb.0: @ %entry1809; FULL-NEXT: vcvt.s32.f64 s0, d01810; FULL-NEXT: vmov r0, s01811; FULL-NEXT: bx lr1812entry:1813 %conv = fptosi double %x to i641814 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)1815 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)1816 %conv6 = trunc i64 %spec.store.select7 to i321817 ret i32 %conv61818}1819 1820define i32 @utest_f64i32_mm(double %x) {1821; SOFT-LABEL: utest_f64i32_mm:1822; SOFT: @ %bb.0: @ %entry1823; SOFT-NEXT: .save {r7, lr}1824; SOFT-NEXT: push {r7, lr}1825; SOFT-NEXT: bl __aeabi_d2ulz1826; SOFT-NEXT: cmp r1, #01827; SOFT-NEXT: beq .LBB28_21828; SOFT-NEXT: @ %bb.1: @ %entry1829; SOFT-NEXT: movs r0, #01830; SOFT-NEXT: mvns r0, r01831; SOFT-NEXT: .LBB28_2: @ %entry1832; SOFT-NEXT: pop {r7, pc}1833;1834; VFP2-LABEL: utest_f64i32_mm:1835; VFP2: @ %bb.0: @ %entry1836; VFP2-NEXT: .save {r7, lr}1837; VFP2-NEXT: push {r7, lr}1838; VFP2-NEXT: vmov r0, r1, d01839; VFP2-NEXT: bl __aeabi_d2ulz1840; VFP2-NEXT: cmp r1, #01841; VFP2-NEXT: it ne1842; VFP2-NEXT: movne.w r0, #-11843; VFP2-NEXT: pop {r7, pc}1844;1845; FULL-LABEL: utest_f64i32_mm:1846; FULL: @ %bb.0: @ %entry1847; FULL-NEXT: vcvt.u32.f64 s0, d01848; FULL-NEXT: vmov r0, s01849; FULL-NEXT: bx lr1850entry:1851 %conv = fptoui double %x to i641852 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)1853 %conv6 = trunc i64 %spec.store.select to i321854 ret i32 %conv61855}1856 1857define i32 @ustest_f64i32_mm(double %x) {1858; SOFT-LABEL: ustest_f64i32_mm:1859; SOFT: @ %bb.0: @ %entry1860; SOFT-NEXT: .save {r7, lr}1861; SOFT-NEXT: push {r7, lr}1862; SOFT-NEXT: bl __aeabi_d2lz1863; SOFT-NEXT: mov r2, r01864; SOFT-NEXT: movs r0, #01865; SOFT-NEXT: cmp r1, #11866; SOFT-NEXT: blt .LBB29_21867; SOFT-NEXT: @ %bb.1: @ %entry1868; SOFT-NEXT: mvns r2, r01869; SOFT-NEXT: .LBB29_2: @ %entry1870; SOFT-NEXT: asrs r3, r1, #311871; SOFT-NEXT: ands r3, r11872; SOFT-NEXT: bmi .LBB29_41873; SOFT-NEXT: @ %bb.3: @ %entry1874; SOFT-NEXT: mov r0, r21875; SOFT-NEXT: .LBB29_4: @ %entry1876; SOFT-NEXT: pop {r7, pc}1877;1878; VFP2-LABEL: ustest_f64i32_mm:1879; VFP2: @ %bb.0: @ %entry1880; VFP2-NEXT: .save {r7, lr}1881; VFP2-NEXT: push {r7, lr}1882; VFP2-NEXT: vmov r0, r1, d01883; VFP2-NEXT: bl __aeabi_d2lz1884; VFP2-NEXT: cmp r1, #11885; VFP2-NEXT: it ge1886; VFP2-NEXT: movge.w r0, #-11887; VFP2-NEXT: ands.w r1, r1, r1, asr #311888; VFP2-NEXT: it mi1889; VFP2-NEXT: movmi r0, #01890; VFP2-NEXT: pop {r7, pc}1891;1892; FULL-LABEL: ustest_f64i32_mm:1893; FULL: @ %bb.0: @ %entry1894; FULL-NEXT: vcvt.u32.f64 s0, d01895; FULL-NEXT: vmov r0, s01896; FULL-NEXT: bx lr1897entry:1898 %conv = fptosi double %x to i641899 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)1900 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)1901 %conv6 = trunc i64 %spec.store.select7 to i321902 ret i32 %conv61903}1904 1905define i32 @stest_f32i32_mm(float %x) {1906; SOFT-LABEL: stest_f32i32_mm:1907; SOFT: @ %bb.0: @ %entry1908; SOFT-NEXT: .save {r4, r5, r7, lr}1909; SOFT-NEXT: push {r4, r5, r7, lr}1910; SOFT-NEXT: bl __aeabi_f2lz1911; SOFT-NEXT: movs r2, #11912; SOFT-NEXT: movs r3, #01913; SOFT-NEXT: ldr r4, .LCPI30_01914; SOFT-NEXT: subs r5, r0, r41915; SOFT-NEXT: mov r5, r11916; SOFT-NEXT: sbcs r5, r31917; SOFT-NEXT: bge .LBB30_71918; SOFT-NEXT: @ %bb.1: @ %entry1919; SOFT-NEXT: mov r4, r21920; SOFT-NEXT: bge .LBB30_81921; SOFT-NEXT: .LBB30_2: @ %entry1922; SOFT-NEXT: cmp r4, #01923; SOFT-NEXT: bne .LBB30_41924; SOFT-NEXT: .LBB30_3: @ %entry1925; SOFT-NEXT: mov r1, r41926; SOFT-NEXT: .LBB30_4: @ %entry1927; SOFT-NEXT: mvns r3, r31928; SOFT-NEXT: lsls r2, r2, #311929; SOFT-NEXT: subs r4, r2, r01930; SOFT-NEXT: sbcs r3, r11931; SOFT-NEXT: blt .LBB30_61932; SOFT-NEXT: @ %bb.5: @ %entry1933; SOFT-NEXT: mov r0, r21934; SOFT-NEXT: .LBB30_6: @ %entry1935; SOFT-NEXT: pop {r4, r5, r7, pc}1936; SOFT-NEXT: .LBB30_7: @ %entry1937; SOFT-NEXT: mov r0, r41938; SOFT-NEXT: mov r4, r21939; SOFT-NEXT: blt .LBB30_21940; SOFT-NEXT: .LBB30_8: @ %entry1941; SOFT-NEXT: mov r4, r31942; SOFT-NEXT: cmp r4, #01943; SOFT-NEXT: beq .LBB30_31944; SOFT-NEXT: b .LBB30_41945; SOFT-NEXT: .p2align 21946; SOFT-NEXT: @ %bb.9:1947; SOFT-NEXT: .LCPI30_0:1948; SOFT-NEXT: .long 2147483647 @ 0x7fffffff1949;1950; VFP-LABEL: stest_f32i32_mm:1951; VFP: @ %bb.0: @ %entry1952; VFP-NEXT: vcvt.s32.f32 s0, s01953; VFP-NEXT: vmov r0, s01954; VFP-NEXT: bx lr1955entry:1956 %conv = fptosi float %x to i641957 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)1958 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)1959 %conv6 = trunc i64 %spec.store.select7 to i321960 ret i32 %conv61961}1962 1963define i32 @utest_f32i32_mm(float %x) {1964; SOFT-LABEL: utest_f32i32_mm:1965; SOFT: @ %bb.0: @ %entry1966; SOFT-NEXT: .save {r7, lr}1967; SOFT-NEXT: push {r7, lr}1968; SOFT-NEXT: bl __aeabi_f2ulz1969; SOFT-NEXT: cmp r1, #01970; SOFT-NEXT: beq .LBB31_21971; SOFT-NEXT: @ %bb.1: @ %entry1972; SOFT-NEXT: movs r0, #01973; SOFT-NEXT: mvns r0, r01974; SOFT-NEXT: .LBB31_2: @ %entry1975; SOFT-NEXT: pop {r7, pc}1976;1977; VFP-LABEL: utest_f32i32_mm:1978; VFP: @ %bb.0: @ %entry1979; VFP-NEXT: vcvt.u32.f32 s0, s01980; VFP-NEXT: vmov r0, s01981; VFP-NEXT: bx lr1982entry:1983 %conv = fptoui float %x to i641984 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)1985 %conv6 = trunc i64 %spec.store.select to i321986 ret i32 %conv61987}1988 1989define i32 @ustest_f32i32_mm(float %x) {1990; SOFT-LABEL: ustest_f32i32_mm:1991; SOFT: @ %bb.0: @ %entry1992; SOFT-NEXT: .save {r7, lr}1993; SOFT-NEXT: push {r7, lr}1994; SOFT-NEXT: bl __aeabi_f2lz1995; SOFT-NEXT: mov r2, r01996; SOFT-NEXT: movs r0, #01997; SOFT-NEXT: cmp r1, #11998; SOFT-NEXT: blt .LBB32_21999; SOFT-NEXT: @ %bb.1: @ %entry2000; SOFT-NEXT: mvns r2, r02001; SOFT-NEXT: .LBB32_2: @ %entry2002; SOFT-NEXT: asrs r3, r1, #312003; SOFT-NEXT: ands r3, r12004; SOFT-NEXT: bmi .LBB32_42005; SOFT-NEXT: @ %bb.3: @ %entry2006; SOFT-NEXT: mov r0, r22007; SOFT-NEXT: .LBB32_4: @ %entry2008; SOFT-NEXT: pop {r7, pc}2009;2010; VFP-LABEL: ustest_f32i32_mm:2011; VFP: @ %bb.0: @ %entry2012; VFP-NEXT: vcvt.u32.f32 s0, s02013; VFP-NEXT: vmov r0, s02014; VFP-NEXT: bx lr2015entry:2016 %conv = fptosi float %x to i642017 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)2018 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)2019 %conv6 = trunc i64 %spec.store.select7 to i322020 ret i32 %conv62021}2022 2023define i32 @stest_f16i32_mm(half %x) {2024; SOFT-LABEL: stest_f16i32_mm:2025; SOFT: @ %bb.0: @ %entry2026; SOFT-NEXT: .save {r4, r5, r7, lr}2027; SOFT-NEXT: push {r4, r5, r7, lr}2028; SOFT-NEXT: uxth r0, r02029; SOFT-NEXT: bl __aeabi_h2f2030; SOFT-NEXT: bl __aeabi_f2lz2031; SOFT-NEXT: movs r2, #12032; SOFT-NEXT: movs r3, #02033; SOFT-NEXT: ldr r4, .LCPI33_02034; SOFT-NEXT: subs r5, r0, r42035; SOFT-NEXT: mov r5, r12036; SOFT-NEXT: sbcs r5, r32037; SOFT-NEXT: bge .LBB33_72038; SOFT-NEXT: @ %bb.1: @ %entry2039; SOFT-NEXT: mov r4, r22040; SOFT-NEXT: bge .LBB33_82041; SOFT-NEXT: .LBB33_2: @ %entry2042; SOFT-NEXT: cmp r4, #02043; SOFT-NEXT: bne .LBB33_42044; SOFT-NEXT: .LBB33_3: @ %entry2045; SOFT-NEXT: mov r1, r42046; SOFT-NEXT: .LBB33_4: @ %entry2047; SOFT-NEXT: mvns r3, r32048; SOFT-NEXT: lsls r2, r2, #312049; SOFT-NEXT: subs r4, r2, r02050; SOFT-NEXT: sbcs r3, r12051; SOFT-NEXT: blt .LBB33_62052; SOFT-NEXT: @ %bb.5: @ %entry2053; SOFT-NEXT: mov r0, r22054; SOFT-NEXT: .LBB33_6: @ %entry2055; SOFT-NEXT: pop {r4, r5, r7, pc}2056; SOFT-NEXT: .LBB33_7: @ %entry2057; SOFT-NEXT: mov r0, r42058; SOFT-NEXT: mov r4, r22059; SOFT-NEXT: blt .LBB33_22060; SOFT-NEXT: .LBB33_8: @ %entry2061; SOFT-NEXT: mov r4, r32062; SOFT-NEXT: cmp r4, #02063; SOFT-NEXT: beq .LBB33_32064; SOFT-NEXT: b .LBB33_42065; SOFT-NEXT: .p2align 22066; SOFT-NEXT: @ %bb.9:2067; SOFT-NEXT: .LCPI33_0:2068; SOFT-NEXT: .long 2147483647 @ 0x7fffffff2069;2070; VFP2-LABEL: stest_f16i32_mm:2071; VFP2: @ %bb.0: @ %entry2072; VFP2-NEXT: .save {r7, lr}2073; VFP2-NEXT: push {r7, lr}2074; VFP2-NEXT: vmov r0, s02075; VFP2-NEXT: bl __aeabi_h2f2076; VFP2-NEXT: vmov s0, r02077; VFP2-NEXT: vcvt.s32.f32 s0, s02078; VFP2-NEXT: vmov r0, s02079; VFP2-NEXT: pop {r7, pc}2080;2081; FULL-LABEL: stest_f16i32_mm:2082; FULL: @ %bb.0: @ %entry2083; FULL-NEXT: vcvt.s32.f16 s0, s02084; FULL-NEXT: vmov r0, s02085; FULL-NEXT: bx lr2086entry:2087 %conv = fptosi half %x to i642088 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)2089 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)2090 %conv6 = trunc i64 %spec.store.select7 to i322091 ret i32 %conv62092}2093 2094define i32 @utesth_f16i32_mm(half %x) {2095; SOFT-LABEL: utesth_f16i32_mm:2096; SOFT: @ %bb.0: @ %entry2097; SOFT-NEXT: .save {r7, lr}2098; SOFT-NEXT: push {r7, lr}2099; SOFT-NEXT: uxth r0, r02100; SOFT-NEXT: bl __aeabi_h2f2101; SOFT-NEXT: bl __aeabi_f2ulz2102; SOFT-NEXT: cmp r1, #02103; SOFT-NEXT: beq .LBB34_22104; SOFT-NEXT: @ %bb.1: @ %entry2105; SOFT-NEXT: movs r0, #02106; SOFT-NEXT: mvns r0, r02107; SOFT-NEXT: .LBB34_2: @ %entry2108; SOFT-NEXT: pop {r7, pc}2109;2110; VFP2-LABEL: utesth_f16i32_mm:2111; VFP2: @ %bb.0: @ %entry2112; VFP2-NEXT: .save {r7, lr}2113; VFP2-NEXT: push {r7, lr}2114; VFP2-NEXT: vmov r0, s02115; VFP2-NEXT: bl __aeabi_h2f2116; VFP2-NEXT: vmov s0, r02117; VFP2-NEXT: vcvt.u32.f32 s0, s02118; VFP2-NEXT: vmov r0, s02119; VFP2-NEXT: pop {r7, pc}2120;2121; FULL-LABEL: utesth_f16i32_mm:2122; FULL: @ %bb.0: @ %entry2123; FULL-NEXT: vcvt.u32.f16 s0, s02124; FULL-NEXT: vmov r0, s02125; FULL-NEXT: bx lr2126entry:2127 %conv = fptoui half %x to i642128 %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)2129 %conv6 = trunc i64 %spec.store.select to i322130 ret i32 %conv62131}2132 2133define i32 @ustest_f16i32_mm(half %x) {2134; SOFT-LABEL: ustest_f16i32_mm:2135; SOFT: @ %bb.0: @ %entry2136; SOFT-NEXT: .save {r7, lr}2137; SOFT-NEXT: push {r7, lr}2138; SOFT-NEXT: uxth r0, r02139; SOFT-NEXT: bl __aeabi_h2f2140; SOFT-NEXT: bl __aeabi_f2lz2141; SOFT-NEXT: mov r2, r02142; SOFT-NEXT: movs r0, #02143; SOFT-NEXT: cmp r1, #12144; SOFT-NEXT: blt .LBB35_22145; SOFT-NEXT: @ %bb.1: @ %entry2146; SOFT-NEXT: mvns r2, r02147; SOFT-NEXT: .LBB35_2: @ %entry2148; SOFT-NEXT: asrs r3, r1, #312149; SOFT-NEXT: ands r3, r12150; SOFT-NEXT: bmi .LBB35_42151; SOFT-NEXT: @ %bb.3: @ %entry2152; SOFT-NEXT: mov r0, r22153; SOFT-NEXT: .LBB35_4: @ %entry2154; SOFT-NEXT: pop {r7, pc}2155;2156; VFP2-LABEL: ustest_f16i32_mm:2157; VFP2: @ %bb.0: @ %entry2158; VFP2-NEXT: .save {r7, lr}2159; VFP2-NEXT: push {r7, lr}2160; VFP2-NEXT: vmov r0, s02161; VFP2-NEXT: bl __aeabi_h2f2162; VFP2-NEXT: vmov s0, r02163; VFP2-NEXT: vcvt.u32.f32 s0, s02164; VFP2-NEXT: vmov r0, s02165; VFP2-NEXT: pop {r7, pc}2166;2167; FULL-LABEL: ustest_f16i32_mm:2168; FULL: @ %bb.0: @ %entry2169; FULL-NEXT: vcvt.u32.f16 s0, s02170; FULL-NEXT: vmov r0, s02171; FULL-NEXT: bx lr2172entry:2173 %conv = fptosi half %x to i642174 %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)2175 %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)2176 %conv6 = trunc i64 %spec.store.select7 to i322177 ret i32 %conv62178}2179 2180; i16 saturate2181 2182define i16 @stest_f64i16_mm(double %x) {2183; SOFT-LABEL: stest_f64i16_mm:2184; SOFT: @ %bb.0: @ %entry2185; SOFT-NEXT: .save {r7, lr}2186; SOFT-NEXT: push {r7, lr}2187; SOFT-NEXT: bl __aeabi_d2iz2188; SOFT-NEXT: ldr r1, .LCPI36_02189; SOFT-NEXT: cmp r0, r12190; SOFT-NEXT: blt .LBB36_22191; SOFT-NEXT: @ %bb.1: @ %entry2192; SOFT-NEXT: mov r0, r12193; SOFT-NEXT: .LBB36_2: @ %entry2194; SOFT-NEXT: ldr r1, .LCPI36_12195; SOFT-NEXT: cmp r0, r12196; SOFT-NEXT: bgt .LBB36_42197; SOFT-NEXT: @ %bb.3: @ %entry2198; SOFT-NEXT: mov r0, r12199; SOFT-NEXT: .LBB36_4: @ %entry2200; SOFT-NEXT: pop {r7, pc}2201; SOFT-NEXT: .p2align 22202; SOFT-NEXT: @ %bb.5:2203; SOFT-NEXT: .LCPI36_0:2204; SOFT-NEXT: .long 32767 @ 0x7fff2205; SOFT-NEXT: .LCPI36_1:2206; SOFT-NEXT: .long 4294934528 @ 0xffff80002207;2208; VFP2-LABEL: stest_f64i16_mm:2209; VFP2: @ %bb.0: @ %entry2210; VFP2-NEXT: .save {r7, lr}2211; VFP2-NEXT: push {r7, lr}2212; VFP2-NEXT: vmov r0, r1, d02213; VFP2-NEXT: bl __aeabi_d2iz2214; VFP2-NEXT: ssat r0, #16, r02215; VFP2-NEXT: pop {r7, pc}2216;2217; FULL-LABEL: stest_f64i16_mm:2218; FULL: @ %bb.0: @ %entry2219; FULL-NEXT: vcvt.s32.f64 s0, d02220; FULL-NEXT: vmov r0, s02221; FULL-NEXT: ssat r0, #16, r02222; FULL-NEXT: bx lr2223entry:2224 %conv = fptosi double %x to i322225 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2226 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2227 %conv6 = trunc i32 %spec.store.select7 to i162228 ret i16 %conv62229}2230 2231define i16 @utest_f64i16_mm(double %x) {2232; SOFT-LABEL: utest_f64i16_mm:2233; SOFT: @ %bb.0: @ %entry2234; SOFT-NEXT: .save {r7, lr}2235; SOFT-NEXT: push {r7, lr}2236; SOFT-NEXT: bl __aeabi_d2uiz2237; SOFT-NEXT: ldr r1, .LCPI37_02238; SOFT-NEXT: cmp r0, r12239; SOFT-NEXT: blo .LBB37_22240; SOFT-NEXT: @ %bb.1: @ %entry2241; SOFT-NEXT: mov r0, r12242; SOFT-NEXT: .LBB37_2: @ %entry2243; SOFT-NEXT: pop {r7, pc}2244; SOFT-NEXT: .p2align 22245; SOFT-NEXT: @ %bb.3:2246; SOFT-NEXT: .LCPI37_0:2247; SOFT-NEXT: .long 65535 @ 0xffff2248;2249; VFP2-LABEL: utest_f64i16_mm:2250; VFP2: @ %bb.0: @ %entry2251; VFP2-NEXT: .save {r7, lr}2252; VFP2-NEXT: push {r7, lr}2253; VFP2-NEXT: vmov r0, r1, d02254; VFP2-NEXT: bl __aeabi_d2uiz2255; VFP2-NEXT: movw r1, #655352256; VFP2-NEXT: cmp r0, r12257; VFP2-NEXT: it hs2258; VFP2-NEXT: movhs r0, r12259; VFP2-NEXT: pop {r7, pc}2260;2261; FULL-LABEL: utest_f64i16_mm:2262; FULL: @ %bb.0: @ %entry2263; FULL-NEXT: vcvt.u32.f64 s0, d02264; FULL-NEXT: movw r1, #655352265; FULL-NEXT: vmov r0, s02266; FULL-NEXT: cmp r0, r12267; FULL-NEXT: csel r0, r0, r1, lo2268; FULL-NEXT: bx lr2269entry:2270 %conv = fptoui double %x to i322271 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2272 %conv6 = trunc i32 %spec.store.select to i162273 ret i16 %conv62274}2275 2276define i16 @ustest_f64i16_mm(double %x) {2277; SOFT-LABEL: ustest_f64i16_mm:2278; SOFT: @ %bb.0: @ %entry2279; SOFT-NEXT: .save {r7, lr}2280; SOFT-NEXT: push {r7, lr}2281; SOFT-NEXT: bl __aeabi_d2iz2282; SOFT-NEXT: ldr r1, .LCPI38_02283; SOFT-NEXT: cmp r0, r12284; SOFT-NEXT: blt .LBB38_22285; SOFT-NEXT: @ %bb.1: @ %entry2286; SOFT-NEXT: mov r0, r12287; SOFT-NEXT: .LBB38_2: @ %entry2288; SOFT-NEXT: asrs r1, r0, #312289; SOFT-NEXT: bics r0, r12290; SOFT-NEXT: pop {r7, pc}2291; SOFT-NEXT: .p2align 22292; SOFT-NEXT: @ %bb.3:2293; SOFT-NEXT: .LCPI38_0:2294; SOFT-NEXT: .long 65535 @ 0xffff2295;2296; VFP2-LABEL: ustest_f64i16_mm:2297; VFP2: @ %bb.0: @ %entry2298; VFP2-NEXT: .save {r7, lr}2299; VFP2-NEXT: push {r7, lr}2300; VFP2-NEXT: vmov r0, r1, d02301; VFP2-NEXT: bl __aeabi_d2iz2302; VFP2-NEXT: usat r0, #16, r02303; VFP2-NEXT: pop {r7, pc}2304;2305; FULL-LABEL: ustest_f64i16_mm:2306; FULL: @ %bb.0: @ %entry2307; FULL-NEXT: vcvt.s32.f64 s0, d02308; FULL-NEXT: vmov r0, s02309; FULL-NEXT: usat r0, #16, r02310; FULL-NEXT: bx lr2311entry:2312 %conv = fptosi double %x to i322313 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)2314 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)2315 %conv6 = trunc i32 %spec.store.select7 to i162316 ret i16 %conv62317}2318 2319define i16 @stest_f32i16_mm(float %x) {2320; SOFT-LABEL: stest_f32i16_mm:2321; SOFT: @ %bb.0: @ %entry2322; SOFT-NEXT: .save {r7, lr}2323; SOFT-NEXT: push {r7, lr}2324; SOFT-NEXT: bl __aeabi_f2iz2325; SOFT-NEXT: ldr r1, .LCPI39_02326; SOFT-NEXT: cmp r0, r12327; SOFT-NEXT: blt .LBB39_22328; SOFT-NEXT: @ %bb.1: @ %entry2329; SOFT-NEXT: mov r0, r12330; SOFT-NEXT: .LBB39_2: @ %entry2331; SOFT-NEXT: ldr r1, .LCPI39_12332; SOFT-NEXT: cmp r0, r12333; SOFT-NEXT: bgt .LBB39_42334; SOFT-NEXT: @ %bb.3: @ %entry2335; SOFT-NEXT: mov r0, r12336; SOFT-NEXT: .LBB39_4: @ %entry2337; SOFT-NEXT: pop {r7, pc}2338; SOFT-NEXT: .p2align 22339; SOFT-NEXT: @ %bb.5:2340; SOFT-NEXT: .LCPI39_0:2341; SOFT-NEXT: .long 32767 @ 0x7fff2342; SOFT-NEXT: .LCPI39_1:2343; SOFT-NEXT: .long 4294934528 @ 0xffff80002344;2345; VFP-LABEL: stest_f32i16_mm:2346; VFP: @ %bb.0: @ %entry2347; VFP-NEXT: vcvt.s32.f32 s0, s02348; VFP-NEXT: vmov r0, s02349; VFP-NEXT: ssat r0, #16, r02350; VFP-NEXT: bx lr2351entry:2352 %conv = fptosi float %x to i322353 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2354 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2355 %conv6 = trunc i32 %spec.store.select7 to i162356 ret i16 %conv62357}2358 2359define i16 @utest_f32i16_mm(float %x) {2360; SOFT-LABEL: utest_f32i16_mm:2361; SOFT: @ %bb.0: @ %entry2362; SOFT-NEXT: .save {r7, lr}2363; SOFT-NEXT: push {r7, lr}2364; SOFT-NEXT: bl __aeabi_f2uiz2365; SOFT-NEXT: ldr r1, .LCPI40_02366; SOFT-NEXT: cmp r0, r12367; SOFT-NEXT: blo .LBB40_22368; SOFT-NEXT: @ %bb.1: @ %entry2369; SOFT-NEXT: mov r0, r12370; SOFT-NEXT: .LBB40_2: @ %entry2371; SOFT-NEXT: pop {r7, pc}2372; SOFT-NEXT: .p2align 22373; SOFT-NEXT: @ %bb.3:2374; SOFT-NEXT: .LCPI40_0:2375; SOFT-NEXT: .long 65535 @ 0xffff2376;2377; VFP2-LABEL: utest_f32i16_mm:2378; VFP2: @ %bb.0: @ %entry2379; VFP2-NEXT: vcvt.u32.f32 s0, s02380; VFP2-NEXT: movw r0, #655352381; VFP2-NEXT: vmov r1, s02382; VFP2-NEXT: cmp r1, r02383; VFP2-NEXT: it lo2384; VFP2-NEXT: movlo r0, r12385; VFP2-NEXT: bx lr2386;2387; FULL-LABEL: utest_f32i16_mm:2388; FULL: @ %bb.0: @ %entry2389; FULL-NEXT: vcvt.u32.f32 s0, s02390; FULL-NEXT: movw r1, #655352391; FULL-NEXT: vmov r0, s02392; FULL-NEXT: cmp r0, r12393; FULL-NEXT: csel r0, r0, r1, lo2394; FULL-NEXT: bx lr2395entry:2396 %conv = fptoui float %x to i322397 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2398 %conv6 = trunc i32 %spec.store.select to i162399 ret i16 %conv62400}2401 2402define i16 @ustest_f32i16_mm(float %x) {2403; SOFT-LABEL: ustest_f32i16_mm:2404; SOFT: @ %bb.0: @ %entry2405; SOFT-NEXT: .save {r7, lr}2406; SOFT-NEXT: push {r7, lr}2407; SOFT-NEXT: bl __aeabi_f2iz2408; SOFT-NEXT: ldr r1, .LCPI41_02409; SOFT-NEXT: cmp r0, r12410; SOFT-NEXT: blt .LBB41_22411; SOFT-NEXT: @ %bb.1: @ %entry2412; SOFT-NEXT: mov r0, r12413; SOFT-NEXT: .LBB41_2: @ %entry2414; SOFT-NEXT: asrs r1, r0, #312415; SOFT-NEXT: bics r0, r12416; SOFT-NEXT: pop {r7, pc}2417; SOFT-NEXT: .p2align 22418; SOFT-NEXT: @ %bb.3:2419; SOFT-NEXT: .LCPI41_0:2420; SOFT-NEXT: .long 65535 @ 0xffff2421;2422; VFP-LABEL: ustest_f32i16_mm:2423; VFP: @ %bb.0: @ %entry2424; VFP-NEXT: vcvt.s32.f32 s0, s02425; VFP-NEXT: vmov r0, s02426; VFP-NEXT: usat r0, #16, r02427; VFP-NEXT: bx lr2428entry:2429 %conv = fptosi float %x to i322430 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)2431 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)2432 %conv6 = trunc i32 %spec.store.select7 to i162433 ret i16 %conv62434}2435 2436define i16 @stest_f16i16_mm(half %x) {2437; SOFT-LABEL: stest_f16i16_mm:2438; SOFT: @ %bb.0: @ %entry2439; SOFT-NEXT: .save {r7, lr}2440; SOFT-NEXT: push {r7, lr}2441; SOFT-NEXT: uxth r0, r02442; SOFT-NEXT: bl __aeabi_h2f2443; SOFT-NEXT: bl __aeabi_f2iz2444; SOFT-NEXT: ldr r1, .LCPI42_02445; SOFT-NEXT: cmp r0, r12446; SOFT-NEXT: blt .LBB42_22447; SOFT-NEXT: @ %bb.1: @ %entry2448; SOFT-NEXT: mov r0, r12449; SOFT-NEXT: .LBB42_2: @ %entry2450; SOFT-NEXT: ldr r1, .LCPI42_12451; SOFT-NEXT: cmp r0, r12452; SOFT-NEXT: bgt .LBB42_42453; SOFT-NEXT: @ %bb.3: @ %entry2454; SOFT-NEXT: mov r0, r12455; SOFT-NEXT: .LBB42_4: @ %entry2456; SOFT-NEXT: pop {r7, pc}2457; SOFT-NEXT: .p2align 22458; SOFT-NEXT: @ %bb.5:2459; SOFT-NEXT: .LCPI42_0:2460; SOFT-NEXT: .long 32767 @ 0x7fff2461; SOFT-NEXT: .LCPI42_1:2462; SOFT-NEXT: .long 4294934528 @ 0xffff80002463;2464; VFP2-LABEL: stest_f16i16_mm:2465; VFP2: @ %bb.0: @ %entry2466; VFP2-NEXT: .save {r7, lr}2467; VFP2-NEXT: push {r7, lr}2468; VFP2-NEXT: vmov r0, s02469; VFP2-NEXT: bl __aeabi_h2f2470; VFP2-NEXT: vmov s0, r02471; VFP2-NEXT: vcvt.s32.f32 s0, s02472; VFP2-NEXT: vmov r0, s02473; VFP2-NEXT: ssat r0, #16, r02474; VFP2-NEXT: pop {r7, pc}2475;2476; FULL-LABEL: stest_f16i16_mm:2477; FULL: @ %bb.0: @ %entry2478; FULL-NEXT: vcvt.s32.f16 s0, s02479; FULL-NEXT: vmov r0, s02480; FULL-NEXT: ssat r0, #16, r02481; FULL-NEXT: bx lr2482entry:2483 %conv = fptosi half %x to i322484 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)2485 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)2486 %conv6 = trunc i32 %spec.store.select7 to i162487 ret i16 %conv62488}2489 2490define i16 @utesth_f16i16_mm(half %x) {2491; SOFT-LABEL: utesth_f16i16_mm:2492; SOFT: @ %bb.0: @ %entry2493; SOFT-NEXT: .save {r7, lr}2494; SOFT-NEXT: push {r7, lr}2495; SOFT-NEXT: uxth r0, r02496; SOFT-NEXT: bl __aeabi_h2f2497; SOFT-NEXT: bl __aeabi_f2uiz2498; SOFT-NEXT: ldr r1, .LCPI43_02499; SOFT-NEXT: cmp r0, r12500; SOFT-NEXT: blo .LBB43_22501; SOFT-NEXT: @ %bb.1: @ %entry2502; SOFT-NEXT: mov r0, r12503; SOFT-NEXT: .LBB43_2: @ %entry2504; SOFT-NEXT: pop {r7, pc}2505; SOFT-NEXT: .p2align 22506; SOFT-NEXT: @ %bb.3:2507; SOFT-NEXT: .LCPI43_0:2508; SOFT-NEXT: .long 65535 @ 0xffff2509;2510; VFP2-LABEL: utesth_f16i16_mm:2511; VFP2: @ %bb.0: @ %entry2512; VFP2-NEXT: .save {r7, lr}2513; VFP2-NEXT: push {r7, lr}2514; VFP2-NEXT: vmov r0, s02515; VFP2-NEXT: bl __aeabi_h2f2516; VFP2-NEXT: vmov s0, r02517; VFP2-NEXT: movw r0, #655352518; VFP2-NEXT: vcvt.u32.f32 s0, s02519; VFP2-NEXT: vmov r1, s02520; VFP2-NEXT: cmp r1, r02521; VFP2-NEXT: it lo2522; VFP2-NEXT: movlo r0, r12523; VFP2-NEXT: pop {r7, pc}2524;2525; FULL-LABEL: utesth_f16i16_mm:2526; FULL: @ %bb.0: @ %entry2527; FULL-NEXT: vcvt.u32.f16 s0, s02528; FULL-NEXT: movw r1, #655352529; FULL-NEXT: vmov r0, s02530; FULL-NEXT: cmp r0, r12531; FULL-NEXT: csel r0, r0, r1, lo2532; FULL-NEXT: bx lr2533entry:2534 %conv = fptoui half %x to i322535 %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)2536 %conv6 = trunc i32 %spec.store.select to i162537 ret i16 %conv62538}2539 2540define i16 @ustest_f16i16_mm(half %x) {2541; SOFT-LABEL: ustest_f16i16_mm:2542; SOFT: @ %bb.0: @ %entry2543; SOFT-NEXT: .save {r7, lr}2544; SOFT-NEXT: push {r7, lr}2545; SOFT-NEXT: uxth r0, r02546; SOFT-NEXT: bl __aeabi_h2f2547; SOFT-NEXT: bl __aeabi_f2iz2548; SOFT-NEXT: ldr r1, .LCPI44_02549; SOFT-NEXT: cmp r0, r12550; SOFT-NEXT: blt .LBB44_22551; SOFT-NEXT: @ %bb.1: @ %entry2552; SOFT-NEXT: mov r0, r12553; SOFT-NEXT: .LBB44_2: @ %entry2554; SOFT-NEXT: asrs r1, r0, #312555; SOFT-NEXT: bics r0, r12556; SOFT-NEXT: pop {r7, pc}2557; SOFT-NEXT: .p2align 22558; SOFT-NEXT: @ %bb.3:2559; SOFT-NEXT: .LCPI44_0:2560; SOFT-NEXT: .long 65535 @ 0xffff2561;2562; VFP2-LABEL: ustest_f16i16_mm:2563; VFP2: @ %bb.0: @ %entry2564; VFP2-NEXT: .save {r7, lr}2565; VFP2-NEXT: push {r7, lr}2566; VFP2-NEXT: vmov r0, s02567; VFP2-NEXT: bl __aeabi_h2f2568; VFP2-NEXT: vmov s0, r02569; VFP2-NEXT: vcvt.s32.f32 s0, s02570; VFP2-NEXT: vmov r0, s02571; VFP2-NEXT: usat r0, #16, r02572; VFP2-NEXT: pop {r7, pc}2573;2574; FULL-LABEL: ustest_f16i16_mm:2575; FULL: @ %bb.0: @ %entry2576; FULL-NEXT: vcvt.s32.f16 s0, s02577; FULL-NEXT: vmov r0, s02578; FULL-NEXT: usat r0, #16, r02579; FULL-NEXT: bx lr2580entry:2581 %conv = fptosi half %x to i322582 %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)2583 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)2584 %conv6 = trunc i32 %spec.store.select7 to i162585 ret i16 %conv62586}2587 2588; i64 saturate2589 2590define i64 @stest_f64i64_mm(double %x) {2591; SOFT-LABEL: stest_f64i64_mm:2592; SOFT: @ %bb.0: @ %entry2593; SOFT-NEXT: .save {r4, r5, r6, r7, lr}2594; SOFT-NEXT: push {r4, r5, r6, r7, lr}2595; SOFT-NEXT: .pad #122596; SOFT-NEXT: sub sp, #122597; SOFT-NEXT: bl __fixdfti2598; SOFT-NEXT: mov r7, r02599; SOFT-NEXT: movs r0, #12600; SOFT-NEXT: movs r5, #02601; SOFT-NEXT: ldr r6, .LCPI45_02602; SOFT-NEXT: adds r4, r7, #12603; SOFT-NEXT: mov r4, r12604; SOFT-NEXT: sbcs r4, r62605; SOFT-NEXT: mov r4, r22606; SOFT-NEXT: sbcs r4, r52607; SOFT-NEXT: mov r4, r32608; SOFT-NEXT: sbcs r4, r52609; SOFT-NEXT: mov r4, r02610; SOFT-NEXT: blt .LBB45_22611; SOFT-NEXT: @ %bb.1: @ %entry2612; SOFT-NEXT: mov r4, r52613; SOFT-NEXT: .LBB45_2: @ %entry2614; SOFT-NEXT: mvns r6, r52615; SOFT-NEXT: cmp r4, #02616; SOFT-NEXT: beq .LBB45_122617; SOFT-NEXT: @ %bb.3: @ %entry2618; SOFT-NEXT: beq .LBB45_132619; SOFT-NEXT: .LBB45_4: @ %entry2620; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill2621; SOFT-NEXT: beq .LBB45_142622; SOFT-NEXT: .LBB45_5: @ %entry2623; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill2624; SOFT-NEXT: bne .LBB45_72625; SOFT-NEXT: .LBB45_6: @ %entry2626; SOFT-NEXT: mov r7, r62627; SOFT-NEXT: .LBB45_7: @ %entry2628; SOFT-NEXT: lsls r3, r0, #312629; SOFT-NEXT: rsbs r4, r7, #02630; SOFT-NEXT: mov r4, r32631; SOFT-NEXT: sbcs r4, r12632; SOFT-NEXT: mov r4, r62633; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload2634; SOFT-NEXT: sbcs r4, r22635; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload2636; SOFT-NEXT: sbcs r6, r22637; SOFT-NEXT: bge .LBB45_152638; SOFT-NEXT: @ %bb.8: @ %entry2639; SOFT-NEXT: cmp r0, #02640; SOFT-NEXT: beq .LBB45_162641; SOFT-NEXT: .LBB45_9: @ %entry2642; SOFT-NEXT: bne .LBB45_112643; SOFT-NEXT: .LBB45_10: @ %entry2644; SOFT-NEXT: mov r1, r32645; SOFT-NEXT: .LBB45_11: @ %entry2646; SOFT-NEXT: mov r0, r72647; SOFT-NEXT: add sp, #122648; SOFT-NEXT: pop {r4, r5, r6, r7, pc}2649; SOFT-NEXT: .LBB45_12: @ %entry2650; SOFT-NEXT: mov r3, r42651; SOFT-NEXT: bne .LBB45_42652; SOFT-NEXT: .LBB45_13: @ %entry2653; SOFT-NEXT: mov r2, r42654; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill2655; SOFT-NEXT: bne .LBB45_52656; SOFT-NEXT: .LBB45_14: @ %entry2657; SOFT-NEXT: ldr r1, .LCPI45_02658; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill2659; SOFT-NEXT: beq .LBB45_62660; SOFT-NEXT: b .LBB45_72661; SOFT-NEXT: .LBB45_15: @ %entry2662; SOFT-NEXT: mov r0, r52663; SOFT-NEXT: cmp r0, #02664; SOFT-NEXT: bne .LBB45_92665; SOFT-NEXT: .LBB45_16: @ %entry2666; SOFT-NEXT: mov r7, r02667; SOFT-NEXT: beq .LBB45_102668; SOFT-NEXT: b .LBB45_112669; SOFT-NEXT: .p2align 22670; SOFT-NEXT: @ %bb.17:2671; SOFT-NEXT: .LCPI45_0:2672; SOFT-NEXT: .long 2147483647 @ 0x7fffffff2673;2674; VFP2-LABEL: stest_f64i64_mm:2675; VFP2: @ %bb.0: @ %entry2676; VFP2-NEXT: .save {r4, r5, r7, lr}2677; VFP2-NEXT: push {r4, r5, r7, lr}2678; VFP2-NEXT: bl __fixdfti2679; VFP2-NEXT: subs.w r4, r0, #-12680; VFP2-NEXT: mvn lr, #-21474836482681; VFP2-NEXT: sbcs.w r4, r1, lr2682; VFP2-NEXT: mov.w r12, #02683; VFP2-NEXT: sbcs r4, r2, #02684; VFP2-NEXT: sbcs r4, r3, #02685; VFP2-NEXT: mov.w r4, #02686; VFP2-NEXT: it lt2687; VFP2-NEXT: movlt r4, #12688; VFP2-NEXT: cmp r4, #02689; VFP2-NEXT: itet eq2690; VFP2-NEXT: moveq r3, r42691; VFP2-NEXT: movne r4, r22692; VFP2-NEXT: moveq r1, lr2693; VFP2-NEXT: mov.w r2, #-12694; VFP2-NEXT: it eq2695; VFP2-NEXT: moveq r0, r22696; VFP2-NEXT: rsbs r5, r0, #02697; VFP2-NEXT: mov.w lr, #-21474836482698; VFP2-NEXT: sbcs.w r5, lr, r12699; VFP2-NEXT: sbcs.w r4, r2, r42700; VFP2-NEXT: sbcs r2, r32701; VFP2-NEXT: it lt2702; VFP2-NEXT: movlt.w r12, #12703; VFP2-NEXT: cmp.w r12, #02704; VFP2-NEXT: itt eq2705; VFP2-NEXT: moveq r0, r122706; VFP2-NEXT: moveq r1, lr2707; VFP2-NEXT: pop {r4, r5, r7, pc}2708;2709; FULL-LABEL: stest_f64i64_mm:2710; FULL: @ %bb.0: @ %entry2711; FULL-NEXT: .save {r4, r5, r7, lr}2712; FULL-NEXT: push {r4, r5, r7, lr}2713; FULL-NEXT: bl __fixdfti2714; FULL-NEXT: subs.w lr, r0, #-12715; FULL-NEXT: mvn r12, #-21474836482716; FULL-NEXT: sbcs.w lr, r1, r122717; FULL-NEXT: sbcs lr, r2, #02718; FULL-NEXT: sbcs lr, r3, #02719; FULL-NEXT: cset lr, lt2720; FULL-NEXT: cmp.w lr, #02721; FULL-NEXT: csel r5, r3, lr, ne2722; FULL-NEXT: mov.w r3, #-12723; FULL-NEXT: csel r0, r0, r3, ne2724; FULL-NEXT: csel r1, r1, r12, ne2725; FULL-NEXT: csel r2, r2, lr, ne2726; FULL-NEXT: rsbs r4, r0, #02727; FULL-NEXT: mov.w r12, #-21474836482728; FULL-NEXT: sbcs.w r4, r12, r12729; FULL-NEXT: sbcs.w r2, r3, r22730; FULL-NEXT: sbcs.w r2, r3, r52731; FULL-NEXT: cset r2, lt2732; FULL-NEXT: cmp r2, #02733; FULL-NEXT: csel r0, r0, r2, ne2734; FULL-NEXT: csel r1, r1, r12, ne2735; FULL-NEXT: pop {r4, r5, r7, pc}2736entry:2737 %conv = fptosi double %x to i1282738 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)2739 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)2740 %conv6 = trunc i128 %spec.store.select7 to i642741 ret i64 %conv62742}2743 2744define i64 @utest_f64i64_mm(double %x) {2745; SOFT-LABEL: utest_f64i64_mm:2746; SOFT: @ %bb.0: @ %entry2747; SOFT-NEXT: .save {r4, lr}2748; SOFT-NEXT: push {r4, lr}2749; SOFT-NEXT: bl __fixunsdfti2750; SOFT-NEXT: movs r4, #02751; SOFT-NEXT: subs r2, r2, #12752; SOFT-NEXT: sbcs r3, r42753; SOFT-NEXT: blo .LBB46_42754; SOFT-NEXT: @ %bb.1: @ %entry2755; SOFT-NEXT: cmp r4, #02756; SOFT-NEXT: beq .LBB46_52757; SOFT-NEXT: .LBB46_2: @ %entry2758; SOFT-NEXT: beq .LBB46_62759; SOFT-NEXT: .LBB46_3: @ %entry2760; SOFT-NEXT: pop {r4, pc}2761; SOFT-NEXT: .LBB46_4:2762; SOFT-NEXT: movs r4, #12763; SOFT-NEXT: cmp r4, #02764; SOFT-NEXT: bne .LBB46_22765; SOFT-NEXT: .LBB46_5: @ %entry2766; SOFT-NEXT: mov r0, r42767; SOFT-NEXT: bne .LBB46_32768; SOFT-NEXT: .LBB46_6: @ %entry2769; SOFT-NEXT: mov r1, r42770; SOFT-NEXT: pop {r4, pc}2771;2772; VFP2-LABEL: utest_f64i64_mm:2773; VFP2: @ %bb.0: @ %entry2774; VFP2-NEXT: .save {r7, lr}2775; VFP2-NEXT: push {r7, lr}2776; VFP2-NEXT: bl __fixunsdfti2777; VFP2-NEXT: subs r2, #12778; VFP2-NEXT: mov.w r12, #02779; VFP2-NEXT: sbcs r2, r3, #02780; VFP2-NEXT: it lo2781; VFP2-NEXT: movlo.w r12, #12782; VFP2-NEXT: cmp.w r12, #02783; VFP2-NEXT: itt eq2784; VFP2-NEXT: moveq r0, r122785; VFP2-NEXT: moveq r1, r122786; VFP2-NEXT: pop {r7, pc}2787;2788; FULL-LABEL: utest_f64i64_mm:2789; FULL: @ %bb.0: @ %entry2790; FULL-NEXT: .save {r7, lr}2791; FULL-NEXT: push {r7, lr}2792; FULL-NEXT: bl __fixunsdfti2793; FULL-NEXT: subs r2, #12794; FULL-NEXT: sbcs r2, r3, #02795; FULL-NEXT: cset r2, lo2796; FULL-NEXT: cmp r2, #02797; FULL-NEXT: csel r0, r0, r2, ne2798; FULL-NEXT: csel r1, r1, r2, ne2799; FULL-NEXT: pop {r7, pc}2800entry:2801 %conv = fptoui double %x to i1282802 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)2803 %conv6 = trunc i128 %spec.store.select to i642804 ret i64 %conv62805}2806 2807define i64 @ustest_f64i64_mm(double %x) {2808; SOFT-LABEL: ustest_f64i64_mm:2809; SOFT: @ %bb.0: @ %entry2810; SOFT-NEXT: .save {r4, lr}2811; SOFT-NEXT: push {r4, lr}2812; SOFT-NEXT: bl __fixdfti2813; SOFT-NEXT: mov r4, r12814; SOFT-NEXT: movs r1, #02815; SOFT-NEXT: subs r2, r2, #12816; SOFT-NEXT: mov r2, r32817; SOFT-NEXT: sbcs r2, r12818; SOFT-NEXT: blt .LBB47_22819; SOFT-NEXT: @ %bb.1: @ %entry2820; SOFT-NEXT: mov r2, r12821; SOFT-NEXT: cmp r2, #02822; SOFT-NEXT: beq .LBB47_32823; SOFT-NEXT: b .LBB47_42824; SOFT-NEXT: .LBB47_2:2825; SOFT-NEXT: movs r2, #12826; SOFT-NEXT: cmp r2, #02827; SOFT-NEXT: bne .LBB47_42828; SOFT-NEXT: .LBB47_3: @ %entry2829; SOFT-NEXT: mov r4, r22830; SOFT-NEXT: .LBB47_4: @ %entry2831; SOFT-NEXT: beq .LBB47_102832; SOFT-NEXT: @ %bb.5: @ %entry2833; SOFT-NEXT: bne .LBB47_72834; SOFT-NEXT: .LBB47_6: @ %entry2835; SOFT-NEXT: mov r3, r22836; SOFT-NEXT: .LBB47_7: @ %entry2837; SOFT-NEXT: cmp r3, #02838; SOFT-NEXT: mov r2, r12839; SOFT-NEXT: bpl .LBB47_112840; SOFT-NEXT: @ %bb.8: @ %entry2841; SOFT-NEXT: bpl .LBB47_122842; SOFT-NEXT: .LBB47_9: @ %entry2843; SOFT-NEXT: mov r0, r22844; SOFT-NEXT: pop {r4, pc}2845; SOFT-NEXT: .LBB47_10: @ %entry2846; SOFT-NEXT: mov r0, r22847; SOFT-NEXT: beq .LBB47_62848; SOFT-NEXT: b .LBB47_72849; SOFT-NEXT: .LBB47_11: @ %entry2850; SOFT-NEXT: mov r2, r02851; SOFT-NEXT: bmi .LBB47_92852; SOFT-NEXT: .LBB47_12: @ %entry2853; SOFT-NEXT: mov r1, r42854; SOFT-NEXT: mov r0, r22855; SOFT-NEXT: pop {r4, pc}2856;2857; VFP2-LABEL: ustest_f64i64_mm:2858; VFP2: @ %bb.0: @ %entry2859; VFP2-NEXT: .save {r7, lr}2860; VFP2-NEXT: push {r7, lr}2861; VFP2-NEXT: bl __fixdfti2862; VFP2-NEXT: subs r2, #12863; VFP2-NEXT: mov.w r12, #02864; VFP2-NEXT: sbcs r2, r3, #02865; VFP2-NEXT: it lt2866; VFP2-NEXT: movlt.w r12, #12867; VFP2-NEXT: cmp.w r12, #02868; VFP2-NEXT: itte eq2869; VFP2-NEXT: moveq r1, r122870; VFP2-NEXT: moveq r0, r122871; VFP2-NEXT: movne r12, r32872; VFP2-NEXT: cmp.w r12, #02873; VFP2-NEXT: itt mi2874; VFP2-NEXT: movmi r0, #02875; VFP2-NEXT: movmi r1, #02876; VFP2-NEXT: pop {r7, pc}2877;2878; FULL-LABEL: ustest_f64i64_mm:2879; FULL: @ %bb.0: @ %entry2880; FULL-NEXT: .save {r7, lr}2881; FULL-NEXT: push {r7, lr}2882; FULL-NEXT: bl __fixdfti2883; FULL-NEXT: subs r2, #12884; FULL-NEXT: sbcs r2, r3, #02885; FULL-NEXT: cset r2, lt2886; FULL-NEXT: cmp r2, #02887; FULL-NEXT: csel r1, r1, r2, ne2888; FULL-NEXT: csel r0, r0, r2, ne2889; FULL-NEXT: csel r2, r3, r2, ne2890; FULL-NEXT: cmp r2, #02891; FULL-NEXT: itt mi2892; FULL-NEXT: movmi r0, #02893; FULL-NEXT: movmi r1, #02894; FULL-NEXT: pop {r7, pc}2895entry:2896 %conv = fptosi double %x to i1282897 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)2898 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)2899 %conv6 = trunc i128 %spec.store.select7 to i642900 ret i64 %conv62901}2902 2903define i64 @stest_f32i64_mm(float %x) {2904; SOFT-LABEL: stest_f32i64_mm:2905; SOFT: @ %bb.0: @ %entry2906; SOFT-NEXT: .save {r4, r5, r6, r7, lr}2907; SOFT-NEXT: push {r4, r5, r6, r7, lr}2908; SOFT-NEXT: .pad #122909; SOFT-NEXT: sub sp, #122910; SOFT-NEXT: bl __fixsfti2911; SOFT-NEXT: mov r7, r02912; SOFT-NEXT: movs r0, #12913; SOFT-NEXT: movs r5, #02914; SOFT-NEXT: ldr r6, .LCPI48_02915; SOFT-NEXT: adds r4, r7, #12916; SOFT-NEXT: mov r4, r12917; SOFT-NEXT: sbcs r4, r62918; SOFT-NEXT: mov r4, r22919; SOFT-NEXT: sbcs r4, r52920; SOFT-NEXT: mov r4, r32921; SOFT-NEXT: sbcs r4, r52922; SOFT-NEXT: mov r4, r02923; SOFT-NEXT: blt .LBB48_22924; SOFT-NEXT: @ %bb.1: @ %entry2925; SOFT-NEXT: mov r4, r52926; SOFT-NEXT: .LBB48_2: @ %entry2927; SOFT-NEXT: mvns r6, r52928; SOFT-NEXT: cmp r4, #02929; SOFT-NEXT: beq .LBB48_122930; SOFT-NEXT: @ %bb.3: @ %entry2931; SOFT-NEXT: beq .LBB48_132932; SOFT-NEXT: .LBB48_4: @ %entry2933; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill2934; SOFT-NEXT: beq .LBB48_142935; SOFT-NEXT: .LBB48_5: @ %entry2936; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill2937; SOFT-NEXT: bne .LBB48_72938; SOFT-NEXT: .LBB48_6: @ %entry2939; SOFT-NEXT: mov r7, r62940; SOFT-NEXT: .LBB48_7: @ %entry2941; SOFT-NEXT: lsls r3, r0, #312942; SOFT-NEXT: rsbs r4, r7, #02943; SOFT-NEXT: mov r4, r32944; SOFT-NEXT: sbcs r4, r12945; SOFT-NEXT: mov r4, r62946; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload2947; SOFT-NEXT: sbcs r4, r22948; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload2949; SOFT-NEXT: sbcs r6, r22950; SOFT-NEXT: bge .LBB48_152951; SOFT-NEXT: @ %bb.8: @ %entry2952; SOFT-NEXT: cmp r0, #02953; SOFT-NEXT: beq .LBB48_162954; SOFT-NEXT: .LBB48_9: @ %entry2955; SOFT-NEXT: bne .LBB48_112956; SOFT-NEXT: .LBB48_10: @ %entry2957; SOFT-NEXT: mov r1, r32958; SOFT-NEXT: .LBB48_11: @ %entry2959; SOFT-NEXT: mov r0, r72960; SOFT-NEXT: add sp, #122961; SOFT-NEXT: pop {r4, r5, r6, r7, pc}2962; SOFT-NEXT: .LBB48_12: @ %entry2963; SOFT-NEXT: mov r3, r42964; SOFT-NEXT: bne .LBB48_42965; SOFT-NEXT: .LBB48_13: @ %entry2966; SOFT-NEXT: mov r2, r42967; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill2968; SOFT-NEXT: bne .LBB48_52969; SOFT-NEXT: .LBB48_14: @ %entry2970; SOFT-NEXT: ldr r1, .LCPI48_02971; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill2972; SOFT-NEXT: beq .LBB48_62973; SOFT-NEXT: b .LBB48_72974; SOFT-NEXT: .LBB48_15: @ %entry2975; SOFT-NEXT: mov r0, r52976; SOFT-NEXT: cmp r0, #02977; SOFT-NEXT: bne .LBB48_92978; SOFT-NEXT: .LBB48_16: @ %entry2979; SOFT-NEXT: mov r7, r02980; SOFT-NEXT: beq .LBB48_102981; SOFT-NEXT: b .LBB48_112982; SOFT-NEXT: .p2align 22983; SOFT-NEXT: @ %bb.17:2984; SOFT-NEXT: .LCPI48_0:2985; SOFT-NEXT: .long 2147483647 @ 0x7fffffff2986;2987; VFP2-LABEL: stest_f32i64_mm:2988; VFP2: @ %bb.0: @ %entry2989; VFP2-NEXT: .save {r4, r5, r7, lr}2990; VFP2-NEXT: push {r4, r5, r7, lr}2991; VFP2-NEXT: bl __fixsfti2992; VFP2-NEXT: subs.w r4, r0, #-12993; VFP2-NEXT: mvn lr, #-21474836482994; VFP2-NEXT: sbcs.w r4, r1, lr2995; VFP2-NEXT: mov.w r12, #02996; VFP2-NEXT: sbcs r4, r2, #02997; VFP2-NEXT: sbcs r4, r3, #02998; VFP2-NEXT: mov.w r4, #02999; VFP2-NEXT: it lt3000; VFP2-NEXT: movlt r4, #13001; VFP2-NEXT: cmp r4, #03002; VFP2-NEXT: itet eq3003; VFP2-NEXT: moveq r3, r43004; VFP2-NEXT: movne r4, r23005; VFP2-NEXT: moveq r1, lr3006; VFP2-NEXT: mov.w r2, #-13007; VFP2-NEXT: it eq3008; VFP2-NEXT: moveq r0, r23009; VFP2-NEXT: rsbs r5, r0, #03010; VFP2-NEXT: mov.w lr, #-21474836483011; VFP2-NEXT: sbcs.w r5, lr, r13012; VFP2-NEXT: sbcs.w r4, r2, r43013; VFP2-NEXT: sbcs r2, r33014; VFP2-NEXT: it lt3015; VFP2-NEXT: movlt.w r12, #13016; VFP2-NEXT: cmp.w r12, #03017; VFP2-NEXT: itt eq3018; VFP2-NEXT: moveq r0, r123019; VFP2-NEXT: moveq r1, lr3020; VFP2-NEXT: pop {r4, r5, r7, pc}3021;3022; FULL-LABEL: stest_f32i64_mm:3023; FULL: @ %bb.0: @ %entry3024; FULL-NEXT: .save {r4, r5, r7, lr}3025; FULL-NEXT: push {r4, r5, r7, lr}3026; FULL-NEXT: bl __fixsfti3027; FULL-NEXT: subs.w lr, r0, #-13028; FULL-NEXT: mvn r12, #-21474836483029; FULL-NEXT: sbcs.w lr, r1, r123030; FULL-NEXT: sbcs lr, r2, #03031; FULL-NEXT: sbcs lr, r3, #03032; FULL-NEXT: cset lr, lt3033; FULL-NEXT: cmp.w lr, #03034; FULL-NEXT: csel r5, r3, lr, ne3035; FULL-NEXT: mov.w r3, #-13036; FULL-NEXT: csel r0, r0, r3, ne3037; FULL-NEXT: csel r1, r1, r12, ne3038; FULL-NEXT: csel r2, r2, lr, ne3039; FULL-NEXT: rsbs r4, r0, #03040; FULL-NEXT: mov.w r12, #-21474836483041; FULL-NEXT: sbcs.w r4, r12, r13042; FULL-NEXT: sbcs.w r2, r3, r23043; FULL-NEXT: sbcs.w r2, r3, r53044; FULL-NEXT: cset r2, lt3045; FULL-NEXT: cmp r2, #03046; FULL-NEXT: csel r0, r0, r2, ne3047; FULL-NEXT: csel r1, r1, r12, ne3048; FULL-NEXT: pop {r4, r5, r7, pc}3049entry:3050 %conv = fptosi float %x to i1283051 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)3052 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)3053 %conv6 = trunc i128 %spec.store.select7 to i643054 ret i64 %conv63055}3056 3057define i64 @utest_f32i64_mm(float %x) {3058; SOFT-LABEL: utest_f32i64_mm:3059; SOFT: @ %bb.0: @ %entry3060; SOFT-NEXT: .save {r4, lr}3061; SOFT-NEXT: push {r4, lr}3062; SOFT-NEXT: bl __fixunssfti3063; SOFT-NEXT: movs r4, #03064; SOFT-NEXT: subs r2, r2, #13065; SOFT-NEXT: sbcs r3, r43066; SOFT-NEXT: blo .LBB49_43067; SOFT-NEXT: @ %bb.1: @ %entry3068; SOFT-NEXT: cmp r4, #03069; SOFT-NEXT: beq .LBB49_53070; SOFT-NEXT: .LBB49_2: @ %entry3071; SOFT-NEXT: beq .LBB49_63072; SOFT-NEXT: .LBB49_3: @ %entry3073; SOFT-NEXT: pop {r4, pc}3074; SOFT-NEXT: .LBB49_4:3075; SOFT-NEXT: movs r4, #13076; SOFT-NEXT: cmp r4, #03077; SOFT-NEXT: bne .LBB49_23078; SOFT-NEXT: .LBB49_5: @ %entry3079; SOFT-NEXT: mov r0, r43080; SOFT-NEXT: bne .LBB49_33081; SOFT-NEXT: .LBB49_6: @ %entry3082; SOFT-NEXT: mov r1, r43083; SOFT-NEXT: pop {r4, pc}3084;3085; VFP2-LABEL: utest_f32i64_mm:3086; VFP2: @ %bb.0: @ %entry3087; VFP2-NEXT: .save {r7, lr}3088; VFP2-NEXT: push {r7, lr}3089; VFP2-NEXT: bl __fixunssfti3090; VFP2-NEXT: subs r2, #13091; VFP2-NEXT: mov.w r12, #03092; VFP2-NEXT: sbcs r2, r3, #03093; VFP2-NEXT: it lo3094; VFP2-NEXT: movlo.w r12, #13095; VFP2-NEXT: cmp.w r12, #03096; VFP2-NEXT: itt eq3097; VFP2-NEXT: moveq r0, r123098; VFP2-NEXT: moveq r1, r123099; VFP2-NEXT: pop {r7, pc}3100;3101; FULL-LABEL: utest_f32i64_mm:3102; FULL: @ %bb.0: @ %entry3103; FULL-NEXT: .save {r7, lr}3104; FULL-NEXT: push {r7, lr}3105; FULL-NEXT: bl __fixunssfti3106; FULL-NEXT: subs r2, #13107; FULL-NEXT: sbcs r2, r3, #03108; FULL-NEXT: cset r2, lo3109; FULL-NEXT: cmp r2, #03110; FULL-NEXT: csel r0, r0, r2, ne3111; FULL-NEXT: csel r1, r1, r2, ne3112; FULL-NEXT: pop {r7, pc}3113entry:3114 %conv = fptoui float %x to i1283115 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)3116 %conv6 = trunc i128 %spec.store.select to i643117 ret i64 %conv63118}3119 3120define i64 @ustest_f32i64_mm(float %x) {3121; SOFT-LABEL: ustest_f32i64_mm:3122; SOFT: @ %bb.0: @ %entry3123; SOFT-NEXT: .save {r4, lr}3124; SOFT-NEXT: push {r4, lr}3125; SOFT-NEXT: bl __fixsfti3126; SOFT-NEXT: mov r4, r13127; SOFT-NEXT: movs r1, #03128; SOFT-NEXT: subs r2, r2, #13129; SOFT-NEXT: mov r2, r33130; SOFT-NEXT: sbcs r2, r13131; SOFT-NEXT: blt .LBB50_23132; SOFT-NEXT: @ %bb.1: @ %entry3133; SOFT-NEXT: mov r2, r13134; SOFT-NEXT: cmp r2, #03135; SOFT-NEXT: beq .LBB50_33136; SOFT-NEXT: b .LBB50_43137; SOFT-NEXT: .LBB50_2:3138; SOFT-NEXT: movs r2, #13139; SOFT-NEXT: cmp r2, #03140; SOFT-NEXT: bne .LBB50_43141; SOFT-NEXT: .LBB50_3: @ %entry3142; SOFT-NEXT: mov r4, r23143; SOFT-NEXT: .LBB50_4: @ %entry3144; SOFT-NEXT: beq .LBB50_103145; SOFT-NEXT: @ %bb.5: @ %entry3146; SOFT-NEXT: bne .LBB50_73147; SOFT-NEXT: .LBB50_6: @ %entry3148; SOFT-NEXT: mov r3, r23149; SOFT-NEXT: .LBB50_7: @ %entry3150; SOFT-NEXT: cmp r3, #03151; SOFT-NEXT: mov r2, r13152; SOFT-NEXT: bpl .LBB50_113153; SOFT-NEXT: @ %bb.8: @ %entry3154; SOFT-NEXT: bpl .LBB50_123155; SOFT-NEXT: .LBB50_9: @ %entry3156; SOFT-NEXT: mov r0, r23157; SOFT-NEXT: pop {r4, pc}3158; SOFT-NEXT: .LBB50_10: @ %entry3159; SOFT-NEXT: mov r0, r23160; SOFT-NEXT: beq .LBB50_63161; SOFT-NEXT: b .LBB50_73162; SOFT-NEXT: .LBB50_11: @ %entry3163; SOFT-NEXT: mov r2, r03164; SOFT-NEXT: bmi .LBB50_93165; SOFT-NEXT: .LBB50_12: @ %entry3166; SOFT-NEXT: mov r1, r43167; SOFT-NEXT: mov r0, r23168; SOFT-NEXT: pop {r4, pc}3169;3170; VFP2-LABEL: ustest_f32i64_mm:3171; VFP2: @ %bb.0: @ %entry3172; VFP2-NEXT: .save {r7, lr}3173; VFP2-NEXT: push {r7, lr}3174; VFP2-NEXT: bl __fixsfti3175; VFP2-NEXT: subs r2, #13176; VFP2-NEXT: mov.w r12, #03177; VFP2-NEXT: sbcs r2, r3, #03178; VFP2-NEXT: it lt3179; VFP2-NEXT: movlt.w r12, #13180; VFP2-NEXT: cmp.w r12, #03181; VFP2-NEXT: itte eq3182; VFP2-NEXT: moveq r1, r123183; VFP2-NEXT: moveq r0, r123184; VFP2-NEXT: movne r12, r33185; VFP2-NEXT: cmp.w r12, #03186; VFP2-NEXT: itt mi3187; VFP2-NEXT: movmi r0, #03188; VFP2-NEXT: movmi r1, #03189; VFP2-NEXT: pop {r7, pc}3190;3191; FULL-LABEL: ustest_f32i64_mm:3192; FULL: @ %bb.0: @ %entry3193; FULL-NEXT: .save {r7, lr}3194; FULL-NEXT: push {r7, lr}3195; FULL-NEXT: bl __fixsfti3196; FULL-NEXT: subs r2, #13197; FULL-NEXT: sbcs r2, r3, #03198; FULL-NEXT: cset r2, lt3199; FULL-NEXT: cmp r2, #03200; FULL-NEXT: csel r1, r1, r2, ne3201; FULL-NEXT: csel r0, r0, r2, ne3202; FULL-NEXT: csel r2, r3, r2, ne3203; FULL-NEXT: cmp r2, #03204; FULL-NEXT: itt mi3205; FULL-NEXT: movmi r0, #03206; FULL-NEXT: movmi r1, #03207; FULL-NEXT: pop {r7, pc}3208entry:3209 %conv = fptosi float %x to i1283210 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)3211 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)3212 %conv6 = trunc i128 %spec.store.select7 to i643213 ret i64 %conv63214}3215 3216define i64 @stest_f16i64_mm(half %x) {3217; SOFT-LABEL: stest_f16i64_mm:3218; SOFT: @ %bb.0: @ %entry3219; SOFT-NEXT: .save {r4, r5, r6, r7, lr}3220; SOFT-NEXT: push {r4, r5, r6, r7, lr}3221; SOFT-NEXT: .pad #123222; SOFT-NEXT: sub sp, #123223; SOFT-NEXT: uxth r0, r03224; SOFT-NEXT: bl __aeabi_h2f3225; SOFT-NEXT: bl __fixsfti3226; SOFT-NEXT: mov r7, r03227; SOFT-NEXT: movs r0, #13228; SOFT-NEXT: movs r5, #03229; SOFT-NEXT: ldr r6, .LCPI51_03230; SOFT-NEXT: adds r4, r7, #13231; SOFT-NEXT: mov r4, r13232; SOFT-NEXT: sbcs r4, r63233; SOFT-NEXT: mov r4, r23234; SOFT-NEXT: sbcs r4, r53235; SOFT-NEXT: mov r4, r33236; SOFT-NEXT: sbcs r4, r53237; SOFT-NEXT: mov r4, r03238; SOFT-NEXT: blt .LBB51_23239; SOFT-NEXT: @ %bb.1: @ %entry3240; SOFT-NEXT: mov r4, r53241; SOFT-NEXT: .LBB51_2: @ %entry3242; SOFT-NEXT: mvns r6, r53243; SOFT-NEXT: cmp r4, #03244; SOFT-NEXT: beq .LBB51_123245; SOFT-NEXT: @ %bb.3: @ %entry3246; SOFT-NEXT: beq .LBB51_133247; SOFT-NEXT: .LBB51_4: @ %entry3248; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill3249; SOFT-NEXT: beq .LBB51_143250; SOFT-NEXT: .LBB51_5: @ %entry3251; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill3252; SOFT-NEXT: bne .LBB51_73253; SOFT-NEXT: .LBB51_6: @ %entry3254; SOFT-NEXT: mov r7, r63255; SOFT-NEXT: .LBB51_7: @ %entry3256; SOFT-NEXT: lsls r3, r0, #313257; SOFT-NEXT: rsbs r4, r7, #03258; SOFT-NEXT: mov r4, r33259; SOFT-NEXT: sbcs r4, r13260; SOFT-NEXT: mov r4, r63261; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload3262; SOFT-NEXT: sbcs r4, r23263; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3264; SOFT-NEXT: sbcs r6, r23265; SOFT-NEXT: bge .LBB51_153266; SOFT-NEXT: @ %bb.8: @ %entry3267; SOFT-NEXT: cmp r0, #03268; SOFT-NEXT: beq .LBB51_163269; SOFT-NEXT: .LBB51_9: @ %entry3270; SOFT-NEXT: bne .LBB51_113271; SOFT-NEXT: .LBB51_10: @ %entry3272; SOFT-NEXT: mov r1, r33273; SOFT-NEXT: .LBB51_11: @ %entry3274; SOFT-NEXT: mov r0, r73275; SOFT-NEXT: add sp, #123276; SOFT-NEXT: pop {r4, r5, r6, r7, pc}3277; SOFT-NEXT: .LBB51_12: @ %entry3278; SOFT-NEXT: mov r3, r43279; SOFT-NEXT: bne .LBB51_43280; SOFT-NEXT: .LBB51_13: @ %entry3281; SOFT-NEXT: mov r2, r43282; SOFT-NEXT: str r2, [sp, #8] @ 4-byte Spill3283; SOFT-NEXT: bne .LBB51_53284; SOFT-NEXT: .LBB51_14: @ %entry3285; SOFT-NEXT: ldr r1, .LCPI51_03286; SOFT-NEXT: str r3, [sp, #4] @ 4-byte Spill3287; SOFT-NEXT: beq .LBB51_63288; SOFT-NEXT: b .LBB51_73289; SOFT-NEXT: .LBB51_15: @ %entry3290; SOFT-NEXT: mov r0, r53291; SOFT-NEXT: cmp r0, #03292; SOFT-NEXT: bne .LBB51_93293; SOFT-NEXT: .LBB51_16: @ %entry3294; SOFT-NEXT: mov r7, r03295; SOFT-NEXT: beq .LBB51_103296; SOFT-NEXT: b .LBB51_113297; SOFT-NEXT: .p2align 23298; SOFT-NEXT: @ %bb.17:3299; SOFT-NEXT: .LCPI51_0:3300; SOFT-NEXT: .long 2147483647 @ 0x7fffffff3301;3302; VFP2-LABEL: stest_f16i64_mm:3303; VFP2: @ %bb.0: @ %entry3304; VFP2-NEXT: .save {r4, r5, r7, lr}3305; VFP2-NEXT: push {r4, r5, r7, lr}3306; VFP2-NEXT: vmov r0, s03307; VFP2-NEXT: bl __aeabi_h2f3308; VFP2-NEXT: vmov s0, r03309; VFP2-NEXT: bl __fixsfti3310; VFP2-NEXT: subs.w r4, r0, #-13311; VFP2-NEXT: mvn lr, #-21474836483312; VFP2-NEXT: sbcs.w r4, r1, lr3313; VFP2-NEXT: mov.w r12, #03314; VFP2-NEXT: sbcs r4, r2, #03315; VFP2-NEXT: sbcs r4, r3, #03316; VFP2-NEXT: mov.w r4, #03317; VFP2-NEXT: it lt3318; VFP2-NEXT: movlt r4, #13319; VFP2-NEXT: cmp r4, #03320; VFP2-NEXT: itet eq3321; VFP2-NEXT: moveq r3, r43322; VFP2-NEXT: movne r4, r23323; VFP2-NEXT: moveq r1, lr3324; VFP2-NEXT: mov.w r2, #-13325; VFP2-NEXT: it eq3326; VFP2-NEXT: moveq r0, r23327; VFP2-NEXT: rsbs r5, r0, #03328; VFP2-NEXT: mov.w lr, #-21474836483329; VFP2-NEXT: sbcs.w r5, lr, r13330; VFP2-NEXT: sbcs.w r4, r2, r43331; VFP2-NEXT: sbcs r2, r33332; VFP2-NEXT: it lt3333; VFP2-NEXT: movlt.w r12, #13334; VFP2-NEXT: cmp.w r12, #03335; VFP2-NEXT: itt eq3336; VFP2-NEXT: moveq r0, r123337; VFP2-NEXT: moveq r1, lr3338; VFP2-NEXT: pop {r4, r5, r7, pc}3339;3340; FULL-LABEL: stest_f16i64_mm:3341; FULL: @ %bb.0: @ %entry3342; FULL-NEXT: .save {r4, r5, r7, lr}3343; FULL-NEXT: push {r4, r5, r7, lr}3344; FULL-NEXT: vmov.f16 r0, s03345; FULL-NEXT: vmov s0, r03346; FULL-NEXT: bl __fixhfti3347; FULL-NEXT: subs.w lr, r0, #-13348; FULL-NEXT: mvn r12, #-21474836483349; FULL-NEXT: sbcs.w lr, r1, r123350; FULL-NEXT: sbcs lr, r2, #03351; FULL-NEXT: sbcs lr, r3, #03352; FULL-NEXT: cset lr, lt3353; FULL-NEXT: cmp.w lr, #03354; FULL-NEXT: csel r5, r3, lr, ne3355; FULL-NEXT: mov.w r3, #-13356; FULL-NEXT: csel r0, r0, r3, ne3357; FULL-NEXT: csel r1, r1, r12, ne3358; FULL-NEXT: csel r2, r2, lr, ne3359; FULL-NEXT: rsbs r4, r0, #03360; FULL-NEXT: mov.w r12, #-21474836483361; FULL-NEXT: sbcs.w r4, r12, r13362; FULL-NEXT: sbcs.w r2, r3, r23363; FULL-NEXT: sbcs.w r2, r3, r53364; FULL-NEXT: cset r2, lt3365; FULL-NEXT: cmp r2, #03366; FULL-NEXT: csel r0, r0, r2, ne3367; FULL-NEXT: csel r1, r1, r12, ne3368; FULL-NEXT: pop {r4, r5, r7, pc}3369entry:3370 %conv = fptosi half %x to i1283371 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)3372 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)3373 %conv6 = trunc i128 %spec.store.select7 to i643374 ret i64 %conv63375}3376 3377define i64 @utesth_f16i64_mm(half %x) {3378; SOFT-LABEL: utesth_f16i64_mm:3379; SOFT: @ %bb.0: @ %entry3380; SOFT-NEXT: .save {r4, lr}3381; SOFT-NEXT: push {r4, lr}3382; SOFT-NEXT: uxth r0, r03383; SOFT-NEXT: bl __aeabi_h2f3384; SOFT-NEXT: bl __fixunssfti3385; SOFT-NEXT: movs r4, #03386; SOFT-NEXT: subs r2, r2, #13387; SOFT-NEXT: sbcs r3, r43388; SOFT-NEXT: blo .LBB52_43389; SOFT-NEXT: @ %bb.1: @ %entry3390; SOFT-NEXT: cmp r4, #03391; SOFT-NEXT: beq .LBB52_53392; SOFT-NEXT: .LBB52_2: @ %entry3393; SOFT-NEXT: beq .LBB52_63394; SOFT-NEXT: .LBB52_3: @ %entry3395; SOFT-NEXT: pop {r4, pc}3396; SOFT-NEXT: .LBB52_4:3397; SOFT-NEXT: movs r4, #13398; SOFT-NEXT: cmp r4, #03399; SOFT-NEXT: bne .LBB52_23400; SOFT-NEXT: .LBB52_5: @ %entry3401; SOFT-NEXT: mov r0, r43402; SOFT-NEXT: bne .LBB52_33403; SOFT-NEXT: .LBB52_6: @ %entry3404; SOFT-NEXT: mov r1, r43405; SOFT-NEXT: pop {r4, pc}3406;3407; VFP2-LABEL: utesth_f16i64_mm:3408; VFP2: @ %bb.0: @ %entry3409; VFP2-NEXT: .save {r7, lr}3410; VFP2-NEXT: push {r7, lr}3411; VFP2-NEXT: vmov r0, s03412; VFP2-NEXT: bl __aeabi_h2f3413; VFP2-NEXT: vmov s0, r03414; VFP2-NEXT: bl __fixunssfti3415; VFP2-NEXT: subs r2, #13416; VFP2-NEXT: mov.w r12, #03417; VFP2-NEXT: sbcs r2, r3, #03418; VFP2-NEXT: it lo3419; VFP2-NEXT: movlo.w r12, #13420; VFP2-NEXT: cmp.w r12, #03421; VFP2-NEXT: itt eq3422; VFP2-NEXT: moveq r0, r123423; VFP2-NEXT: moveq r1, r123424; VFP2-NEXT: pop {r7, pc}3425;3426; FULL-LABEL: utesth_f16i64_mm:3427; FULL: @ %bb.0: @ %entry3428; FULL-NEXT: .save {r7, lr}3429; FULL-NEXT: push {r7, lr}3430; FULL-NEXT: vmov.f16 r0, s03431; FULL-NEXT: vmov s0, r03432; FULL-NEXT: bl __fixunshfti3433; FULL-NEXT: subs r2, #13434; FULL-NEXT: sbcs r2, r3, #03435; FULL-NEXT: cset r2, lo3436; FULL-NEXT: cmp r2, #03437; FULL-NEXT: csel r0, r0, r2, ne3438; FULL-NEXT: csel r1, r1, r2, ne3439; FULL-NEXT: pop {r7, pc}3440entry:3441 %conv = fptoui half %x to i1283442 %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)3443 %conv6 = trunc i128 %spec.store.select to i643444 ret i64 %conv63445}3446 3447define i64 @ustest_f16i64_mm(half %x) {3448; SOFT-LABEL: ustest_f16i64_mm:3449; SOFT: @ %bb.0: @ %entry3450; SOFT-NEXT: .save {r4, lr}3451; SOFT-NEXT: push {r4, lr}3452; SOFT-NEXT: uxth r0, r03453; SOFT-NEXT: bl __aeabi_h2f3454; SOFT-NEXT: bl __fixsfti3455; SOFT-NEXT: mov r4, r13456; SOFT-NEXT: movs r1, #03457; SOFT-NEXT: subs r2, r2, #13458; SOFT-NEXT: mov r2, r33459; SOFT-NEXT: sbcs r2, r13460; SOFT-NEXT: blt .LBB53_23461; SOFT-NEXT: @ %bb.1: @ %entry3462; SOFT-NEXT: mov r2, r13463; SOFT-NEXT: cmp r2, #03464; SOFT-NEXT: beq .LBB53_33465; SOFT-NEXT: b .LBB53_43466; SOFT-NEXT: .LBB53_2:3467; SOFT-NEXT: movs r2, #13468; SOFT-NEXT: cmp r2, #03469; SOFT-NEXT: bne .LBB53_43470; SOFT-NEXT: .LBB53_3: @ %entry3471; SOFT-NEXT: mov r4, r23472; SOFT-NEXT: .LBB53_4: @ %entry3473; SOFT-NEXT: beq .LBB53_103474; SOFT-NEXT: @ %bb.5: @ %entry3475; SOFT-NEXT: bne .LBB53_73476; SOFT-NEXT: .LBB53_6: @ %entry3477; SOFT-NEXT: mov r3, r23478; SOFT-NEXT: .LBB53_7: @ %entry3479; SOFT-NEXT: cmp r3, #03480; SOFT-NEXT: mov r2, r13481; SOFT-NEXT: bpl .LBB53_113482; SOFT-NEXT: @ %bb.8: @ %entry3483; SOFT-NEXT: bpl .LBB53_123484; SOFT-NEXT: .LBB53_9: @ %entry3485; SOFT-NEXT: mov r0, r23486; SOFT-NEXT: pop {r4, pc}3487; SOFT-NEXT: .LBB53_10: @ %entry3488; SOFT-NEXT: mov r0, r23489; SOFT-NEXT: beq .LBB53_63490; SOFT-NEXT: b .LBB53_73491; SOFT-NEXT: .LBB53_11: @ %entry3492; SOFT-NEXT: mov r2, r03493; SOFT-NEXT: bmi .LBB53_93494; SOFT-NEXT: .LBB53_12: @ %entry3495; SOFT-NEXT: mov r1, r43496; SOFT-NEXT: mov r0, r23497; SOFT-NEXT: pop {r4, pc}3498;3499; VFP2-LABEL: ustest_f16i64_mm:3500; VFP2: @ %bb.0: @ %entry3501; VFP2-NEXT: .save {r7, lr}3502; VFP2-NEXT: push {r7, lr}3503; VFP2-NEXT: vmov r0, s03504; VFP2-NEXT: bl __aeabi_h2f3505; VFP2-NEXT: vmov s0, r03506; VFP2-NEXT: bl __fixsfti3507; VFP2-NEXT: subs r2, #13508; VFP2-NEXT: mov.w r12, #03509; VFP2-NEXT: sbcs r2, r3, #03510; VFP2-NEXT: it lt3511; VFP2-NEXT: movlt.w r12, #13512; VFP2-NEXT: cmp.w r12, #03513; VFP2-NEXT: itte eq3514; VFP2-NEXT: moveq r1, r123515; VFP2-NEXT: moveq r0, r123516; VFP2-NEXT: movne r12, r33517; VFP2-NEXT: cmp.w r12, #03518; VFP2-NEXT: itt mi3519; VFP2-NEXT: movmi r0, #03520; VFP2-NEXT: movmi r1, #03521; VFP2-NEXT: pop {r7, pc}3522;3523; FULL-LABEL: ustest_f16i64_mm:3524; FULL: @ %bb.0: @ %entry3525; FULL-NEXT: .save {r7, lr}3526; FULL-NEXT: push {r7, lr}3527; FULL-NEXT: vmov.f16 r0, s03528; FULL-NEXT: vmov s0, r03529; FULL-NEXT: bl __fixhfti3530; FULL-NEXT: subs r2, #13531; FULL-NEXT: sbcs r2, r3, #03532; FULL-NEXT: cset r2, lt3533; FULL-NEXT: cmp r2, #03534; FULL-NEXT: csel r1, r1, r2, ne3535; FULL-NEXT: csel r0, r0, r2, ne3536; FULL-NEXT: csel r2, r3, r2, ne3537; FULL-NEXT: cmp r2, #03538; FULL-NEXT: itt mi3539; FULL-NEXT: movmi r0, #03540; FULL-NEXT: movmi r1, #03541; FULL-NEXT: pop {r7, pc}3542entry:3543 %conv = fptosi half %x to i1283544 %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)3545 %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)3546 %conv6 = trunc i128 %spec.store.select7 to i643547 ret i64 %conv63548}3549 3550 3551define void @unroll_maxmin(ptr nocapture %0, ptr nocapture readonly %1, i32 %2) {3552; SOFT-LABEL: unroll_maxmin:3553; SOFT: @ %bb.0:3554; SOFT-NEXT: .save {r4, r5, r6, r7, lr}3555; SOFT-NEXT: push {r4, r5, r6, r7, lr}3556; SOFT-NEXT: .pad #203557; SOFT-NEXT: sub sp, #203558; SOFT-NEXT: mov r4, r13559; SOFT-NEXT: mov r5, r03560; SOFT-NEXT: movs r0, #03561; SOFT-NEXT: str r0, [sp, #16] @ 4-byte Spill3562; SOFT-NEXT: mvns r0, r03563; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill3564; SOFT-NEXT: movs r0, #13565; SOFT-NEXT: lsls r1, r0, #313566; SOFT-NEXT: str r1, [sp, #12] @ 4-byte Spill3567; SOFT-NEXT: str r0, [sp, #4] @ 4-byte Spill3568; SOFT-NEXT: lsls r7, r0, #103569; SOFT-NEXT: b .LBB54_23570; SOFT-NEXT: .LBB54_1: @ in Loop: Header=BB54_2 Depth=13571; SOFT-NEXT: str r0, [r5, #4]3572; SOFT-NEXT: adds r4, #83573; SOFT-NEXT: adds r5, #83574; SOFT-NEXT: subs r7, r7, #23575; SOFT-NEXT: beq .LBB54_183576; SOFT-NEXT: .LBB54_2: @ =>This Inner Loop Header: Depth=13577; SOFT-NEXT: ldr r0, [r4]3578; SOFT-NEXT: movs r1, #793579; SOFT-NEXT: lsls r6, r1, #243580; SOFT-NEXT: mov r1, r63581; SOFT-NEXT: bl __aeabi_fmul3582; SOFT-NEXT: bl __aeabi_f2lz3583; SOFT-NEXT: ldr r2, .LCPI54_03584; SOFT-NEXT: subs r2, r0, r23585; SOFT-NEXT: mov r2, r13586; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload3587; SOFT-NEXT: sbcs r2, r33588; SOFT-NEXT: bge .LBB54_143589; SOFT-NEXT: @ %bb.3: @ in Loop: Header=BB54_2 Depth=13590; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3591; SOFT-NEXT: bge .LBB54_153592; SOFT-NEXT: .LBB54_4: @ in Loop: Header=BB54_2 Depth=13593; SOFT-NEXT: cmp r2, #03594; SOFT-NEXT: bne .LBB54_63595; SOFT-NEXT: .LBB54_5: @ in Loop: Header=BB54_2 Depth=13596; SOFT-NEXT: mov r1, r23597; SOFT-NEXT: .LBB54_6: @ in Loop: Header=BB54_2 Depth=13598; SOFT-NEXT: ldr r2, [sp, #12] @ 4-byte Reload3599; SOFT-NEXT: subs r2, r2, r03600; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload3601; SOFT-NEXT: sbcs r2, r13602; SOFT-NEXT: blt .LBB54_83603; SOFT-NEXT: @ %bb.7: @ in Loop: Header=BB54_2 Depth=13604; SOFT-NEXT: ldr r0, [sp, #12] @ 4-byte Reload3605; SOFT-NEXT: .LBB54_8: @ in Loop: Header=BB54_2 Depth=13606; SOFT-NEXT: str r0, [r5]3607; SOFT-NEXT: ldr r0, [r4, #4]3608; SOFT-NEXT: mov r1, r63609; SOFT-NEXT: bl __aeabi_fmul3610; SOFT-NEXT: bl __aeabi_f2lz3611; SOFT-NEXT: ldr r2, .LCPI54_03612; SOFT-NEXT: subs r2, r0, r23613; SOFT-NEXT: mov r2, r13614; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload3615; SOFT-NEXT: sbcs r2, r33616; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3617; SOFT-NEXT: bge .LBB54_163618; SOFT-NEXT: @ %bb.9: @ in Loop: Header=BB54_2 Depth=13619; SOFT-NEXT: cmp r2, #03620; SOFT-NEXT: beq .LBB54_173621; SOFT-NEXT: .LBB54_10: @ in Loop: Header=BB54_2 Depth=13622; SOFT-NEXT: bne .LBB54_123623; SOFT-NEXT: .LBB54_11: @ in Loop: Header=BB54_2 Depth=13624; SOFT-NEXT: ldr r0, .LCPI54_03625; SOFT-NEXT: .LBB54_12: @ in Loop: Header=BB54_2 Depth=13626; SOFT-NEXT: ldr r2, [sp, #12] @ 4-byte Reload3627; SOFT-NEXT: subs r2, r2, r03628; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload3629; SOFT-NEXT: sbcs r2, r13630; SOFT-NEXT: blt .LBB54_13631; SOFT-NEXT: @ %bb.13: @ in Loop: Header=BB54_2 Depth=13632; SOFT-NEXT: ldr r0, [sp, #12] @ 4-byte Reload3633; SOFT-NEXT: b .LBB54_13634; SOFT-NEXT: .LBB54_14: @ in Loop: Header=BB54_2 Depth=13635; SOFT-NEXT: ldr r0, .LCPI54_03636; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3637; SOFT-NEXT: blt .LBB54_43638; SOFT-NEXT: .LBB54_15: @ in Loop: Header=BB54_2 Depth=13639; SOFT-NEXT: ldr r2, [sp, #16] @ 4-byte Reload3640; SOFT-NEXT: cmp r2, #03641; SOFT-NEXT: beq .LBB54_53642; SOFT-NEXT: b .LBB54_63643; SOFT-NEXT: .LBB54_16: @ in Loop: Header=BB54_2 Depth=13644; SOFT-NEXT: ldr r2, [sp, #16] @ 4-byte Reload3645; SOFT-NEXT: cmp r2, #03646; SOFT-NEXT: bne .LBB54_103647; SOFT-NEXT: .LBB54_17: @ in Loop: Header=BB54_2 Depth=13648; SOFT-NEXT: mov r1, r23649; SOFT-NEXT: beq .LBB54_113650; SOFT-NEXT: b .LBB54_123651; SOFT-NEXT: .LBB54_18:3652; SOFT-NEXT: add sp, #203653; SOFT-NEXT: pop {r4, r5, r6, r7, pc}3654; SOFT-NEXT: .p2align 23655; SOFT-NEXT: @ %bb.19:3656; SOFT-NEXT: .LCPI54_0:3657; SOFT-NEXT: .long 2147483647 @ 0x7fffffff3658;3659; VFP2-LABEL: unroll_maxmin:3660; VFP2: @ %bb.0:3661; VFP2-NEXT: subs r1, #83662; VFP2-NEXT: subs r0, #83663; VFP2-NEXT: vldr s0, .LCPI54_03664; VFP2-NEXT: mov.w r2, #10243665; VFP2-NEXT: .LBB54_1: @ =>This Inner Loop Header: Depth=13666; VFP2-NEXT: vldr s2, [r1, #8]3667; VFP2-NEXT: subs r2, #23668; VFP2-NEXT: vmul.f32 s2, s2, s03669; VFP2-NEXT: vcvt.s32.f32 s2, s23670; VFP2-NEXT: vmov r3, s23671; VFP2-NEXT: str r3, [r0, #8]!3672; VFP2-NEXT: vldr s2, [r1, #12]3673; VFP2-NEXT: add.w r1, r1, #83674; VFP2-NEXT: vmul.f32 s2, s2, s03675; VFP2-NEXT: vcvt.s32.f32 s2, s23676; VFP2-NEXT: vstr s2, [r0, #4]3677; VFP2-NEXT: bne .LBB54_13678; VFP2-NEXT: @ %bb.2:3679; VFP2-NEXT: bx lr3680; VFP2-NEXT: .p2align 23681; VFP2-NEXT: @ %bb.3:3682; VFP2-NEXT: .LCPI54_0:3683; VFP2-NEXT: .long 0x4f000000 @ float 2.14748365E+93684;3685; FULL-LABEL: unroll_maxmin:3686; FULL: @ %bb.0:3687; FULL-NEXT: .save {r7, lr}3688; FULL-NEXT: push {r7, lr}3689; FULL-NEXT: mov.w lr, #5123690; FULL-NEXT: subs r1, #83691; FULL-NEXT: subs r0, #83692; FULL-NEXT: vldr s0, .LCPI54_03693; FULL-NEXT: .LBB54_1: @ =>This Inner Loop Header: Depth=13694; FULL-NEXT: vldr s2, [r1, #8]3695; FULL-NEXT: vmul.f32 s2, s2, s03696; FULL-NEXT: vcvt.s32.f32 s2, s23697; FULL-NEXT: vmov r2, s23698; FULL-NEXT: str r2, [r0, #8]!3699; FULL-NEXT: vldr s2, [r1, #12]3700; FULL-NEXT: adds r1, #83701; FULL-NEXT: vmul.f32 s2, s2, s03702; FULL-NEXT: vcvt.s32.f32 s2, s23703; FULL-NEXT: vstr s2, [r0, #4]3704; FULL-NEXT: le lr, .LBB54_13705; FULL-NEXT: @ %bb.2:3706; FULL-NEXT: pop {r7, pc}3707; FULL-NEXT: .p2align 23708; FULL-NEXT: @ %bb.3:3709; FULL-NEXT: .LCPI54_0:3710; FULL-NEXT: .long 0x4f000000 @ float 2.14748365E+93711 br label %53712 37134: ; preds = %53714 ret void3715 37165: ; preds = %5, %33717 %6 = phi i32 [ 0, %3 ], [ %28, %5 ]3718 %7 = getelementptr inbounds float, ptr %1, i32 %63719 %8 = load float, ptr %7, align 43720 %9 = fmul float %8, 0x41E00000000000003721 %10 = fptosi float %9 to i643722 %11 = icmp slt i64 %10, 21474836473723 %12 = select i1 %11, i64 %10, i64 21474836473724 %13 = icmp sgt i64 %12, -21474836483725 %14 = select i1 %13, i64 %12, i64 -21474836483726 %15 = trunc i64 %14 to i323727 %16 = getelementptr inbounds i32, ptr %0, i32 %63728 store i32 %15, ptr %16, align 43729 %17 = or disjoint i32 %6, 13730 %18 = getelementptr inbounds float, ptr %1, i32 %173731 %19 = load float, ptr %18, align 43732 %20 = fmul float %19, 0x41E00000000000003733 %21 = fptosi float %20 to i643734 %22 = icmp slt i64 %21, 21474836473735 %23 = select i1 %22, i64 %21, i64 21474836473736 %24 = icmp sgt i64 %23, -21474836483737 %25 = select i1 %24, i64 %23, i64 -21474836483738 %26 = trunc i64 %25 to i323739 %27 = getelementptr inbounds i32, ptr %0, i32 %173740 store i32 %26, ptr %27, align 43741 %28 = add nuw nsw i32 %6, 23742 %29 = icmp eq i32 %28, 10243743 br i1 %29, label %4, label %53744}3745 3746define void @unroll_minmax(ptr nocapture %0, ptr nocapture readonly %1, i32 %2) {3747; SOFT-LABEL: unroll_minmax:3748; SOFT: @ %bb.0:3749; SOFT-NEXT: .save {r4, r5, r6, r7, lr}3750; SOFT-NEXT: push {r4, r5, r6, r7, lr}3751; SOFT-NEXT: .pad #123752; SOFT-NEXT: sub sp, #123753; SOFT-NEXT: mov r4, r13754; SOFT-NEXT: mov r5, r03755; SOFT-NEXT: movs r0, #03756; SOFT-NEXT: str r0, [sp] @ 4-byte Spill3757; SOFT-NEXT: mvns r0, r03758; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill3759; SOFT-NEXT: movs r0, #13760; SOFT-NEXT: lsls r1, r0, #313761; SOFT-NEXT: str r1, [sp, #4] @ 4-byte Spill3762; SOFT-NEXT: lsls r7, r0, #103763; SOFT-NEXT: b .LBB55_23764; SOFT-NEXT: .LBB55_1: @ in Loop: Header=BB55_2 Depth=13765; SOFT-NEXT: str r0, [r5, #4]3766; SOFT-NEXT: adds r4, #83767; SOFT-NEXT: adds r5, #83768; SOFT-NEXT: subs r7, r7, #23769; SOFT-NEXT: beq .LBB55_143770; SOFT-NEXT: .LBB55_2: @ =>This Inner Loop Header: Depth=13771; SOFT-NEXT: ldr r0, [r4]3772; SOFT-NEXT: movs r1, #793773; SOFT-NEXT: lsls r6, r1, #243774; SOFT-NEXT: mov r1, r63775; SOFT-NEXT: bl __aeabi_fmul3776; SOFT-NEXT: bl __aeabi_f2lz3777; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3778; SOFT-NEXT: subs r2, r2, r03779; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload3780; SOFT-NEXT: sbcs r2, r13781; SOFT-NEXT: blt .LBB55_43782; SOFT-NEXT: @ %bb.3: @ in Loop: Header=BB55_2 Depth=13783; SOFT-NEXT: ldr r1, [sp, #8] @ 4-byte Reload3784; SOFT-NEXT: .LBB55_4: @ in Loop: Header=BB55_2 Depth=13785; SOFT-NEXT: blt .LBB55_63786; SOFT-NEXT: @ %bb.5: @ in Loop: Header=BB55_2 Depth=13787; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload3788; SOFT-NEXT: .LBB55_6: @ in Loop: Header=BB55_2 Depth=13789; SOFT-NEXT: ldr r2, .LCPI55_03790; SOFT-NEXT: subs r2, r0, r23791; SOFT-NEXT: ldr r2, [sp] @ 4-byte Reload3792; SOFT-NEXT: sbcs r1, r23793; SOFT-NEXT: blt .LBB55_83794; SOFT-NEXT: @ %bb.7: @ in Loop: Header=BB55_2 Depth=13795; SOFT-NEXT: ldr r0, .LCPI55_03796; SOFT-NEXT: .LBB55_8: @ in Loop: Header=BB55_2 Depth=13797; SOFT-NEXT: str r0, [r5]3798; SOFT-NEXT: ldr r0, [r4, #4]3799; SOFT-NEXT: mov r1, r63800; SOFT-NEXT: bl __aeabi_fmul3801; SOFT-NEXT: bl __aeabi_f2lz3802; SOFT-NEXT: ldr r2, [sp, #4] @ 4-byte Reload3803; SOFT-NEXT: subs r2, r2, r03804; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload3805; SOFT-NEXT: sbcs r2, r13806; SOFT-NEXT: blt .LBB55_103807; SOFT-NEXT: @ %bb.9: @ in Loop: Header=BB55_2 Depth=13808; SOFT-NEXT: ldr r1, [sp, #8] @ 4-byte Reload3809; SOFT-NEXT: .LBB55_10: @ in Loop: Header=BB55_2 Depth=13810; SOFT-NEXT: blt .LBB55_123811; SOFT-NEXT: @ %bb.11: @ in Loop: Header=BB55_2 Depth=13812; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload3813; SOFT-NEXT: .LBB55_12: @ in Loop: Header=BB55_2 Depth=13814; SOFT-NEXT: ldr r2, .LCPI55_03815; SOFT-NEXT: subs r2, r0, r23816; SOFT-NEXT: ldr r2, [sp] @ 4-byte Reload3817; SOFT-NEXT: sbcs r1, r23818; SOFT-NEXT: blt .LBB55_13819; SOFT-NEXT: @ %bb.13: @ in Loop: Header=BB55_2 Depth=13820; SOFT-NEXT: ldr r0, .LCPI55_03821; SOFT-NEXT: b .LBB55_13822; SOFT-NEXT: .LBB55_14:3823; SOFT-NEXT: add sp, #123824; SOFT-NEXT: pop {r4, r5, r6, r7, pc}3825; SOFT-NEXT: .p2align 23826; SOFT-NEXT: @ %bb.15:3827; SOFT-NEXT: .LCPI55_0:3828; SOFT-NEXT: .long 2147483647 @ 0x7fffffff3829;3830; VFP2-LABEL: unroll_minmax:3831; VFP2: @ %bb.0:3832; VFP2-NEXT: subs r1, #83833; VFP2-NEXT: subs r0, #83834; VFP2-NEXT: vldr s0, .LCPI55_03835; VFP2-NEXT: mov.w r2, #10243836; VFP2-NEXT: .LBB55_1: @ =>This Inner Loop Header: Depth=13837; VFP2-NEXT: vldr s2, [r1, #8]3838; VFP2-NEXT: subs r2, #23839; VFP2-NEXT: vmul.f32 s2, s2, s03840; VFP2-NEXT: vcvt.s32.f32 s2, s23841; VFP2-NEXT: vmov r3, s23842; VFP2-NEXT: str r3, [r0, #8]!3843; VFP2-NEXT: vldr s2, [r1, #12]3844; VFP2-NEXT: add.w r1, r1, #83845; VFP2-NEXT: vmul.f32 s2, s2, s03846; VFP2-NEXT: vcvt.s32.f32 s2, s23847; VFP2-NEXT: vstr s2, [r0, #4]3848; VFP2-NEXT: bne .LBB55_13849; VFP2-NEXT: @ %bb.2:3850; VFP2-NEXT: bx lr3851; VFP2-NEXT: .p2align 23852; VFP2-NEXT: @ %bb.3:3853; VFP2-NEXT: .LCPI55_0:3854; VFP2-NEXT: .long 0x4f000000 @ float 2.14748365E+93855;3856; FULL-LABEL: unroll_minmax:3857; FULL: @ %bb.0:3858; FULL-NEXT: .save {r7, lr}3859; FULL-NEXT: push {r7, lr}3860; FULL-NEXT: mov.w lr, #5123861; FULL-NEXT: subs r1, #83862; FULL-NEXT: subs r0, #83863; FULL-NEXT: vldr s0, .LCPI55_03864; FULL-NEXT: .LBB55_1: @ =>This Inner Loop Header: Depth=13865; FULL-NEXT: vldr s2, [r1, #8]3866; FULL-NEXT: vmul.f32 s2, s2, s03867; FULL-NEXT: vcvt.s32.f32 s2, s23868; FULL-NEXT: vmov r2, s23869; FULL-NEXT: str r2, [r0, #8]!3870; FULL-NEXT: vldr s2, [r1, #12]3871; FULL-NEXT: adds r1, #83872; FULL-NEXT: vmul.f32 s2, s2, s03873; FULL-NEXT: vcvt.s32.f32 s2, s23874; FULL-NEXT: vstr s2, [r0, #4]3875; FULL-NEXT: le lr, .LBB55_13876; FULL-NEXT: @ %bb.2:3877; FULL-NEXT: pop {r7, pc}3878; FULL-NEXT: .p2align 23879; FULL-NEXT: @ %bb.3:3880; FULL-NEXT: .LCPI55_0:3881; FULL-NEXT: .long 0x4f000000 @ float 2.14748365E+93882 br label %53883 38844: ; preds = %53885 ret void3886 38875: ; preds = %5, %33888 %6 = phi i32 [ 0, %3 ], [ %28, %5 ]3889 %7 = getelementptr inbounds float, ptr %1, i32 %63890 %8 = load float, ptr %7, align 43891 %9 = fmul float %8, 0x41E00000000000003892 %10 = fptosi float %9 to i643893 %11 = icmp sgt i64 %10, -21474836483894 %12 = select i1 %11, i64 %10, i64 -21474836483895 %13 = icmp slt i64 %12, 21474836473896 %14 = select i1 %13, i64 %12, i64 21474836473897 %15 = trunc i64 %14 to i323898 %16 = getelementptr inbounds i32, ptr %0, i32 %63899 store i32 %15, ptr %16, align 43900 %17 = or disjoint i32 %6, 13901 %18 = getelementptr inbounds float, ptr %1, i32 %173902 %19 = load float, ptr %18, align 43903 %20 = fmul float %19, 0x41E00000000000003904 %21 = fptosi float %20 to i643905 %22 = icmp sgt i64 %21, -21474836483906 %23 = select i1 %22, i64 %21, i64 -21474836483907 %24 = icmp slt i64 %23, 21474836473908 %25 = select i1 %24, i64 %23, i64 21474836473909 %26 = trunc i64 %25 to i323910 %27 = getelementptr inbounds i32, ptr %0, i32 %173911 store i32 %26, ptr %27, align 43912 %28 = add nuw nsw i32 %6, 23913 %29 = icmp eq i32 %28, 10243914 br i1 %29, label %4, label %53915}3916 3917define i32 @stest_f32i32i64(float %x) {3918; SOFT-LABEL: stest_f32i32i64:3919; SOFT: @ %bb.0: @ %entry3920; SOFT-NEXT: .save {r4, lr}3921; SOFT-NEXT: push {r4, lr}3922; SOFT-NEXT: bl __aeabi_f2lz3923; SOFT-NEXT: movs r3, #03924; SOFT-NEXT: ldr r2, .LCPI56_03925; SOFT-NEXT: subs r4, r0, r23926; SOFT-NEXT: sbcs r1, r33927; SOFT-NEXT: blt .LBB56_23928; SOFT-NEXT: @ %bb.1: @ %entry3929; SOFT-NEXT: mov r0, r23930; SOFT-NEXT: .LBB56_2: @ %entry3931; SOFT-NEXT: ldr r1, .LCPI56_13932; SOFT-NEXT: cmp r0, r13933; SOFT-NEXT: bgt .LBB56_43934; SOFT-NEXT: @ %bb.3: @ %entry3935; SOFT-NEXT: mov r0, r13936; SOFT-NEXT: .LBB56_4: @ %entry3937; SOFT-NEXT: pop {r4, pc}3938; SOFT-NEXT: .p2align 23939; SOFT-NEXT: @ %bb.5:3940; SOFT-NEXT: .LCPI56_0:3941; SOFT-NEXT: .long 32767 @ 0x7fff3942; SOFT-NEXT: .LCPI56_1:3943; SOFT-NEXT: .long 4294934528 @ 0xffff80003944;3945; VFP2-LABEL: stest_f32i32i64:3946; VFP2: @ %bb.0: @ %entry3947; VFP2-NEXT: .save {r7, lr}3948; VFP2-NEXT: push {r7, lr}3949; VFP2-NEXT: vmov r0, s03950; VFP2-NEXT: bl __aeabi_f2lz3951; VFP2-NEXT: movw r2, #327673952; VFP2-NEXT: subs r3, r0, r23953; VFP2-NEXT: sbcs r1, r1, #03954; VFP2-NEXT: it ge3955; VFP2-NEXT: movge r0, r23956; VFP2-NEXT: movw r1, #327683957; VFP2-NEXT: cmn.w r0, #327683958; VFP2-NEXT: movt r1, #655353959; VFP2-NEXT: it le3960; VFP2-NEXT: movle r0, r13961; VFP2-NEXT: pop {r7, pc}3962;3963; FULL-LABEL: stest_f32i32i64:3964; FULL: @ %bb.0: @ %entry3965; FULL-NEXT: .save {r7, lr}3966; FULL-NEXT: push {r7, lr}3967; FULL-NEXT: vmov r0, s03968; FULL-NEXT: bl __aeabi_f2lz3969; FULL-NEXT: movw r2, #327673970; FULL-NEXT: subs r3, r0, r23971; FULL-NEXT: sbcs r1, r1, #03972; FULL-NEXT: csel r0, r0, r2, lt3973; FULL-NEXT: movw r1, #327683974; FULL-NEXT: movt r1, #655353975; FULL-NEXT: cmn.w r0, #327683976; FULL-NEXT: csel r0, r0, r1, gt3977; FULL-NEXT: pop {r7, pc}3978entry:3979 %conv = fptosi float %x to i643980 %convt = trunc i64 %conv to i323981 %0 = icmp slt i64 %conv, 327673982 %spec.store.select = select i1 %0, i32 %convt, i32 327673983 %1 = icmp sgt i32 %spec.store.select, -327683984 %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -327683985 ret i32 %spec.store.select73986}3987 3988; i32 non saturate3989 3990define i32 @ustest_f16i32_nsat(half %x) {3991; SOFT-LABEL: ustest_f16i32_nsat:3992; SOFT: @ %bb.0:3993; SOFT-NEXT: .save {r7, lr}3994; SOFT-NEXT: push {r7, lr}3995; SOFT-NEXT: uxth r0, r03996; SOFT-NEXT: bl __aeabi_h2f3997; SOFT-NEXT: bl __aeabi_f2iz3998; SOFT-NEXT: asrs r1, r0, #313999; SOFT-NEXT: ands r0, r14000; SOFT-NEXT: asrs r1, r0, #314001; SOFT-NEXT: bics r0, r14002; SOFT-NEXT: pop {r7, pc}4003;4004; VFP2-LABEL: ustest_f16i32_nsat:4005; VFP2: @ %bb.0:4006; VFP2-NEXT: .save {r7, lr}4007; VFP2-NEXT: push {r7, lr}4008; VFP2-NEXT: vmov r0, s04009; VFP2-NEXT: bl __aeabi_h2f4010; VFP2-NEXT: vmov s0, r04011; VFP2-NEXT: vcvt.s32.f32 s0, s04012; VFP2-NEXT: vmov r0, s04013; VFP2-NEXT: usat r0, #0, r04014; VFP2-NEXT: pop {r7, pc}4015;4016; FULL-LABEL: ustest_f16i32_nsat:4017; FULL: @ %bb.0:4018; FULL-NEXT: vcvt.s32.f16 s0, s04019; FULL-NEXT: vmov r0, s04020; FULL-NEXT: usat r0, #0, r04021; FULL-NEXT: bx lr4022 %conv = fptosi half %x to i324023 %spec.store.select = call i32 @llvm.smin.i32(i32 0, i32 %conv)4024 %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)4025 ret i32 %spec.store.select74026}4027 4028 4029 4030declare i32 @llvm.smin.i32(i32, i32)4031declare i32 @llvm.smax.i32(i32, i32)4032declare i32 @llvm.umin.i32(i32, i32)4033declare i64 @llvm.smin.i64(i64, i64)4034declare i64 @llvm.smax.i64(i64, i64)4035declare i64 @llvm.umin.i64(i64, i64)4036declare i128 @llvm.smin.i128(i128, i128)4037declare i128 @llvm.smax.i128(i128, i128)4038declare i128 @llvm.umin.i128(i128, i128)4039