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