brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.8 KiB · df6b6f7 Raw
525 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=NEON3; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+sve2 < %s | FileCheck %s --check-prefix=SVE24 5; Test SVE2 BSL/NBSL/BSL1N/BSL2N code generation for:6;   #define BSL(x,y,z)   (  ((x) & (z)) | ( (y) & ~(z)))7;   #define NBSL(x,y,z)  (~(((x) & (z)) | ( (y) & ~(z))))8;   #define BSL1N(x,y,z) ( (~(x) & (z)) | ( (y) & ~(z)))9;   #define BSL2N(x,y,z) (  ((x) & (z)) | (~(y) & ~(z)))10;11; See also llvm/test/CodeGen/AArch64/sve2-bsl.ll.12 13; Test basic codegen.14 15define <1 x i64> @bsl_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {16; NEON-LABEL: bsl_v1i64:17; NEON:       // %bb.0:18; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b19; NEON-NEXT:    ret20;21; SVE2-LABEL: bsl_v1i64:22; SVE2:       // %bb.0:23; SVE2-NEXT:    bif v0.8b, v1.8b, v2.8b24; SVE2-NEXT:    ret25  %4 = and <1 x i64> %2, %026  %5 = xor <1 x i64> %2, splat (i64 -1)27  %6 = and <1 x i64> %1, %528  %7 = or <1 x i64> %4, %629  ret <1 x i64> %730}31 32define <1 x i64> @nbsl_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {33; NEON-LABEL: nbsl_v1i64:34; NEON:       // %bb.0:35; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b36; NEON-NEXT:    mvn v0.8b, v0.8b37; NEON-NEXT:    ret38;39; SVE2-LABEL: nbsl_v1i64:40; SVE2:       // %bb.0:41; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z042; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z243; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z144; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d45; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z046; SVE2-NEXT:    ret47  %4 = and <1 x i64> %2, %048  %5 = xor <1 x i64> %2, splat (i64 -1)49  %6 = and <1 x i64> %1, %550  %7 = or <1 x i64> %4, %651  %8 = xor <1 x i64> %7, splat (i64 -1)52  ret <1 x i64> %853}54 55define <1 x i64> @bsl1n_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {56; NEON-LABEL: bsl1n_v1i64:57; NEON:       // %bb.0:58; NEON-NEXT:    mvn v0.8b, v0.8b59; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b60; NEON-NEXT:    ret61;62; SVE2-LABEL: bsl1n_v1i64:63; SVE2:       // %bb.0:64; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z065; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z266; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z167; SVE2-NEXT:    bsl1n z0.d, z0.d, z1.d, z2.d68; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z069; SVE2-NEXT:    ret70  %4 = xor <1 x i64> %0, splat (i64 -1)71  %5 = and <1 x i64> %2, %472  %6 = xor <1 x i64> %2, splat (i64 -1)73  %7 = and <1 x i64> %1, %674  %8 = or <1 x i64> %5, %775  ret <1 x i64> %876}77 78define <1 x i64> @bsl2n_v1i64(<1 x i64> %0, <1 x i64> %1, <1 x i64> %2) {79; NEON-LABEL: bsl2n_v1i64:80; NEON:       // %bb.0:81; NEON-NEXT:    and v0.8b, v2.8b, v0.8b82; NEON-NEXT:    orr v1.8b, v2.8b, v1.8b83; NEON-NEXT:    orn v0.8b, v0.8b, v1.8b84; NEON-NEXT:    ret85;86; SVE2-LABEL: bsl2n_v1i64:87; SVE2:       // %bb.0:88; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z089; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z290; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z191; SVE2-NEXT:    bsl2n z0.d, z0.d, z1.d, z2.d92; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z093; SVE2-NEXT:    ret94  %4 = and <1 x i64> %2, %095  %5 = or <1 x i64> %2, %196  %6 = xor <1 x i64> %5, splat (i64 -1)97  %7 = or <1 x i64> %4, %698  ret <1 x i64> %799}100 101define <2 x i64> @bsl_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {102; NEON-LABEL: bsl_v2i64:103; NEON:       // %bb.0:104; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b105; NEON-NEXT:    ret106;107; SVE2-LABEL: bsl_v2i64:108; SVE2:       // %bb.0:109; SVE2-NEXT:    bif v0.16b, v1.16b, v2.16b110; SVE2-NEXT:    ret111  %4 = and <2 x i64> %2, %0112  %5 = xor <2 x i64> %2, splat (i64 -1)113  %6 = and <2 x i64> %1, %5114  %7 = or <2 x i64> %4, %6115  ret <2 x i64> %7116}117 118define <2 x i64> @nbsl_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {119; NEON-LABEL: nbsl_v2i64:120; NEON:       // %bb.0:121; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b122; NEON-NEXT:    mvn v0.16b, v0.16b123; NEON-NEXT:    ret124;125; SVE2-LABEL: nbsl_v2i64:126; SVE2:       // %bb.0:127; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0128; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2129; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1130; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d131; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0132; SVE2-NEXT:    ret133  %4 = and <2 x i64> %2, %0134  %5 = xor <2 x i64> %2, splat (i64 -1)135  %6 = and <2 x i64> %1, %5136  %7 = or <2 x i64> %4, %6137  %8 = xor <2 x i64> %7, splat (i64 -1)138  ret <2 x i64> %8139}140 141define <2 x i64> @bsl1n_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {142; NEON-LABEL: bsl1n_v2i64:143; NEON:       // %bb.0:144; NEON-NEXT:    mvn v0.16b, v0.16b145; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b146; NEON-NEXT:    ret147;148; SVE2-LABEL: bsl1n_v2i64:149; SVE2:       // %bb.0:150; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0151; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2152; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1153; SVE2-NEXT:    bsl1n z0.d, z0.d, z1.d, z2.d154; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0155; SVE2-NEXT:    ret156  %4 = xor <2 x i64> %0, splat (i64 -1)157  %5 = and <2 x i64> %2, %4158  %6 = xor <2 x i64> %2, splat (i64 -1)159  %7 = and <2 x i64> %1, %6160  %8 = or <2 x i64> %5, %7161  ret <2 x i64> %8162}163 164define <2 x i64> @bsl2n_v2i64(<2 x i64> %0, <2 x i64> %1, <2 x i64> %2) {165; NEON-LABEL: bsl2n_v2i64:166; NEON:       // %bb.0:167; NEON-NEXT:    and v0.16b, v2.16b, v0.16b168; NEON-NEXT:    orr v1.16b, v2.16b, v1.16b169; NEON-NEXT:    orn v0.16b, v0.16b, v1.16b170; NEON-NEXT:    ret171;172; SVE2-LABEL: bsl2n_v2i64:173; SVE2:       // %bb.0:174; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0175; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2176; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1177; SVE2-NEXT:    bsl2n z0.d, z0.d, z1.d, z2.d178; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0179; SVE2-NEXT:    ret180  %4 = and <2 x i64> %2, %0181  %5 = or <2 x i64> %2, %1182  %6 = xor <2 x i64> %5, splat (i64 -1)183  %7 = or <2 x i64> %4, %6184  ret <2 x i64> %7185}186 187; Test other element types.188 189define <8 x i8> @nbsl_v8i8(<8 x i8> %0, <8 x i8> %1, <8 x i8> %2) {190; NEON-LABEL: nbsl_v8i8:191; NEON:       // %bb.0:192; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b193; NEON-NEXT:    mvn v0.8b, v0.8b194; NEON-NEXT:    ret195;196; SVE2-LABEL: nbsl_v8i8:197; SVE2:       // %bb.0:198; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0199; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z2200; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1201; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d202; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0203; SVE2-NEXT:    ret204  %4 = and <8 x i8> %2, %0205  %5 = xor <8 x i8> %2, splat (i8 -1)206  %6 = and <8 x i8> %1, %5207  %7 = or <8 x i8> %4, %6208  %8 = xor <8 x i8> %7, splat (i8 -1)209  ret <8 x i8> %8210}211 212define <4 x i16> @nbsl_v4i16(<4 x i16> %0, <4 x i16> %1, <4 x i16> %2) {213; NEON-LABEL: nbsl_v4i16:214; NEON:       // %bb.0:215; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b216; NEON-NEXT:    mvn v0.8b, v0.8b217; NEON-NEXT:    ret218;219; SVE2-LABEL: nbsl_v4i16:220; SVE2:       // %bb.0:221; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0222; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z2223; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1224; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d225; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0226; SVE2-NEXT:    ret227  %4 = and <4 x i16> %2, %0228  %5 = xor <4 x i16> %2, splat (i16 -1)229  %6 = and <4 x i16> %1, %5230  %7 = or <4 x i16> %4, %6231  %8 = xor <4 x i16> %7, splat (i16 -1)232  ret <4 x i16> %8233}234 235define <2 x i32> @nbsl_v2i32(<2 x i32> %0, <2 x i32> %1, <2 x i32> %2) {236; NEON-LABEL: nbsl_v2i32:237; NEON:       // %bb.0:238; NEON-NEXT:    bif v0.8b, v1.8b, v2.8b239; NEON-NEXT:    mvn v0.8b, v0.8b240; NEON-NEXT:    ret241;242; SVE2-LABEL: nbsl_v2i32:243; SVE2:       // %bb.0:244; SVE2-NEXT:    // kill: def $d0 killed $d0 def $z0245; SVE2-NEXT:    // kill: def $d2 killed $d2 def $z2246; SVE2-NEXT:    // kill: def $d1 killed $d1 def $z1247; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d248; SVE2-NEXT:    // kill: def $d0 killed $d0 killed $z0249; SVE2-NEXT:    ret250  %4 = and <2 x i32> %2, %0251  %5 = xor <2 x i32> %2, splat (i32 -1)252  %6 = and <2 x i32> %1, %5253  %7 = or <2 x i32> %4, %6254  %8 = xor <2 x i32> %7, splat (i32 -1)255  ret <2 x i32> %8256}257 258define <16 x i8> @nbsl_v16i8(<16 x i8> %0, <16 x i8> %1, <16 x i8> %2) {259; NEON-LABEL: nbsl_v16i8:260; NEON:       // %bb.0:261; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b262; NEON-NEXT:    mvn v0.16b, v0.16b263; NEON-NEXT:    ret264;265; SVE2-LABEL: nbsl_v16i8:266; SVE2:       // %bb.0:267; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0268; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2269; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1270; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d271; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0272; SVE2-NEXT:    ret273  %4 = and <16 x i8> %2, %0274  %5 = xor <16 x i8> %2, splat (i8 -1)275  %6 = and <16 x i8> %1, %5276  %7 = or <16 x i8> %4, %6277  %8 = xor <16 x i8> %7, splat (i8 -1)278  ret <16 x i8> %8279}280 281define <8 x i16> @nbsl_v8i16(<8 x i16> %0, <8 x i16> %1, <8 x i16> %2) {282; NEON-LABEL: nbsl_v8i16:283; NEON:       // %bb.0:284; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b285; NEON-NEXT:    mvn v0.16b, v0.16b286; NEON-NEXT:    ret287;288; SVE2-LABEL: nbsl_v8i16:289; SVE2:       // %bb.0:290; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0291; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2292; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1293; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d294; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0295; SVE2-NEXT:    ret296  %4 = and <8 x i16> %2, %0297  %5 = xor <8 x i16> %2, splat (i16 -1)298  %6 = and <8 x i16> %1, %5299  %7 = or <8 x i16> %4, %6300  %8 = xor <8 x i16> %7, splat (i16 -1)301  ret <8 x i16> %8302}303 304define <4 x i32> @nbsl_v4i32(<4 x i32> %0, <4 x i32> %1, <4 x i32> %2) {305; NEON-LABEL: nbsl_v4i32:306; NEON:       // %bb.0:307; NEON-NEXT:    bif v0.16b, v1.16b, v2.16b308; NEON-NEXT:    mvn v0.16b, v0.16b309; NEON-NEXT:    ret310;311; SVE2-LABEL: nbsl_v4i32:312; SVE2:       // %bb.0:313; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0314; SVE2-NEXT:    // kill: def $q2 killed $q2 def $z2315; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1316; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z2.d317; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0318; SVE2-NEXT:    ret319  %4 = and <4 x i32> %2, %0320  %5 = xor <4 x i32> %2, splat (i32 -1)321  %6 = and <4 x i32> %1, %5322  %7 = or <4 x i32> %4, %6323  %8 = xor <4 x i32> %7, splat (i32 -1)324  ret <4 x i32> %8325}326 327; Test types that need promotion.328 329define <4 x i8> @bsl_v4i8(<4 x i8> %0, <4 x i8> %1, <4 x i8> %2) {330; NEON-LABEL: bsl_v4i8:331; NEON:       // %bb.0:332; NEON-NEXT:    movi d3, #0xff00ff00ff00ff333; NEON-NEXT:    and v0.8b, v2.8b, v0.8b334; NEON-NEXT:    eor v3.8b, v2.8b, v3.8b335; NEON-NEXT:    and v1.8b, v1.8b, v3.8b336; NEON-NEXT:    orr v0.8b, v0.8b, v1.8b337; NEON-NEXT:    ret338;339; SVE2-LABEL: bsl_v4i8:340; SVE2:       // %bb.0:341; SVE2-NEXT:    movi d3, #0xff00ff00ff00ff342; SVE2-NEXT:    and v0.8b, v2.8b, v0.8b343; SVE2-NEXT:    eor v3.8b, v2.8b, v3.8b344; SVE2-NEXT:    and v1.8b, v1.8b, v3.8b345; SVE2-NEXT:    orr v0.8b, v0.8b, v1.8b346; SVE2-NEXT:    ret347  %4 = and <4 x i8> %2, %0348  %5 = xor <4 x i8> %2, splat (i8 -1)349  %6 = and <4 x i8> %1, %5350  %7 = or <4 x i8> %4, %6351  ret <4 x i8> %7352}353 354define <4 x i8> @nbsl_v4i8(<4 x i8> %0, <4 x i8> %1, <4 x i8> %2) {355; NEON-LABEL: nbsl_v4i8:356; NEON:       // %bb.0:357; NEON-NEXT:    movi d3, #0xff00ff00ff00ff358; NEON-NEXT:    and v0.8b, v2.8b, v0.8b359; NEON-NEXT:    eor v4.8b, v2.8b, v3.8b360; NEON-NEXT:    and v1.8b, v1.8b, v4.8b361; NEON-NEXT:    orr v0.8b, v0.8b, v1.8b362; NEON-NEXT:    eor v0.8b, v0.8b, v3.8b363; NEON-NEXT:    ret364;365; SVE2-LABEL: nbsl_v4i8:366; SVE2:       // %bb.0:367; SVE2-NEXT:    movi d3, #0xff00ff00ff00ff368; SVE2-NEXT:    and v0.8b, v2.8b, v0.8b369; SVE2-NEXT:    eor v4.8b, v2.8b, v3.8b370; SVE2-NEXT:    and v1.8b, v1.8b, v4.8b371; SVE2-NEXT:    orr v0.8b, v0.8b, v1.8b372; SVE2-NEXT:    eor v0.8b, v0.8b, v3.8b373; SVE2-NEXT:    ret374  %4 = and <4 x i8> %2, %0375  %5 = xor <4 x i8> %2, splat (i8 -1)376  %6 = and <4 x i8> %1, %5377  %7 = or <4 x i8> %4, %6378  %8 = xor <4 x i8> %7, splat (i8 -1)379  ret <4 x i8> %8380}381 382define <4 x i8> @bsl1n_v4i8(<4 x i8> %0, <4 x i8> %1, <4 x i8> %2) {383; NEON-LABEL: bsl1n_v4i8:384; NEON:       // %bb.0:385; NEON-NEXT:    movi d3, #0xff00ff00ff00ff386; NEON-NEXT:    eor v0.8b, v0.8b, v3.8b387; NEON-NEXT:    eor v3.8b, v2.8b, v3.8b388; NEON-NEXT:    and v0.8b, v2.8b, v0.8b389; NEON-NEXT:    and v1.8b, v1.8b, v3.8b390; NEON-NEXT:    orr v0.8b, v0.8b, v1.8b391; NEON-NEXT:    ret392;393; SVE2-LABEL: bsl1n_v4i8:394; SVE2:       // %bb.0:395; SVE2-NEXT:    movi d3, #0xff00ff00ff00ff396; SVE2-NEXT:    eor v0.8b, v0.8b, v3.8b397; SVE2-NEXT:    eor v3.8b, v2.8b, v3.8b398; SVE2-NEXT:    and v0.8b, v2.8b, v0.8b399; SVE2-NEXT:    and v1.8b, v1.8b, v3.8b400; SVE2-NEXT:    orr v0.8b, v0.8b, v1.8b401; SVE2-NEXT:    ret402  %4 = xor <4 x i8> %0, splat (i8 -1)403  %5 = and <4 x i8> %2, %4404  %6 = xor <4 x i8> %2, splat (i8 -1)405  %7 = and <4 x i8> %1, %6406  %8 = or <4 x i8> %5, %7407  ret <4 x i8> %8408}409 410define <4 x i8> @bsl2n_v4i8(<4 x i8> %0, <4 x i8> %1, <4 x i8> %2) {411; NEON-LABEL: bsl2n_v4i8:412; NEON:       // %bb.0:413; NEON-NEXT:    movi d3, #0xff00ff00ff00ff414; NEON-NEXT:    orr v1.8b, v2.8b, v1.8b415; NEON-NEXT:    and v0.8b, v2.8b, v0.8b416; NEON-NEXT:    eor v1.8b, v1.8b, v3.8b417; NEON-NEXT:    orr v0.8b, v0.8b, v1.8b418; NEON-NEXT:    ret419;420; SVE2-LABEL: bsl2n_v4i8:421; SVE2:       // %bb.0:422; SVE2-NEXT:    movi d3, #0xff00ff00ff00ff423; SVE2-NEXT:    orr v1.8b, v2.8b, v1.8b424; SVE2-NEXT:    and v0.8b, v2.8b, v0.8b425; SVE2-NEXT:    eor v1.8b, v1.8b, v3.8b426; SVE2-NEXT:    orr v0.8b, v0.8b, v1.8b427; SVE2-NEXT:    ret428  %4 = and <4 x i8> %2, %0429  %5 = or <4 x i8> %2, %1430  %6 = xor <4 x i8> %5, splat (i8 -1)431  %7 = or <4 x i8> %4, %6432  ret <4 x i8> %7433}434 435; NOT (a) has a dedicated instruction (MVN).436define <2 x i64> @not_q(<2 x i64> %0) #0 {437; NEON-LABEL: not_q:438; NEON:       // %bb.0:439; NEON-NEXT:    mvn v0.16b, v0.16b440; NEON-NEXT:    ret441;442; SVE2-LABEL: not_q:443; SVE2:       // %bb.0:444; SVE2-NEXT:    mvn v0.16b, v0.16b445; SVE2-NEXT:    ret446  %2 = xor <2 x i64> %0, splat (i64 -1)447  ret <2 x i64> %2448}449 450; NAND (a, b) = NBSL (a, b, b) = NBSL (b, a, a).451define <2 x i64> @nand_q(<2 x i64> %0, <2 x i64> %1) #0 {452; NEON-LABEL: nand_q:453; NEON:       // %bb.0:454; NEON-NEXT:    and v0.16b, v1.16b, v0.16b455; NEON-NEXT:    mvn v0.16b, v0.16b456; NEON-NEXT:    ret457;458; SVE2-LABEL: nand_q:459; SVE2:       // %bb.0:460; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0461; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1462; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z1.d463; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0464; SVE2-NEXT:    ret465  %3 = and <2 x i64> %1, %0466  %4 = xor <2 x i64> %3, splat (i64 -1)467  ret <2 x i64> %4468}469 470; NOR (a, b) = NBSL (a, b, a) = NBSL (b, a, b).471define <2 x i64> @nor_q(<2 x i64> %0, <2 x i64> %1) #0 {472; NEON-LABEL: nor_q:473; NEON:       // %bb.0:474; NEON-NEXT:    orr v0.16b, v1.16b, v0.16b475; NEON-NEXT:    mvn v0.16b, v0.16b476; NEON-NEXT:    ret477;478; SVE2-LABEL: nor_q:479; SVE2:       // %bb.0:480; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0481; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1482; SVE2-NEXT:    nbsl z0.d, z0.d, z1.d, z0.d483; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0484; SVE2-NEXT:    ret485  %3 = or <2 x i64> %1, %0486  %4 = xor <2 x i64> %3, splat (i64 -1)487  ret <2 x i64> %4488}489 490; EON (a, b) = BSL2N (a, a, b) = BSL2N (b, b, a).491define <2 x i64> @eon_q(<2 x i64> %0, <2 x i64> %1) #0 {492; NEON-LABEL: eon_q:493; NEON:       // %bb.0:494; NEON-NEXT:    eor v0.16b, v0.16b, v1.16b495; NEON-NEXT:    mvn v0.16b, v0.16b496; NEON-NEXT:    ret497;498; SVE2-LABEL: eon_q:499; SVE2:       // %bb.0:500; SVE2-NEXT:    // kill: def $q0 killed $q0 def $z0501; SVE2-NEXT:    // kill: def $q1 killed $q1 def $z1502; SVE2-NEXT:    bsl2n z0.d, z0.d, z0.d, z1.d503; SVE2-NEXT:    // kill: def $q0 killed $q0 killed $z0504; SVE2-NEXT:    ret505  %3 = xor <2 x i64> %0, %1506  %4 = xor <2 x i64> %3, splat (i64 -1)507  ret <2 x i64> %4508}509 510; ORN (a, b) has a dedicated instruction (ORN).511define <2 x i64> @orn_q(<2 x i64> %0, <2 x i64> %1) #0 {512; NEON-LABEL: orn_q:513; NEON:       // %bb.0:514; NEON-NEXT:    orn v0.16b, v0.16b, v1.16b515; NEON-NEXT:    ret516;517; SVE2-LABEL: orn_q:518; SVE2:       // %bb.0:519; SVE2-NEXT:    orn v0.16b, v0.16b, v1.16b520; SVE2-NEXT:    ret521  %3 = xor <2 x i64> %1, splat (i64 -1)522  %4 = or <2 x i64> %0, %3523  ret <2 x i64> %4524}525