1; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2,+sve2-bitperm < %s 2>%t | FileCheck %s 2; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t 3 4; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. 5; WARN-NOT: warning 6 7; 8; BDEP 9; 10 11define <vscale x 16 x i8> @bdep_nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 12; CHECK-LABEL: bdep_nxv16i8: 13; CHECK: bdep z0.b, z0.b, z1.b 14; CHECK-NEXT: ret 15 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.bdep.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 16 ret <vscale x 16 x i8> %out 17} 18 19define <vscale x 8 x i16> @bdep_nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 20; CHECK-LABEL: bdep_nxv8i16: 21; CHECK: bdep z0.h, z0.h, z1.h 22; CHECK-NEXT: ret 23 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.bdep.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 24 ret <vscale x 8 x i16> %out 25} 26 27define <vscale x 4 x i32> @bdep_nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 28; CHECK-LABEL: bdep_nxv4i32: 29; CHECK: bdep z0.s, z0.s, z1.s 30; CHECK-NEXT: ret 31 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.bdep.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 32 ret <vscale x 4 x i32> %out 33} 34 35define <vscale x 2 x i64> @bdep_nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 36; CHECK-LABEL: bdep_nxv2i64: 37; CHECK: bdep z0.d, z0.d, z1.d 38; CHECK-NEXT: ret 39 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bdep.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 40 ret <vscale x 2 x i64> %out 41} 42 43; 44; BEXT 45; 46 47define <vscale x 16 x i8> @bext_nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 48; CHECK-LABEL: bext_nxv16i8: 49; CHECK: bext z0.b, z0.b, z1.b 50; CHECK-NEXT: ret 51 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.bext.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 52 ret <vscale x 16 x i8> %out 53} 54 55define <vscale x 8 x i16> @bext_nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 56; CHECK-LABEL: bext_nxv8i16: 57; CHECK: bext z0.h, z0.h, z1.h 58; CHECK-NEXT: ret 59 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.bext.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 60 ret <vscale x 8 x i16> %out 61} 62 63define <vscale x 4 x i32> @bext_nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 64; CHECK-LABEL: bext_nxv4i32: 65; CHECK: bext z0.s, z0.s, z1.s 66; CHECK-NEXT: ret 67 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.bext.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 68 ret <vscale x 4 x i32> %out 69} 70 71define <vscale x 2 x i64> @bext_nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 72; CHECK-LABEL: bext_nxv2i64: 73; CHECK: bext z0.d, z0.d, z1.d 74; CHECK-NEXT: ret 75 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bext.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 76 ret <vscale x 2 x i64> %out 77} 78 79; 80; BGRP 81; 82 83define <vscale x 16 x i8> @bgrp_nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 84; CHECK-LABEL: bgrp_nxv16i8: 85; CHECK: bgrp z0.b, z0.b, z1.b 86; CHECK-NEXT: ret 87 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.bgrp.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 88 ret <vscale x 16 x i8> %out 89} 90 91define <vscale x 8 x i16> @bgrp_nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 92; CHECK-LABEL: bgrp_nxv8i16: 93; CHECK: bgrp z0.h, z0.h, z1.h 94; CHECK-NEXT: ret 95 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.bgrp.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 96 ret <vscale x 8 x i16> %out 97} 98 99define <vscale x 4 x i32> @bgrp_nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 100; CHECK-LABEL: bgrp_nxv4i32: 101; CHECK: bgrp z0.s, z0.s, z1.s 102; CHECK-NEXT: ret 103 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.bgrp.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 104 ret <vscale x 4 x i32> %out 105} 106 107define <vscale x 2 x i64> @bgrp_nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 108; CHECK-LABEL: bgrp_nxv2i64: 109; CHECK: bgrp z0.d, z0.d, z1.d 110; CHECK-NEXT: ret 111 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bgrp.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 112 ret <vscale x 2 x i64> %out 113} 114 115declare <vscale x 16 x i8> @llvm.aarch64.sve.bdep.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 116declare <vscale x 8 x i16> @llvm.aarch64.sve.bdep.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 117declare <vscale x 4 x i32> @llvm.aarch64.sve.bdep.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 118declare <vscale x 2 x i64> @llvm.aarch64.sve.bdep.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 119 120declare <vscale x 16 x i8> @llvm.aarch64.sve.bext.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 121declare <vscale x 8 x i16> @llvm.aarch64.sve.bext.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 122declare <vscale x 4 x i32> @llvm.aarch64.sve.bext.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 123declare <vscale x 2 x i64> @llvm.aarch64.sve.bext.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 124 125declare <vscale x 16 x i8> @llvm.aarch64.sve.bgrp.x.nx16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) 126declare <vscale x 8 x i16> @llvm.aarch64.sve.bgrp.x.nx8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) 127declare <vscale x 4 x i32> @llvm.aarch64.sve.bgrp.x.nx4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) 128declare <vscale x 2 x i64> @llvm.aarch64.sve.bgrp.x.nx2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) 129