1002 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub2; RUN: llc -mattr=+sve < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4 5target triple = "aarch64-unknown-linux-gnu"6 7;8; OEQ9;10 11define <vscale x 2 x i1> @fcmp_oeq_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {12; CHECK-LABEL: fcmp_oeq_nxv2bf16:13; CHECK: // %bb.0:14; CHECK-NEXT: lsl z1.s, z1.s, #1615; CHECK-NEXT: lsl z0.s, z0.s, #1616; CHECK-NEXT: ptrue p0.d17; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s18; CHECK-NEXT: ret19 %res = fcmp oeq <vscale x 2 x bfloat> %a, %b20 ret <vscale x 2 x i1> %res21}22 23define <vscale x 4 x i1> @fcmp_oeq_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {24; CHECK-LABEL: fcmp_oeq_nxv4bf16:25; CHECK: // %bb.0:26; CHECK-NEXT: lsl z1.s, z1.s, #1627; CHECK-NEXT: lsl z0.s, z0.s, #1628; CHECK-NEXT: ptrue p0.s29; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s30; CHECK-NEXT: ret31 %res = fcmp oeq <vscale x 4 x bfloat> %a, %b32 ret <vscale x 4 x i1> %res33}34 35define <vscale x 8 x i1> @fcmp_oeq_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {36; CHECK-LABEL: fcmp_oeq_nxv8bf16:37; CHECK: // %bb.0:38; CHECK-NEXT: uunpkhi z2.s, z1.h39; CHECK-NEXT: uunpkhi z3.s, z0.h40; CHECK-NEXT: uunpklo z1.s, z1.h41; CHECK-NEXT: uunpklo z0.s, z0.h42; CHECK-NEXT: ptrue p0.s43; CHECK-NEXT: lsl z2.s, z2.s, #1644; CHECK-NEXT: lsl z3.s, z3.s, #1645; CHECK-NEXT: lsl z1.s, z1.s, #1646; CHECK-NEXT: lsl z0.s, z0.s, #1647; CHECK-NEXT: fcmeq p1.s, p0/z, z3.s, z2.s48; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s49; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h50; CHECK-NEXT: ret51 %res = fcmp oeq <vscale x 8 x bfloat> %a, %b52 ret <vscale x 8 x i1> %res53}54 55;56; OGT57;58 59define <vscale x 2 x i1> @fcmp_ogt_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {60; CHECK-LABEL: fcmp_ogt_nxv2bf16:61; CHECK: // %bb.0:62; CHECK-NEXT: lsl z1.s, z1.s, #1663; CHECK-NEXT: lsl z0.s, z0.s, #1664; CHECK-NEXT: ptrue p0.d65; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s66; CHECK-NEXT: ret67 %res = fcmp ogt <vscale x 2 x bfloat> %a, %b68 ret <vscale x 2 x i1> %res69}70 71define <vscale x 4 x i1> @fcmp_ogt_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {72; CHECK-LABEL: fcmp_ogt_nxv4bf16:73; CHECK: // %bb.0:74; CHECK-NEXT: lsl z1.s, z1.s, #1675; CHECK-NEXT: lsl z0.s, z0.s, #1676; CHECK-NEXT: ptrue p0.s77; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s78; CHECK-NEXT: ret79 %res = fcmp ogt <vscale x 4 x bfloat> %a, %b80 ret <vscale x 4 x i1> %res81}82 83define <vscale x 8 x i1> @fcmp_ogt_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {84; CHECK-LABEL: fcmp_ogt_nxv8bf16:85; CHECK: // %bb.0:86; CHECK-NEXT: uunpkhi z2.s, z1.h87; CHECK-NEXT: uunpkhi z3.s, z0.h88; CHECK-NEXT: uunpklo z1.s, z1.h89; CHECK-NEXT: uunpklo z0.s, z0.h90; CHECK-NEXT: ptrue p0.s91; CHECK-NEXT: lsl z2.s, z2.s, #1692; CHECK-NEXT: lsl z3.s, z3.s, #1693; CHECK-NEXT: lsl z1.s, z1.s, #1694; CHECK-NEXT: lsl z0.s, z0.s, #1695; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s96; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s97; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h98; CHECK-NEXT: ret99 %res = fcmp ogt <vscale x 8 x bfloat> %a, %b100 ret <vscale x 8 x i1> %res101}102 103;104; OGE105;106 107define <vscale x 2 x i1> @fcmp_oge_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {108; CHECK-LABEL: fcmp_oge_nxv2bf16:109; CHECK: // %bb.0:110; CHECK-NEXT: lsl z1.s, z1.s, #16111; CHECK-NEXT: lsl z0.s, z0.s, #16112; CHECK-NEXT: ptrue p0.d113; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s114; CHECK-NEXT: ret115 %res = fcmp oge <vscale x 2 x bfloat> %a, %b116 ret <vscale x 2 x i1> %res117}118 119define <vscale x 4 x i1> @fcmp_oge_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {120; CHECK-LABEL: fcmp_oge_nxv4bf16:121; CHECK: // %bb.0:122; CHECK-NEXT: lsl z1.s, z1.s, #16123; CHECK-NEXT: lsl z0.s, z0.s, #16124; CHECK-NEXT: ptrue p0.s125; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s126; CHECK-NEXT: ret127 %res = fcmp oge <vscale x 4 x bfloat> %a, %b128 ret <vscale x 4 x i1> %res129}130 131define <vscale x 8 x i1> @fcmp_oge_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {132; CHECK-LABEL: fcmp_oge_nxv8bf16:133; CHECK: // %bb.0:134; CHECK-NEXT: uunpkhi z2.s, z1.h135; CHECK-NEXT: uunpkhi z3.s, z0.h136; CHECK-NEXT: uunpklo z1.s, z1.h137; CHECK-NEXT: uunpklo z0.s, z0.h138; CHECK-NEXT: ptrue p0.s139; CHECK-NEXT: lsl z2.s, z2.s, #16140; CHECK-NEXT: lsl z3.s, z3.s, #16141; CHECK-NEXT: lsl z1.s, z1.s, #16142; CHECK-NEXT: lsl z0.s, z0.s, #16143; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s144; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s145; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h146; CHECK-NEXT: ret147 %res = fcmp oge <vscale x 8 x bfloat> %a, %b148 ret <vscale x 8 x i1> %res149}150 151;152; OLT153;154 155define <vscale x 2 x i1> @fcmp_olt_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {156; CHECK-LABEL: fcmp_olt_nxv2bf16:157; CHECK: // %bb.0:158; CHECK-NEXT: lsl z0.s, z0.s, #16159; CHECK-NEXT: lsl z1.s, z1.s, #16160; CHECK-NEXT: ptrue p0.d161; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s162; CHECK-NEXT: ret163 %res = fcmp olt <vscale x 2 x bfloat> %a, %b164 ret <vscale x 2 x i1> %res165}166 167define <vscale x 4 x i1> @fcmp_olt_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {168; CHECK-LABEL: fcmp_olt_nxv4bf16:169; CHECK: // %bb.0:170; CHECK-NEXT: lsl z0.s, z0.s, #16171; CHECK-NEXT: lsl z1.s, z1.s, #16172; CHECK-NEXT: ptrue p0.s173; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s174; CHECK-NEXT: ret175 %res = fcmp olt <vscale x 4 x bfloat> %a, %b176 ret <vscale x 4 x i1> %res177}178 179define <vscale x 8 x i1> @fcmp_olt_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {180; CHECK-LABEL: fcmp_olt_nxv8bf16:181; CHECK: // %bb.0:182; CHECK-NEXT: uunpkhi z2.s, z0.h183; CHECK-NEXT: uunpkhi z3.s, z1.h184; CHECK-NEXT: uunpklo z0.s, z0.h185; CHECK-NEXT: uunpklo z1.s, z1.h186; CHECK-NEXT: ptrue p0.s187; CHECK-NEXT: lsl z2.s, z2.s, #16188; CHECK-NEXT: lsl z3.s, z3.s, #16189; CHECK-NEXT: lsl z0.s, z0.s, #16190; CHECK-NEXT: lsl z1.s, z1.s, #16191; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s192; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s193; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h194; CHECK-NEXT: ret195 %res = fcmp olt <vscale x 8 x bfloat> %a, %b196 ret <vscale x 8 x i1> %res197}198 199;200; OLE201;202 203define <vscale x 2 x i1> @fcmp_ole_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {204; CHECK-LABEL: fcmp_ole_nxv2bf16:205; CHECK: // %bb.0:206; CHECK-NEXT: lsl z0.s, z0.s, #16207; CHECK-NEXT: lsl z1.s, z1.s, #16208; CHECK-NEXT: ptrue p0.d209; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s210; CHECK-NEXT: ret211 %res = fcmp ole <vscale x 2 x bfloat> %a, %b212 ret <vscale x 2 x i1> %res213}214 215define <vscale x 4 x i1> @fcmp_ole_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {216; CHECK-LABEL: fcmp_ole_nxv4bf16:217; CHECK: // %bb.0:218; CHECK-NEXT: lsl z0.s, z0.s, #16219; CHECK-NEXT: lsl z1.s, z1.s, #16220; CHECK-NEXT: ptrue p0.s221; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s222; CHECK-NEXT: ret223 %res = fcmp ole <vscale x 4 x bfloat> %a, %b224 ret <vscale x 4 x i1> %res225}226 227define <vscale x 8 x i1> @fcmp_ole_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {228; CHECK-LABEL: fcmp_ole_nxv8bf16:229; CHECK: // %bb.0:230; CHECK-NEXT: uunpkhi z2.s, z0.h231; CHECK-NEXT: uunpkhi z3.s, z1.h232; CHECK-NEXT: uunpklo z0.s, z0.h233; CHECK-NEXT: uunpklo z1.s, z1.h234; CHECK-NEXT: ptrue p0.s235; CHECK-NEXT: lsl z2.s, z2.s, #16236; CHECK-NEXT: lsl z3.s, z3.s, #16237; CHECK-NEXT: lsl z0.s, z0.s, #16238; CHECK-NEXT: lsl z1.s, z1.s, #16239; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s240; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s241; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h242; CHECK-NEXT: ret243 %res = fcmp ole <vscale x 8 x bfloat> %a, %b244 ret <vscale x 8 x i1> %res245}246 247;248; ONE249;250 251define <vscale x 2 x i1> @fcmp_one_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {252; CHECK-LABEL: fcmp_one_nxv2bf16:253; CHECK: // %bb.0:254; CHECK-NEXT: lsl z0.s, z0.s, #16255; CHECK-NEXT: lsl z1.s, z1.s, #16256; CHECK-NEXT: ptrue p0.d257; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s258; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s259; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b260; CHECK-NEXT: ret261 %res = fcmp one <vscale x 2 x bfloat> %a, %b262 ret <vscale x 2 x i1> %res263}264 265define <vscale x 4 x i1> @fcmp_one_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {266; CHECK-LABEL: fcmp_one_nxv4bf16:267; CHECK: // %bb.0:268; CHECK-NEXT: lsl z0.s, z0.s, #16269; CHECK-NEXT: lsl z1.s, z1.s, #16270; CHECK-NEXT: ptrue p0.s271; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s272; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s273; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b274; CHECK-NEXT: ret275 %res = fcmp one <vscale x 4 x bfloat> %a, %b276 ret <vscale x 4 x i1> %res277}278 279define <vscale x 8 x i1> @fcmp_one_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {280; CHECK-LABEL: fcmp_one_nxv8bf16:281; CHECK: // %bb.0:282; CHECK-NEXT: uunpkhi z2.s, z0.h283; CHECK-NEXT: uunpkhi z3.s, z1.h284; CHECK-NEXT: uunpklo z0.s, z0.h285; CHECK-NEXT: uunpklo z1.s, z1.h286; CHECK-NEXT: ptrue p0.s287; CHECK-NEXT: lsl z2.s, z2.s, #16288; CHECK-NEXT: lsl z3.s, z3.s, #16289; CHECK-NEXT: lsl z0.s, z0.s, #16290; CHECK-NEXT: lsl z1.s, z1.s, #16291; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s292; CHECK-NEXT: fcmgt p2.s, p0/z, z2.s, z3.s293; CHECK-NEXT: fcmgt p3.s, p0/z, z1.s, z0.s294; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s295; CHECK-NEXT: mov p1.b, p2/m, p2.b296; CHECK-NEXT: sel p0.b, p0, p0.b, p3.b297; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h298; CHECK-NEXT: ret299 %res = fcmp one <vscale x 8 x bfloat> %a, %b300 ret <vscale x 8 x i1> %res301}302 303;304; ORD305;306 307define <vscale x 2 x i1> @fcmp_ord_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {308; CHECK-LABEL: fcmp_ord_nxv2bf16:309; CHECK: // %bb.0:310; CHECK-NEXT: lsl z1.s, z1.s, #16311; CHECK-NEXT: lsl z0.s, z0.s, #16312; CHECK-NEXT: ptrue p0.d313; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s314; CHECK-NEXT: not p0.b, p0/z, p1.b315; CHECK-NEXT: ret316 %res = fcmp ord <vscale x 2 x bfloat> %a, %b317 ret <vscale x 2 x i1> %res318}319 320define <vscale x 4 x i1> @fcmp_ord_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {321; CHECK-LABEL: fcmp_ord_nxv4bf16:322; CHECK: // %bb.0:323; CHECK-NEXT: lsl z1.s, z1.s, #16324; CHECK-NEXT: lsl z0.s, z0.s, #16325; CHECK-NEXT: ptrue p0.s326; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s327; CHECK-NEXT: not p0.b, p0/z, p1.b328; CHECK-NEXT: ret329 %res = fcmp ord <vscale x 4 x bfloat> %a, %b330 ret <vscale x 4 x i1> %res331}332 333define <vscale x 8 x i1> @fcmp_ord_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {334; CHECK-LABEL: fcmp_ord_nxv8bf16:335; CHECK: // %bb.0:336; CHECK-NEXT: uunpkhi z2.s, z1.h337; CHECK-NEXT: uunpkhi z3.s, z0.h338; CHECK-NEXT: uunpklo z1.s, z1.h339; CHECK-NEXT: uunpklo z0.s, z0.h340; CHECK-NEXT: ptrue p0.s341; CHECK-NEXT: lsl z2.s, z2.s, #16342; CHECK-NEXT: lsl z3.s, z3.s, #16343; CHECK-NEXT: lsl z1.s, z1.s, #16344; CHECK-NEXT: lsl z0.s, z0.s, #16345; CHECK-NEXT: fcmuo p1.s, p0/z, z3.s, z2.s346; CHECK-NEXT: fcmuo p2.s, p0/z, z0.s, z1.s347; CHECK-NEXT: not p1.b, p0/z, p1.b348; CHECK-NEXT: not p0.b, p0/z, p2.b349; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h350; CHECK-NEXT: ret351 %res = fcmp ord <vscale x 8 x bfloat> %a, %b352 ret <vscale x 8 x i1> %res353}354 355;356; UEQ357;358 359define <vscale x 2 x i1> @fcmp_ueq_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {360; CHECK-LABEL: fcmp_ueq_nxv2bf16:361; CHECK: // %bb.0:362; CHECK-NEXT: lsl z1.s, z1.s, #16363; CHECK-NEXT: lsl z0.s, z0.s, #16364; CHECK-NEXT: ptrue p0.d365; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s366; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s367; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b368; CHECK-NEXT: ret369 %res = fcmp ueq <vscale x 2 x bfloat> %a, %b370 ret <vscale x 2 x i1> %res371}372 373define <vscale x 4 x i1> @fcmp_ueq_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {374; CHECK-LABEL: fcmp_ueq_nxv4bf16:375; CHECK: // %bb.0:376; CHECK-NEXT: lsl z1.s, z1.s, #16377; CHECK-NEXT: lsl z0.s, z0.s, #16378; CHECK-NEXT: ptrue p0.s379; CHECK-NEXT: fcmuo p1.s, p0/z, z0.s, z1.s380; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s381; CHECK-NEXT: sel p0.b, p0, p0.b, p1.b382; CHECK-NEXT: ret383 %res = fcmp ueq <vscale x 4 x bfloat> %a, %b384 ret <vscale x 4 x i1> %res385}386 387define <vscale x 8 x i1> @fcmp_ueq_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {388; CHECK-LABEL: fcmp_ueq_nxv8bf16:389; CHECK: // %bb.0:390; CHECK-NEXT: uunpkhi z2.s, z1.h391; CHECK-NEXT: uunpkhi z3.s, z0.h392; CHECK-NEXT: uunpklo z1.s, z1.h393; CHECK-NEXT: uunpklo z0.s, z0.h394; CHECK-NEXT: ptrue p0.s395; CHECK-NEXT: lsl z2.s, z2.s, #16396; CHECK-NEXT: lsl z3.s, z3.s, #16397; CHECK-NEXT: lsl z1.s, z1.s, #16398; CHECK-NEXT: lsl z0.s, z0.s, #16399; CHECK-NEXT: fcmuo p1.s, p0/z, z3.s, z2.s400; CHECK-NEXT: fcmeq p2.s, p0/z, z3.s, z2.s401; CHECK-NEXT: fcmuo p3.s, p0/z, z0.s, z1.s402; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s403; CHECK-NEXT: mov p1.b, p2/m, p2.b404; CHECK-NEXT: sel p0.b, p0, p0.b, p3.b405; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h406; CHECK-NEXT: ret407 %res = fcmp ueq <vscale x 8 x bfloat> %a, %b408 ret <vscale x 8 x i1> %res409}410 411;412; UGT413;414 415define <vscale x 2 x i1> @fcmp_ugt_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {416; CHECK-LABEL: fcmp_ugt_nxv2bf16:417; CHECK: // %bb.0:418; CHECK-NEXT: lsl z0.s, z0.s, #16419; CHECK-NEXT: lsl z1.s, z1.s, #16420; CHECK-NEXT: ptrue p0.d421; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z0.s422; CHECK-NEXT: not p0.b, p0/z, p1.b423; CHECK-NEXT: ret424 %res = fcmp ugt <vscale x 2 x bfloat> %a, %b425 ret <vscale x 2 x i1> %res426}427 428define <vscale x 4 x i1> @fcmp_ugt_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {429; CHECK-LABEL: fcmp_ugt_nxv4bf16:430; CHECK: // %bb.0:431; CHECK-NEXT: lsl z0.s, z0.s, #16432; CHECK-NEXT: lsl z1.s, z1.s, #16433; CHECK-NEXT: ptrue p0.s434; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z0.s435; CHECK-NEXT: not p0.b, p0/z, p1.b436; CHECK-NEXT: ret437 %res = fcmp ugt <vscale x 4 x bfloat> %a, %b438 ret <vscale x 4 x i1> %res439}440 441define <vscale x 8 x i1> @fcmp_ugt_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {442; CHECK-LABEL: fcmp_ugt_nxv8bf16:443; CHECK: // %bb.0:444; CHECK-NEXT: uunpkhi z2.s, z0.h445; CHECK-NEXT: uunpkhi z3.s, z1.h446; CHECK-NEXT: uunpklo z0.s, z0.h447; CHECK-NEXT: uunpklo z1.s, z1.h448; CHECK-NEXT: ptrue p0.s449; CHECK-NEXT: lsl z2.s, z2.s, #16450; CHECK-NEXT: lsl z3.s, z3.s, #16451; CHECK-NEXT: lsl z0.s, z0.s, #16452; CHECK-NEXT: lsl z1.s, z1.s, #16453; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s454; CHECK-NEXT: fcmge p2.s, p0/z, z1.s, z0.s455; CHECK-NEXT: not p1.b, p0/z, p1.b456; CHECK-NEXT: not p0.b, p0/z, p2.b457; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h458; CHECK-NEXT: ret459 %res = fcmp ugt <vscale x 8 x bfloat> %a, %b460 ret <vscale x 8 x i1> %res461}462 463;464; UGE465;466 467define <vscale x 2 x i1> @fcmp_uge_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {468; CHECK-LABEL: fcmp_uge_nxv2bf16:469; CHECK: // %bb.0:470; CHECK-NEXT: lsl z0.s, z0.s, #16471; CHECK-NEXT: lsl z1.s, z1.s, #16472; CHECK-NEXT: ptrue p0.d473; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s474; CHECK-NEXT: not p0.b, p0/z, p1.b475; CHECK-NEXT: ret476 %res = fcmp uge <vscale x 2 x bfloat> %a, %b477 ret <vscale x 2 x i1> %res478}479 480define <vscale x 4 x i1> @fcmp_uge_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {481; CHECK-LABEL: fcmp_uge_nxv4bf16:482; CHECK: // %bb.0:483; CHECK-NEXT: lsl z0.s, z0.s, #16484; CHECK-NEXT: lsl z1.s, z1.s, #16485; CHECK-NEXT: ptrue p0.s486; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z0.s487; CHECK-NEXT: not p0.b, p0/z, p1.b488; CHECK-NEXT: ret489 %res = fcmp uge <vscale x 4 x bfloat> %a, %b490 ret <vscale x 4 x i1> %res491}492 493define <vscale x 8 x i1> @fcmp_uge_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {494; CHECK-LABEL: fcmp_uge_nxv8bf16:495; CHECK: // %bb.0:496; CHECK-NEXT: uunpkhi z2.s, z0.h497; CHECK-NEXT: uunpkhi z3.s, z1.h498; CHECK-NEXT: uunpklo z0.s, z0.h499; CHECK-NEXT: uunpklo z1.s, z1.h500; CHECK-NEXT: ptrue p0.s501; CHECK-NEXT: lsl z2.s, z2.s, #16502; CHECK-NEXT: lsl z3.s, z3.s, #16503; CHECK-NEXT: lsl z0.s, z0.s, #16504; CHECK-NEXT: lsl z1.s, z1.s, #16505; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s506; CHECK-NEXT: fcmgt p2.s, p0/z, z1.s, z0.s507; CHECK-NEXT: not p1.b, p0/z, p1.b508; CHECK-NEXT: not p0.b, p0/z, p2.b509; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h510; CHECK-NEXT: ret511 %res = fcmp uge <vscale x 8 x bfloat> %a, %b512 ret <vscale x 8 x i1> %res513}514 515;516; ULT517;518 519define <vscale x 2 x i1> @fcmp_ult_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {520; CHECK-LABEL: fcmp_ult_nxv2bf16:521; CHECK: // %bb.0:522; CHECK-NEXT: lsl z1.s, z1.s, #16523; CHECK-NEXT: lsl z0.s, z0.s, #16524; CHECK-NEXT: ptrue p0.d525; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s526; CHECK-NEXT: not p0.b, p0/z, p1.b527; CHECK-NEXT: ret528 %res = fcmp ult <vscale x 2 x bfloat> %a, %b529 ret <vscale x 2 x i1> %res530}531 532define <vscale x 4 x i1> @fcmp_ult_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {533; CHECK-LABEL: fcmp_ult_nxv4bf16:534; CHECK: // %bb.0:535; CHECK-NEXT: lsl z1.s, z1.s, #16536; CHECK-NEXT: lsl z0.s, z0.s, #16537; CHECK-NEXT: ptrue p0.s538; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s539; CHECK-NEXT: not p0.b, p0/z, p1.b540; CHECK-NEXT: ret541 %res = fcmp ult <vscale x 4 x bfloat> %a, %b542 ret <vscale x 4 x i1> %res543}544 545define <vscale x 8 x i1> @fcmp_ult_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {546; CHECK-LABEL: fcmp_ult_nxv8bf16:547; CHECK: // %bb.0:548; CHECK-NEXT: uunpkhi z2.s, z1.h549; CHECK-NEXT: uunpkhi z3.s, z0.h550; CHECK-NEXT: uunpklo z1.s, z1.h551; CHECK-NEXT: uunpklo z0.s, z0.h552; CHECK-NEXT: ptrue p0.s553; CHECK-NEXT: lsl z2.s, z2.s, #16554; CHECK-NEXT: lsl z3.s, z3.s, #16555; CHECK-NEXT: lsl z1.s, z1.s, #16556; CHECK-NEXT: lsl z0.s, z0.s, #16557; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s558; CHECK-NEXT: fcmge p2.s, p0/z, z0.s, z1.s559; CHECK-NEXT: not p1.b, p0/z, p1.b560; CHECK-NEXT: not p0.b, p0/z, p2.b561; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h562; CHECK-NEXT: ret563 %res = fcmp ult <vscale x 8 x bfloat> %a, %b564 ret <vscale x 8 x i1> %res565}566 567;568; ULE569;570 571define <vscale x 2 x i1> @fcmp_ule_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {572; CHECK-LABEL: fcmp_ule_nxv2bf16:573; CHECK: // %bb.0:574; CHECK-NEXT: lsl z1.s, z1.s, #16575; CHECK-NEXT: lsl z0.s, z0.s, #16576; CHECK-NEXT: ptrue p0.d577; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s578; CHECK-NEXT: not p0.b, p0/z, p1.b579; CHECK-NEXT: ret580 %res = fcmp ule <vscale x 2 x bfloat> %a, %b581 ret <vscale x 2 x i1> %res582}583 584define <vscale x 4 x i1> @fcmp_ule_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {585; CHECK-LABEL: fcmp_ule_nxv4bf16:586; CHECK: // %bb.0:587; CHECK-NEXT: lsl z1.s, z1.s, #16588; CHECK-NEXT: lsl z0.s, z0.s, #16589; CHECK-NEXT: ptrue p0.s590; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s591; CHECK-NEXT: not p0.b, p0/z, p1.b592; CHECK-NEXT: ret593 %res = fcmp ule <vscale x 4 x bfloat> %a, %b594 ret <vscale x 4 x i1> %res595}596 597define <vscale x 8 x i1> @fcmp_ule_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {598; CHECK-LABEL: fcmp_ule_nxv8bf16:599; CHECK: // %bb.0:600; CHECK-NEXT: uunpkhi z2.s, z1.h601; CHECK-NEXT: uunpkhi z3.s, z0.h602; CHECK-NEXT: uunpklo z1.s, z1.h603; CHECK-NEXT: uunpklo z0.s, z0.h604; CHECK-NEXT: ptrue p0.s605; CHECK-NEXT: lsl z2.s, z2.s, #16606; CHECK-NEXT: lsl z3.s, z3.s, #16607; CHECK-NEXT: lsl z1.s, z1.s, #16608; CHECK-NEXT: lsl z0.s, z0.s, #16609; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s610; CHECK-NEXT: fcmgt p2.s, p0/z, z0.s, z1.s611; CHECK-NEXT: not p1.b, p0/z, p1.b612; CHECK-NEXT: not p0.b, p0/z, p2.b613; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h614; CHECK-NEXT: ret615 %res = fcmp ule <vscale x 8 x bfloat> %a, %b616 ret <vscale x 8 x i1> %res617}618 619;620; UNE621;622 623define <vscale x 2 x i1> @fcmp_une_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {624; CHECK-LABEL: fcmp_une_nxv2bf16:625; CHECK: // %bb.0:626; CHECK-NEXT: lsl z1.s, z1.s, #16627; CHECK-NEXT: lsl z0.s, z0.s, #16628; CHECK-NEXT: ptrue p0.d629; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s630; CHECK-NEXT: ret631 %res = fcmp une <vscale x 2 x bfloat> %a, %b632 ret <vscale x 2 x i1> %res633}634 635define <vscale x 4 x i1> @fcmp_une_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {636; CHECK-LABEL: fcmp_une_nxv4bf16:637; CHECK: // %bb.0:638; CHECK-NEXT: lsl z1.s, z1.s, #16639; CHECK-NEXT: lsl z0.s, z0.s, #16640; CHECK-NEXT: ptrue p0.s641; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s642; CHECK-NEXT: ret643 %res = fcmp une <vscale x 4 x bfloat> %a, %b644 ret <vscale x 4 x i1> %res645}646 647define <vscale x 8 x i1> @fcmp_une_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {648; CHECK-LABEL: fcmp_une_nxv8bf16:649; CHECK: // %bb.0:650; CHECK-NEXT: uunpkhi z2.s, z1.h651; CHECK-NEXT: uunpkhi z3.s, z0.h652; CHECK-NEXT: uunpklo z1.s, z1.h653; CHECK-NEXT: uunpklo z0.s, z0.h654; CHECK-NEXT: ptrue p0.s655; CHECK-NEXT: lsl z2.s, z2.s, #16656; CHECK-NEXT: lsl z3.s, z3.s, #16657; CHECK-NEXT: lsl z1.s, z1.s, #16658; CHECK-NEXT: lsl z0.s, z0.s, #16659; CHECK-NEXT: fcmne p1.s, p0/z, z3.s, z2.s660; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s661; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h662; CHECK-NEXT: ret663 %res = fcmp une <vscale x 8 x bfloat> %a, %b664 ret <vscale x 8 x i1> %res665}666 667;668; UNO669;670 671define <vscale x 2 x i1> @fcmp_uno_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {672; CHECK-LABEL: fcmp_uno_nxv2bf16:673; CHECK: // %bb.0:674; CHECK-NEXT: lsl z1.s, z1.s, #16675; CHECK-NEXT: lsl z0.s, z0.s, #16676; CHECK-NEXT: ptrue p0.d677; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z1.s678; CHECK-NEXT: ret679 %res = fcmp uno <vscale x 2 x bfloat> %a, %b680 ret <vscale x 2 x i1> %res681}682 683define <vscale x 4 x i1> @fcmp_uno_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {684; CHECK-LABEL: fcmp_uno_nxv4bf16:685; CHECK: // %bb.0:686; CHECK-NEXT: lsl z1.s, z1.s, #16687; CHECK-NEXT: lsl z0.s, z0.s, #16688; CHECK-NEXT: ptrue p0.s689; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z1.s690; CHECK-NEXT: ret691 %res = fcmp uno <vscale x 4 x bfloat> %a, %b692 ret <vscale x 4 x i1> %res693}694 695define <vscale x 8 x i1> @fcmp_uno_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {696; CHECK-LABEL: fcmp_uno_nxv8bf16:697; CHECK: // %bb.0:698; CHECK-NEXT: uunpkhi z2.s, z1.h699; CHECK-NEXT: uunpkhi z3.s, z0.h700; CHECK-NEXT: uunpklo z1.s, z1.h701; CHECK-NEXT: uunpklo z0.s, z0.h702; CHECK-NEXT: ptrue p0.s703; CHECK-NEXT: lsl z2.s, z2.s, #16704; CHECK-NEXT: lsl z3.s, z3.s, #16705; CHECK-NEXT: lsl z1.s, z1.s, #16706; CHECK-NEXT: lsl z0.s, z0.s, #16707; CHECK-NEXT: fcmuo p1.s, p0/z, z3.s, z2.s708; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z1.s709; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h710; CHECK-NEXT: ret711 %res = fcmp uno <vscale x 8 x bfloat> %a, %b712 ret <vscale x 8 x i1> %res713}714 715;716; EQ717;718 719define <vscale x 2 x i1> @fcmp_eq_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {720; CHECK-LABEL: fcmp_eq_nxv2bf16:721; CHECK: // %bb.0:722; CHECK-NEXT: lsl z1.s, z1.s, #16723; CHECK-NEXT: lsl z0.s, z0.s, #16724; CHECK-NEXT: ptrue p0.d725; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s726; CHECK-NEXT: ret727 %res = fcmp fast oeq <vscale x 2 x bfloat> %a, %b728 ret <vscale x 2 x i1> %res729}730 731define <vscale x 4 x i1> @fcmp_eq_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {732; CHECK-LABEL: fcmp_eq_nxv4bf16:733; CHECK: // %bb.0:734; CHECK-NEXT: lsl z1.s, z1.s, #16735; CHECK-NEXT: lsl z0.s, z0.s, #16736; CHECK-NEXT: ptrue p0.s737; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s738; CHECK-NEXT: ret739 %res = fcmp fast oeq <vscale x 4 x bfloat> %a, %b740 ret <vscale x 4 x i1> %res741}742 743define <vscale x 8 x i1> @fcmp_eq_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {744; CHECK-LABEL: fcmp_eq_nxv8bf16:745; CHECK: // %bb.0:746; CHECK-NEXT: uunpkhi z2.s, z1.h747; CHECK-NEXT: uunpkhi z3.s, z0.h748; CHECK-NEXT: uunpklo z1.s, z1.h749; CHECK-NEXT: uunpklo z0.s, z0.h750; CHECK-NEXT: ptrue p0.s751; CHECK-NEXT: lsl z2.s, z2.s, #16752; CHECK-NEXT: lsl z3.s, z3.s, #16753; CHECK-NEXT: lsl z1.s, z1.s, #16754; CHECK-NEXT: lsl z0.s, z0.s, #16755; CHECK-NEXT: fcmeq p1.s, p0/z, z3.s, z2.s756; CHECK-NEXT: fcmeq p0.s, p0/z, z0.s, z1.s757; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h758; CHECK-NEXT: ret759 %res = fcmp fast oeq <vscale x 8 x bfloat> %a, %b760 ret <vscale x 8 x i1> %res761}762 763;764; GT765;766 767define <vscale x 2 x i1> @fcmp_gt_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {768; CHECK-LABEL: fcmp_gt_nxv2bf16:769; CHECK: // %bb.0:770; CHECK-NEXT: lsl z1.s, z1.s, #16771; CHECK-NEXT: lsl z0.s, z0.s, #16772; CHECK-NEXT: ptrue p0.d773; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s774; CHECK-NEXT: ret775 %res = fcmp fast ogt <vscale x 2 x bfloat> %a, %b776 ret <vscale x 2 x i1> %res777}778 779define <vscale x 4 x i1> @fcmp_gt_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {780; CHECK-LABEL: fcmp_gt_nxv4bf16:781; CHECK: // %bb.0:782; CHECK-NEXT: lsl z1.s, z1.s, #16783; CHECK-NEXT: lsl z0.s, z0.s, #16784; CHECK-NEXT: ptrue p0.s785; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s786; CHECK-NEXT: ret787 %res = fcmp fast ogt <vscale x 4 x bfloat> %a, %b788 ret <vscale x 4 x i1> %res789}790 791define <vscale x 8 x i1> @fcmp_gt_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {792; CHECK-LABEL: fcmp_gt_nxv8bf16:793; CHECK: // %bb.0:794; CHECK-NEXT: uunpkhi z2.s, z1.h795; CHECK-NEXT: uunpkhi z3.s, z0.h796; CHECK-NEXT: uunpklo z1.s, z1.h797; CHECK-NEXT: uunpklo z0.s, z0.h798; CHECK-NEXT: ptrue p0.s799; CHECK-NEXT: lsl z2.s, z2.s, #16800; CHECK-NEXT: lsl z3.s, z3.s, #16801; CHECK-NEXT: lsl z1.s, z1.s, #16802; CHECK-NEXT: lsl z0.s, z0.s, #16803; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s804; CHECK-NEXT: fcmgt p0.s, p0/z, z0.s, z1.s805; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h806; CHECK-NEXT: ret807 %res = fcmp fast ogt <vscale x 8 x bfloat> %a, %b808 ret <vscale x 8 x i1> %res809}810 811;812; GE813;814 815define <vscale x 2 x i1> @fcmp_ge_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {816; CHECK-LABEL: fcmp_ge_nxv2bf16:817; CHECK: // %bb.0:818; CHECK-NEXT: lsl z1.s, z1.s, #16819; CHECK-NEXT: lsl z0.s, z0.s, #16820; CHECK-NEXT: ptrue p0.d821; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s822; CHECK-NEXT: ret823 %res = fcmp fast oge <vscale x 2 x bfloat> %a, %b824 ret <vscale x 2 x i1> %res825}826 827define <vscale x 4 x i1> @fcmp_ge_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {828; CHECK-LABEL: fcmp_ge_nxv4bf16:829; CHECK: // %bb.0:830; CHECK-NEXT: lsl z1.s, z1.s, #16831; CHECK-NEXT: lsl z0.s, z0.s, #16832; CHECK-NEXT: ptrue p0.s833; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s834; CHECK-NEXT: ret835 %res = fcmp fast oge <vscale x 4 x bfloat> %a, %b836 ret <vscale x 4 x i1> %res837}838 839define <vscale x 8 x i1> @fcmp_ge_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {840; CHECK-LABEL: fcmp_ge_nxv8bf16:841; CHECK: // %bb.0:842; CHECK-NEXT: uunpkhi z2.s, z1.h843; CHECK-NEXT: uunpkhi z3.s, z0.h844; CHECK-NEXT: uunpklo z1.s, z1.h845; CHECK-NEXT: uunpklo z0.s, z0.h846; CHECK-NEXT: ptrue p0.s847; CHECK-NEXT: lsl z2.s, z2.s, #16848; CHECK-NEXT: lsl z3.s, z3.s, #16849; CHECK-NEXT: lsl z1.s, z1.s, #16850; CHECK-NEXT: lsl z0.s, z0.s, #16851; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s852; CHECK-NEXT: fcmge p0.s, p0/z, z0.s, z1.s853; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h854; CHECK-NEXT: ret855 %res = fcmp fast oge <vscale x 8 x bfloat> %a, %b856 ret <vscale x 8 x i1> %res857}858 859;860; LT861;862 863define <vscale x 2 x i1> @fcmp_lt_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {864; CHECK-LABEL: fcmp_lt_nxv2bf16:865; CHECK: // %bb.0:866; CHECK-NEXT: lsl z0.s, z0.s, #16867; CHECK-NEXT: lsl z1.s, z1.s, #16868; CHECK-NEXT: ptrue p0.d869; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s870; CHECK-NEXT: ret871 %res = fcmp fast olt <vscale x 2 x bfloat> %a, %b872 ret <vscale x 2 x i1> %res873}874 875define <vscale x 4 x i1> @fcmp_lt_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {876; CHECK-LABEL: fcmp_lt_nxv4bf16:877; CHECK: // %bb.0:878; CHECK-NEXT: lsl z0.s, z0.s, #16879; CHECK-NEXT: lsl z1.s, z1.s, #16880; CHECK-NEXT: ptrue p0.s881; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s882; CHECK-NEXT: ret883 %res = fcmp fast olt <vscale x 4 x bfloat> %a, %b884 ret <vscale x 4 x i1> %res885}886 887define <vscale x 8 x i1> @fcmp_lt_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {888; CHECK-LABEL: fcmp_lt_nxv8bf16:889; CHECK: // %bb.0:890; CHECK-NEXT: uunpkhi z2.s, z0.h891; CHECK-NEXT: uunpkhi z3.s, z1.h892; CHECK-NEXT: uunpklo z0.s, z0.h893; CHECK-NEXT: uunpklo z1.s, z1.h894; CHECK-NEXT: ptrue p0.s895; CHECK-NEXT: lsl z2.s, z2.s, #16896; CHECK-NEXT: lsl z3.s, z3.s, #16897; CHECK-NEXT: lsl z0.s, z0.s, #16898; CHECK-NEXT: lsl z1.s, z1.s, #16899; CHECK-NEXT: fcmgt p1.s, p0/z, z3.s, z2.s900; CHECK-NEXT: fcmgt p0.s, p0/z, z1.s, z0.s901; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h902; CHECK-NEXT: ret903 %res = fcmp fast olt <vscale x 8 x bfloat> %a, %b904 ret <vscale x 8 x i1> %res905}906 907;908; LE909;910 911define <vscale x 2 x i1> @fcmp_le_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {912; CHECK-LABEL: fcmp_le_nxv2bf16:913; CHECK: // %bb.0:914; CHECK-NEXT: lsl z0.s, z0.s, #16915; CHECK-NEXT: lsl z1.s, z1.s, #16916; CHECK-NEXT: ptrue p0.d917; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s918; CHECK-NEXT: ret919 %res = fcmp fast ole <vscale x 2 x bfloat> %a, %b920 ret <vscale x 2 x i1> %res921}922 923define <vscale x 4 x i1> @fcmp_le_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {924; CHECK-LABEL: fcmp_le_nxv4bf16:925; CHECK: // %bb.0:926; CHECK-NEXT: lsl z0.s, z0.s, #16927; CHECK-NEXT: lsl z1.s, z1.s, #16928; CHECK-NEXT: ptrue p0.s929; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s930; CHECK-NEXT: ret931 %res = fcmp fast ole <vscale x 4 x bfloat> %a, %b932 ret <vscale x 4 x i1> %res933}934 935define <vscale x 8 x i1> @fcmp_le_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {936; CHECK-LABEL: fcmp_le_nxv8bf16:937; CHECK: // %bb.0:938; CHECK-NEXT: uunpkhi z2.s, z0.h939; CHECK-NEXT: uunpkhi z3.s, z1.h940; CHECK-NEXT: uunpklo z0.s, z0.h941; CHECK-NEXT: uunpklo z1.s, z1.h942; CHECK-NEXT: ptrue p0.s943; CHECK-NEXT: lsl z2.s, z2.s, #16944; CHECK-NEXT: lsl z3.s, z3.s, #16945; CHECK-NEXT: lsl z0.s, z0.s, #16946; CHECK-NEXT: lsl z1.s, z1.s, #16947; CHECK-NEXT: fcmge p1.s, p0/z, z3.s, z2.s948; CHECK-NEXT: fcmge p0.s, p0/z, z1.s, z0.s949; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h950; CHECK-NEXT: ret951 %res = fcmp fast ole <vscale x 8 x bfloat> %a, %b952 ret <vscale x 8 x i1> %res953}954 955;956; NE957;958 959define <vscale x 2 x i1> @fcmp_ne_nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) {960; CHECK-LABEL: fcmp_ne_nxv2bf16:961; CHECK: // %bb.0:962; CHECK-NEXT: lsl z1.s, z1.s, #16963; CHECK-NEXT: lsl z0.s, z0.s, #16964; CHECK-NEXT: ptrue p0.d965; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s966; CHECK-NEXT: ret967 %res = fcmp fast one <vscale x 2 x bfloat> %a, %b968 ret <vscale x 2 x i1> %res969}970 971define <vscale x 4 x i1> @fcmp_ne_nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) {972; CHECK-LABEL: fcmp_ne_nxv4bf16:973; CHECK: // %bb.0:974; CHECK-NEXT: lsl z1.s, z1.s, #16975; CHECK-NEXT: lsl z0.s, z0.s, #16976; CHECK-NEXT: ptrue p0.s977; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s978; CHECK-NEXT: ret979 %res = fcmp fast one <vscale x 4 x bfloat> %a, %b980 ret <vscale x 4 x i1> %res981}982 983define <vscale x 8 x i1> @fcmp_ne_nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) {984; CHECK-LABEL: fcmp_ne_nxv8bf16:985; CHECK: // %bb.0:986; CHECK-NEXT: uunpkhi z2.s, z1.h987; CHECK-NEXT: uunpkhi z3.s, z0.h988; CHECK-NEXT: uunpklo z1.s, z1.h989; CHECK-NEXT: uunpklo z0.s, z0.h990; CHECK-NEXT: ptrue p0.s991; CHECK-NEXT: lsl z2.s, z2.s, #16992; CHECK-NEXT: lsl z3.s, z3.s, #16993; CHECK-NEXT: lsl z1.s, z1.s, #16994; CHECK-NEXT: lsl z0.s, z0.s, #16995; CHECK-NEXT: fcmne p1.s, p0/z, z3.s, z2.s996; CHECK-NEXT: fcmne p0.s, p0/z, z0.s, z1.s997; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h998; CHECK-NEXT: ret999 %res = fcmp fast one <vscale x 8 x bfloat> %a, %b1000 ret <vscale x 8 x i1> %res1001}1002