539 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 -aarch64-sve-vector-bits-max=128 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_1283; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_128_NOMAX4; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s -check-prefixes=CHECK,SVE2_NOMIN_NOMAX5; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_MIN_256_NOMAX6 7target triple = "aarch64-unknown-linux-gnu"8 9; SVE2_128: .LCPI0_0:10; SVE2_128-NEXT: .byte 0 // 0x011; SVE2_128-NEXT: .byte 7 // 0x712; SVE2_128-NEXT: .byte 2 // 0x213; SVE2_128-NEXT: .byte 3 // 0x314; SVE2_128-NEXT: .byte 4 // 0x415; SVE2_128-NEXT: .byte 5 // 0x516; SVE2_128-NEXT: .byte 6 // 0x617; SVE2_128-NEXT: .byte 7 // 0x718; SVE2_128-NEXT: .byte 255 // 0xff19; SVE2_128-NEXT: .byte 255 // 0xff20define <8 x i8> @shuffle_index_indices_from_op1(ptr %a, ptr %b) {21; SVE2_128-LABEL: shuffle_index_indices_from_op1:22; SVE2_128: // %bb.0:23; SVE2_128-NEXT: adrp x8, .LCPI0_024; SVE2_128-NEXT: ldr d0, [x0]25; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]26; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b27; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z028; SVE2_128-NEXT: ret29;30; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op1:31; SVE2_128_NOMAX: // %bb.0:32; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI0_033; SVE2_128_NOMAX-NEXT: ldr d0, [x0]34; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]35; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b36; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z037; SVE2_128_NOMAX-NEXT: ret38;39; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op1:40; SVE2_NOMIN_NOMAX: // %bb.0:41; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI0_042; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x0]43; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]44; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b45; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z046; SVE2_NOMIN_NOMAX-NEXT: ret47;48; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op1:49; SVE2_MIN_256_NOMAX: // %bb.0:50; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl3251; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI0_052; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI0_053; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x0]54; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]55; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b56; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z057; SVE2_MIN_256_NOMAX-NEXT: ret58 %op1 = load <8 x i8>, ptr %a59 %op2 = load <8 x i8>, ptr %b60 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>61 ret <8 x i8> %162}63 64; SVE2_128: .LCPI1_0:65; SVE2_128-NEXT: .byte 0 // 0x066; SVE2_128-NEXT: .byte 1 // 0x167; SVE2_128-NEXT: .byte 1 // 0x168; SVE2_128-NEXT: .byte 3 // 0x369; SVE2_128-NEXT: .byte 4 // 0x470; SVE2_128-NEXT: .byte 7 // 0x771; SVE2_128-NEXT: .byte 6 // 0x672; SVE2_128-NEXT: .byte 7 // 0x773; SVE2_128-NEXT: .byte 255 // 0xff74; SVE2_128-NEXT: .byte 255 // 0xff75define <8 x i8> @shuffle_index_indices_from_op2(ptr %a, ptr %b) {76; SVE2_128-LABEL: shuffle_index_indices_from_op2:77; SVE2_128: // %bb.0:78; SVE2_128-NEXT: adrp x8, .LCPI1_079; SVE2_128-NEXT: ldr d0, [x1]80; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]81; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b82; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z083; SVE2_128-NEXT: ret84;85; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op2:86; SVE2_128_NOMAX: // %bb.0:87; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI1_088; SVE2_128_NOMAX-NEXT: ldr d0, [x1]89; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]90; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b91; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z092; SVE2_128_NOMAX-NEXT: ret93;94; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op2:95; SVE2_NOMIN_NOMAX: // %bb.0:96; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI1_097; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]98; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]99; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b100; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0101; SVE2_NOMIN_NOMAX-NEXT: ret102;103; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op2:104; SVE2_MIN_256_NOMAX: // %bb.0:105; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl32106; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI1_0107; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI1_0108; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x1]109; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]110; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b111; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0112; SVE2_MIN_256_NOMAX-NEXT: ret113 %op1 = load <8 x i8>, ptr %a114 %op2 = load <8 x i8>, ptr %b115 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 8, i32 9, i32 9, i32 11, i32 12, i32 15, i32 14, i32 15>116 ret <8 x i8> %1117}118 119; SVE2_128: .LCPI2_0:120; SVE2_128-NEXT: .byte 1 // 0x1121; SVE2_128-NEXT: .byte 17 // 0x11122; SVE2_128-NEXT: .byte 18 // 0x12123; SVE2_128-NEXT: .byte 19 // 0x13124; SVE2_128-NEXT: .byte 20 // 0x14125; SVE2_128-NEXT: .byte 20 // 0x14126; SVE2_128-NEXT: .byte 22 // 0x16127; SVE2_128-NEXT: .byte 23 // 0x17128; SVE2_128-NEXT: .byte 255 // 0xff129; SVE2_128-NEXT: .byte 255 // 0xff130define <8 x i8> @shuffle_index_indices_from_both_ops(ptr %a, ptr %b) {131; SVE2_128-LABEL: shuffle_index_indices_from_both_ops:132; SVE2_128: // %bb.0:133; SVE2_128-NEXT: adrp x8, .LCPI2_0134; SVE2_128-NEXT: ldr d0, [x0]135; SVE2_128-NEXT: ldr d1, [x1]136; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI2_0]137; SVE2_128-NEXT: tbl z0.b, { z0.b, z1.b }, z2.b138; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0139; SVE2_128-NEXT: ret140;141; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops:142; SVE2_128_NOMAX: // %bb.0:143; SVE2_128_NOMAX-NEXT: ldr d0, [x1]144; SVE2_128_NOMAX-NEXT: ldr d1, [x0]145; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[3]146; SVE2_128_NOMAX-NEXT: mov z3.b, z0.b[2]147; SVE2_128_NOMAX-NEXT: mov z4.b, z0.b[1]148; SVE2_128_NOMAX-NEXT: mov z1.b, z1.b[1]149; SVE2_128_NOMAX-NEXT: mov z5.b, z0.b[7]150; SVE2_128_NOMAX-NEXT: mov z6.b, z0.b[6]151; SVE2_128_NOMAX-NEXT: mov z0.b, z0.b[4]152; SVE2_128_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b153; SVE2_128_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b154; SVE2_128_NOMAX-NEXT: zip1 z3.b, z6.b, z5.b155; SVE2_128_NOMAX-NEXT: zip1 z0.b, z0.b, z0.b156; SVE2_128_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h157; SVE2_128_NOMAX-NEXT: zip1 z0.h, z0.h, z3.h158; SVE2_128_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s159; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0160; SVE2_128_NOMAX-NEXT: ret161;162; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops:163; SVE2_NOMIN_NOMAX: // %bb.0:164; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]165; SVE2_NOMIN_NOMAX-NEXT: ldr d1, [x0]166; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[3]167; SVE2_NOMIN_NOMAX-NEXT: mov z3.b, z0.b[2]168; SVE2_NOMIN_NOMAX-NEXT: mov z4.b, z0.b[1]169; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z1.b[1]170; SVE2_NOMIN_NOMAX-NEXT: mov z5.b, z0.b[7]171; SVE2_NOMIN_NOMAX-NEXT: mov z6.b, z0.b[6]172; SVE2_NOMIN_NOMAX-NEXT: mov z0.b, z0.b[4]173; SVE2_NOMIN_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b174; SVE2_NOMIN_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b175; SVE2_NOMIN_NOMAX-NEXT: zip1 z3.b, z6.b, z5.b176; SVE2_NOMIN_NOMAX-NEXT: zip1 z0.b, z0.b, z0.b177; SVE2_NOMIN_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h178; SVE2_NOMIN_NOMAX-NEXT: zip1 z0.h, z0.h, z3.h179; SVE2_NOMIN_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s180; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0181; SVE2_NOMIN_NOMAX-NEXT: ret182;183; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops:184; SVE2_MIN_256_NOMAX: // %bb.0:185; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [x1]186; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x0]187; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[3]188; SVE2_MIN_256_NOMAX-NEXT: mov z3.b, z0.b[2]189; SVE2_MIN_256_NOMAX-NEXT: mov z4.b, z0.b[1]190; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z1.b[1]191; SVE2_MIN_256_NOMAX-NEXT: mov z5.b, z0.b[7]192; SVE2_MIN_256_NOMAX-NEXT: mov z6.b, z0.b[6]193; SVE2_MIN_256_NOMAX-NEXT: mov z0.b, z0.b[4]194; SVE2_MIN_256_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b195; SVE2_MIN_256_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b196; SVE2_MIN_256_NOMAX-NEXT: zip1 z3.b, z6.b, z5.b197; SVE2_MIN_256_NOMAX-NEXT: zip1 z0.b, z0.b, z0.b198; SVE2_MIN_256_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h199; SVE2_MIN_256_NOMAX-NEXT: zip1 z0.h, z0.h, z3.h200; SVE2_MIN_256_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s201; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0202; SVE2_MIN_256_NOMAX-NEXT: ret203 %op1 = load <8 x i8>, ptr %a204 %op2 = load <8 x i8>, ptr %b205 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>206 ret <8 x i8> %1207}208 209; SVE2_128: .LCPI3_0:210; SVE2_128-NEXT: .byte 1 // 0x1211; SVE2_128-NEXT: .byte 17 // 0x11212; SVE2_128-NEXT: .byte 18 // 0x12213; SVE2_128-NEXT: .byte 19 // 0x13214; SVE2_128-NEXT: .byte 20 // 0x14215; SVE2_128-NEXT: .byte 20 // 0x14216; SVE2_128-NEXT: .byte 22 // 0x16217; SVE2_128-NEXT: .byte 0 // 0x0218; SVE2_128-NEXT: .byte 255 // 0xff219; SVE2_128-NEXT: .byte 255 // 0xff220define <8 x i8> @shuffle_index_poison_value(ptr %a, ptr %b) {221; SVE2_128-LABEL: shuffle_index_poison_value:222; SVE2_128: // %bb.0:223; SVE2_128-NEXT: adrp x8, .LCPI3_0224; SVE2_128-NEXT: ldr d0, [x0]225; SVE2_128-NEXT: ldr d1, [x1]226; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI3_0]227; SVE2_128-NEXT: tbl z0.b, { z0.b, z1.b }, z2.b228; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0229; SVE2_128-NEXT: ret230;231; SVE2_128_NOMAX-LABEL: shuffle_index_poison_value:232; SVE2_128_NOMAX: // %bb.0:233; SVE2_128_NOMAX-NEXT: ldr d0, [x1]234; SVE2_128_NOMAX-NEXT: ldr d1, [x0]235; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[3]236; SVE2_128_NOMAX-NEXT: mov z3.b, z0.b[2]237; SVE2_128_NOMAX-NEXT: mov z4.b, z0.b[1]238; SVE2_128_NOMAX-NEXT: mov z1.b, z1.b[1]239; SVE2_128_NOMAX-NEXT: mov z5.b, z0.b[4]240; SVE2_128_NOMAX-NEXT: mov z0.b, z0.b[6]241; SVE2_128_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b242; SVE2_128_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b243; SVE2_128_NOMAX-NEXT: zip1 z3.b, z5.b, z5.b244; SVE2_128_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h245; SVE2_128_NOMAX-NEXT: zip1 z0.h, z3.h, z0.h246; SVE2_128_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s247; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0248; SVE2_128_NOMAX-NEXT: ret249;250; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_poison_value:251; SVE2_NOMIN_NOMAX: // %bb.0:252; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]253; SVE2_NOMIN_NOMAX-NEXT: ldr d1, [x0]254; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[3]255; SVE2_NOMIN_NOMAX-NEXT: mov z3.b, z0.b[2]256; SVE2_NOMIN_NOMAX-NEXT: mov z4.b, z0.b[1]257; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z1.b[1]258; SVE2_NOMIN_NOMAX-NEXT: mov z5.b, z0.b[4]259; SVE2_NOMIN_NOMAX-NEXT: mov z0.b, z0.b[6]260; SVE2_NOMIN_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b261; SVE2_NOMIN_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b262; SVE2_NOMIN_NOMAX-NEXT: zip1 z3.b, z5.b, z5.b263; SVE2_NOMIN_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h264; SVE2_NOMIN_NOMAX-NEXT: zip1 z0.h, z3.h, z0.h265; SVE2_NOMIN_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s266; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0267; SVE2_NOMIN_NOMAX-NEXT: ret268;269; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_poison_value:270; SVE2_MIN_256_NOMAX: // %bb.0:271; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [x1]272; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x0]273; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[3]274; SVE2_MIN_256_NOMAX-NEXT: mov z3.b, z0.b[2]275; SVE2_MIN_256_NOMAX-NEXT: mov z4.b, z0.b[1]276; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z1.b[1]277; SVE2_MIN_256_NOMAX-NEXT: mov z5.b, z0.b[4]278; SVE2_MIN_256_NOMAX-NEXT: mov z0.b, z0.b[6]279; SVE2_MIN_256_NOMAX-NEXT: zip1 z2.b, z3.b, z2.b280; SVE2_MIN_256_NOMAX-NEXT: zip1 z1.b, z1.b, z4.b281; SVE2_MIN_256_NOMAX-NEXT: zip1 z3.b, z5.b, z5.b282; SVE2_MIN_256_NOMAX-NEXT: zip1 z1.h, z1.h, z2.h283; SVE2_MIN_256_NOMAX-NEXT: zip1 z0.h, z3.h, z0.h284; SVE2_MIN_256_NOMAX-NEXT: zip1 z0.s, z1.s, z0.s285; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0286; SVE2_MIN_256_NOMAX-NEXT: ret287 %op1 = load <8 x i8>, ptr %a288 %op2 = load <8 x i8>, ptr %b289 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 poison>290 ret <8 x i8> %1291}292 293define <8 x i8> @shuffle_op1_poison(ptr %a, ptr %b) {294; SVE2_128-LABEL: shuffle_op1_poison:295; SVE2_128: // %bb.0:296; SVE2_128-NEXT: adrp x8, .LCPI4_0297; SVE2_128-NEXT: ldr d0, [x1]298; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]299; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b300; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0301; SVE2_128-NEXT: ret302;303; SVE2_128_NOMAX-LABEL: shuffle_op1_poison:304; SVE2_128_NOMAX: // %bb.0:305; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI4_0306; SVE2_128_NOMAX-NEXT: ldr d0, [x1]307; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]308; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b309; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0310; SVE2_128_NOMAX-NEXT: ret311;312; SVE2_NOMIN_NOMAX-LABEL: shuffle_op1_poison:313; SVE2_NOMIN_NOMAX: // %bb.0:314; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI4_0315; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]316; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]317; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b318; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0319; SVE2_NOMIN_NOMAX-NEXT: ret320;321; SVE2_MIN_256_NOMAX-LABEL: shuffle_op1_poison:322; SVE2_MIN_256_NOMAX: // %bb.0:323; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl32324; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI4_0325; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI4_0326; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x1]327; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]328; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b329; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0330; SVE2_MIN_256_NOMAX-NEXT: ret331 %op2 = load <8 x i8>, ptr %b332 %1 = shufflevector <8 x i8> poison, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>333 ret <8 x i8> %1334}335 336; In this function, we could not represent indexes for the second operand337; because for i8 type, the maximum constant in the mask is 256.338define <8 x i8> @negative_test_shuffle_index_size_op_both_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {339; CHECK-LABEL: negative_test_shuffle_index_size_op_both_maxhw:340; CHECK: // %bb.0:341; CHECK-NEXT: ldr d0, [x1]342; CHECK-NEXT: ldr d1, [x0]343; CHECK-NEXT: mov z2.b, z0.b[3]344; CHECK-NEXT: mov z3.b, z0.b[2]345; CHECK-NEXT: mov z4.b, z0.b[1]346; CHECK-NEXT: mov z1.b, z1.b[1]347; CHECK-NEXT: mov z5.b, z0.b[7]348; CHECK-NEXT: mov z6.b, z0.b[6]349; CHECK-NEXT: mov z0.b, z0.b[4]350; CHECK-NEXT: zip1 z2.b, z3.b, z2.b351; CHECK-NEXT: zip1 z1.b, z1.b, z4.b352; CHECK-NEXT: zip1 z3.b, z6.b, z5.b353; CHECK-NEXT: zip1 z0.b, z0.b, z0.b354; CHECK-NEXT: zip1 z1.h, z1.h, z2.h355; CHECK-NEXT: zip1 z0.h, z0.h, z3.h356; CHECK-NEXT: zip1 z0.s, z1.s, z0.s357; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0358; CHECK-NEXT: ret359 %op1 = load <8 x i8>, ptr %a360 %op2 = load <8 x i8>, ptr %b361 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>362 ret <8 x i8> %1363}364 365; CHECK: .LCPI6_0:366; CHECK-NEXT: .byte 0 // 0x0367; CHECK-NEXT: .byte 7 // 0x7368; CHECK-NEXT: .byte 2 // 0x2369; CHECK-NEXT: .byte 3 // 0x3370; CHECK-NEXT: .byte 4 // 0x4371; CHECK-NEXT: .byte 5 // 0x5372; CHECK-NEXT: .byte 6 // 0x6373; CHECK-NEXT: .byte 7 // 0x7374; CHECK-NEXT: .byte 255 // 0xff375; CHECK-NEXT: .byte 255 // 0xff376define <8 x i8> @shuffle_index_size_op1_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {377; CHECK-LABEL: shuffle_index_size_op1_maxhw:378; CHECK: // %bb.0:379; CHECK-NEXT: adrp x8, .LCPI6_0380; CHECK-NEXT: add x8, x8, :lo12:.LCPI6_0381; CHECK-NEXT: ldr d1, [x0]382; CHECK-NEXT: ldr z0, [x8]383; CHECK-NEXT: tbl z0.b, { z1.b }, z0.b384; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0385; CHECK-NEXT: ret386 %op1 = load <8 x i8>, ptr %a387 %op2 = load <8 x i8>, ptr %b388 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>389 ret <8 x i8> %1390}391 392; SVE2_128: .LCPI7_0:393; SVE2_128-NEXT: .hword 1 // 0x1394; SVE2_128-NEXT: .hword 9 // 0x9395; SVE2_128-NEXT: .hword 10 // 0xa396; SVE2_128-NEXT: .hword 11 // 0xb397; SVE2_128-NEXT: .hword 12 // 0xc398; SVE2_128-NEXT: .hword 12 // 0xc399; SVE2_128-NEXT: .hword 14 // 0xe400; SVE2_128-NEXT: .hword 15 // 0xf401 402; SVE2_128_NOMAX: .LCPI7_0:403; SVE2_128_NOMAX-NEXT: .hword 0 // 0x0404; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1405; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1406; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1407; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1408; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1409; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1410; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1411; SVE2_128_NOMAX-NEXT:.LCPI7_1:412; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1413; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1414; SVE2_128_NOMAX-NEXT: .hword 2 // 0x2415; SVE2_128_NOMAX-NEXT: .hword 3 // 0x3416; SVE2_128_NOMAX-NEXT: .hword 4 // 0x4417; SVE2_128_NOMAX-NEXT: .hword 4 // 0x4418; SVE2_128_NOMAX-NEXT: .hword 6 // 0x6419; SVE2_128_NOMAX-NEXT: .hword 7 // 0x7420 421; SVE2_NOMIN_NOMAX: .LCPI7_0:422; SVE2_NOMIN_NOMAX-NEXT: .hword 0 // 0x0423; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1424; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1425; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1426; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1427; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1428; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1429; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1430; SVE2_NOMIN_NOMAX-NEXT:.LCPI7_1:431; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1432; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1433; SVE2_NOMIN_NOMAX-NEXT: .hword 2 // 0x2434; SVE2_NOMIN_NOMAX-NEXT: .hword 3 // 0x3435; SVE2_NOMIN_NOMAX-NEXT: .hword 4 // 0x4436; SVE2_NOMIN_NOMAX-NEXT: .hword 4 // 0x4437; SVE2_NOMIN_NOMAX-NEXT: .hword 6 // 0x6438; SVE2_NOMIN_NOMAX-NEXT: .hword 7 // 0x7439 440; SVE2_MIN_256_NOMAX: .LCPI7_0:441; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0442; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1443; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1444; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1445; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1446; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1447; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1448; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1449; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0450; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0451; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0452; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0453; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0454; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0455; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0456; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0457; SVE2_MIN_256_NOMAX-NEXT:.LCPI7_1:458; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1459; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1460; SVE2_MIN_256_NOMAX-NEXT: .hword 2 // 0x2461; SVE2_MIN_256_NOMAX-NEXT: .hword 3 // 0x3462; SVE2_MIN_256_NOMAX-NEXT: .hword 4 // 0x4463; SVE2_MIN_256_NOMAX-NEXT: .hword 4 // 0x4464; SVE2_MIN_256_NOMAX-NEXT: .hword 6 // 0x6465; SVE2_MIN_256_NOMAX-NEXT: .hword 7 // 0x7466; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff467; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff468; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff469; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff470; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff471; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff472; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff473; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff474define <8 x i16> @shuffle_index_indices_from_both_ops_i16(ptr %a, ptr %b) {475; SVE2_128-LABEL: shuffle_index_indices_from_both_ops_i16:476; SVE2_128: // %bb.0:477; SVE2_128-NEXT: adrp x8, .LCPI7_0478; SVE2_128-NEXT: ldr q0, [x0]479; SVE2_128-NEXT: ldr q1, [x1]480; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI7_0]481; SVE2_128-NEXT: tbl z0.h, { z0.h, z1.h }, z2.h482; SVE2_128-NEXT: // kill: def $q0 killed $q0 killed $z0483; SVE2_128-NEXT: ret484;485; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:486; SVE2_128_NOMAX: // %bb.0:487; SVE2_128_NOMAX-NEXT: cnth x8488; SVE2_128_NOMAX-NEXT: adrp x9, .LCPI7_0489; SVE2_128_NOMAX-NEXT: adrp x10, .LCPI7_1490; SVE2_128_NOMAX-NEXT: mov z0.h, w8491; SVE2_128_NOMAX-NEXT: ldr q1, [x9, :lo12:.LCPI7_0]492; SVE2_128_NOMAX-NEXT: ldr q2, [x10, :lo12:.LCPI7_1]493; SVE2_128_NOMAX-NEXT: ptrue p0.h, vl8494; SVE2_128_NOMAX-NEXT: mad z0.h, p0/m, z1.h, z2.h495; SVE2_128_NOMAX-NEXT: ldr q1, [x0]496; SVE2_128_NOMAX-NEXT: ldr q2, [x1]497; SVE2_128_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h498; SVE2_128_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0499; SVE2_128_NOMAX-NEXT: ret500;501; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:502; SVE2_NOMIN_NOMAX: // %bb.0:503; SVE2_NOMIN_NOMAX-NEXT: cnth x8504; SVE2_NOMIN_NOMAX-NEXT: adrp x9, .LCPI7_0505; SVE2_NOMIN_NOMAX-NEXT: adrp x10, .LCPI7_1506; SVE2_NOMIN_NOMAX-NEXT: mov z0.h, w8507; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x9, :lo12:.LCPI7_0]508; SVE2_NOMIN_NOMAX-NEXT: ldr q2, [x10, :lo12:.LCPI7_1]509; SVE2_NOMIN_NOMAX-NEXT: ptrue p0.h, vl8510; SVE2_NOMIN_NOMAX-NEXT: mad z0.h, p0/m, z1.h, z2.h511; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x0]512; SVE2_NOMIN_NOMAX-NEXT: ldr q2, [x1]513; SVE2_NOMIN_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h514; SVE2_NOMIN_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0515; SVE2_NOMIN_NOMAX-NEXT: ret516;517; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:518; SVE2_MIN_256_NOMAX: // %bb.0:519; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.h, vl16520; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI7_0521; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI7_0522; SVE2_MIN_256_NOMAX-NEXT: adrp x9, .LCPI7_1523; SVE2_MIN_256_NOMAX-NEXT: add x9, x9, :lo12:.LCPI7_1524; SVE2_MIN_256_NOMAX-NEXT: cnth x10525; SVE2_MIN_256_NOMAX-NEXT: ld1h { z0.h }, p0/z, [x8]526; SVE2_MIN_256_NOMAX-NEXT: ld1h { z1.h }, p0/z, [x9]527; SVE2_MIN_256_NOMAX-NEXT: mov z2.h, w10528; SVE2_MIN_256_NOMAX-NEXT: mad z0.h, p0/m, z2.h, z1.h529; SVE2_MIN_256_NOMAX-NEXT: ldr q1, [x0]530; SVE2_MIN_256_NOMAX-NEXT: ldr q2, [x1]531; SVE2_MIN_256_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h532; SVE2_MIN_256_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0533; SVE2_MIN_256_NOMAX-NEXT: ret534 %op1 = load <8 x i16>, ptr %a535 %op2 = load <8 x i16>, ptr %b536 %1 = shufflevector <8 x i16> %op1, <8 x i16> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>537 ret <8 x i16> %1538}539