1; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2 -asm-verbose=0 < %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; EORBT 9; 10 11define <vscale x 16 x i8> @eorbt_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c) { 12; CHECK-LABEL: eorbt_i8: 13; CHECK: eorbt z0.b, z1.b, z2.b 14; CHECK-NEXT: ret 15 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.eorbt.nxv16i8(<vscale x 16 x i8> %a, 16 <vscale x 16 x i8> %b, 17 <vscale x 16 x i8> %c) 18 ret <vscale x 16 x i8> %out 19} 20 21define <vscale x 8 x i16> @eorbt_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c) { 22; CHECK-LABEL: eorbt_i16: 23; CHECK: eorbt z0.h, z1.h, z2.h 24; CHECK-NEXT: ret 25 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.eorbt.nxv8i16(<vscale x 8 x i16> %a, 26 <vscale x 8 x i16> %b, 27 <vscale x 8 x i16> %c) 28 ret <vscale x 8 x i16> %out 29} 30 31define <vscale x 4 x i32> @eorbt_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 32; CHECK-LABEL: eorbt_i32: 33; CHECK: eorbt z0.s, z1.s, z2.s 34; CHECK-NEXT: ret 35 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.eorbt.nxv4i32(<vscale x 4 x i32> %a, 36 <vscale x 4 x i32> %b, 37 <vscale x 4 x i32> %c) 38 ret <vscale x 4 x i32> %out 39} 40 41define <vscale x 2 x i64> @eorbt_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c) { 42; CHECK-LABEL: eorbt_i64: 43; CHECK: eorbt z0.d, z1.d, z2.d 44; CHECK-NEXT: ret 45 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.eorbt.nxv2i64(<vscale x 2 x i64> %a, 46 <vscale x 2 x i64> %b, 47 <vscale x 2 x i64> %c) 48 ret <vscale x 2 x i64> %out 49} 50 51; 52; EORTB 53; 54 55define <vscale x 16 x i8> @eortb_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b, <vscale x 16 x i8> %c) { 56; CHECK-LABEL: eortb_i8: 57; CHECK: eortb z0.b, z1.b, z2.b 58; CHECK-NEXT: ret 59 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.eortb.nxv16i8(<vscale x 16 x i8> %a, 60 <vscale x 16 x i8> %b, 61 <vscale x 16 x i8> %c) 62 ret <vscale x 16 x i8> %out 63} 64 65define <vscale x 8 x i16> @eortb_i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b, <vscale x 8 x i16> %c) { 66; CHECK-LABEL: eortb_i16: 67; CHECK: eortb z0.h, z1.h, z2.h 68; CHECK-NEXT: ret 69 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.eortb.nxv8i16(<vscale x 8 x i16> %a, 70 <vscale x 8 x i16> %b, 71 <vscale x 8 x i16> %c) 72 ret <vscale x 8 x i16> %out 73} 74 75define <vscale x 4 x i32> @eortb_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b, <vscale x 4 x i32> %c) { 76; CHECK-LABEL: eortb_i32: 77; CHECK: eortb z0.s, z1.s, z2.s 78; CHECK-NEXT: ret 79 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.eortb.nxv4i32(<vscale x 4 x i32> %a, 80 <vscale x 4 x i32> %b, 81 <vscale x 4 x i32> %c) 82 ret <vscale x 4 x i32> %out 83} 84 85define <vscale x 2 x i64> @eortb_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b, <vscale x 2 x i64> %c) { 86; CHECK-LABEL: eortb_i64: 87; CHECK: eortb z0.d, z1.d, z2.d 88; CHECK-NEXT: ret 89 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.eortb.nxv2i64(<vscale x 2 x i64> %a, 90 <vscale x 2 x i64> %b, 91 <vscale x 2 x i64> %c) 92 ret <vscale x 2 x i64> %out 93} 94 95; 96; PMULLB 97; 98 99define <vscale x 16 x i8> @pmullb_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 100; CHECK-LABEL: pmullb_i8: 101; CHECK: pmullb z0.h, z0.b, z1.b 102; CHECK-NEXT: ret 103 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.pmullb.pair.nxv16i8(<vscale x 16 x i8> %a, 104 <vscale x 16 x i8> %b) 105 ret <vscale x 16 x i8> %out 106} 107 108define <vscale x 4 x i32> @pmullb_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 109; CHECK-LABEL: pmullb_i32: 110; CHECK: pmullb z0.d, z0.s, z1.s 111; CHECK-NEXT: ret 112 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.pmullb.pair.nxv4i32(<vscale x 4 x i32> %a, 113 <vscale x 4 x i32> %b) 114 ret <vscale x 4 x i32> %out 115} 116 117; 118; PMULLT 119; 120 121define <vscale x 16 x i8> @pmullt_i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 122; CHECK-LABEL: pmullt_i8: 123; CHECK: pmullt z0.h, z0.b, z1.b 124; CHECK-NEXT: ret 125 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.pmullt.pair.nxv16i8(<vscale x 16 x i8> %a, 126 <vscale x 16 x i8> %b) 127 ret <vscale x 16 x i8> %out 128} 129 130define <vscale x 4 x i32> @pmullt_i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 131; CHECK-LABEL: pmullt_i32: 132; CHECK: pmullt z0.d, z0.s, z1.s 133; CHECK-NEXT: ret 134 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.pmullt.pair.nxv4i32(<vscale x 4 x i32> %a, 135 <vscale x 4 x i32> %b) 136 ret <vscale x 4 x i32> %out 137} 138 139declare <vscale x 16 x i8> @llvm.aarch64.sve.eorbt.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 140declare <vscale x 8 x i16> @llvm.aarch64.sve.eorbt.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 141declare <vscale x 4 x i32> @llvm.aarch64.sve.eorbt.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 142declare <vscale x 2 x i64> @llvm.aarch64.sve.eorbt.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 143 144declare <vscale x 16 x i8> @llvm.aarch64.sve.eortb.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 145declare <vscale x 8 x i16> @llvm.aarch64.sve.eortb.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 146declare <vscale x 4 x i32> @llvm.aarch64.sve.eortb.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 147declare <vscale x 2 x i64> @llvm.aarch64.sve.eortb.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 148 149declare <vscale x 16 x i8> @llvm.aarch64.sve.pmullb.pair.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 150declare <vscale x 4 x i32> @llvm.aarch64.sve.pmullb.pair.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 151 152declare <vscale x 16 x i8> @llvm.aarch64.sve.pmullt.pair.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 153declare <vscale x 4 x i32> @llvm.aarch64.sve.pmullt.pair.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 154