1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+use-experimental-zeroing-pseudos < %s | FileCheck %s 3 4; 5; ADD 6; 7 8define <vscale x 16 x i8> @add_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 9; CHECK-LABEL: add_i8_zero: 10; CHECK: // %bb.0: 11; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 12; CHECK-NEXT: add z0.b, p0/m, z0.b, z1.b 13; CHECK-NEXT: ret 14 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 15 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.add.nxv16i8(<vscale x 16 x i1> %pg, 16 <vscale x 16 x i8> %a_z, 17 <vscale x 16 x i8> %b) 18 ret <vscale x 16 x i8> %out 19} 20 21define <vscale x 8 x i16> @add_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 22; CHECK-LABEL: add_i16_zero: 23; CHECK: // %bb.0: 24; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 25; CHECK-NEXT: add z0.h, p0/m, z0.h, z1.h 26; CHECK-NEXT: ret 27 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 28 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.add.nxv8i16(<vscale x 8 x i1> %pg, 29 <vscale x 8 x i16> %a_z, 30 <vscale x 8 x i16> %b) 31 ret <vscale x 8 x i16> %out 32} 33 34define <vscale x 4 x i32> @add_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 35; CHECK-LABEL: add_i32_zero: 36; CHECK: // %bb.0: 37; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 38; CHECK-NEXT: add z0.s, p0/m, z0.s, z1.s 39; CHECK-NEXT: ret 40 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 41 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> %pg, 42 <vscale x 4 x i32> %a_z, 43 <vscale x 4 x i32> %b) 44 ret <vscale x 4 x i32> %out 45} 46 47define <vscale x 2 x i64> @add_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 48; CHECK-LABEL: add_i64_zero: 49; CHECK: // %bb.0: 50; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 51; CHECK-NEXT: add z0.d, p0/m, z0.d, z1.d 52; CHECK-NEXT: ret 53 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 54 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.add.nxv2i64(<vscale x 2 x i1> %pg, 55 <vscale x 2 x i64> %a_z, 56 <vscale x 2 x i64> %b) 57 ret <vscale x 2 x i64> %out 58} 59 60; 61; SUB 62; 63 64define <vscale x 16 x i8> @sub_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 65; CHECK-LABEL: sub_i8_zero: 66; CHECK: // %bb.0: 67; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 68; CHECK-NEXT: sub z0.b, p0/m, z0.b, z1.b 69; CHECK-NEXT: ret 70 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 71 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.sub.nxv16i8(<vscale x 16 x i1> %pg, 72 <vscale x 16 x i8> %a_z, 73 <vscale x 16 x i8> %b) 74 ret <vscale x 16 x i8> %out 75} 76 77define <vscale x 8 x i16> @sub_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 78; CHECK-LABEL: sub_i16_zero: 79; CHECK: // %bb.0: 80; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 81; CHECK-NEXT: sub z0.h, p0/m, z0.h, z1.h 82; CHECK-NEXT: ret 83 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 84 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.sub.nxv8i16(<vscale x 8 x i1> %pg, 85 <vscale x 8 x i16> %a_z, 86 <vscale x 8 x i16> %b) 87 ret <vscale x 8 x i16> %out 88} 89 90define <vscale x 4 x i32> @sub_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 91; CHECK-LABEL: sub_i32_zero: 92; CHECK: // %bb.0: 93; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 94; CHECK-NEXT: sub z0.s, p0/m, z0.s, z1.s 95; CHECK-NEXT: ret 96 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 97 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1> %pg, 98 <vscale x 4 x i32> %a_z, 99 <vscale x 4 x i32> %b) 100 ret <vscale x 4 x i32> %out 101} 102 103define <vscale x 2 x i64> @sub_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 104; CHECK-LABEL: sub_i64_zero: 105; CHECK: // %bb.0: 106; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 107; CHECK-NEXT: sub z0.d, p0/m, z0.d, z1.d 108; CHECK-NEXT: ret 109 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 110 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.sub.nxv2i64(<vscale x 2 x i1> %pg, 111 <vscale x 2 x i64> %a_z, 112 <vscale x 2 x i64> %b) 113 ret <vscale x 2 x i64> %out 114} 115 116; 117; SUBR 118; 119 120define <vscale x 16 x i8> @subr_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 121; CHECK-LABEL: subr_i8_zero: 122; CHECK: // %bb.0: 123; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 124; CHECK-NEXT: subr z0.b, p0/m, z0.b, z1.b 125; CHECK-NEXT: ret 126 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 127 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.subr.nxv16i8(<vscale x 16 x i1> %pg, 128 <vscale x 16 x i8> %a_z, 129 <vscale x 16 x i8> %b) 130 ret <vscale x 16 x i8> %out 131} 132 133define <vscale x 8 x i16> @subr_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 134; CHECK-LABEL: subr_i16_zero: 135; CHECK: // %bb.0: 136; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 137; CHECK-NEXT: subr z0.h, p0/m, z0.h, z1.h 138; CHECK-NEXT: ret 139 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 140 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.subr.nxv8i16(<vscale x 8 x i1> %pg, 141 <vscale x 8 x i16> %a_z, 142 <vscale x 8 x i16> %b) 143 ret <vscale x 8 x i16> %out 144} 145 146define <vscale x 4 x i32> @subr_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 147; CHECK-LABEL: subr_i32_zero: 148; CHECK: // %bb.0: 149; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 150; CHECK-NEXT: subr z0.s, p0/m, z0.s, z1.s 151; CHECK-NEXT: ret 152 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 153 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.subr.nxv4i32(<vscale x 4 x i1> %pg, 154 <vscale x 4 x i32> %a_z, 155 <vscale x 4 x i32> %b) 156 ret <vscale x 4 x i32> %out 157} 158 159define <vscale x 2 x i64> @subr_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 160; CHECK-LABEL: subr_i64_zero: 161; CHECK: // %bb.0: 162; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 163; CHECK-NEXT: subr z0.d, p0/m, z0.d, z1.d 164; CHECK-NEXT: ret 165 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 166 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.subr.nxv2i64(<vscale x 2 x i1> %pg, 167 <vscale x 2 x i64> %a_z, 168 <vscale x 2 x i64> %b) 169 ret <vscale x 2 x i64> %out 170} 171 172; 173; ORR 174; 175 176define <vscale x 16 x i8> @orr_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 177; CHECK-LABEL: orr_i8_zero: 178; CHECK: // %bb.0: 179; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 180; CHECK-NEXT: orr z0.b, p0/m, z0.b, z1.b 181; CHECK-NEXT: ret 182 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 183 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.orr.nxv16i8(<vscale x 16 x i1> %pg, 184 <vscale x 16 x i8> %a_z, 185 <vscale x 16 x i8> %b) 186 ret <vscale x 16 x i8> %out 187} 188 189define <vscale x 8 x i16> @orr_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 190; CHECK-LABEL: orr_i16_zero: 191; CHECK: // %bb.0: 192; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 193; CHECK-NEXT: orr z0.h, p0/m, z0.h, z1.h 194; CHECK-NEXT: ret 195 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 196 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.orr.nxv8i16(<vscale x 8 x i1> %pg, 197 <vscale x 8 x i16> %a_z, 198 <vscale x 8 x i16> %b) 199 ret <vscale x 8 x i16> %out 200} 201 202define <vscale x 4 x i32> @orr_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 203; CHECK-LABEL: orr_i32_zero: 204; CHECK: // %bb.0: 205; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 206; CHECK-NEXT: orr z0.s, p0/m, z0.s, z1.s 207; CHECK-NEXT: ret 208 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 209 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1> %pg, 210 <vscale x 4 x i32> %a_z, 211 <vscale x 4 x i32> %b) 212 ret <vscale x 4 x i32> %out 213} 214 215define <vscale x 2 x i64> @orr_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 216; CHECK-LABEL: orr_i64_zero: 217; CHECK: // %bb.0: 218; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 219; CHECK-NEXT: orr z0.d, p0/m, z0.d, z1.d 220; CHECK-NEXT: ret 221 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 222 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.orr.nxv2i64(<vscale x 2 x i1> %pg, 223 <vscale x 2 x i64> %a_z, 224 <vscale x 2 x i64> %b) 225 ret <vscale x 2 x i64> %out 226} 227 228; 229; EOR 230; 231 232define <vscale x 16 x i8> @eor_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 233; CHECK-LABEL: eor_i8_zero: 234; CHECK: // %bb.0: 235; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 236; CHECK-NEXT: eor z0.b, p0/m, z0.b, z1.b 237; CHECK-NEXT: ret 238 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 239 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.eor.nxv16i8(<vscale x 16 x i1> %pg, 240 <vscale x 16 x i8> %a_z, 241 <vscale x 16 x i8> %b) 242 ret <vscale x 16 x i8> %out 243} 244 245define <vscale x 8 x i16> @eor_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 246; CHECK-LABEL: eor_i16_zero: 247; CHECK: // %bb.0: 248; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 249; CHECK-NEXT: eor z0.h, p0/m, z0.h, z1.h 250; CHECK-NEXT: ret 251 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 252 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.eor.nxv8i16(<vscale x 8 x i1> %pg, 253 <vscale x 8 x i16> %a_z, 254 <vscale x 8 x i16> %b) 255 ret <vscale x 8 x i16> %out 256} 257 258define <vscale x 4 x i32> @eor_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 259; CHECK-LABEL: eor_i32_zero: 260; CHECK: // %bb.0: 261; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 262; CHECK-NEXT: eor z0.s, p0/m, z0.s, z1.s 263; CHECK-NEXT: ret 264 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 265 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1> %pg, 266 <vscale x 4 x i32> %a_z, 267 <vscale x 4 x i32> %b) 268 ret <vscale x 4 x i32> %out 269} 270 271define <vscale x 2 x i64> @eor_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 272; CHECK-LABEL: eor_i64_zero: 273; CHECK: // %bb.0: 274; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 275; CHECK-NEXT: eor z0.d, p0/m, z0.d, z1.d 276; CHECK-NEXT: ret 277 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 278 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.eor.nxv2i64(<vscale x 2 x i1> %pg, 279 <vscale x 2 x i64> %a_z, 280 <vscale x 2 x i64> %b) 281 ret <vscale x 2 x i64> %out 282} 283 284; 285; AND 286; 287 288define <vscale x 16 x i8> @and_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 289; CHECK-LABEL: and_i8_zero: 290; CHECK: // %bb.0: 291; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 292; CHECK-NEXT: and z0.b, p0/m, z0.b, z1.b 293; CHECK-NEXT: ret 294 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 295 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.and.nxv16i8(<vscale x 16 x i1> %pg, 296 <vscale x 16 x i8> %a_z, 297 <vscale x 16 x i8> %b) 298 ret <vscale x 16 x i8> %out 299} 300 301define <vscale x 8 x i16> @and_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 302; CHECK-LABEL: and_i16_zero: 303; CHECK: // %bb.0: 304; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 305; CHECK-NEXT: and z0.h, p0/m, z0.h, z1.h 306; CHECK-NEXT: ret 307 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 308 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.and.nxv8i16(<vscale x 8 x i1> %pg, 309 <vscale x 8 x i16> %a_z, 310 <vscale x 8 x i16> %b) 311 ret <vscale x 8 x i16> %out 312} 313 314define <vscale x 4 x i32> @and_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 315; CHECK-LABEL: and_i32_zero: 316; CHECK: // %bb.0: 317; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 318; CHECK-NEXT: and z0.s, p0/m, z0.s, z1.s 319; CHECK-NEXT: ret 320 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 321 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1> %pg, 322 <vscale x 4 x i32> %a_z, 323 <vscale x 4 x i32> %b) 324 ret <vscale x 4 x i32> %out 325} 326 327define <vscale x 2 x i64> @and_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 328; CHECK-LABEL: and_i64_zero: 329; CHECK: // %bb.0: 330; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 331; CHECK-NEXT: and z0.d, p0/m, z0.d, z1.d 332; CHECK-NEXT: ret 333 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 334 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.and.nxv2i64(<vscale x 2 x i1> %pg, 335 <vscale x 2 x i64> %a_z, 336 <vscale x 2 x i64> %b) 337 ret <vscale x 2 x i64> %out 338} 339 340; 341; BIC 342; 343 344define <vscale x 16 x i8> @bic_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) { 345; CHECK-LABEL: bic_i8_zero: 346; CHECK: // %bb.0: 347; CHECK-NEXT: movprfx z0.b, p0/z, z0.b 348; CHECK-NEXT: bic z0.b, p0/m, z0.b, z1.b 349; CHECK-NEXT: ret 350 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer 351 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.bic.nxv16i8(<vscale x 16 x i1> %pg, 352 <vscale x 16 x i8> %a_z, 353 <vscale x 16 x i8> %b) 354 ret <vscale x 16 x i8> %out 355} 356 357define <vscale x 8 x i16> @bic_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) { 358; CHECK-LABEL: bic_i16_zero: 359; CHECK: // %bb.0: 360; CHECK-NEXT: movprfx z0.h, p0/z, z0.h 361; CHECK-NEXT: bic z0.h, p0/m, z0.h, z1.h 362; CHECK-NEXT: ret 363 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer 364 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.bic.nxv8i16(<vscale x 8 x i1> %pg, 365 <vscale x 8 x i16> %a_z, 366 <vscale x 8 x i16> %b) 367 ret <vscale x 8 x i16> %out 368} 369 370define <vscale x 4 x i32> @bic_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) { 371; CHECK-LABEL: bic_i32_zero: 372; CHECK: // %bb.0: 373; CHECK-NEXT: movprfx z0.s, p0/z, z0.s 374; CHECK-NEXT: bic z0.s, p0/m, z0.s, z1.s 375; CHECK-NEXT: ret 376 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer 377 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.bic.nxv4i32(<vscale x 4 x i1> %pg, 378 <vscale x 4 x i32> %a_z, 379 <vscale x 4 x i32> %b) 380 ret <vscale x 4 x i32> %out 381} 382 383define <vscale x 2 x i64> @bic_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 384; CHECK-LABEL: bic_i64_zero: 385; CHECK: // %bb.0: 386; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 387; CHECK-NEXT: bic z0.d, p0/m, z0.d, z1.d 388; CHECK-NEXT: ret 389 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 390 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg, 391 <vscale x 2 x i64> %a_z, 392 <vscale x 2 x i64> %b) 393 ret <vscale x 2 x i64> %out 394} 395 396; BIC (i.e. A & ~A) is illegal operation with movprfx, so the codegen depend on IR before expand-pseudo 397define <vscale x 2 x i64> @bic_i64_zero_no_unique_reg(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a) { 398; CHECK-LABEL: bic_i64_zero_no_unique_reg: 399; CHECK: // %bb.0: 400; CHECK-NEXT: mov z1.d, #0 // =0x0 401; CHECK-NEXT: mov z1.d, p0/m, z0.d 402; CHECK-NEXT: movprfx z0.d, p0/z, z0.d 403; CHECK-NEXT: bic z0.d, p0/m, z0.d, z1.d 404; CHECK-NEXT: ret 405 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 406 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg, 407 <vscale x 2 x i64> %a_z, 408 <vscale x 2 x i64> %a_z) 409 ret <vscale x 2 x i64> %out 410} 411 412; BIC (i.e. A & ~B) is not a commutative operation, so disable it when the 413; destination operand is not the destructive operand 414define <vscale x 2 x i64> @bic_i64_zero_no_comm(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) { 415; CHECK-LABEL: bic_i64_zero_no_comm: 416; CHECK: // %bb.0: 417; CHECK-NEXT: mov z2.d, #0 // =0x0 418; CHECK-NEXT: mov z2.d, p0/m, z0.d 419; CHECK-NEXT: mov z0.d, z1.d 420; CHECK-NEXT: bic z0.d, p0/m, z0.d, z2.d 421; CHECK-NEXT: ret 422 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer 423 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg, 424 <vscale x 2 x i64> %b, 425 <vscale x 2 x i64> %a_z) 426 ret <vscale x 2 x i64> %out 427} 428 429declare <vscale x 16 x i8> @llvm.aarch64.sve.add.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 430declare <vscale x 8 x i16> @llvm.aarch64.sve.add.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 431declare <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 432declare <vscale x 2 x i64> @llvm.aarch64.sve.add.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 433 434declare <vscale x 16 x i8> @llvm.aarch64.sve.sub.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 435declare <vscale x 8 x i16> @llvm.aarch64.sve.sub.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 436declare <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 437declare <vscale x 2 x i64> @llvm.aarch64.sve.sub.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 438 439declare <vscale x 16 x i8> @llvm.aarch64.sve.subr.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 440declare <vscale x 8 x i16> @llvm.aarch64.sve.subr.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 441declare <vscale x 4 x i32> @llvm.aarch64.sve.subr.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 442declare <vscale x 2 x i64> @llvm.aarch64.sve.subr.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 443 444declare <vscale x 16 x i8> @llvm.aarch64.sve.orr.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 445declare <vscale x 8 x i16> @llvm.aarch64.sve.orr.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 446declare <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 447declare <vscale x 2 x i64> @llvm.aarch64.sve.orr.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 448 449declare <vscale x 16 x i8> @llvm.aarch64.sve.eor.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 450declare <vscale x 8 x i16> @llvm.aarch64.sve.eor.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 451declare <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 452declare <vscale x 2 x i64> @llvm.aarch64.sve.eor.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 453 454declare <vscale x 16 x i8> @llvm.aarch64.sve.and.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 455declare <vscale x 8 x i16> @llvm.aarch64.sve.and.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 456declare <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 457declare <vscale x 2 x i64> @llvm.aarch64.sve.and.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 458 459declare <vscale x 16 x i8> @llvm.aarch64.sve.bic.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>) 460declare <vscale x 8 x i16> @llvm.aarch64.sve.bic.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>) 461declare <vscale x 4 x i32> @llvm.aarch64.sve.bic.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>) 462declare <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>) 463