1500 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -mtriple=armv7a-none-eabihf -mattr=+neon,+vfp4 %s -o - | FileCheck %s3 4define <4 x float> @add_v4f32(<4 x float> %x, <4 x float> %y) #0 {5; CHECK-LABEL: add_v4f32:6; CHECK: @ %bb.0:7; CHECK-NEXT: vadd.f32 s11, s3, s78; CHECK-NEXT: vadd.f32 s10, s2, s69; CHECK-NEXT: vadd.f32 s9, s1, s510; CHECK-NEXT: vadd.f32 s8, s0, s411; CHECK-NEXT: vorr q0, q2, q212; CHECK-NEXT: bx lr13 %val = call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> %x, <4 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #014 ret <4 x float> %val15}16 17define <4 x float> @sub_v4f32(<4 x float> %x, <4 x float> %y) #0 {18; CHECK-LABEL: sub_v4f32:19; CHECK: @ %bb.0:20; CHECK-NEXT: vsub.f32 s11, s3, s721; CHECK-NEXT: vsub.f32 s10, s2, s622; CHECK-NEXT: vsub.f32 s9, s1, s523; CHECK-NEXT: vsub.f32 s8, s0, s424; CHECK-NEXT: vorr q0, q2, q225; CHECK-NEXT: bx lr26 %val = call <4 x float> @llvm.experimental.constrained.fsub.v4f32(<4 x float> %x, <4 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #027 ret <4 x float> %val28}29 30define <4 x float> @mul_v4f32(<4 x float> %x, <4 x float> %y) #0 {31; CHECK-LABEL: mul_v4f32:32; CHECK: @ %bb.0:33; CHECK-NEXT: vmul.f32 s11, s3, s734; CHECK-NEXT: vmul.f32 s10, s2, s635; CHECK-NEXT: vmul.f32 s9, s1, s536; CHECK-NEXT: vmul.f32 s8, s0, s437; CHECK-NEXT: vorr q0, q2, q238; CHECK-NEXT: bx lr39 %val = call <4 x float> @llvm.experimental.constrained.fmul.v4f32(<4 x float> %x, <4 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #040 ret <4 x float> %val41}42 43define <4 x float> @div_v4f32(<4 x float> %x, <4 x float> %y) #0 {44; CHECK-LABEL: div_v4f32:45; CHECK: @ %bb.0:46; CHECK-NEXT: vdiv.f32 s11, s3, s747; CHECK-NEXT: vdiv.f32 s10, s2, s648; CHECK-NEXT: vdiv.f32 s9, s1, s549; CHECK-NEXT: vdiv.f32 s8, s0, s450; CHECK-NEXT: vorr q0, q2, q251; CHECK-NEXT: bx lr52 %val = call <4 x float> @llvm.experimental.constrained.fdiv.v4f32(<4 x float> %x, <4 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #053 ret <4 x float> %val54}55 56define <4 x float> @fma_v4f32(<4 x float> %x, <4 x float> %y, <4 x float> %z) #0 {57; CHECK-LABEL: fma_v4f32:58; CHECK: @ %bb.0:59; CHECK-NEXT: vfma.f32 s11, s3, s760; CHECK-NEXT: vfma.f32 s10, s2, s661; CHECK-NEXT: vfma.f32 s9, s1, s562; CHECK-NEXT: vfma.f32 s8, s0, s463; CHECK-NEXT: vorr q0, q2, q264; CHECK-NEXT: bx lr65 %val = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %x, <4 x float> %y, <4 x float> %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #066 ret <4 x float> %val67}68 69define <4 x i32> @fptosi_v4i32_v4f32(<4 x float> %x) #0 {70; CHECK-LABEL: fptosi_v4i32_v4f32:71; CHECK: @ %bb.0:72; CHECK-NEXT: vcvt.s32.f32 s4, s273; CHECK-NEXT: vcvt.s32.f32 s6, s074; CHECK-NEXT: vcvt.s32.f32 s0, s175; CHECK-NEXT: vmov r0, s476; CHECK-NEXT: vcvt.s32.f32 s4, s377; CHECK-NEXT: vmov.32 d17[0], r078; CHECK-NEXT: vmov r0, s679; CHECK-NEXT: vmov.32 d16[0], r080; CHECK-NEXT: vmov r0, s481; CHECK-NEXT: vmov.32 d17[1], r082; CHECK-NEXT: vmov r0, s083; CHECK-NEXT: vmov.32 d16[1], r084; CHECK-NEXT: vorr q0, q8, q885; CHECK-NEXT: bx lr86 %val = call <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #087 ret <4 x i32> %val88}89 90define <4 x i32> @fptoui_v4i32_v4f32(<4 x float> %x) #0 {91; CHECK-LABEL: fptoui_v4i32_v4f32:92; CHECK: @ %bb.0:93; CHECK-NEXT: vcvt.u32.f32 s4, s294; CHECK-NEXT: vcvt.u32.f32 s6, s095; CHECK-NEXT: vcvt.u32.f32 s0, s196; CHECK-NEXT: vmov r0, s497; CHECK-NEXT: vcvt.u32.f32 s4, s398; CHECK-NEXT: vmov.32 d17[0], r099; CHECK-NEXT: vmov r0, s6100; CHECK-NEXT: vmov.32 d16[0], r0101; CHECK-NEXT: vmov r0, s4102; CHECK-NEXT: vmov.32 d17[1], r0103; CHECK-NEXT: vmov r0, s0104; CHECK-NEXT: vmov.32 d16[1], r0105; CHECK-NEXT: vorr q0, q8, q8106; CHECK-NEXT: bx lr107 %val = call <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0108 ret <4 x i32> %val109}110 111define <4 x i64> @fptosi_v4i64_v4f32(<4 x float> %x) #0 {112; CHECK-LABEL: fptosi_v4i64_v4f32:113; CHECK: @ %bb.0:114; CHECK-NEXT: .save {r4, r5, r6, r7, r11, lr}115; CHECK-NEXT: push {r4, r5, r6, r7, r11, lr}116; CHECK-NEXT: .vsave {d8, d9, d10, d11}117; CHECK-NEXT: vpush {d8, d9, d10, d11}118; CHECK-NEXT: vorr q4, q0, q0119; CHECK-NEXT: vmov r0, s19120; CHECK-NEXT: bl __aeabi_f2lz121; CHECK-NEXT: mov r4, r1122; CHECK-NEXT: vmov r1, s16123; CHECK-NEXT: vmov r5, s17124; CHECK-NEXT: vmov r6, s18125; CHECK-NEXT: vmov.32 d9[0], r0126; CHECK-NEXT: mov r0, r1127; CHECK-NEXT: bl __aeabi_f2lz128; CHECK-NEXT: vmov.32 d10[0], r0129; CHECK-NEXT: mov r0, r5130; CHECK-NEXT: mov r7, r1131; CHECK-NEXT: bl __aeabi_f2lz132; CHECK-NEXT: vmov.32 d11[0], r0133; CHECK-NEXT: mov r0, r6134; CHECK-NEXT: mov r5, r1135; CHECK-NEXT: bl __aeabi_f2lz136; CHECK-NEXT: vmov.32 d8[0], r0137; CHECK-NEXT: vmov.32 d11[1], r5138; CHECK-NEXT: vmov.32 d9[1], r4139; CHECK-NEXT: vmov.32 d10[1], r7140; CHECK-NEXT: vmov.32 d8[1], r1141; CHECK-NEXT: vorr q0, q5, q5142; CHECK-NEXT: vorr q1, q4, q4143; CHECK-NEXT: vpop {d8, d9, d10, d11}144; CHECK-NEXT: pop {r4, r5, r6, r7, r11, pc}145 %val = call <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0146 ret <4 x i64> %val147}148 149define <4 x i64> @fptoui_v4i64_v4f32(<4 x float> %x) #0 {150; CHECK-LABEL: fptoui_v4i64_v4f32:151; CHECK: @ %bb.0:152; CHECK-NEXT: .save {r4, r5, r6, r7, r11, lr}153; CHECK-NEXT: push {r4, r5, r6, r7, r11, lr}154; CHECK-NEXT: .vsave {d8, d9, d10, d11}155; CHECK-NEXT: vpush {d8, d9, d10, d11}156; CHECK-NEXT: vorr q4, q0, q0157; CHECK-NEXT: vmov r0, s19158; CHECK-NEXT: bl __aeabi_f2ulz159; CHECK-NEXT: mov r4, r1160; CHECK-NEXT: vmov r1, s16161; CHECK-NEXT: vmov r5, s17162; CHECK-NEXT: vmov r6, s18163; CHECK-NEXT: vmov.32 d9[0], r0164; CHECK-NEXT: mov r0, r1165; CHECK-NEXT: bl __aeabi_f2ulz166; CHECK-NEXT: vmov.32 d10[0], r0167; CHECK-NEXT: mov r0, r5168; CHECK-NEXT: mov r7, r1169; CHECK-NEXT: bl __aeabi_f2ulz170; CHECK-NEXT: vmov.32 d11[0], r0171; CHECK-NEXT: mov r0, r6172; CHECK-NEXT: mov r5, r1173; CHECK-NEXT: bl __aeabi_f2ulz174; CHECK-NEXT: vmov.32 d8[0], r0175; CHECK-NEXT: vmov.32 d11[1], r5176; CHECK-NEXT: vmov.32 d9[1], r4177; CHECK-NEXT: vmov.32 d10[1], r7178; CHECK-NEXT: vmov.32 d8[1], r1179; CHECK-NEXT: vorr q0, q5, q5180; CHECK-NEXT: vorr q1, q4, q4181; CHECK-NEXT: vpop {d8, d9, d10, d11}182; CHECK-NEXT: pop {r4, r5, r6, r7, r11, pc}183 %val = call <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0184 ret <4 x i64> %val185}186 187define <4 x float> @sitofp_v4f32_v4i32(<4 x i32> %x) #0 {188; CHECK-LABEL: sitofp_v4f32_v4i32:189; CHECK: @ %bb.0:190; CHECK-NEXT: .pad #32191; CHECK-NEXT: sub sp, sp, #32192; CHECK-NEXT: vmov r12, r1, d0193; CHECK-NEXT: movw r0, #0194; CHECK-NEXT: vmov r2, r3, d1195; CHECK-NEXT: movt r0, #17200196; CHECK-NEXT: str r0, [sp, #20]197; CHECK-NEXT: vldr d16, .LCPI9_0198; CHECK-NEXT: eor r1, r1, #-2147483648199; CHECK-NEXT: str r1, [sp, #16]200; CHECK-NEXT: str r0, [sp, #12]201; CHECK-NEXT: eor r1, r2, #-2147483648202; CHECK-NEXT: vldr d17, [sp, #16]203; CHECK-NEXT: stmib sp, {r0, r1}204; CHECK-NEXT: eor r1, r3, #-2147483648205; CHECK-NEXT: vsub.f64 d17, d17, d16206; CHECK-NEXT: vldr d18, [sp, #8]207; CHECK-NEXT: str r1, [sp]208; CHECK-NEXT: str r0, [sp, #28]209; CHECK-NEXT: eor r0, r12, #-2147483648210; CHECK-NEXT: vldr d19, [sp]211; CHECK-NEXT: str r0, [sp, #24]212; CHECK-NEXT: vsub.f64 d18, d18, d16213; CHECK-NEXT: vsub.f64 d19, d19, d16214; CHECK-NEXT: vldr d20, [sp, #24]215; CHECK-NEXT: vcvt.f32.f64 s3, d19216; CHECK-NEXT: vsub.f64 d16, d20, d16217; CHECK-NEXT: vcvt.f32.f64 s2, d18218; CHECK-NEXT: vcvt.f32.f64 s1, d17219; CHECK-NEXT: vcvt.f32.f64 s0, d16220; CHECK-NEXT: add sp, sp, #32221; CHECK-NEXT: bx lr222; CHECK-NEXT: .p2align 3223; CHECK-NEXT: @ %bb.1:224; CHECK-NEXT: .LCPI9_0:225; CHECK-NEXT: .long 2147483648 @ double 4503601774854144226; CHECK-NEXT: .long 1127219200227 %val = call <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0228 ret <4 x float> %val229}230 231define <4 x float> @uitofp_v4f32_v4i32(<4 x i32> %x) #0 {232; CHECK-LABEL: uitofp_v4f32_v4i32:233; CHECK: @ %bb.0:234; CHECK-NEXT: .pad #32235; CHECK-NEXT: sub sp, sp, #32236; CHECK-NEXT: vmov r0, r1, d1237; CHECK-NEXT: movw r2, #0238; CHECK-NEXT: vmov r12, r3, d0239; CHECK-NEXT: movt r2, #17200240; CHECK-NEXT: stm sp, {r1, r2}241; CHECK-NEXT: vldr d17, [sp]242; CHECK-NEXT: vldr d16, .LCPI10_0243; CHECK-NEXT: str r2, [sp, #12]244; CHECK-NEXT: vsub.f64 d17, d17, d16245; CHECK-NEXT: vcvt.f32.f64 s3, d17246; CHECK-NEXT: str r0, [sp, #8]247; CHECK-NEXT: vldr d18, [sp, #8]248; CHECK-NEXT: str r2, [sp, #20]249; CHECK-NEXT: str r3, [sp, #16]250; CHECK-NEXT: vsub.f64 d18, d18, d16251; CHECK-NEXT: vldr d19, [sp, #16]252; CHECK-NEXT: str r2, [sp, #28]253; CHECK-NEXT: vcvt.f32.f64 s2, d18254; CHECK-NEXT: str r12, [sp, #24]255; CHECK-NEXT: vldr d20, [sp, #24]256; CHECK-NEXT: vsub.f64 d19, d19, d16257; CHECK-NEXT: vsub.f64 d16, d20, d16258; CHECK-NEXT: vcvt.f32.f64 s1, d19259; CHECK-NEXT: vcvt.f32.f64 s0, d16260; CHECK-NEXT: add sp, sp, #32261; CHECK-NEXT: bx lr262; CHECK-NEXT: .p2align 3263; CHECK-NEXT: @ %bb.1:264; CHECK-NEXT: .LCPI10_0:265; CHECK-NEXT: .long 0 @ double 4503599627370496266; CHECK-NEXT: .long 1127219200267 %val = call <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0268 ret <4 x float> %val269}270 271define <4 x float> @sitofp_v4f32_v4i64(<4 x i64> %x) #0 {272; CHECK-LABEL: sitofp_v4f32_v4i64:273; CHECK: @ %bb.0:274; CHECK-NEXT: .save {r4, r5, r6, lr}275; CHECK-NEXT: push {r4, r5, r6, lr}276; CHECK-NEXT: .vsave {d8, d9, d10, d11}277; CHECK-NEXT: vpush {d8, d9, d10, d11}278; CHECK-NEXT: vorr q4, q1, q1279; CHECK-NEXT: vorr q5, q0, q0280; CHECK-NEXT: vmov r0, r1, d8281; CHECK-NEXT: bl __aeabi_l2f282; CHECK-NEXT: mov r4, r0283; CHECK-NEXT: vmov r0, r1, d9284; CHECK-NEXT: bl __aeabi_l2f285; CHECK-NEXT: vmov r2, r1, d11286; CHECK-NEXT: vmov s19, r0287; CHECK-NEXT: vmov r5, r6, d10288; CHECK-NEXT: vmov s18, r4289; CHECK-NEXT: mov r0, r2290; CHECK-NEXT: bl __aeabi_l2f291; CHECK-NEXT: vmov s17, r0292; CHECK-NEXT: mov r0, r5293; CHECK-NEXT: mov r1, r6294; CHECK-NEXT: bl __aeabi_l2f295; CHECK-NEXT: vmov s16, r0296; CHECK-NEXT: vorr q0, q4, q4297; CHECK-NEXT: vpop {d8, d9, d10, d11}298; CHECK-NEXT: pop {r4, r5, r6, pc}299 %val = call <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i64(<4 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0300 ret <4 x float> %val301}302 303define <4 x float> @uitofp_v4f32_v4i64(<4 x i64> %x) #0 {304; CHECK-LABEL: uitofp_v4f32_v4i64:305; CHECK: @ %bb.0:306; CHECK-NEXT: .save {r4, r5, r6, lr}307; CHECK-NEXT: push {r4, r5, r6, lr}308; CHECK-NEXT: .vsave {d8, d9, d10, d11}309; CHECK-NEXT: vpush {d8, d9, d10, d11}310; CHECK-NEXT: vorr q4, q1, q1311; CHECK-NEXT: vorr q5, q0, q0312; CHECK-NEXT: vmov r0, r1, d8313; CHECK-NEXT: bl __aeabi_ul2f314; CHECK-NEXT: mov r4, r0315; CHECK-NEXT: vmov r0, r1, d9316; CHECK-NEXT: bl __aeabi_ul2f317; CHECK-NEXT: vmov r2, r1, d11318; CHECK-NEXT: vmov s19, r0319; CHECK-NEXT: vmov r5, r6, d10320; CHECK-NEXT: vmov s18, r4321; CHECK-NEXT: mov r0, r2322; CHECK-NEXT: bl __aeabi_ul2f323; CHECK-NEXT: vmov s17, r0324; CHECK-NEXT: mov r0, r5325; CHECK-NEXT: mov r1, r6326; CHECK-NEXT: bl __aeabi_ul2f327; CHECK-NEXT: vmov s16, r0328; CHECK-NEXT: vorr q0, q4, q4329; CHECK-NEXT: vpop {d8, d9, d10, d11}330; CHECK-NEXT: pop {r4, r5, r6, pc}331 %val = call <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i64(<4 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0332 ret <4 x float> %val333}334 335define <4 x float> @sqrt_v4f32(<4 x float> %x) #0 {336; CHECK-LABEL: sqrt_v4f32:337; CHECK: @ %bb.0:338; CHECK-NEXT: vsqrt.f32 s7, s3339; CHECK-NEXT: vsqrt.f32 s6, s2340; CHECK-NEXT: vsqrt.f32 s5, s1341; CHECK-NEXT: vsqrt.f32 s4, s0342; CHECK-NEXT: vorr q0, q1, q1343; CHECK-NEXT: bx lr344 %val = call <4 x float> @llvm.experimental.constrained.sqrt.v4f32(<4 x float> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0345 ret <4 x float> %val346}347 348define <4 x float> @rint_v4f32(<4 x float> %x) #0 {349; CHECK-LABEL: rint_v4f32:350; CHECK: @ %bb.0:351; CHECK-NEXT: .save {r11, lr}352; CHECK-NEXT: push {r11, lr}353; CHECK-NEXT: .vsave {d8, d9, d10, d11}354; CHECK-NEXT: vpush {d8, d9, d10, d11}355; CHECK-NEXT: vorr q5, q0, q0356; CHECK-NEXT: vmov.f32 s0, s23357; CHECK-NEXT: bl rintf358; CHECK-NEXT: vmov.f32 s19, s0359; CHECK-NEXT: vmov.f32 s0, s22360; CHECK-NEXT: bl rintf361; CHECK-NEXT: vmov.f32 s18, s0362; CHECK-NEXT: vmov.f32 s0, s21363; CHECK-NEXT: bl rintf364; CHECK-NEXT: vmov.f32 s17, s0365; CHECK-NEXT: vmov.f32 s0, s20366; CHECK-NEXT: bl rintf367; CHECK-NEXT: vmov.f32 s16, s0368; CHECK-NEXT: vorr q0, q4, q4369; CHECK-NEXT: vpop {d8, d9, d10, d11}370; CHECK-NEXT: pop {r11, pc}371 %val = call <4 x float> @llvm.experimental.constrained.rint.v4f32(<4 x float> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0372 ret <4 x float> %val373}374 375define <4 x float> @nearbyint_v4f32(<4 x float> %x) #0 {376; CHECK-LABEL: nearbyint_v4f32:377; CHECK: @ %bb.0:378; CHECK-NEXT: .save {r11, lr}379; CHECK-NEXT: push {r11, lr}380; CHECK-NEXT: .vsave {d8, d9, d10, d11}381; CHECK-NEXT: vpush {d8, d9, d10, d11}382; CHECK-NEXT: vorr q5, q0, q0383; CHECK-NEXT: vmov.f32 s0, s23384; CHECK-NEXT: bl nearbyintf385; CHECK-NEXT: vmov.f32 s19, s0386; CHECK-NEXT: vmov.f32 s0, s22387; CHECK-NEXT: bl nearbyintf388; CHECK-NEXT: vmov.f32 s18, s0389; CHECK-NEXT: vmov.f32 s0, s21390; CHECK-NEXT: bl nearbyintf391; CHECK-NEXT: vmov.f32 s17, s0392; CHECK-NEXT: vmov.f32 s0, s20393; CHECK-NEXT: bl nearbyintf394; CHECK-NEXT: vmov.f32 s16, s0395; CHECK-NEXT: vorr q0, q4, q4396; CHECK-NEXT: vpop {d8, d9, d10, d11}397; CHECK-NEXT: pop {r11, pc}398 %val = call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0399 ret <4 x float> %val400}401 402define <4 x float> @maxnum_v4f32(<4 x float> %x, <4 x float> %y) #0 {403; CHECK-LABEL: maxnum_v4f32:404; CHECK: @ %bb.0:405; CHECK-NEXT: .save {r11, lr}406; CHECK-NEXT: push {r11, lr}407; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13}408; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13}409; CHECK-NEXT: vorr q5, q0, q0410; CHECK-NEXT: vorr q4, q1, q1411; CHECK-NEXT: vmov.f32 s0, s23412; CHECK-NEXT: vmov.f32 s1, s19413; CHECK-NEXT: bl fmaxf414; CHECK-NEXT: vmov.f32 s27, s0415; CHECK-NEXT: vmov.f32 s0, s22416; CHECK-NEXT: vmov.f32 s1, s18417; CHECK-NEXT: bl fmaxf418; CHECK-NEXT: vmov.f32 s26, s0419; CHECK-NEXT: vmov.f32 s0, s21420; CHECK-NEXT: vmov.f32 s1, s17421; CHECK-NEXT: bl fmaxf422; CHECK-NEXT: vmov.f32 s25, s0423; CHECK-NEXT: vmov.f32 s0, s20424; CHECK-NEXT: vmov.f32 s1, s16425; CHECK-NEXT: bl fmaxf426; CHECK-NEXT: vmov.f32 s24, s0427; CHECK-NEXT: vorr q0, q6, q6428; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13}429; CHECK-NEXT: pop {r11, pc}430 %val = call <4 x float> @llvm.experimental.constrained.maxnum.v4f32(<4 x float> %x, <4 x float> %y, metadata !"fpexcept.strict") #0431 ret <4 x float> %val432}433 434define <4 x float> @minnum_v4f32(<4 x float> %x, <4 x float> %y) #0 {435; CHECK-LABEL: minnum_v4f32:436; CHECK: @ %bb.0:437; CHECK-NEXT: .save {r11, lr}438; CHECK-NEXT: push {r11, lr}439; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13}440; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13}441; CHECK-NEXT: vorr q5, q0, q0442; CHECK-NEXT: vorr q4, q1, q1443; CHECK-NEXT: vmov.f32 s0, s23444; CHECK-NEXT: vmov.f32 s1, s19445; CHECK-NEXT: bl fminf446; CHECK-NEXT: vmov.f32 s27, s0447; CHECK-NEXT: vmov.f32 s0, s22448; CHECK-NEXT: vmov.f32 s1, s18449; CHECK-NEXT: bl fminf450; CHECK-NEXT: vmov.f32 s26, s0451; CHECK-NEXT: vmov.f32 s0, s21452; CHECK-NEXT: vmov.f32 s1, s17453; CHECK-NEXT: bl fminf454; CHECK-NEXT: vmov.f32 s25, s0455; CHECK-NEXT: vmov.f32 s0, s20456; CHECK-NEXT: vmov.f32 s1, s16457; CHECK-NEXT: bl fminf458; CHECK-NEXT: vmov.f32 s24, s0459; CHECK-NEXT: vorr q0, q6, q6460; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13}461; CHECK-NEXT: pop {r11, pc}462 %val = call <4 x float> @llvm.experimental.constrained.minnum.v4f32(<4 x float> %x, <4 x float> %y, metadata !"fpexcept.strict") #0463 ret <4 x float> %val464}465 466define <4 x float> @ceil_v4f32(<4 x float> %x) #0 {467; CHECK-LABEL: ceil_v4f32:468; CHECK: @ %bb.0:469; CHECK-NEXT: .save {r11, lr}470; CHECK-NEXT: push {r11, lr}471; CHECK-NEXT: .vsave {d8, d9, d10, d11}472; CHECK-NEXT: vpush {d8, d9, d10, d11}473; CHECK-NEXT: vorr q5, q0, q0474; CHECK-NEXT: vmov.f32 s0, s23475; CHECK-NEXT: bl ceilf476; CHECK-NEXT: vmov.f32 s19, s0477; CHECK-NEXT: vmov.f32 s0, s22478; CHECK-NEXT: bl ceilf479; CHECK-NEXT: vmov.f32 s18, s0480; CHECK-NEXT: vmov.f32 s0, s21481; CHECK-NEXT: bl ceilf482; CHECK-NEXT: vmov.f32 s17, s0483; CHECK-NEXT: vmov.f32 s0, s20484; CHECK-NEXT: bl ceilf485; CHECK-NEXT: vmov.f32 s16, s0486; CHECK-NEXT: vorr q0, q4, q4487; CHECK-NEXT: vpop {d8, d9, d10, d11}488; CHECK-NEXT: pop {r11, pc}489 %val = call <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0490 ret <4 x float> %val491}492 493define <4 x float> @floor_v4f32(<4 x float> %x) #0 {494; CHECK-LABEL: floor_v4f32:495; CHECK: @ %bb.0:496; CHECK-NEXT: .save {r11, lr}497; CHECK-NEXT: push {r11, lr}498; CHECK-NEXT: .vsave {d8, d9, d10, d11}499; CHECK-NEXT: vpush {d8, d9, d10, d11}500; CHECK-NEXT: vorr q5, q0, q0501; CHECK-NEXT: vmov.f32 s0, s23502; CHECK-NEXT: bl floorf503; CHECK-NEXT: vmov.f32 s19, s0504; CHECK-NEXT: vmov.f32 s0, s22505; CHECK-NEXT: bl floorf506; CHECK-NEXT: vmov.f32 s18, s0507; CHECK-NEXT: vmov.f32 s0, s21508; CHECK-NEXT: bl floorf509; CHECK-NEXT: vmov.f32 s17, s0510; CHECK-NEXT: vmov.f32 s0, s20511; CHECK-NEXT: bl floorf512; CHECK-NEXT: vmov.f32 s16, s0513; CHECK-NEXT: vorr q0, q4, q4514; CHECK-NEXT: vpop {d8, d9, d10, d11}515; CHECK-NEXT: pop {r11, pc}516 %val = call <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0517 ret <4 x float> %val518}519 520define <4 x float> @round_v4f32(<4 x float> %x) #0 {521; CHECK-LABEL: round_v4f32:522; CHECK: @ %bb.0:523; CHECK-NEXT: .save {r11, lr}524; CHECK-NEXT: push {r11, lr}525; CHECK-NEXT: .vsave {d8, d9, d10, d11}526; CHECK-NEXT: vpush {d8, d9, d10, d11}527; CHECK-NEXT: vorr q5, q0, q0528; CHECK-NEXT: vmov.f32 s0, s23529; CHECK-NEXT: bl roundf530; CHECK-NEXT: vmov.f32 s19, s0531; CHECK-NEXT: vmov.f32 s0, s22532; CHECK-NEXT: bl roundf533; CHECK-NEXT: vmov.f32 s18, s0534; CHECK-NEXT: vmov.f32 s0, s21535; CHECK-NEXT: bl roundf536; CHECK-NEXT: vmov.f32 s17, s0537; CHECK-NEXT: vmov.f32 s0, s20538; CHECK-NEXT: bl roundf539; CHECK-NEXT: vmov.f32 s16, s0540; CHECK-NEXT: vorr q0, q4, q4541; CHECK-NEXT: vpop {d8, d9, d10, d11}542; CHECK-NEXT: pop {r11, pc}543 %val = call <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0544 ret <4 x float> %val545}546 547define <4 x float> @roundeven_v4f32(<4 x float> %x) #0 {548; CHECK-LABEL: roundeven_v4f32:549; CHECK: @ %bb.0:550; CHECK-NEXT: .save {r11, lr}551; CHECK-NEXT: push {r11, lr}552; CHECK-NEXT: .vsave {d8, d9, d10, d11}553; CHECK-NEXT: vpush {d8, d9, d10, d11}554; CHECK-NEXT: vorr q5, q0, q0555; CHECK-NEXT: vmov.f32 s0, s23556; CHECK-NEXT: bl roundevenf557; CHECK-NEXT: vmov.f32 s19, s0558; CHECK-NEXT: vmov.f32 s0, s22559; CHECK-NEXT: bl roundevenf560; CHECK-NEXT: vmov.f32 s18, s0561; CHECK-NEXT: vmov.f32 s0, s21562; CHECK-NEXT: bl roundevenf563; CHECK-NEXT: vmov.f32 s17, s0564; CHECK-NEXT: vmov.f32 s0, s20565; CHECK-NEXT: bl roundevenf566; CHECK-NEXT: vmov.f32 s16, s0567; CHECK-NEXT: vorr q0, q4, q4568; CHECK-NEXT: vpop {d8, d9, d10, d11}569; CHECK-NEXT: pop {r11, pc}570 %val = call <4 x float> @llvm.experimental.constrained.roundeven.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0571 ret <4 x float> %val572}573 574define <4 x float> @trunc_v4f32(<4 x float> %x) #0 {575; CHECK-LABEL: trunc_v4f32:576; CHECK: @ %bb.0:577; CHECK-NEXT: .save {r11, lr}578; CHECK-NEXT: push {r11, lr}579; CHECK-NEXT: .vsave {d8, d9, d10, d11}580; CHECK-NEXT: vpush {d8, d9, d10, d11}581; CHECK-NEXT: vorr q5, q0, q0582; CHECK-NEXT: vmov.f32 s0, s23583; CHECK-NEXT: bl truncf584; CHECK-NEXT: vmov.f32 s19, s0585; CHECK-NEXT: vmov.f32 s0, s22586; CHECK-NEXT: bl truncf587; CHECK-NEXT: vmov.f32 s18, s0588; CHECK-NEXT: vmov.f32 s0, s21589; CHECK-NEXT: bl truncf590; CHECK-NEXT: vmov.f32 s17, s0591; CHECK-NEXT: vmov.f32 s0, s20592; CHECK-NEXT: bl truncf593; CHECK-NEXT: vmov.f32 s16, s0594; CHECK-NEXT: vorr q0, q4, q4595; CHECK-NEXT: vpop {d8, d9, d10, d11}596; CHECK-NEXT: pop {r11, pc}597 %val = call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> %x, metadata !"fpexcept.strict") #0598 ret <4 x float> %val599}600 601define <4 x i1> @fcmp_v4f32(<4 x float> %x, <4 x float> %y) #0 {602; CHECK-LABEL: fcmp_v4f32:603; CHECK: @ %bb.0: @ %entry604; CHECK-NEXT: vcmp.f32 s3, s7605; CHECK-NEXT: mov r1, #0606; CHECK-NEXT: vmrs APSR_nzcv, fpscr607; CHECK-NEXT: vcmp.f32 s2, s6608; CHECK-NEXT: mov r2, #0609; CHECK-NEXT: mov r3, #0610; CHECK-NEXT: mov r0, #0611; CHECK-NEXT: movweq r1, #1612; CHECK-NEXT: cmp r1, #0613; CHECK-NEXT: mvnne r1, #0614; CHECK-NEXT: vmrs APSR_nzcv, fpscr615; CHECK-NEXT: vcmp.f32 s0, s4616; CHECK-NEXT: movweq r2, #1617; CHECK-NEXT: cmp r2, #0618; CHECK-NEXT: mvnne r2, #0619; CHECK-NEXT: vmrs APSR_nzcv, fpscr620; CHECK-NEXT: vcmp.f32 s1, s5621; CHECK-NEXT: vmov.32 d17[0], r2622; CHECK-NEXT: movweq r3, #1623; CHECK-NEXT: cmp r3, #0624; CHECK-NEXT: mvnne r3, #0625; CHECK-NEXT: vmrs APSR_nzcv, fpscr626; CHECK-NEXT: vmov.32 d16[0], r3627; CHECK-NEXT: vmov.32 d17[1], r1628; CHECK-NEXT: movweq r0, #1629; CHECK-NEXT: cmp r0, #0630; CHECK-NEXT: mvnne r0, #0631; CHECK-NEXT: vmov.32 d16[1], r0632; CHECK-NEXT: vmovn.i32 d0, q8633; CHECK-NEXT: bx lr634entry:635 %val = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f64(<4 x float> %x, <4 x float> %y, metadata !"oeq", metadata !"fpexcept.strict")636 ret <4 x i1> %val637}638 639define <4 x i1> @fcmps_v4f32(<4 x float> %x, <4 x float> %y) #0 {640; CHECK-LABEL: fcmps_v4f32:641; CHECK: @ %bb.0: @ %entry642; CHECK-NEXT: vcmpe.f32 s3, s7643; CHECK-NEXT: mov r1, #0644; CHECK-NEXT: vmrs APSR_nzcv, fpscr645; CHECK-NEXT: vcmpe.f32 s2, s6646; CHECK-NEXT: mov r2, #0647; CHECK-NEXT: mov r3, #0648; CHECK-NEXT: mov r0, #0649; CHECK-NEXT: movweq r1, #1650; CHECK-NEXT: cmp r1, #0651; CHECK-NEXT: mvnne r1, #0652; CHECK-NEXT: vmrs APSR_nzcv, fpscr653; CHECK-NEXT: vcmpe.f32 s0, s4654; CHECK-NEXT: movweq r2, #1655; CHECK-NEXT: cmp r2, #0656; CHECK-NEXT: mvnne r2, #0657; CHECK-NEXT: vmrs APSR_nzcv, fpscr658; CHECK-NEXT: vcmpe.f32 s1, s5659; CHECK-NEXT: vmov.32 d17[0], r2660; CHECK-NEXT: movweq r3, #1661; CHECK-NEXT: cmp r3, #0662; CHECK-NEXT: mvnne r3, #0663; CHECK-NEXT: vmrs APSR_nzcv, fpscr664; CHECK-NEXT: vmov.32 d16[0], r3665; CHECK-NEXT: vmov.32 d17[1], r1666; CHECK-NEXT: movweq r0, #1667; CHECK-NEXT: cmp r0, #0668; CHECK-NEXT: mvnne r0, #0669; CHECK-NEXT: vmov.32 d16[1], r0670; CHECK-NEXT: vmovn.i32 d0, q8671; CHECK-NEXT: bx lr672entry:673 %val = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %x, <4 x float> %y, metadata !"oeq", metadata !"fpexcept.strict")674 ret <4 x i1> %val675}676 677 678 679define <2 x double> @add_v2f64(<2 x double> %x, <2 x double> %y) #0 {680; CHECK-LABEL: add_v2f64:681; CHECK: @ %bb.0:682; CHECK-NEXT: vadd.f64 d17, d1, d3683; CHECK-NEXT: vadd.f64 d16, d0, d2684; CHECK-NEXT: vorr q0, q8, q8685; CHECK-NEXT: bx lr686 %val = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0687 ret <2 x double> %val688}689 690define <2 x double> @sub_v2f64(<2 x double> %x, <2 x double> %y) #0 {691; CHECK-LABEL: sub_v2f64:692; CHECK: @ %bb.0:693; CHECK-NEXT: vsub.f64 d17, d1, d3694; CHECK-NEXT: vsub.f64 d16, d0, d2695; CHECK-NEXT: vorr q0, q8, q8696; CHECK-NEXT: bx lr697 %val = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0698 ret <2 x double> %val699}700 701define <2 x double> @mul_v2f64(<2 x double> %x, <2 x double> %y) #0 {702; CHECK-LABEL: mul_v2f64:703; CHECK: @ %bb.0:704; CHECK-NEXT: vmul.f64 d17, d1, d3705; CHECK-NEXT: vmul.f64 d16, d0, d2706; CHECK-NEXT: vorr q0, q8, q8707; CHECK-NEXT: bx lr708 %val = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0709 ret <2 x double> %val710}711 712define <2 x double> @div_v2f64(<2 x double> %x, <2 x double> %y) #0 {713; CHECK-LABEL: div_v2f64:714; CHECK: @ %bb.0:715; CHECK-NEXT: vdiv.f64 d17, d1, d3716; CHECK-NEXT: vdiv.f64 d16, d0, d2717; CHECK-NEXT: vorr q0, q8, q8718; CHECK-NEXT: bx lr719 %val = call <2 x double> @llvm.experimental.constrained.fdiv.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0720 ret <2 x double> %val721}722 723define <2 x double> @fma_v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z) #0 {724; CHECK-LABEL: fma_v2f64:725; CHECK: @ %bb.0:726; CHECK-NEXT: vfma.f64 d5, d1, d3727; CHECK-NEXT: vfma.f64 d4, d0, d2728; CHECK-NEXT: vorr q0, q2, q2729; CHECK-NEXT: bx lr730 %val = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0731 ret <2 x double> %val732}733 734define <2 x i32> @fptosi_v2i32_v2f64(<2 x double> %x) #0 {735; CHECK-LABEL: fptosi_v2i32_v2f64:736; CHECK: @ %bb.0:737; CHECK-NEXT: vcvt.s32.f64 s4, d0738; CHECK-NEXT: vmov r0, s4739; CHECK-NEXT: vcvt.s32.f64 s2, d1740; CHECK-NEXT: vmov.32 d0[0], r0741; CHECK-NEXT: vmov r0, s2742; CHECK-NEXT: vmov.32 d0[1], r0743; CHECK-NEXT: bx lr744 %val = call <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #0745 ret <2 x i32> %val746}747 748define <2 x i32> @fptoui_v2i32_v2f64(<2 x double> %x) #0 {749; CHECK-LABEL: fptoui_v2i32_v2f64:750; CHECK: @ %bb.0:751; CHECK-NEXT: vcvt.u32.f64 s4, d0752; CHECK-NEXT: vmov r0, s4753; CHECK-NEXT: vcvt.u32.f64 s2, d1754; CHECK-NEXT: vmov.32 d0[0], r0755; CHECK-NEXT: vmov r0, s2756; CHECK-NEXT: vmov.32 d0[1], r0757; CHECK-NEXT: bx lr758 %val = call <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #0759 ret <2 x i32> %val760}761 762define <2 x i64> @fptosi_v2i64_v2f64(<2 x double> %x) #0 {763; CHECK-LABEL: fptosi_v2i64_v2f64:764; CHECK: @ %bb.0:765; CHECK-NEXT: .save {r4, lr}766; CHECK-NEXT: push {r4, lr}767; CHECK-NEXT: .vsave {d8, d9}768; CHECK-NEXT: vpush {d8, d9}769; CHECK-NEXT: vorr q4, q0, q0770; CHECK-NEXT: vmov r0, r1, d9771; CHECK-NEXT: bl __aeabi_d2lz772; CHECK-NEXT: mov r4, r1773; CHECK-NEXT: vmov r2, r1, d8774; CHECK-NEXT: vmov.32 d9[0], r0775; CHECK-NEXT: mov r0, r2776; CHECK-NEXT: bl __aeabi_d2lz777; CHECK-NEXT: vmov.32 d8[0], r0778; CHECK-NEXT: vmov.32 d9[1], r4779; CHECK-NEXT: vmov.32 d8[1], r1780; CHECK-NEXT: vorr q0, q4, q4781; CHECK-NEXT: vpop {d8, d9}782; CHECK-NEXT: pop {r4, pc}783 %val = call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #0784 ret <2 x i64> %val785}786 787define <2 x i64> @fptoui_v2i64_v2f64(<2 x double> %x) #0 {788; CHECK-LABEL: fptoui_v2i64_v2f64:789; CHECK: @ %bb.0:790; CHECK-NEXT: .save {r4, lr}791; CHECK-NEXT: push {r4, lr}792; CHECK-NEXT: .vsave {d8, d9}793; CHECK-NEXT: vpush {d8, d9}794; CHECK-NEXT: vorr q4, q0, q0795; CHECK-NEXT: vmov r0, r1, d9796; CHECK-NEXT: bl __aeabi_d2ulz797; CHECK-NEXT: mov r4, r1798; CHECK-NEXT: vmov r2, r1, d8799; CHECK-NEXT: vmov.32 d9[0], r0800; CHECK-NEXT: mov r0, r2801; CHECK-NEXT: bl __aeabi_d2ulz802; CHECK-NEXT: vmov.32 d8[0], r0803; CHECK-NEXT: vmov.32 d9[1], r4804; CHECK-NEXT: vmov.32 d8[1], r1805; CHECK-NEXT: vorr q0, q4, q4806; CHECK-NEXT: vpop {d8, d9}807; CHECK-NEXT: pop {r4, pc}808 %val = call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #0809 ret <2 x i64> %val810}811 812define <2 x double> @sitofp_v2f64_v2i32(<2 x i32> %x) #0 {813; CHECK-LABEL: sitofp_v2f64_v2i32:814; CHECK: @ %bb.0:815; CHECK-NEXT: .pad #16816; CHECK-NEXT: sub sp, sp, #16817; CHECK-NEXT: vmov.32 r0, d0[1]818; CHECK-NEXT: movw r2, #0819; CHECK-NEXT: vmov.32 r1, d0[0]820; CHECK-NEXT: movt r2, #17200821; CHECK-NEXT: str r2, [sp, #4]822; CHECK-NEXT: vldr d16, .LCPI34_0823; CHECK-NEXT: eor r0, r0, #-2147483648824; CHECK-NEXT: str r0, [sp]825; CHECK-NEXT: str r2, [sp, #12]826; CHECK-NEXT: eor r0, r1, #-2147483648827; CHECK-NEXT: vldr d17, [sp]828; CHECK-NEXT: str r0, [sp, #8]829; CHECK-NEXT: vldr d18, [sp, #8]830; CHECK-NEXT: vsub.f64 d1, d17, d16831; CHECK-NEXT: vsub.f64 d0, d18, d16832; CHECK-NEXT: add sp, sp, #16833; CHECK-NEXT: bx lr834; CHECK-NEXT: .p2align 3835; CHECK-NEXT: @ %bb.1:836; CHECK-NEXT: .LCPI34_0:837; CHECK-NEXT: .long 2147483648 @ double 4503601774854144838; CHECK-NEXT: .long 1127219200839 %val = call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i32(<2 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0840 ret <2 x double> %val841}842 843define <2 x double> @uitofp_v2f64_v2i32(<2 x i32> %x) #0 {844; CHECK-LABEL: uitofp_v2f64_v2i32:845; CHECK: @ %bb.0:846; CHECK-NEXT: .pad #16847; CHECK-NEXT: sub sp, sp, #16848; CHECK-NEXT: movw r0, #0849; CHECK-NEXT: mov r1, sp850; CHECK-NEXT: movt r0, #17200851; CHECK-NEXT: vst1.32 {d0[1]}, [r1:32]852; CHECK-NEXT: add r1, sp, #8853; CHECK-NEXT: str r0, [sp, #4]854; CHECK-NEXT: vldr d17, [sp]855; CHECK-NEXT: vst1.32 {d0[0]}, [r1:32]856; CHECK-NEXT: vldr d16, .LCPI35_0857; CHECK-NEXT: str r0, [sp, #12]858; CHECK-NEXT: vldr d18, [sp, #8]859; CHECK-NEXT: vsub.f64 d1, d17, d16860; CHECK-NEXT: vsub.f64 d0, d18, d16861; CHECK-NEXT: add sp, sp, #16862; CHECK-NEXT: bx lr863; CHECK-NEXT: .p2align 3864; CHECK-NEXT: @ %bb.1:865; CHECK-NEXT: .LCPI35_0:866; CHECK-NEXT: .long 0 @ double 4503599627370496867; CHECK-NEXT: .long 1127219200868 %val = call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i32(<2 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0869 ret <2 x double> %val870}871 872define <2 x double> @sitofp_v2f64_v2i64(<2 x i64> %x) #0 {873; CHECK-LABEL: sitofp_v2f64_v2i64:874; CHECK: @ %bb.0:875; CHECK-NEXT: .save {r11, lr}876; CHECK-NEXT: push {r11, lr}877; CHECK-NEXT: .vsave {d8, d9}878; CHECK-NEXT: vpush {d8, d9}879; CHECK-NEXT: vorr q4, q0, q0880; CHECK-NEXT: vmov r0, r1, d9881; CHECK-NEXT: bl __aeabi_l2d882; CHECK-NEXT: vmov r2, r3, d8883; CHECK-NEXT: vmov d9, r0, r1884; CHECK-NEXT: mov r0, r2885; CHECK-NEXT: mov r1, r3886; CHECK-NEXT: bl __aeabi_l2d887; CHECK-NEXT: vmov d8, r0, r1888; CHECK-NEXT: vorr q0, q4, q4889; CHECK-NEXT: vpop {d8, d9}890; CHECK-NEXT: pop {r11, pc}891 %val = call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0892 ret <2 x double> %val893}894 895define <2 x double> @uitofp_v2f64_v2i64(<2 x i64> %x) #0 {896; CHECK-LABEL: uitofp_v2f64_v2i64:897; CHECK: @ %bb.0:898; CHECK-NEXT: .save {r11, lr}899; CHECK-NEXT: push {r11, lr}900; CHECK-NEXT: .vsave {d8, d9}901; CHECK-NEXT: vpush {d8, d9}902; CHECK-NEXT: vorr q4, q0, q0903; CHECK-NEXT: vmov r0, r1, d9904; CHECK-NEXT: bl __aeabi_ul2d905; CHECK-NEXT: vmov r2, r3, d8906; CHECK-NEXT: vmov d9, r0, r1907; CHECK-NEXT: mov r0, r2908; CHECK-NEXT: mov r1, r3909; CHECK-NEXT: bl __aeabi_ul2d910; CHECK-NEXT: vmov d8, r0, r1911; CHECK-NEXT: vorr q0, q4, q4912; CHECK-NEXT: vpop {d8, d9}913; CHECK-NEXT: pop {r11, pc}914 %val = call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0915 ret <2 x double> %val916}917 918define <2 x double> @sqrt_v2f64(<2 x double> %x) #0 {919; CHECK-LABEL: sqrt_v2f64:920; CHECK: @ %bb.0:921; CHECK-NEXT: vsqrt.f64 d17, d1922; CHECK-NEXT: vsqrt.f64 d16, d0923; CHECK-NEXT: vorr q0, q8, q8924; CHECK-NEXT: bx lr925 %val = call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(<2 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0926 ret <2 x double> %val927}928 929define <2 x double> @rint_v2f64(<2 x double> %x) #0 {930; CHECK-LABEL: rint_v2f64:931; CHECK: @ %bb.0:932; CHECK-NEXT: .save {r11, lr}933; CHECK-NEXT: push {r11, lr}934; CHECK-NEXT: .vsave {d8, d9, d10, d11}935; CHECK-NEXT: vpush {d8, d9, d10, d11}936; CHECK-NEXT: vorr q4, q0, q0937; CHECK-NEXT: vorr d0, d9, d9938; CHECK-NEXT: bl rint939; CHECK-NEXT: vorr d11, d0, d0940; CHECK-NEXT: vorr d0, d8, d8941; CHECK-NEXT: bl rint942; CHECK-NEXT: vorr d10, d0, d0943; CHECK-NEXT: vorr q0, q5, q5944; CHECK-NEXT: vpop {d8, d9, d10, d11}945; CHECK-NEXT: pop {r11, pc}946 %val = call <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0947 ret <2 x double> %val948}949 950define <2 x double> @nearbyint_v2f64(<2 x double> %x) #0 {951; CHECK-LABEL: nearbyint_v2f64:952; CHECK: @ %bb.0:953; CHECK-NEXT: .save {r11, lr}954; CHECK-NEXT: push {r11, lr}955; CHECK-NEXT: .vsave {d8, d9, d10, d11}956; CHECK-NEXT: vpush {d8, d9, d10, d11}957; CHECK-NEXT: vorr q4, q0, q0958; CHECK-NEXT: vorr d0, d9, d9959; CHECK-NEXT: bl nearbyint960; CHECK-NEXT: vorr d11, d0, d0961; CHECK-NEXT: vorr d0, d8, d8962; CHECK-NEXT: bl nearbyint963; CHECK-NEXT: vorr d10, d0, d0964; CHECK-NEXT: vorr q0, q5, q5965; CHECK-NEXT: vpop {d8, d9, d10, d11}966; CHECK-NEXT: pop {r11, pc}967 %val = call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0968 ret <2 x double> %val969}970 971define <2 x double> @maxnum_v2f64(<2 x double> %x, <2 x double> %y) #0 {972; CHECK-LABEL: maxnum_v2f64:973; CHECK: @ %bb.0:974; CHECK-NEXT: .save {r11, lr}975; CHECK-NEXT: push {r11, lr}976; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13}977; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13}978; CHECK-NEXT: vorr q5, q0, q0979; CHECK-NEXT: vorr q4, q1, q1980; CHECK-NEXT: vorr d0, d11, d11981; CHECK-NEXT: vorr d1, d9, d9982; CHECK-NEXT: bl fmax983; CHECK-NEXT: vorr d13, d0, d0984; CHECK-NEXT: vorr d0, d10, d10985; CHECK-NEXT: vorr d1, d8, d8986; CHECK-NEXT: bl fmax987; CHECK-NEXT: vorr d12, d0, d0988; CHECK-NEXT: vorr q0, q6, q6989; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13}990; CHECK-NEXT: pop {r11, pc}991 %val = call <2 x double> @llvm.experimental.constrained.maxnum.v2f64(<2 x double> %x, <2 x double> %y, metadata !"fpexcept.strict") #0992 ret <2 x double> %val993}994 995define <2 x double> @minnum_v2f64(<2 x double> %x, <2 x double> %y) #0 {996; CHECK-LABEL: minnum_v2f64:997; CHECK: @ %bb.0:998; CHECK-NEXT: .save {r11, lr}999; CHECK-NEXT: push {r11, lr}1000; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13}1001; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13}1002; CHECK-NEXT: vorr q5, q0, q01003; CHECK-NEXT: vorr q4, q1, q11004; CHECK-NEXT: vorr d0, d11, d111005; CHECK-NEXT: vorr d1, d9, d91006; CHECK-NEXT: bl fmin1007; CHECK-NEXT: vorr d13, d0, d01008; CHECK-NEXT: vorr d0, d10, d101009; CHECK-NEXT: vorr d1, d8, d81010; CHECK-NEXT: bl fmin1011; CHECK-NEXT: vorr d12, d0, d01012; CHECK-NEXT: vorr q0, q6, q61013; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13}1014; CHECK-NEXT: pop {r11, pc}1015 %val = call <2 x double> @llvm.experimental.constrained.minnum.v2f64(<2 x double> %x, <2 x double> %y, metadata !"fpexcept.strict") #01016 ret <2 x double> %val1017}1018 1019define <2 x double> @ceil_v2f64(<2 x double> %x) #0 {1020; CHECK-LABEL: ceil_v2f64:1021; CHECK: @ %bb.0:1022; CHECK-NEXT: .save {r11, lr}1023; CHECK-NEXT: push {r11, lr}1024; CHECK-NEXT: .vsave {d8, d9, d10, d11}1025; CHECK-NEXT: vpush {d8, d9, d10, d11}1026; CHECK-NEXT: vorr q4, q0, q01027; CHECK-NEXT: vorr d0, d9, d91028; CHECK-NEXT: bl ceil1029; CHECK-NEXT: vorr d11, d0, d01030; CHECK-NEXT: vorr d0, d8, d81031; CHECK-NEXT: bl ceil1032; CHECK-NEXT: vorr d10, d0, d01033; CHECK-NEXT: vorr q0, q5, q51034; CHECK-NEXT: vpop {d8, d9, d10, d11}1035; CHECK-NEXT: pop {r11, pc}1036 %val = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #01037 ret <2 x double> %val1038}1039 1040define <2 x double> @floor_v2f64(<2 x double> %x) #0 {1041; CHECK-LABEL: floor_v2f64:1042; CHECK: @ %bb.0:1043; CHECK-NEXT: .save {r11, lr}1044; CHECK-NEXT: push {r11, lr}1045; CHECK-NEXT: .vsave {d8, d9, d10, d11}1046; CHECK-NEXT: vpush {d8, d9, d10, d11}1047; CHECK-NEXT: vorr q4, q0, q01048; CHECK-NEXT: vorr d0, d9, d91049; CHECK-NEXT: bl floor1050; CHECK-NEXT: vorr d11, d0, d01051; CHECK-NEXT: vorr d0, d8, d81052; CHECK-NEXT: bl floor1053; CHECK-NEXT: vorr d10, d0, d01054; CHECK-NEXT: vorr q0, q5, q51055; CHECK-NEXT: vpop {d8, d9, d10, d11}1056; CHECK-NEXT: pop {r11, pc}1057 %val = call <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #01058 ret <2 x double> %val1059}1060 1061define <2 x double> @round_v2f64(<2 x double> %x) #0 {1062; CHECK-LABEL: round_v2f64:1063; CHECK: @ %bb.0:1064; CHECK-NEXT: .save {r11, lr}1065; CHECK-NEXT: push {r11, lr}1066; CHECK-NEXT: .vsave {d8, d9, d10, d11}1067; CHECK-NEXT: vpush {d8, d9, d10, d11}1068; CHECK-NEXT: vorr q4, q0, q01069; CHECK-NEXT: vorr d0, d9, d91070; CHECK-NEXT: bl round1071; CHECK-NEXT: vorr d11, d0, d01072; CHECK-NEXT: vorr d0, d8, d81073; CHECK-NEXT: bl round1074; CHECK-NEXT: vorr d10, d0, d01075; CHECK-NEXT: vorr q0, q5, q51076; CHECK-NEXT: vpop {d8, d9, d10, d11}1077; CHECK-NEXT: pop {r11, pc}1078 %val = call <2 x double> @llvm.experimental.constrained.round.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #01079 ret <2 x double> %val1080}1081 1082define <2 x double> @roundeven_v2f64(<2 x double> %x) #0 {1083; CHECK-LABEL: roundeven_v2f64:1084; CHECK: @ %bb.0:1085; CHECK-NEXT: .save {r11, lr}1086; CHECK-NEXT: push {r11, lr}1087; CHECK-NEXT: .vsave {d8, d9, d10, d11}1088; CHECK-NEXT: vpush {d8, d9, d10, d11}1089; CHECK-NEXT: vorr q4, q0, q01090; CHECK-NEXT: vorr d0, d9, d91091; CHECK-NEXT: bl roundeven1092; CHECK-NEXT: vorr d11, d0, d01093; CHECK-NEXT: vorr d0, d8, d81094; CHECK-NEXT: bl roundeven1095; CHECK-NEXT: vorr d10, d0, d01096; CHECK-NEXT: vorr q0, q5, q51097; CHECK-NEXT: vpop {d8, d9, d10, d11}1098; CHECK-NEXT: pop {r11, pc}1099 %val = call <2 x double> @llvm.experimental.constrained.roundeven.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #01100 ret <2 x double> %val1101}1102 1103define <2 x double> @trunc_v2f64(<2 x double> %x) #0 {1104; CHECK-LABEL: trunc_v2f64:1105; CHECK: @ %bb.0:1106; CHECK-NEXT: .save {r11, lr}1107; CHECK-NEXT: push {r11, lr}1108; CHECK-NEXT: .vsave {d8, d9, d10, d11}1109; CHECK-NEXT: vpush {d8, d9, d10, d11}1110; CHECK-NEXT: vorr q4, q0, q01111; CHECK-NEXT: vorr d0, d9, d91112; CHECK-NEXT: bl trunc1113; CHECK-NEXT: vorr d11, d0, d01114; CHECK-NEXT: vorr d0, d8, d81115; CHECK-NEXT: bl trunc1116; CHECK-NEXT: vorr d10, d0, d01117; CHECK-NEXT: vorr q0, q5, q51118; CHECK-NEXT: vpop {d8, d9, d10, d11}1119; CHECK-NEXT: pop {r11, pc}1120 %val = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %x, metadata !"fpexcept.strict") #01121 ret <2 x double> %val1122}1123 1124define <2 x i1> @fcmp_v2f64(<2 x double> %x, <2 x double> %y) #0 {1125; CHECK-LABEL: fcmp_v2f64:1126; CHECK: @ %bb.0: @ %entry1127; CHECK-NEXT: vcmp.f64 d0, d21128; CHECK-NEXT: mov r1, #01129; CHECK-NEXT: mov r0, #01130; CHECK-NEXT: vmrs APSR_nzcv, fpscr1131; CHECK-NEXT: vcmp.f64 d1, d31132; CHECK-NEXT: movweq r1, #11133; CHECK-NEXT: cmp r1, #01134; CHECK-NEXT: mvnne r1, #01135; CHECK-NEXT: vmrs APSR_nzcv, fpscr1136; CHECK-NEXT: vmov.32 d0[0], r11137; CHECK-NEXT: movweq r0, #11138; CHECK-NEXT: cmp r0, #01139; CHECK-NEXT: mvnne r0, #01140; CHECK-NEXT: vmov.32 d0[1], r01141; CHECK-NEXT: bx lr1142entry:1143 %val = call <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double> %x, <2 x double> %y, metadata !"oeq", metadata !"fpexcept.strict")1144 ret <2 x i1> %val1145}1146 1147define <2 x i1> @fcmps_v2f64(<2 x double> %x, <2 x double> %y) #0 {1148; CHECK-LABEL: fcmps_v2f64:1149; CHECK: @ %bb.0: @ %entry1150; CHECK-NEXT: vcmpe.f64 d0, d21151; CHECK-NEXT: mov r1, #01152; CHECK-NEXT: mov r0, #01153; CHECK-NEXT: vmrs APSR_nzcv, fpscr1154; CHECK-NEXT: vcmpe.f64 d1, d31155; CHECK-NEXT: movweq r1, #11156; CHECK-NEXT: cmp r1, #01157; CHECK-NEXT: mvnne r1, #01158; CHECK-NEXT: vmrs APSR_nzcv, fpscr1159; CHECK-NEXT: vmov.32 d0[0], r11160; CHECK-NEXT: movweq r0, #11161; CHECK-NEXT: cmp r0, #01162; CHECK-NEXT: mvnne r0, #01163; CHECK-NEXT: vmov.32 d0[1], r01164; CHECK-NEXT: bx lr1165entry:1166 %val = call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %x, <2 x double> %y, metadata !"oeq", metadata !"fpexcept.strict")1167 ret <2 x i1> %val1168}1169 1170 1171 1172define <1 x double> @add_v1f64(<1 x double> %x, <1 x double> %y) #0 {1173; CHECK-LABEL: add_v1f64:1174; CHECK: @ %bb.0:1175; CHECK-NEXT: vadd.f64 d0, d0, d11176; CHECK-NEXT: bx lr1177 %val = call <1 x double> @llvm.experimental.constrained.fadd.v1f64(<1 x double> %x, <1 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #01178 ret <1 x double> %val1179}1180 1181define <1 x double> @sub_v1f64(<1 x double> %x, <1 x double> %y) #0 {1182; CHECK-LABEL: sub_v1f64:1183; CHECK: @ %bb.0:1184; CHECK-NEXT: vsub.f64 d0, d0, d11185; CHECK-NEXT: bx lr1186 %val = call <1 x double> @llvm.experimental.constrained.fsub.v1f64(<1 x double> %x, <1 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #01187 ret <1 x double> %val1188}1189 1190define <1 x double> @mul_v1f64(<1 x double> %x, <1 x double> %y) #0 {1191; CHECK-LABEL: mul_v1f64:1192; CHECK: @ %bb.0:1193; CHECK-NEXT: vmul.f64 d0, d0, d11194; CHECK-NEXT: bx lr1195 %val = call <1 x double> @llvm.experimental.constrained.fmul.v1f64(<1 x double> %x, <1 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #01196 ret <1 x double> %val1197}1198 1199define <1 x double> @div_v1f64(<1 x double> %x, <1 x double> %y) #0 {1200; CHECK-LABEL: div_v1f64:1201; CHECK: @ %bb.0:1202; CHECK-NEXT: vdiv.f64 d0, d0, d11203; CHECK-NEXT: bx lr1204 %val = call <1 x double> @llvm.experimental.constrained.fdiv.v1f64(<1 x double> %x, <1 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #01205 ret <1 x double> %val1206}1207 1208define <1 x double> @fma_v1f64(<1 x double> %x, <1 x double> %y, <1 x double> %z) #0 {1209; CHECK-LABEL: fma_v1f64:1210; CHECK: @ %bb.0:1211; CHECK-NEXT: vfma.f64 d2, d0, d11212; CHECK-NEXT: vmov.f64 d0, d21213; CHECK-NEXT: bx lr1214 %val = call <1 x double> @llvm.experimental.constrained.fma.v1f64(<1 x double> %x, <1 x double> %y, <1 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #01215 ret <1 x double> %val1216}1217 1218define <1 x i32> @fptosi_v1i32_v1f64(<1 x double> %x) #0 {1219; CHECK-LABEL: fptosi_v1i32_v1f64:1220; CHECK: @ %bb.0:1221; CHECK-NEXT: vcvt.s32.f64 s0, d01222; CHECK-NEXT: vmov r0, s01223; CHECK-NEXT: bx lr1224 %val = call <1 x i32> @llvm.experimental.constrained.fptosi.v1i32.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01225 ret <1 x i32> %val1226}1227 1228define <1 x i32> @fptoui_v1i32_v1f64(<1 x double> %x) #0 {1229; CHECK-LABEL: fptoui_v1i32_v1f64:1230; CHECK: @ %bb.0:1231; CHECK-NEXT: vcvt.u32.f64 s0, d01232; CHECK-NEXT: vmov r0, s01233; CHECK-NEXT: bx lr1234 %val = call <1 x i32> @llvm.experimental.constrained.fptoui.v1i32.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01235 ret <1 x i32> %val1236}1237 1238define <1 x i64> @fptosi_v1i64_v1f64(<1 x double> %x) #0 {1239; CHECK-LABEL: fptosi_v1i64_v1f64:1240; CHECK: @ %bb.0:1241; CHECK-NEXT: .save {r11, lr}1242; CHECK-NEXT: push {r11, lr}1243; CHECK-NEXT: vmov r0, r1, d01244; CHECK-NEXT: bl __aeabi_d2lz1245; CHECK-NEXT: vmov.32 d0[0], r01246; CHECK-NEXT: vmov.32 d0[1], r11247; CHECK-NEXT: pop {r11, pc}1248 %val = call <1 x i64> @llvm.experimental.constrained.fptosi.v1i64.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01249 ret <1 x i64> %val1250}1251 1252define <1 x i64> @fptoui_v1i64_v1f64(<1 x double> %x) #0 {1253; CHECK-LABEL: fptoui_v1i64_v1f64:1254; CHECK: @ %bb.0:1255; CHECK-NEXT: .save {r11, lr}1256; CHECK-NEXT: push {r11, lr}1257; CHECK-NEXT: vmov r0, r1, d01258; CHECK-NEXT: bl __aeabi_d2ulz1259; CHECK-NEXT: vmov.32 d0[0], r01260; CHECK-NEXT: vmov.32 d0[1], r11261; CHECK-NEXT: pop {r11, pc}1262 %val = call <1 x i64> @llvm.experimental.constrained.fptoui.v1i64.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01263 ret <1 x i64> %val1264}1265 1266define <1 x double> @sitofp_v1f64_v1i32(<1 x i32> %x) #0 {1267; CHECK-LABEL: sitofp_v1f64_v1i32:1268; CHECK: @ %bb.0:1269; CHECK-NEXT: .pad #81270; CHECK-NEXT: sub sp, sp, #81271; CHECK-NEXT: movw r1, #01272; CHECK-NEXT: eor r0, r0, #-21474836481273; CHECK-NEXT: movt r1, #172001274; CHECK-NEXT: str r0, [sp]1275; CHECK-NEXT: str r1, [sp, #4]1276; CHECK-NEXT: vldr d16, .LCPI59_01277; CHECK-NEXT: vldr d17, [sp]1278; CHECK-NEXT: vsub.f64 d0, d17, d161279; CHECK-NEXT: add sp, sp, #81280; CHECK-NEXT: bx lr1281; CHECK-NEXT: .p2align 31282; CHECK-NEXT: @ %bb.1:1283; CHECK-NEXT: .LCPI59_0:1284; CHECK-NEXT: .long 2147483648 @ double 45036017748541441285; CHECK-NEXT: .long 11272192001286 %val = call <1 x double> @llvm.experimental.constrained.sitofp.v1f64.v1i32(<1 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01287 ret <1 x double> %val1288}1289 1290define <1 x double> @uitofp_v1f64_v1i32(<1 x i32> %x) #0 {1291; CHECK-LABEL: uitofp_v1f64_v1i32:1292; CHECK: @ %bb.0:1293; CHECK-NEXT: .pad #81294; CHECK-NEXT: sub sp, sp, #81295; CHECK-NEXT: movw r1, #01296; CHECK-NEXT: str r0, [sp]1297; CHECK-NEXT: movt r1, #172001298; CHECK-NEXT: vldr d16, .LCPI60_01299; CHECK-NEXT: str r1, [sp, #4]1300; CHECK-NEXT: vldr d17, [sp]1301; CHECK-NEXT: vsub.f64 d0, d17, d161302; CHECK-NEXT: add sp, sp, #81303; CHECK-NEXT: bx lr1304; CHECK-NEXT: .p2align 31305; CHECK-NEXT: @ %bb.1:1306; CHECK-NEXT: .LCPI60_0:1307; CHECK-NEXT: .long 0 @ double 45035996273704961308; CHECK-NEXT: .long 11272192001309 %val = call <1 x double> @llvm.experimental.constrained.uitofp.v1f64.v1i32(<1 x i32> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01310 ret <1 x double> %val1311}1312 1313define <1 x double> @sitofp_v1f64_v1i64(<1 x i64> %x) #0 {1314; CHECK-LABEL: sitofp_v1f64_v1i64:1315; CHECK: @ %bb.0:1316; CHECK-NEXT: .save {r11, lr}1317; CHECK-NEXT: push {r11, lr}1318; CHECK-NEXT: vmov.32 r0, d0[0]1319; CHECK-NEXT: vmov.32 r1, d0[1]1320; CHECK-NEXT: bl __aeabi_l2d1321; CHECK-NEXT: vmov d0, r0, r11322; CHECK-NEXT: pop {r11, pc}1323 %val = call <1 x double> @llvm.experimental.constrained.sitofp.v1f64.v1i64(<1 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01324 ret <1 x double> %val1325}1326 1327define <1 x double> @uitofp_v1f64_v1i64(<1 x i64> %x) #0 {1328; CHECK-LABEL: uitofp_v1f64_v1i64:1329; CHECK: @ %bb.0:1330; CHECK-NEXT: .save {r11, lr}1331; CHECK-NEXT: push {r11, lr}1332; CHECK-NEXT: vmov.32 r0, d0[0]1333; CHECK-NEXT: vmov.32 r1, d0[1]1334; CHECK-NEXT: bl __aeabi_ul2d1335; CHECK-NEXT: vmov d0, r0, r11336; CHECK-NEXT: pop {r11, pc}1337 %val = call <1 x double> @llvm.experimental.constrained.uitofp.v1f64.v1i64(<1 x i64> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01338 ret <1 x double> %val1339}1340 1341define <1 x double> @sqrt_v1f64(<1 x double> %x) #0 {1342; CHECK-LABEL: sqrt_v1f64:1343; CHECK: @ %bb.0:1344; CHECK-NEXT: vsqrt.f64 d0, d01345; CHECK-NEXT: bx lr1346 %val = call <1 x double> @llvm.experimental.constrained.sqrt.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01347 ret <1 x double> %val1348}1349 1350define <1 x double> @rint_v1f64(<1 x double> %x) #0 {1351; CHECK-LABEL: rint_v1f64:1352; CHECK: @ %bb.0:1353; CHECK-NEXT: .save {r11, lr}1354; CHECK-NEXT: push {r11, lr}1355; CHECK-NEXT: bl rint1356; CHECK-NEXT: pop {r11, pc}1357 %val = call <1 x double> @llvm.experimental.constrained.rint.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01358 ret <1 x double> %val1359}1360 1361define <1 x double> @nearbyint_v1f64(<1 x double> %x) #0 {1362; CHECK-LABEL: nearbyint_v1f64:1363; CHECK: @ %bb.0:1364; CHECK-NEXT: .save {r11, lr}1365; CHECK-NEXT: push {r11, lr}1366; CHECK-NEXT: bl nearbyint1367; CHECK-NEXT: pop {r11, pc}1368 %val = call <1 x double> @llvm.experimental.constrained.nearbyint.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01369 ret <1 x double> %val1370}1371 1372define <1 x double> @maxnum_v1f64(<1 x double> %x, <1 x double> %y) #0 {1373; CHECK-LABEL: maxnum_v1f64:1374; CHECK: @ %bb.0:1375; CHECK-NEXT: .save {r11, lr}1376; CHECK-NEXT: push {r11, lr}1377; CHECK-NEXT: bl fmax1378; CHECK-NEXT: pop {r11, pc}1379 %val = call <1 x double> @llvm.experimental.constrained.maxnum.v1f64(<1 x double> %x, <1 x double> %y, metadata !"fpexcept.strict") #01380 ret <1 x double> %val1381}1382 1383define <1 x double> @minnum_v1f64(<1 x double> %x, <1 x double> %y) #0 {1384; CHECK-LABEL: minnum_v1f64:1385; CHECK: @ %bb.0:1386; CHECK-NEXT: .save {r11, lr}1387; CHECK-NEXT: push {r11, lr}1388; CHECK-NEXT: bl fmin1389; CHECK-NEXT: pop {r11, pc}1390 %val = call <1 x double> @llvm.experimental.constrained.minnum.v1f64(<1 x double> %x, <1 x double> %y, metadata !"fpexcept.strict") #01391 ret <1 x double> %val1392}1393 1394define <1 x double> @ceil_v1f64(<1 x double> %x) #0 {1395; CHECK-LABEL: ceil_v1f64:1396; CHECK: @ %bb.0:1397; CHECK-NEXT: .save {r11, lr}1398; CHECK-NEXT: push {r11, lr}1399; CHECK-NEXT: bl ceil1400; CHECK-NEXT: pop {r11, pc}1401 %val = call <1 x double> @llvm.experimental.constrained.ceil.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01402 ret <1 x double> %val1403}1404 1405define <1 x double> @floor_v1f64(<1 x double> %x) #0 {1406; CHECK-LABEL: floor_v1f64:1407; CHECK: @ %bb.0:1408; CHECK-NEXT: .save {r11, lr}1409; CHECK-NEXT: push {r11, lr}1410; CHECK-NEXT: bl floor1411; CHECK-NEXT: pop {r11, pc}1412 %val = call <1 x double> @llvm.experimental.constrained.floor.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01413 ret <1 x double> %val1414}1415 1416define <1 x double> @round_v1f64(<1 x double> %x) #0 {1417; CHECK-LABEL: round_v1f64:1418; CHECK: @ %bb.0:1419; CHECK-NEXT: .save {r11, lr}1420; CHECK-NEXT: push {r11, lr}1421; CHECK-NEXT: bl round1422; CHECK-NEXT: pop {r11, pc}1423 %val = call <1 x double> @llvm.experimental.constrained.round.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01424 ret <1 x double> %val1425}1426 1427define <1 x double> @roundeven_v1f64(<1 x double> %x) #0 {1428; CHECK-LABEL: roundeven_v1f64:1429; CHECK: @ %bb.0:1430; CHECK-NEXT: .save {r11, lr}1431; CHECK-NEXT: push {r11, lr}1432; CHECK-NEXT: bl roundeven1433; CHECK-NEXT: pop {r11, pc}1434 %val = call <1 x double> @llvm.experimental.constrained.roundeven.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01435 ret <1 x double> %val1436}1437 1438define <1 x double> @trunc_v1f64(<1 x double> %x) #0 {1439; CHECK-LABEL: trunc_v1f64:1440; CHECK: @ %bb.0:1441; CHECK-NEXT: .save {r11, lr}1442; CHECK-NEXT: push {r11, lr}1443; CHECK-NEXT: bl trunc1444; CHECK-NEXT: pop {r11, pc}1445 %val = call <1 x double> @llvm.experimental.constrained.trunc.v1f64(<1 x double> %x, metadata !"fpexcept.strict") #01446 ret <1 x double> %val1447}1448 1449define <1 x i1> @fcmp_v1f61(<1 x double> %x, <1 x double> %y) #0 {1450; CHECK-LABEL: fcmp_v1f61:1451; CHECK: @ %bb.0: @ %entry1452; CHECK-NEXT: vcmp.f64 d0, d11453; CHECK-NEXT: mov r0, #01454; CHECK-NEXT: vmrs APSR_nzcv, fpscr1455; CHECK-NEXT: movweq r0, #11456; CHECK-NEXT: bx lr1457entry:1458 %val = call <1 x i1> @llvm.experimental.constrained.fcmp.v1f64(<1 x double> %x, <1 x double> %y, metadata !"oeq", metadata !"fpexcept.strict")1459 ret <1 x i1> %val1460}1461 1462define <1 x i1> @fcmps_v1f61(<1 x double> %x, <1 x double> %y) #0 {1463; CHECK-LABEL: fcmps_v1f61:1464; CHECK: @ %bb.0: @ %entry1465; CHECK-NEXT: vcmpe.f64 d0, d11466; CHECK-NEXT: mov r0, #01467; CHECK-NEXT: vmrs APSR_nzcv, fpscr1468; CHECK-NEXT: movweq r0, #11469; CHECK-NEXT: bx lr1470entry:1471 %val = call <1 x i1> @llvm.experimental.constrained.fcmps.v1f64(<1 x double> %x, <1 x double> %y, metadata !"oeq", metadata !"fpexcept.strict")1472 ret <1 x i1> %val1473}1474 1475 1476 1477define <2 x float> @fptrunc_v2f32_v2f64(<2 x double> %x) #0 {1478; CHECK-LABEL: fptrunc_v2f32_v2f64:1479; CHECK: @ %bb.0:1480; CHECK-NEXT: vcvt.f32.f64 s5, d11481; CHECK-NEXT: vcvt.f32.f64 s4, d01482; CHECK-NEXT: vmov.f64 d0, d21483; CHECK-NEXT: bx lr1484 %val = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01485 ret <2 x float> %val1486}1487 1488define <2 x double> @fpext_v2f64_v2f32(<2 x float> %x) #0 {1489; CHECK-LABEL: fpext_v2f64_v2f32:1490; CHECK: @ %bb.0:1491; CHECK-NEXT: vcvt.f64.f32 d17, s11492; CHECK-NEXT: vcvt.f64.f32 d16, s01493; CHECK-NEXT: vorr q0, q8, q81494; CHECK-NEXT: bx lr1495 %val = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float> %x, metadata !"fpexcept.strict") #01496 ret <2 x double> %val1497}1498 1499attributes #0 = { strictfp }1500