1; RUN: llc -mtriple aarch64 -mattr=+sve -asm-verbose=1 < %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; SVCREATE2 (i8) 9; 10 11define <vscale x 16 x i8> @test_svcreate2_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) local_unnamed_addr #0 { 12; CHECK-LABEL: test_svcreate2_s8_vec0: 13; CHECK: // %L2 14; CHECK-NEXT: ret 15 %tuple = tail call <vscale x 32 x i8> @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) 16 br i1 %p, label %L1, label %L2 17L1: 18 ret <vscale x 16 x i8> undef 19L2: 20 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8> %tuple, i32 0) 21 ret <vscale x 16 x i8> %extract 22} 23 24define <vscale x 16 x i8> @test_svcreate2_s8_vec1(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) local_unnamed_addr #0 { 25; CHECK-LABEL: test_svcreate2_s8_vec1: 26; CHECK: // %L2 27; CHECK-NEXT: mov z0.d, z1.d 28; CHECK-NEXT: ret 29 %tuple = tail call <vscale x 32 x i8> @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) 30 br i1 %p, label %L1, label %L2 31L1: 32 ret <vscale x 16 x i8> undef 33L2: 34 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8> %tuple, i32 1) 35 ret <vscale x 16 x i8> %extract 36} 37 38; 39; SVCREATE2 (i16) 40; 41 42define <vscale x 8 x i16> @test_svcreate2_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) local_unnamed_addr #0 { 43; CHECK-LABEL: test_svcreate2_s16_vec0: 44; CHECK: // %L2 45; CHECK-NEXT: ret 46 %tuple = tail call <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) 47 br i1 %p, label %L1, label %L2 48L1: 49 ret <vscale x 8 x i16> undef 50L2: 51 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16> %tuple, i32 0) 52 ret <vscale x 8 x i16> %extract 53} 54 55define <vscale x 8 x i16> @test_svcreate2_s16_vec1(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) local_unnamed_addr #0 { 56; CHECK-LABEL: test_svcreate2_s16_vec1: 57; CHECK: // %L2 58; CHECK-NEXT: mov z0.d, z1.d 59; CHECK-NEXT: ret 60 %tuple = tail call <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) 61 br i1 %p, label %L1, label %L2 62L1: 63 ret <vscale x 8 x i16> undef 64L2: 65 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16> %tuple, i32 1) 66 ret <vscale x 8 x i16> %extract 67} 68 69; 70; SVCREATE2 (half) 71; 72 73define <vscale x 8 x half> @test_svcreate2_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1) local_unnamed_addr #0 { 74; CHECK-LABEL: test_svcreate2_f16_vec0: 75; CHECK: // %L2 76; CHECK-NEXT: ret 77 %tuple = tail call <vscale x 16 x half> @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1) 78 br i1 %p, label %L1, label %L2 79L1: 80 ret <vscale x 8 x half> undef 81L2: 82 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half> %tuple, i32 0) 83 ret <vscale x 8 x half> %extract 84} 85 86define <vscale x 8 x half> @test_svcreate2_f16_vec1(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1) local_unnamed_addr #0 { 87; CHECK-LABEL: test_svcreate2_f16_vec1: 88; CHECK: // %L2 89; CHECK-NEXT: mov z0.d, z1.d 90; CHECK-NEXT: ret 91 %tuple = tail call <vscale x 16 x half> @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1) 92 br i1 %p, label %L1, label %L2 93L1: 94 ret <vscale x 8 x half> undef 95L2: 96 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half> %tuple, i32 1) 97 ret <vscale x 8 x half> %extract 98} 99 100; 101; SVCREATE2 (bfloat) 102; 103 104define <vscale x 8 x bfloat> @test_svcreate2_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) local_unnamed_addr #1 { 105; CHECK-LABEL: test_svcreate2_bf16_vec0: 106; CHECK: // %L2 107; CHECK-NEXT: ret 108 %tuple = tail call <vscale x 16 x bfloat> @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) 109 br i1 %p, label %L1, label %L2 110L1: 111 ret <vscale x 8 x bfloat> undef 112L2: 113 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat> %tuple, i32 0) 114 ret <vscale x 8 x bfloat> %extract 115} 116 117define <vscale x 8 x bfloat> @test_svcreate2_bf16_vec1(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) local_unnamed_addr #1 { 118; CHECK-LABEL: test_svcreate2_bf16_vec1: 119; CHECK: // %L2 120; CHECK-NEXT: mov z0.d, z1.d 121; CHECK-NEXT: ret 122 %tuple = tail call <vscale x 16 x bfloat> @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) 123 br i1 %p, label %L1, label %L2 124L1: 125 ret <vscale x 8 x bfloat> undef 126L2: 127 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat> %tuple, i32 1) 128 ret <vscale x 8 x bfloat> %extract 129} 130 131; 132; SVCREATE2 (i32) 133; 134 135define <vscale x 4 x i32> @test_svcreate2_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) local_unnamed_addr #0 { 136; CHECK-LABEL: test_svcreate2_s32_vec0: 137; CHECK: // %L2 138; CHECK-NEXT: ret 139 %tuple = tail call <vscale x 8 x i32> @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) 140 br i1 %p, label %L1, label %L2 141L1: 142 ret <vscale x 4 x i32> undef 143L2: 144 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32> %tuple, i32 0) 145 ret <vscale x 4 x i32> %extract 146} 147 148define <vscale x 4 x i32> @test_svcreate2_s32_vec1(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) local_unnamed_addr #0 { 149; CHECK-LABEL: test_svcreate2_s32_vec1: 150; CHECK: // %L2 151; CHECK-NEXT: mov z0.d, z1.d 152; CHECK-NEXT: ret 153 %tuple = tail call <vscale x 8 x i32> @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) 154 br i1 %p, label %L1, label %L2 155L1: 156 ret <vscale x 4 x i32> undef 157L2: 158 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32> %tuple, i32 1) 159 ret <vscale x 4 x i32> %extract 160} 161 162; 163; SVCREATE2 (float) 164; 165 166define <vscale x 4 x float> @test_svcreate2_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1) local_unnamed_addr #0 { 167; CHECK-LABEL: test_svcreate2_f32_vec0: 168; CHECK: // %L2 169; CHECK-NEXT: ret 170 %tuple = tail call <vscale x 8 x float> @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1) 171 br i1 %p, label %L1, label %L2 172L1: 173 ret <vscale x 4 x float> undef 174L2: 175 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float> %tuple, i32 0) 176 ret <vscale x 4 x float> %extract 177} 178 179define <vscale x 4 x float> @test_svcreate2_f32_vec1(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1) local_unnamed_addr #0 { 180; CHECK-LABEL: test_svcreate2_f32_vec1: 181; CHECK: // %L2 182; CHECK-NEXT: mov z0.d, z1.d 183; CHECK-NEXT: ret 184 %tuple = tail call <vscale x 8 x float> @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1) 185 br i1 %p, label %L1, label %L2 186L1: 187 ret <vscale x 4 x float> undef 188L2: 189 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float> %tuple, i32 1) 190 ret <vscale x 4 x float> %extract 191} 192 193; 194; SVCREATE2 (i64) 195; 196 197define <vscale x 2 x i64> @test_svcreate2_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) local_unnamed_addr #0 { 198; CHECK-LABEL: test_svcreate2_s64_vec0: 199; CHECK: // %L2 200; CHECK-NEXT: ret 201 %tuple = tail call <vscale x 4 x i64> @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) 202 br i1 %p, label %L1, label %L2 203L1: 204 ret <vscale x 2 x i64> undef 205L2: 206 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64> %tuple, i32 0) 207 ret <vscale x 2 x i64> %extract 208} 209 210define <vscale x 2 x i64> @test_svcreate2_s64_vec1(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) local_unnamed_addr #0 { 211; CHECK-LABEL: test_svcreate2_s64_vec1: 212; CHECK: // %L2 213; CHECK-NEXT: mov z0.d, z1.d 214; CHECK-NEXT: ret 215 %tuple = tail call <vscale x 4 x i64> @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) 216 br i1 %p, label %L1, label %L2 217L1: 218 ret <vscale x 2 x i64> undef 219L2: 220 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64> %tuple, i32 1) 221 ret <vscale x 2 x i64> %extract 222} 223 224; 225; SVCREATE2 (double) 226; 227 228define <vscale x 2 x double> @test_svcreate2_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1) local_unnamed_addr #0 { 229; CHECK-LABEL: test_svcreate2_f64_vec0: 230; CHECK: // %L2 231; CHECK-NEXT: ret 232 %tuple = tail call <vscale x 4 x double> @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1) 233 br i1 %p, label %L1, label %L2 234L1: 235 ret <vscale x 2 x double> undef 236L2: 237 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double> %tuple, i32 0) 238 ret <vscale x 2 x double> %extract 239} 240 241define <vscale x 2 x double> @test_svcreate2_f64_vec1(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1) local_unnamed_addr #0 { 242; CHECK-LABEL: test_svcreate2_f64_vec1: 243; CHECK: // %L2 244; CHECK-NEXT: mov z0.d, z1.d 245; CHECK-NEXT: ret 246 %tuple = tail call <vscale x 4 x double> @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1) 247 br i1 %p, label %L1, label %L2 248L1: 249 ret <vscale x 2 x double> undef 250L2: 251 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double> %tuple, i32 1) 252 ret <vscale x 2 x double> %extract 253} 254 255; 256; SVCREATE3 (i8) 257; 258 259define <vscale x 16 x i8> @test_svcreate3_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) local_unnamed_addr #0 { 260; CHECK-LABEL: test_svcreate3_s8_vec0: 261; CHECK: // %L2 262; CHECK-NEXT: ret 263 %tuple = tail call <vscale x 48 x i8> @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) 264 br i1 %p, label %L1, label %L2 265L1: 266 ret <vscale x 16 x i8> undef 267L2: 268 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8> %tuple, i32 0) 269 ret <vscale x 16 x i8> %extract 270} 271 272define <vscale x 16 x i8> @test_svcreate3_s8_vec2(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) local_unnamed_addr #0 { 273; CHECK-LABEL: test_svcreate3_s8_vec2: 274; CHECK: // %L2 275; CHECK-NEXT: mov z0.d, z2.d 276; CHECK-NEXT: ret 277 %tuple = tail call <vscale x 48 x i8> @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) 278 br i1 %p, label %L1, label %L2 279L1: 280 ret <vscale x 16 x i8> undef 281L2: 282 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8> %tuple, i32 2) 283 ret <vscale x 16 x i8> %extract 284} 285 286; 287; SVCREATE3 (i16) 288; 289 290define <vscale x 8 x i16> @test_svcreate3_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) local_unnamed_addr #0 { 291; CHECK-LABEL: test_svcreate3_s16_vec0: 292; CHECK: // %L2 293; CHECK-NEXT: ret 294 %tuple = tail call <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) 295 br i1 %p, label %L1, label %L2 296L1: 297 ret <vscale x 8 x i16> undef 298L2: 299 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16> %tuple, i32 0) 300 ret <vscale x 8 x i16> %extract 301} 302 303define <vscale x 8 x i16> @test_svcreate3_s16_vec2(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) local_unnamed_addr #0 { 304; CHECK-LABEL: test_svcreate3_s16_vec2: 305; CHECK: // %L2 306; CHECK-NEXT: mov z0.d, z2.d 307; CHECK-NEXT: ret 308 %tuple = tail call <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) 309 br i1 %p, label %L1, label %L2 310L1: 311 ret <vscale x 8 x i16> undef 312L2: 313 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16> %tuple, i32 2) 314 ret <vscale x 8 x i16> %extract 315} 316 317; 318; SVCREATE3 (half) 319; 320 321define <vscale x 8 x half> @test_svcreate3_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) local_unnamed_addr #0 { 322; CHECK-LABEL: test_svcreate3_f16_vec0: 323; CHECK: // %L2 324; CHECK-NEXT: ret 325 %tuple = tail call <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) 326 br i1 %p, label %L1, label %L2 327L1: 328 ret <vscale x 8 x half> undef 329L2: 330 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half> %tuple, i32 0) 331 ret <vscale x 8 x half> %extract 332} 333 334define <vscale x 8 x half> @test_svcreate3_f16_vec2(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) local_unnamed_addr #0 { 335; CHECK-LABEL: test_svcreate3_f16_vec2: 336; CHECK: // %L2 337; CHECK-NEXT: mov z0.d, z2.d 338; CHECK-NEXT: ret 339 %tuple = tail call <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) 340 br i1 %p, label %L1, label %L2 341L1: 342 ret <vscale x 8 x half> undef 343L2: 344 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half> %tuple, i32 2) 345 ret <vscale x 8 x half> %extract 346} 347 348; 349; SVCREATE3 (bfloat) 350; 351 352define <vscale x 8 x bfloat> @test_svcreate3_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) local_unnamed_addr #1 { 353; CHECK-LABEL: test_svcreate3_bf16_vec0: 354; CHECK: // %L2 355; CHECK-NEXT: ret 356 %tuple = tail call <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) 357 br i1 %p, label %L1, label %L2 358L1: 359 ret <vscale x 8 x bfloat> undef 360L2: 361 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat> %tuple, i32 0) 362 ret <vscale x 8 x bfloat> %extract 363} 364 365define <vscale x 8 x bfloat> @test_svcreate3_bf16_vec2(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) local_unnamed_addr #1 { 366; CHECK-LABEL: test_svcreate3_bf16_vec2: 367; CHECK: // %L2 368; CHECK-NEXT: mov z0.d, z2.d 369; CHECK-NEXT: ret 370 %tuple = tail call <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) 371 br i1 %p, label %L1, label %L2 372L1: 373 ret <vscale x 8 x bfloat> undef 374L2: 375 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat> %tuple, i32 2) 376 ret <vscale x 8 x bfloat> %extract 377} 378 379; 380; SVCREATE3 (i32) 381; 382 383define <vscale x 4 x i32> @test_svcreate3_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) local_unnamed_addr #0 { 384; CHECK-LABEL: test_svcreate3_s32_vec0: 385; CHECK: // %L2 386; CHECK-NEXT: ret 387 %tuple = tail call <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) 388 br i1 %p, label %L1, label %L2 389L1: 390 ret <vscale x 4 x i32> undef 391L2: 392 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32> %tuple, i32 0) 393 ret <vscale x 4 x i32> %extract 394} 395 396define <vscale x 4 x i32> @test_svcreate3_s32_vec2(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) local_unnamed_addr #0 { 397; CHECK-LABEL: test_svcreate3_s32_vec2: 398; CHECK: // %L2 399; CHECK-NEXT: mov z0.d, z2.d 400; CHECK-NEXT: ret 401 %tuple = tail call <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) 402 br i1 %p, label %L1, label %L2 403L1: 404 ret <vscale x 4 x i32> undef 405L2: 406 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32> %tuple, i32 2) 407 ret <vscale x 4 x i32> %extract 408} 409 410; 411; SVCREATE3 (float) 412; 413 414define <vscale x 4 x float> @test_svcreate3_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) local_unnamed_addr #0 { 415; CHECK-LABEL: test_svcreate3_f32_vec0: 416; CHECK: // %L2 417; CHECK-NEXT: ret 418 %tuple = tail call <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) 419 br i1 %p, label %L1, label %L2 420L1: 421 ret <vscale x 4 x float> undef 422L2: 423 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float> %tuple, i32 0) 424 ret <vscale x 4 x float> %extract 425} 426 427define <vscale x 4 x float> @test_svcreate3_f32_vec2(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) local_unnamed_addr #0 { 428; CHECK-LABEL: test_svcreate3_f32_vec2: 429; CHECK: // %L2 430; CHECK-NEXT: mov z0.d, z2.d 431; CHECK-NEXT: ret 432 %tuple = tail call <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) 433 br i1 %p, label %L1, label %L2 434L1: 435 ret <vscale x 4 x float> undef 436L2: 437 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float> %tuple, i32 2) 438 ret <vscale x 4 x float> %extract 439} 440 441; 442; SVCREATE3 (i64) 443; 444 445define <vscale x 2 x i64> @test_svcreate3_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) local_unnamed_addr #0 { 446; CHECK-LABEL: test_svcreate3_s64_vec0: 447; CHECK: // %L2 448; CHECK-NEXT: ret 449 %tuple = tail call <vscale x 6 x i64> @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) 450 br i1 %p, label %L1, label %L2 451L1: 452 ret <vscale x 2 x i64> undef 453L2: 454 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64> %tuple, i32 0) 455 ret <vscale x 2 x i64> %extract 456} 457 458define <vscale x 2 x i64> @test_svcreate3_s64_vec2(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) local_unnamed_addr #0 { 459; CHECK-LABEL: test_svcreate3_s64_vec2: 460; CHECK: // %L2 461; CHECK-NEXT: mov z0.d, z2.d 462; CHECK-NEXT: ret 463 %tuple = tail call <vscale x 6 x i64> @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) 464 br i1 %p, label %L1, label %L2 465L1: 466 ret <vscale x 2 x i64> undef 467L2: 468 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64> %tuple, i32 2) 469 ret <vscale x 2 x i64> %extract 470} 471 472; 473; SVCREATE3 (double) 474; 475 476define <vscale x 2 x double> @test_svcreate3_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) local_unnamed_addr #0 { 477; CHECK-LABEL: test_svcreate3_f64_vec0: 478; CHECK: // %L2 479; CHECK-NEXT: ret 480 %tuple = tail call <vscale x 6 x double> @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) 481 br i1 %p, label %L1, label %L2 482L1: 483 ret <vscale x 2 x double> undef 484L2: 485 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double> %tuple, i32 0) 486 ret <vscale x 2 x double> %extract 487} 488 489define <vscale x 2 x double> @test_svcreate3_f64_vec2(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) local_unnamed_addr #0 { 490; CHECK-LABEL: test_svcreate3_f64_vec2: 491; CHECK: // %L2 492; CHECK-NEXT: mov z0.d, z2.d 493; CHECK-NEXT: ret 494 %tuple = tail call <vscale x 6 x double> @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) 495 br i1 %p, label %L1, label %L2 496L1: 497 ret <vscale x 2 x double> undef 498L2: 499 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double> %tuple, i32 2) 500 ret <vscale x 2 x double> %extract 501} 502 503; 504; SVCREATE4 (i8) 505; 506 507define <vscale x 16 x i8> @test_svcreate4_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) local_unnamed_addr #0 { 508; CHECK-LABEL: test_svcreate4_s8_vec0: 509; CHECK: // %L2 510; CHECK-NEXT: ret 511 %tuple = tail call <vscale x 64 x i8> @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) 512 br i1 %p, label %L1, label %L2 513L1: 514 ret <vscale x 16 x i8> undef 515L2: 516 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8> %tuple, i32 0) 517 ret <vscale x 16 x i8> %extract 518} 519 520define <vscale x 16 x i8> @test_svcreate4_s8_vec3(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) local_unnamed_addr #0 { 521; CHECK-LABEL: test_svcreate4_s8_vec3: 522; CHECK: // %L2 523; CHECK-NEXT: mov z0.d, z3.d 524; CHECK-NEXT: ret 525 %tuple = tail call <vscale x 64 x i8> @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) 526 br i1 %p, label %L1, label %L2 527L1: 528 ret <vscale x 16 x i8> undef 529L2: 530 %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8> %tuple, i32 3) 531 ret <vscale x 16 x i8> %extract 532} 533 534; 535; SVCREATE4 (i16) 536; 537 538define <vscale x 8 x i16> @test_svcreate4_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) local_unnamed_addr #0 { 539; CHECK-LABEL: test_svcreate4_s16_vec0: 540; CHECK: // %L2 541; CHECK-NEXT: ret 542 %tuple = tail call <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) 543 br i1 %p, label %L1, label %L2 544L1: 545 ret <vscale x 8 x i16> undef 546L2: 547 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16> %tuple, i32 0) 548 ret <vscale x 8 x i16> %extract 549} 550 551define <vscale x 8 x i16> @test_svcreate4_s16_vec3(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) local_unnamed_addr #0 { 552; CHECK-LABEL: test_svcreate4_s16_vec3: 553; CHECK: // %L2 554; CHECK-NEXT: mov z0.d, z3.d 555; CHECK-NEXT: ret 556 %tuple = tail call <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) 557 br i1 %p, label %L1, label %L2 558L1: 559 ret <vscale x 8 x i16> undef 560L2: 561 %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16> %tuple, i32 3) 562 ret <vscale x 8 x i16> %extract 563} 564 565; 566; SVCREATE4 (half) 567; 568 569define <vscale x 8 x half> @test_svcreate4_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) local_unnamed_addr #0 { 570; CHECK-LABEL: test_svcreate4_f16_vec0: 571; CHECK: // %L2 572; CHECK-NEXT: ret 573 %tuple = tail call <vscale x 32 x half> @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) 574 br i1 %p, label %L1, label %L2 575L1: 576 ret <vscale x 8 x half> undef 577L2: 578 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half> %tuple, i32 0) 579 ret <vscale x 8 x half> %extract 580} 581 582define <vscale x 8 x half> @test_svcreate4_f16_vec3(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) local_unnamed_addr #0 { 583; CHECK-LABEL: test_svcreate4_f16_vec3: 584; CHECK: // %L2 585; CHECK-NEXT: mov z0.d, z3.d 586; CHECK-NEXT: ret 587 %tuple = tail call <vscale x 32 x half> @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) 588 br i1 %p, label %L1, label %L2 589L1: 590 ret <vscale x 8 x half> undef 591L2: 592 %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half> %tuple, i32 3) 593 ret <vscale x 8 x half> %extract 594} 595 596; 597; SVCREATE4 (bfloat) 598; 599 600define <vscale x 8 x bfloat> @test_svcreate4_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) local_unnamed_addr #1 { 601; CHECK-LABEL: test_svcreate4_bf16_vec0: 602; CHECK: // %L2 603; CHECK-NEXT: ret 604 %tuple = tail call <vscale x 32 x bfloat> @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) 605 br i1 %p, label %L1, label %L2 606L1: 607 ret <vscale x 8 x bfloat> undef 608L2: 609 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat> %tuple, i32 0) 610 ret <vscale x 8 x bfloat> %extract 611} 612 613define <vscale x 8 x bfloat> @test_svcreate4_bf16_vec3(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) local_unnamed_addr #1 { 614; CHECK-LABEL: test_svcreate4_bf16_vec3: 615; CHECK: // %L2 616; CHECK-NEXT: mov z0.d, z3.d 617; CHECK-NEXT: ret 618 %tuple = tail call <vscale x 32 x bfloat> @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) 619 br i1 %p, label %L1, label %L2 620L1: 621 ret <vscale x 8 x bfloat> undef 622L2: 623 %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat> %tuple, i32 3) 624 ret <vscale x 8 x bfloat> %extract 625} 626 627; 628; SVCREATE4 (i32) 629; 630 631define <vscale x 4 x i32> @test_svcreate4_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) local_unnamed_addr #0 { 632; CHECK-LABEL: test_svcreate4_s32_vec0: 633; CHECK: // %L2 634; CHECK-NEXT: ret 635 %tuple = tail call <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) 636 br i1 %p, label %L1, label %L2 637L1: 638 ret <vscale x 4 x i32> undef 639L2: 640 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32> %tuple, i32 0) 641 ret <vscale x 4 x i32> %extract 642} 643 644define <vscale x 4 x i32> @test_svcreate4_s32_vec3(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) local_unnamed_addr #0 { 645; CHECK-LABEL: test_svcreate4_s32_vec3: 646; CHECK: // %L2 647; CHECK-NEXT: mov z0.d, z3.d 648; CHECK-NEXT: ret 649 %tuple = tail call <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) 650 br i1 %p, label %L1, label %L2 651L1: 652 ret <vscale x 4 x i32> undef 653L2: 654 %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32> %tuple, i32 3) 655 ret <vscale x 4 x i32> %extract 656} 657 658; 659; SVCREATE4 (float) 660; 661 662define <vscale x 4 x float> @test_svcreate4_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) local_unnamed_addr #0 { 663; CHECK-LABEL: test_svcreate4_f32_vec0: 664; CHECK: // %L2 665; CHECK-NEXT: ret 666 %tuple = tail call <vscale x 16 x float> @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) 667 br i1 %p, label %L1, label %L2 668L1: 669 ret <vscale x 4 x float> undef 670L2: 671 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float> %tuple, i32 0) 672 ret <vscale x 4 x float> %extract 673} 674 675define <vscale x 4 x float> @test_svcreate4_f32_vec3(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) local_unnamed_addr #0 { 676; CHECK-LABEL: test_svcreate4_f32_vec3: 677; CHECK: // %L2 678; CHECK-NEXT: mov z0.d, z3.d 679; CHECK-NEXT: ret 680 %tuple = tail call <vscale x 16 x float> @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) 681 br i1 %p, label %L1, label %L2 682L1: 683 ret <vscale x 4 x float> undef 684L2: 685 %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float> %tuple, i32 3) 686 ret <vscale x 4 x float> %extract 687} 688 689; 690; SVCREATE4 (i64) 691; 692 693define <vscale x 2 x i64> @test_svcreate4_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) local_unnamed_addr #0 { 694; CHECK-LABEL: test_svcreate4_s64_vec0: 695; CHECK: // %L2 696; CHECK-NEXT: ret 697 %tuple = tail call <vscale x 8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) 698 br i1 %p, label %L1, label %L2 699L1: 700 ret <vscale x 2 x i64> undef 701L2: 702 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64> %tuple, i32 0) 703 ret <vscale x 2 x i64> %extract 704} 705 706define <vscale x 2 x i64> @test_svcreate4_s64_vec3(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) local_unnamed_addr #0 { 707; CHECK-LABEL: test_svcreate4_s64_vec3: 708; CHECK: // %L2 709; CHECK-NEXT: mov z0.d, z3.d 710; CHECK-NEXT: ret 711 %tuple = tail call <vscale x 8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) 712 br i1 %p, label %L1, label %L2 713L1: 714 ret <vscale x 2 x i64> undef 715L2: 716 %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64> %tuple, i32 3) 717 ret <vscale x 2 x i64> %extract 718} 719 720; 721; SVCREATE4 (double) 722; 723 724define <vscale x 2 x double> @test_svcreate4_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) local_unnamed_addr #0 { 725; CHECK-LABEL: test_svcreate4_f64_vec0: 726; CHECK: // %L2 727; CHECK-NEXT: ret 728 %tuple = tail call <vscale x 8 x double> @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) 729 br i1 %p, label %L1, label %L2 730L1: 731 ret <vscale x 2 x double> undef 732L2: 733 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double> %tuple, i32 0) 734 ret <vscale x 2 x double> %extract 735} 736 737define <vscale x 2 x double> @test_svcreate4_f64_vec3(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) local_unnamed_addr #0 { 738; CHECK-LABEL: test_svcreate4_f64_vec3: 739; CHECK: // %L2 740; CHECK-NEXT: mov z0.d, z3.d 741; CHECK-NEXT: ret 742 %tuple = tail call <vscale x 8 x double> @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) 743 br i1 %p, label %L1, label %L2 744L1: 745 ret <vscale x 2 x double> undef 746L2: 747 %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double> %tuple, i32 3) 748 ret <vscale x 2 x double> %extract 749} 750 751attributes #0 = { nounwind "target-features"="+sve" } 752; +bf16 is required for the bfloat version. 753attributes #1 = { nounwind "target-features"="+sve,+bf16" } 754 755declare <vscale x 4 x double> @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>) 756declare <vscale x 8 x float> @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>) 757declare <vscale x 16 x half> @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>) 758declare <vscale x 16 x bfloat> @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>) 759declare <vscale x 4 x i64> @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 760declare <vscale x 8 x i32> @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 761declare <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 762declare <vscale x 32 x i8> @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 763 764declare <vscale x 6 x double> @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>) 765declare <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>) 766declare <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>) 767declare <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>) 768declare <vscale x 6 x i64> @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 769declare <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 770declare <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 771declare <vscale x 48 x i8> @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 772 773declare <vscale x 8 x double> @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64 (<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>) 774declare <vscale x 16 x float> @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>) 775declare <vscale x 32 x half> @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>) 776declare <vscale x 32 x bfloat> @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>) 777declare <vscale x 8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>) 778declare <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>) 779declare <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>) 780declare <vscale x 64 x i8> @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>) 781 782declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8>, i32 immarg) 783declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8>, i32 immarg) 784declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8>, i32 immarg) 785 786declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16>, i32 immarg) 787declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16>, i32 immarg) 788declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16>, i32 immarg) 789 790declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32>, i32 immarg) 791declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32>, i32 immarg) 792declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32>, i32 immarg) 793 794declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64>, i32 immarg) 795declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64>, i32 immarg) 796declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64>, i32 immarg) 797 798declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat>, i32 immarg) 799declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat>, i32 immarg) 800declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat>, i32 immarg) 801 802declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half>, i32 immarg) 803declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half>, i32 immarg) 804declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half>, i32 immarg) 805 806declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float>, i32 immarg) 807declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float>, i32 immarg) 808declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float>, i32 immarg) 809 810declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double>, i32 immarg) 811declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double>, i32 immarg) 812declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double>, i32 immarg) 813