363 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,+fp64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-FP3; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve,+fullfp16,+fp64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOFP4 5define arm_aapcs_vfpcc float @fadd_v2f32(<2 x float> %x, float %y) {6; CHECK-LABEL: fadd_v2f32:7; CHECK: @ %bb.0: @ %entry8; CHECK-NEXT: vadd.f32 s0, s0, s19; CHECK-NEXT: vadd.f32 s0, s4, s010; CHECK-NEXT: bx lr11entry:12 %z = call fast float @llvm.vector.reduce.fadd.f32.v2f32(float %y, <2 x float> %x)13 ret float %z14}15 16define arm_aapcs_vfpcc float @fadd_v4f32(<4 x float> %x, float %y) {17; CHECK-FP-LABEL: fadd_v4f32:18; CHECK-FP: @ %bb.0: @ %entry19; CHECK-FP-NEXT: vadd.f32 s2, s2, s320; CHECK-FP-NEXT: vadd.f32 s0, s0, s121; CHECK-FP-NEXT: vadd.f32 s0, s0, s222; CHECK-FP-NEXT: vadd.f32 s0, s4, s023; CHECK-FP-NEXT: bx lr24;25; CHECK-NOFP-LABEL: fadd_v4f32:26; CHECK-NOFP: @ %bb.0: @ %entry27; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s128; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s229; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s330; CHECK-NOFP-NEXT: vadd.f32 s0, s4, s031; CHECK-NOFP-NEXT: bx lr32entry:33 %z = call fast float @llvm.vector.reduce.fadd.f32.v4f32(float %y, <4 x float> %x)34 ret float %z35}36 37define arm_aapcs_vfpcc float @fadd_v8f32(<8 x float> %x, float %y) {38; CHECK-FP-LABEL: fadd_v8f32:39; CHECK-FP: @ %bb.0: @ %entry40; CHECK-FP-NEXT: vadd.f32 q0, q0, q141; CHECK-FP-NEXT: vadd.f32 s2, s2, s342; CHECK-FP-NEXT: vadd.f32 s0, s0, s143; CHECK-FP-NEXT: vadd.f32 s0, s0, s244; CHECK-FP-NEXT: vadd.f32 s0, s8, s045; CHECK-FP-NEXT: bx lr46;47; CHECK-NOFP-LABEL: fadd_v8f32:48; CHECK-NOFP: @ %bb.0: @ %entry49; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s450; CHECK-NOFP-NEXT: vadd.f32 s10, s1, s551; CHECK-NOFP-NEXT: vadd.f32 s2, s2, s652; CHECK-NOFP-NEXT: vadd.f32 s4, s3, s753; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s1054; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s255; CHECK-NOFP-NEXT: vadd.f32 s0, s0, s456; CHECK-NOFP-NEXT: vadd.f32 s0, s8, s057; CHECK-NOFP-NEXT: bx lr58entry:59 %z = call fast float @llvm.vector.reduce.fadd.f32.v8f32(float %y, <8 x float> %x)60 ret float %z61}62 63define arm_aapcs_vfpcc half @fadd_v2f16(<2 x half> %x, half %y) {64; CHECK-LABEL: fadd_v2f16:65; CHECK: @ %bb.0: @ %entry66; CHECK-NEXT: vmovx.f16 s2, s067; CHECK-NEXT: vadd.f16 s0, s0, s268; CHECK-NEXT: vadd.f16 s0, s4, s069; CHECK-NEXT: bx lr70entry:71 %z = call fast half @llvm.vector.reduce.fadd.f16.v2f16(half %y, <2 x half> %x)72 ret half %z73}74 75define arm_aapcs_vfpcc half @fadd_v4f16(<4 x half> %x, half %y) {76; CHECK-FP-LABEL: fadd_v4f16:77; CHECK-FP: @ %bb.0: @ %entry78; CHECK-FP-NEXT: vmovx.f16 s2, s179; CHECK-FP-NEXT: vmovx.f16 s6, s080; CHECK-FP-NEXT: vadd.f16 s2, s1, s281; CHECK-FP-NEXT: vadd.f16 s0, s0, s682; CHECK-FP-NEXT: vadd.f16 s0, s0, s283; CHECK-FP-NEXT: vadd.f16 s0, s4, s084; CHECK-FP-NEXT: bx lr85;86; CHECK-NOFP-LABEL: fadd_v4f16:87; CHECK-NOFP: @ %bb.0: @ %entry88; CHECK-NOFP-NEXT: vmovx.f16 s2, s089; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s290; CHECK-NOFP-NEXT: vmovx.f16 s2, s191; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s192; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s293; CHECK-NOFP-NEXT: vadd.f16 s0, s4, s094; CHECK-NOFP-NEXT: bx lr95entry:96 %z = call fast half @llvm.vector.reduce.fadd.f16.v4f16(half %y, <4 x half> %x)97 ret half %z98}99 100define arm_aapcs_vfpcc half @fadd_v8f16(<8 x half> %x, half %y) {101; CHECK-FP-LABEL: fadd_v8f16:102; CHECK-FP: @ %bb.0: @ %entry103; CHECK-FP-NEXT: vrev32.16 q2, q0104; CHECK-FP-NEXT: vadd.f16 q0, q0, q2105; CHECK-FP-NEXT: vadd.f16 s2, s2, s3106; CHECK-FP-NEXT: vadd.f16 s0, s0, s1107; CHECK-FP-NEXT: vadd.f16 s0, s0, s2108; CHECK-FP-NEXT: vadd.f16 s0, s4, s0109; CHECK-FP-NEXT: bx lr110;111; CHECK-NOFP-LABEL: fadd_v8f16:112; CHECK-NOFP: @ %bb.0: @ %entry113; CHECK-NOFP-NEXT: vmovx.f16 s6, s0114; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s6115; CHECK-NOFP-NEXT: vmovx.f16 s6, s1116; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s1117; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s6118; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2119; CHECK-NOFP-NEXT: vmovx.f16 s2, s2120; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2121; CHECK-NOFP-NEXT: vmovx.f16 s2, s3122; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s3123; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2124; CHECK-NOFP-NEXT: vadd.f16 s0, s4, s0125; CHECK-NOFP-NEXT: bx lr126entry:127 %z = call fast half @llvm.vector.reduce.fadd.f16.v8f16(half %y, <8 x half> %x)128 ret half %z129}130 131define arm_aapcs_vfpcc half @fadd_v16f16(<16 x half> %x, half %y) {132; CHECK-FP-LABEL: fadd_v16f16:133; CHECK-FP: @ %bb.0: @ %entry134; CHECK-FP-NEXT: vadd.f16 q0, q0, q1135; CHECK-FP-NEXT: vrev32.16 q1, q0136; CHECK-FP-NEXT: vadd.f16 q0, q0, q1137; CHECK-FP-NEXT: vadd.f16 s2, s2, s3138; CHECK-FP-NEXT: vadd.f16 s0, s0, s1139; CHECK-FP-NEXT: vadd.f16 s0, s0, s2140; CHECK-FP-NEXT: vadd.f16 s0, s8, s0141; CHECK-FP-NEXT: bx lr142;143; CHECK-NOFP-LABEL: fadd_v16f16:144; CHECK-NOFP: @ %bb.0: @ %entry145; CHECK-NOFP-NEXT: vmovx.f16 s12, s0146; CHECK-NOFP-NEXT: vmovx.f16 s10, s4147; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s4148; CHECK-NOFP-NEXT: vadd.f16 s10, s12, s10149; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s10150; CHECK-NOFP-NEXT: vadd.f16 s4, s1, s5151; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s4152; CHECK-NOFP-NEXT: vmovx.f16 s4, s5153; CHECK-NOFP-NEXT: vmovx.f16 s10, s1154; CHECK-NOFP-NEXT: vadd.f16 s4, s10, s4155; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s4156; CHECK-NOFP-NEXT: vadd.f16 s4, s2, s6157; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s4158; CHECK-NOFP-NEXT: vmovx.f16 s4, s6159; CHECK-NOFP-NEXT: vmovx.f16 s2, s2160; CHECK-NOFP-NEXT: vadd.f16 s2, s2, s4161; CHECK-NOFP-NEXT: vmovx.f16 s4, s3162; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2163; CHECK-NOFP-NEXT: vadd.f16 s2, s3, s7164; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2165; CHECK-NOFP-NEXT: vmovx.f16 s2, s7166; CHECK-NOFP-NEXT: vadd.f16 s2, s4, s2167; CHECK-NOFP-NEXT: vadd.f16 s0, s0, s2168; CHECK-NOFP-NEXT: vadd.f16 s0, s8, s0169; CHECK-NOFP-NEXT: bx lr170entry:171 %z = call fast half @llvm.vector.reduce.fadd.f16.v16f16(half %y, <16 x half> %x)172 ret half %z173}174 175define arm_aapcs_vfpcc double @fadd_v1f64(<1 x double> %x, double %y) {176; CHECK-LABEL: fadd_v1f64:177; CHECK: @ %bb.0: @ %entry178; CHECK-NEXT: vadd.f64 d0, d1, d0179; CHECK-NEXT: bx lr180entry:181 %z = call fast double @llvm.vector.reduce.fadd.f64.v1f64(double %y, <1 x double> %x)182 ret double %z183}184 185define arm_aapcs_vfpcc double @fadd_v2f64(<2 x double> %x, double %y) {186; CHECK-LABEL: fadd_v2f64:187; CHECK: @ %bb.0: @ %entry188; CHECK-NEXT: vadd.f64 d0, d0, d1189; CHECK-NEXT: vadd.f64 d0, d2, d0190; CHECK-NEXT: bx lr191entry:192 %z = call fast double @llvm.vector.reduce.fadd.f64.v2f64(double %y, <2 x double> %x)193 ret double %z194}195 196define arm_aapcs_vfpcc double @fadd_v4f64(<4 x double> %x, double %y) {197; CHECK-LABEL: fadd_v4f64:198; CHECK: @ %bb.0: @ %entry199; CHECK-NEXT: vadd.f64 d1, d1, d3200; CHECK-NEXT: vadd.f64 d0, d0, d2201; CHECK-NEXT: vadd.f64 d0, d0, d1202; CHECK-NEXT: vadd.f64 d0, d4, d0203; CHECK-NEXT: bx lr204entry:205 %z = call fast double @llvm.vector.reduce.fadd.f64.v4f64(double %y, <4 x double> %x)206 ret double %z207}208 209define arm_aapcs_vfpcc float @fadd_v2f32_nofast(<2 x float> %x, float %y) {210; CHECK-LABEL: fadd_v2f32_nofast:211; CHECK: @ %bb.0: @ %entry212; CHECK-NEXT: vadd.f32 s0, s4, s0213; CHECK-NEXT: vadd.f32 s0, s0, s1214; CHECK-NEXT: bx lr215entry:216 %z = call float @llvm.vector.reduce.fadd.f32.v2f32(float %y, <2 x float> %x)217 ret float %z218}219 220define arm_aapcs_vfpcc float @fadd_v4f32_nofast(<4 x float> %x, float %y) {221; CHECK-LABEL: fadd_v4f32_nofast:222; CHECK: @ %bb.0: @ %entry223; CHECK-NEXT: vadd.f32 s0, s4, s0224; CHECK-NEXT: vadd.f32 s0, s0, s1225; CHECK-NEXT: vadd.f32 s0, s0, s2226; CHECK-NEXT: vadd.f32 s0, s0, s3227; CHECK-NEXT: bx lr228entry:229 %z = call float @llvm.vector.reduce.fadd.f32.v4f32(float %y, <4 x float> %x)230 ret float %z231}232 233define arm_aapcs_vfpcc float @fadd_v8f32_nofast(<8 x float> %x, float %y) {234; CHECK-LABEL: fadd_v8f32_nofast:235; CHECK: @ %bb.0: @ %entry236; CHECK-NEXT: vadd.f32 s0, s8, s0237; CHECK-NEXT: vadd.f32 s0, s0, s1238; CHECK-NEXT: vadd.f32 s0, s0, s2239; CHECK-NEXT: vadd.f32 s0, s0, s3240; CHECK-NEXT: vadd.f32 s0, s0, s4241; CHECK-NEXT: vadd.f32 s0, s0, s5242; CHECK-NEXT: vadd.f32 s0, s0, s6243; CHECK-NEXT: vadd.f32 s0, s0, s7244; CHECK-NEXT: bx lr245entry:246 %z = call float @llvm.vector.reduce.fadd.f32.v8f32(float %y, <8 x float> %x)247 ret float %z248}249 250define arm_aapcs_vfpcc half @fadd_v4f16_nofast(<4 x half> %x, half %y) {251; CHECK-LABEL: fadd_v4f16_nofast:252; CHECK: @ %bb.0: @ %entry253; CHECK-NEXT: vadd.f16 s2, s4, s0254; CHECK-NEXT: vmovx.f16 s0, s0255; CHECK-NEXT: vadd.f16 s0, s2, s0256; CHECK-NEXT: vmovx.f16 s2, s1257; CHECK-NEXT: vadd.f16 s0, s0, s1258; CHECK-NEXT: vadd.f16 s0, s0, s2259; CHECK-NEXT: bx lr260entry:261 %z = call half @llvm.vector.reduce.fadd.f16.v4f16(half %y, <4 x half> %x)262 ret half %z263}264 265define arm_aapcs_vfpcc half @fadd_v8f16_nofast(<8 x half> %x, half %y) {266; CHECK-LABEL: fadd_v8f16_nofast:267; CHECK: @ %bb.0: @ %entry268; CHECK-NEXT: vadd.f16 s4, s4, s0269; CHECK-NEXT: vmovx.f16 s0, s0270; CHECK-NEXT: vadd.f16 s0, s4, s0271; CHECK-NEXT: vmovx.f16 s4, s1272; CHECK-NEXT: vadd.f16 s0, s0, s1273; CHECK-NEXT: vadd.f16 s0, s0, s4274; CHECK-NEXT: vadd.f16 s0, s0, s2275; CHECK-NEXT: vmovx.f16 s2, s2276; CHECK-NEXT: vadd.f16 s0, s0, s2277; CHECK-NEXT: vmovx.f16 s2, s3278; CHECK-NEXT: vadd.f16 s0, s0, s3279; CHECK-NEXT: vadd.f16 s0, s0, s2280; CHECK-NEXT: bx lr281entry:282 %z = call half @llvm.vector.reduce.fadd.f16.v8f16(half %y, <8 x half> %x)283 ret half %z284}285 286define arm_aapcs_vfpcc half @fadd_v16f16_nofast(<16 x half> %x, half %y) {287; CHECK-LABEL: fadd_v16f16_nofast:288; CHECK: @ %bb.0: @ %entry289; CHECK-NEXT: vadd.f16 s8, s8, s0290; CHECK-NEXT: vmovx.f16 s0, s0291; CHECK-NEXT: vadd.f16 s0, s8, s0292; CHECK-NEXT: vmovx.f16 s8, s1293; CHECK-NEXT: vadd.f16 s0, s0, s1294; CHECK-NEXT: vadd.f16 s0, s0, s8295; CHECK-NEXT: vadd.f16 s0, s0, s2296; CHECK-NEXT: vmovx.f16 s2, s2297; CHECK-NEXT: vadd.f16 s0, s0, s2298; CHECK-NEXT: vmovx.f16 s2, s3299; CHECK-NEXT: vadd.f16 s0, s0, s3300; CHECK-NEXT: vadd.f16 s0, s0, s2301; CHECK-NEXT: vmovx.f16 s2, s4302; CHECK-NEXT: vadd.f16 s0, s0, s4303; CHECK-NEXT: vadd.f16 s0, s0, s2304; CHECK-NEXT: vmovx.f16 s2, s5305; CHECK-NEXT: vadd.f16 s0, s0, s5306; CHECK-NEXT: vadd.f16 s0, s0, s2307; CHECK-NEXT: vmovx.f16 s2, s6308; CHECK-NEXT: vadd.f16 s0, s0, s6309; CHECK-NEXT: vadd.f16 s0, s0, s2310; CHECK-NEXT: vmovx.f16 s2, s7311; CHECK-NEXT: vadd.f16 s0, s0, s7312; CHECK-NEXT: vadd.f16 s0, s0, s2313; CHECK-NEXT: bx lr314entry:315 %z = call half @llvm.vector.reduce.fadd.f16.v16f16(half %y, <16 x half> %x)316 ret half %z317}318 319define arm_aapcs_vfpcc double @fadd_v1f64_nofast(<1 x double> %x, double %y) {320; CHECK-LABEL: fadd_v1f64_nofast:321; CHECK: @ %bb.0: @ %entry322; CHECK-NEXT: vadd.f64 d0, d1, d0323; CHECK-NEXT: bx lr324entry:325 %z = call double @llvm.vector.reduce.fadd.f64.v1f64(double %y, <1 x double> %x)326 ret double %z327}328 329define arm_aapcs_vfpcc double @fadd_v2f64_nofast(<2 x double> %x, double %y) {330; CHECK-LABEL: fadd_v2f64_nofast:331; CHECK: @ %bb.0: @ %entry332; CHECK-NEXT: vadd.f64 d0, d2, d0333; CHECK-NEXT: vadd.f64 d0, d0, d1334; CHECK-NEXT: bx lr335entry:336 %z = call double @llvm.vector.reduce.fadd.f64.v2f64(double %y, <2 x double> %x)337 ret double %z338}339 340define arm_aapcs_vfpcc double @fadd_v4f64_nofast(<4 x double> %x, double %y) {341; CHECK-LABEL: fadd_v4f64_nofast:342; CHECK: @ %bb.0: @ %entry343; CHECK-NEXT: vadd.f64 d0, d4, d0344; CHECK-NEXT: vadd.f64 d0, d0, d1345; CHECK-NEXT: vadd.f64 d0, d0, d2346; CHECK-NEXT: vadd.f64 d0, d0, d3347; CHECK-NEXT: bx lr348entry:349 %z = call double @llvm.vector.reduce.fadd.f64.v4f64(double %y, <4 x double> %x)350 ret double %z351}352 353declare double @llvm.vector.reduce.fadd.f64.v1f64(double, <1 x double>)354declare double @llvm.vector.reduce.fadd.f64.v2f64(double, <2 x double>)355declare double @llvm.vector.reduce.fadd.f64.v4f64(double, <4 x double>)356declare float @llvm.vector.reduce.fadd.f32.v2f32(float, <2 x float>)357declare float @llvm.vector.reduce.fadd.f32.v4f32(float, <4 x float>)358declare float @llvm.vector.reduce.fadd.f32.v8f32(float, <8 x float>)359declare half @llvm.vector.reduce.fadd.f16.v16f16(half, <16 x half>)360declare half @llvm.vector.reduce.fadd.f16.v2f16(half, <2 x half>)361declare half @llvm.vector.reduce.fadd.f16.v4f16(half, <4 x half>)362declare half @llvm.vector.reduce.fadd.f16.v8f16(half, <8 x half>)363