1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 4 5define i8 @ti8(i1 %c, ptr %p, i8 %a, i8 %b) { 6; CHECK-SD-LABEL: ti8: 7; CHECK-SD: // %bb.0: // %entry 8; CHECK-SD-NEXT: tbz w0, #0, .LBB0_2 9; CHECK-SD-NEXT: // %bb.1: // %t 10; CHECK-SD-NEXT: mov w3, w2 11; CHECK-SD-NEXT: str wzr, [x1] 12; CHECK-SD-NEXT: .LBB0_2: // %e 13; CHECK-SD-NEXT: mov w0, w3 14; CHECK-SD-NEXT: ret 15; 16; CHECK-GI-LABEL: ti8: 17; CHECK-GI: // %bb.0: // %entry 18; CHECK-GI-NEXT: mov w8, w0 19; CHECK-GI-NEXT: mov w0, w3 20; CHECK-GI-NEXT: tbz w8, #0, .LBB0_2 21; CHECK-GI-NEXT: // %bb.1: // %t 22; CHECK-GI-NEXT: mov w0, w2 23; CHECK-GI-NEXT: str wzr, [x1] 24; CHECK-GI-NEXT: .LBB0_2: // %e 25; CHECK-GI-NEXT: ret 26entry: 27 br i1 %c, label %t, label %e 28t: 29 store i32 0, ptr %p 30 br label %e 31e: 32 %h = phi i8 [%a, %t], [%b, %entry] 33 ret i8 %h 34} 35 36define i16 @ti16(i1 %c, ptr %p, i16 %a, i16 %b) { 37; CHECK-SD-LABEL: ti16: 38; CHECK-SD: // %bb.0: // %entry 39; CHECK-SD-NEXT: tbz w0, #0, .LBB1_2 40; CHECK-SD-NEXT: // %bb.1: // %t 41; CHECK-SD-NEXT: mov w3, w2 42; CHECK-SD-NEXT: str wzr, [x1] 43; CHECK-SD-NEXT: .LBB1_2: // %e 44; CHECK-SD-NEXT: mov w0, w3 45; CHECK-SD-NEXT: ret 46; 47; CHECK-GI-LABEL: ti16: 48; CHECK-GI: // %bb.0: // %entry 49; CHECK-GI-NEXT: mov w8, w0 50; CHECK-GI-NEXT: mov w0, w3 51; CHECK-GI-NEXT: tbz w8, #0, .LBB1_2 52; CHECK-GI-NEXT: // %bb.1: // %t 53; CHECK-GI-NEXT: mov w0, w2 54; CHECK-GI-NEXT: str wzr, [x1] 55; CHECK-GI-NEXT: .LBB1_2: // %e 56; CHECK-GI-NEXT: ret 57entry: 58 br i1 %c, label %t, label %e 59t: 60 store i32 0, ptr %p 61 br label %e 62e: 63 %h = phi i16 [%a, %t], [%b, %entry] 64 ret i16 %h 65} 66 67define i32 @ti32(i1 %c, ptr %p, i32 %a, i32 %b) { 68; CHECK-SD-LABEL: ti32: 69; CHECK-SD: // %bb.0: // %entry 70; CHECK-SD-NEXT: tbz w0, #0, .LBB2_2 71; CHECK-SD-NEXT: // %bb.1: // %t 72; CHECK-SD-NEXT: mov w3, w2 73; CHECK-SD-NEXT: str wzr, [x1] 74; CHECK-SD-NEXT: .LBB2_2: // %e 75; CHECK-SD-NEXT: mov w0, w3 76; CHECK-SD-NEXT: ret 77; 78; CHECK-GI-LABEL: ti32: 79; CHECK-GI: // %bb.0: // %entry 80; CHECK-GI-NEXT: mov w8, w0 81; CHECK-GI-NEXT: mov w0, w3 82; CHECK-GI-NEXT: tbz w8, #0, .LBB2_2 83; CHECK-GI-NEXT: // %bb.1: // %t 84; CHECK-GI-NEXT: mov w0, w2 85; CHECK-GI-NEXT: str wzr, [x1] 86; CHECK-GI-NEXT: .LBB2_2: // %e 87; CHECK-GI-NEXT: ret 88entry: 89 br i1 %c, label %t, label %e 90t: 91 store i32 0, ptr %p 92 br label %e 93e: 94 %h = phi i32 [%a, %t], [%b, %entry] 95 ret i32 %h 96} 97 98define i64 @ti64(i1 %c, ptr %p, i64 %a, i64 %b) { 99; CHECK-SD-LABEL: ti64: 100; CHECK-SD: // %bb.0: // %entry 101; CHECK-SD-NEXT: tbz w0, #0, .LBB3_2 102; CHECK-SD-NEXT: // %bb.1: // %t 103; CHECK-SD-NEXT: mov x3, x2 104; CHECK-SD-NEXT: str wzr, [x1] 105; CHECK-SD-NEXT: .LBB3_2: // %e 106; CHECK-SD-NEXT: mov x0, x3 107; CHECK-SD-NEXT: ret 108; 109; CHECK-GI-LABEL: ti64: 110; CHECK-GI: // %bb.0: // %entry 111; CHECK-GI-NEXT: mov w8, w0 112; CHECK-GI-NEXT: mov x0, x3 113; CHECK-GI-NEXT: tbz w8, #0, .LBB3_2 114; CHECK-GI-NEXT: // %bb.1: // %t 115; CHECK-GI-NEXT: mov x0, x2 116; CHECK-GI-NEXT: str wzr, [x1] 117; CHECK-GI-NEXT: .LBB3_2: // %e 118; CHECK-GI-NEXT: ret 119entry: 120 br i1 %c, label %t, label %e 121t: 122 store i32 0, ptr %p 123 br label %e 124e: 125 %h = phi i64 [%a, %t], [%b, %entry] 126 ret i64 %h 127} 128 129define i128 @ti128(i1 %c, ptr %p, i128 %a, i128 %b) { 130; CHECK-SD-LABEL: ti128: 131; CHECK-SD: // %bb.0: // %entry 132; CHECK-SD-NEXT: tbz w0, #0, .LBB4_2 133; CHECK-SD-NEXT: // %bb.1: // %t 134; CHECK-SD-NEXT: mov x4, x2 135; CHECK-SD-NEXT: mov x5, x3 136; CHECK-SD-NEXT: str wzr, [x1] 137; CHECK-SD-NEXT: .LBB4_2: // %e 138; CHECK-SD-NEXT: mov x0, x4 139; CHECK-SD-NEXT: mov x1, x5 140; CHECK-SD-NEXT: ret 141; 142; CHECK-GI-LABEL: ti128: 143; CHECK-GI: // %bb.0: // %entry 144; CHECK-GI-NEXT: mov w8, w0 145; CHECK-GI-NEXT: mov x0, x4 146; CHECK-GI-NEXT: tbz w8, #0, .LBB4_2 147; CHECK-GI-NEXT: // %bb.1: // %t 148; CHECK-GI-NEXT: mov x0, x2 149; CHECK-GI-NEXT: mov x5, x3 150; CHECK-GI-NEXT: str wzr, [x1] 151; CHECK-GI-NEXT: .LBB4_2: // %e 152; CHECK-GI-NEXT: mov x1, x5 153; CHECK-GI-NEXT: ret 154entry: 155 br i1 %c, label %t, label %e 156t: 157 store i32 0, ptr %p 158 br label %e 159e: 160 %h = phi i128 [%a, %t], [%b, %entry] 161 ret i128 %h 162} 163 164define ptr @tp0(i1 %c, ptr %p, ptr %a, ptr %b) { 165; CHECK-SD-LABEL: tp0: 166; CHECK-SD: // %bb.0: // %entry 167; CHECK-SD-NEXT: tbz w0, #0, .LBB5_2 168; CHECK-SD-NEXT: // %bb.1: // %t 169; CHECK-SD-NEXT: mov x3, x2 170; CHECK-SD-NEXT: str wzr, [x1] 171; CHECK-SD-NEXT: .LBB5_2: // %e 172; CHECK-SD-NEXT: mov x0, x3 173; CHECK-SD-NEXT: ret 174; 175; CHECK-GI-LABEL: tp0: 176; CHECK-GI: // %bb.0: // %entry 177; CHECK-GI-NEXT: mov w8, w0 178; CHECK-GI-NEXT: mov x0, x3 179; CHECK-GI-NEXT: tbz w8, #0, .LBB5_2 180; CHECK-GI-NEXT: // %bb.1: // %t 181; CHECK-GI-NEXT: mov x0, x2 182; CHECK-GI-NEXT: str wzr, [x1] 183; CHECK-GI-NEXT: .LBB5_2: // %e 184; CHECK-GI-NEXT: ret 185entry: 186 br i1 %c, label %t, label %e 187t: 188 store i32 0, ptr %p 189 br label %e 190e: 191 %h = phi ptr [%a, %t], [%b, %entry] 192 ret ptr %h 193} 194 195define half @tf16(i1 %c, ptr %p, half %a, half %b) { 196; CHECK-LABEL: tf16: 197; CHECK: // %bb.0: // %entry 198; CHECK-NEXT: tbz w0, #0, .LBB6_2 199; CHECK-NEXT: // %bb.1: // %t 200; CHECK-NEXT: fmov s1, s0 201; CHECK-NEXT: str wzr, [x1] 202; CHECK-NEXT: .LBB6_2: // %e 203; CHECK-NEXT: fmov s0, s1 204; CHECK-NEXT: ret 205entry: 206 br i1 %c, label %t, label %e 207t: 208 store i32 0, ptr %p 209 br label %e 210e: 211 %h = phi half [%a, %t], [%b, %entry] 212 ret half %h 213} 214 215define float @tf32(i1 %c, ptr %p, float %a, float %b) { 216; CHECK-LABEL: tf32: 217; CHECK: // %bb.0: // %entry 218; CHECK-NEXT: tbz w0, #0, .LBB7_2 219; CHECK-NEXT: // %bb.1: // %t 220; CHECK-NEXT: fmov s1, s0 221; CHECK-NEXT: str wzr, [x1] 222; CHECK-NEXT: .LBB7_2: // %e 223; CHECK-NEXT: fmov s0, s1 224; CHECK-NEXT: ret 225entry: 226 br i1 %c, label %t, label %e 227t: 228 store i32 0, ptr %p 229 br label %e 230e: 231 %h = phi float [%a, %t], [%b, %entry] 232 ret float %h 233} 234 235define double @tf64(i1 %c, ptr %p, double %a, double %b) { 236; CHECK-LABEL: tf64: 237; CHECK: // %bb.0: // %entry 238; CHECK-NEXT: tbz w0, #0, .LBB8_2 239; CHECK-NEXT: // %bb.1: // %t 240; CHECK-NEXT: fmov d1, d0 241; CHECK-NEXT: str wzr, [x1] 242; CHECK-NEXT: .LBB8_2: // %e 243; CHECK-NEXT: fmov d0, d1 244; CHECK-NEXT: ret 245entry: 246 br i1 %c, label %t, label %e 247t: 248 store i32 0, ptr %p 249 br label %e 250e: 251 %h = phi double [%a, %t], [%b, %entry] 252 ret double %h 253} 254 255define fp128 @tf128(i1 %c, ptr %p, fp128 %a, fp128 %b) { 256; CHECK-SD-LABEL: tf128: 257; CHECK-SD: // %bb.0: // %entry 258; CHECK-SD-NEXT: tbz w0, #0, .LBB9_2 259; CHECK-SD-NEXT: // %bb.1: // %t 260; CHECK-SD-NEXT: mov v1.16b, v0.16b 261; CHECK-SD-NEXT: str wzr, [x1] 262; CHECK-SD-NEXT: .LBB9_2: // %e 263; CHECK-SD-NEXT: mov v0.16b, v1.16b 264; CHECK-SD-NEXT: ret 265; 266; CHECK-GI-LABEL: tf128: 267; CHECK-GI: // %bb.0: // %entry 268; CHECK-GI-NEXT: tbz w0, #0, .LBB9_2 269; CHECK-GI-NEXT: // %bb.1: // %t 270; CHECK-GI-NEXT: mov d2, v0.d[1] 271; CHECK-GI-NEXT: fmov d1, d0 272; CHECK-GI-NEXT: str wzr, [x1] 273; CHECK-GI-NEXT: b .LBB9_3 274; CHECK-GI-NEXT: .LBB9_2: 275; CHECK-GI-NEXT: mov d2, v1.d[1] 276; CHECK-GI-NEXT: .LBB9_3: // %e 277; CHECK-GI-NEXT: fmov x8, d1 278; CHECK-GI-NEXT: mov v0.d[0], x8 279; CHECK-GI-NEXT: fmov x8, d2 280; CHECK-GI-NEXT: mov v0.d[1], x8 281; CHECK-GI-NEXT: ret 282entry: 283 br i1 %c, label %t, label %e 284t: 285 store i32 0, ptr %p 286 br label %e 287e: 288 %h = phi fp128 [%a, %t], [%b, %entry] 289 ret fp128 %h 290} 291 292define <2 x i8> @tv2i8(i1 %c, ptr %p, <2 x i8> %a, <2 x i8> %b) { 293; CHECK-SD-LABEL: tv2i8: 294; CHECK-SD: // %bb.0: // %entry 295; CHECK-SD-NEXT: tbz w0, #0, .LBB10_2 296; CHECK-SD-NEXT: // %bb.1: // %t 297; CHECK-SD-NEXT: fmov d1, d0 298; CHECK-SD-NEXT: str wzr, [x1] 299; CHECK-SD-NEXT: .LBB10_2: // %e 300; CHECK-SD-NEXT: fmov d0, d1 301; CHECK-SD-NEXT: ret 302; 303; CHECK-GI-LABEL: tv2i8: 304; CHECK-GI: // %bb.0: // %entry 305; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 306; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 307; CHECK-GI-NEXT: tbz w0, #0, .LBB10_2 308; CHECK-GI-NEXT: // %bb.1: // %t 309; CHECK-GI-NEXT: mov w8, v0.s[1] 310; CHECK-GI-NEXT: str wzr, [x1] 311; CHECK-GI-NEXT: mov v0.b[1], w8 312; CHECK-GI-NEXT: fmov d1, d0 313; CHECK-GI-NEXT: b .LBB10_3 314; CHECK-GI-NEXT: .LBB10_2: 315; CHECK-GI-NEXT: mov w8, v1.s[1] 316; CHECK-GI-NEXT: mov v1.b[1], w8 317; CHECK-GI-NEXT: .LBB10_3: // %e 318; CHECK-GI-NEXT: umov w8, v1.b[0] 319; CHECK-GI-NEXT: umov w9, v1.b[1] 320; CHECK-GI-NEXT: mov v0.s[0], w8 321; CHECK-GI-NEXT: mov v0.s[1], w9 322; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 323; CHECK-GI-NEXT: ret 324entry: 325 br i1 %c, label %t, label %e 326t: 327 store i32 0, ptr %p 328 br label %e 329e: 330 %h = phi <2 x i8> [%a, %t], [%b, %entry] 331 ret <2 x i8> %h 332} 333 334define <3 x i8> @tv3i8(i1 %c, ptr %p, <3 x i8> %a, <3 x i8> %b) { 335; CHECK-SD-LABEL: tv3i8: 336; CHECK-SD: // %bb.0: // %entry 337; CHECK-SD-NEXT: tbz w0, #0, .LBB11_2 338; CHECK-SD-NEXT: // %bb.1: // %t 339; CHECK-SD-NEXT: mov w5, w2 340; CHECK-SD-NEXT: mov w6, w3 341; CHECK-SD-NEXT: mov w7, w4 342; CHECK-SD-NEXT: str wzr, [x1] 343; CHECK-SD-NEXT: .LBB11_2: // %e 344; CHECK-SD-NEXT: mov w0, w5 345; CHECK-SD-NEXT: mov w1, w6 346; CHECK-SD-NEXT: mov w2, w7 347; CHECK-SD-NEXT: ret 348; 349; CHECK-GI-LABEL: tv3i8: 350; CHECK-GI: // %bb.0: // %entry 351; CHECK-GI-NEXT: tbz w0, #0, .LBB11_2 352; CHECK-GI-NEXT: // %bb.1: // %t 353; CHECK-GI-NEXT: fmov s0, w2 354; CHECK-GI-NEXT: str wzr, [x1] 355; CHECK-GI-NEXT: mov v0.b[1], w3 356; CHECK-GI-NEXT: mov v0.b[2], w4 357; CHECK-GI-NEXT: b .LBB11_3 358; CHECK-GI-NEXT: .LBB11_2: 359; CHECK-GI-NEXT: fmov s0, w5 360; CHECK-GI-NEXT: mov v0.b[1], w6 361; CHECK-GI-NEXT: mov v0.b[2], w7 362; CHECK-GI-NEXT: .LBB11_3: // %e 363; CHECK-GI-NEXT: umov w0, v0.b[0] 364; CHECK-GI-NEXT: umov w1, v0.b[1] 365; CHECK-GI-NEXT: umov w2, v0.b[2] 366; CHECK-GI-NEXT: ret 367entry: 368 br i1 %c, label %t, label %e 369t: 370 store i32 0, ptr %p 371 br label %e 372e: 373 %h = phi <3 x i8> [%a, %t], [%b, %entry] 374 ret <3 x i8> %h 375} 376 377define <4 x i8> @tv4i8(i1 %c, ptr %p, <4 x i8> %a, <4 x i8> %b) { 378; CHECK-SD-LABEL: tv4i8: 379; CHECK-SD: // %bb.0: // %entry 380; CHECK-SD-NEXT: tbz w0, #0, .LBB12_2 381; CHECK-SD-NEXT: // %bb.1: // %t 382; CHECK-SD-NEXT: fmov d1, d0 383; CHECK-SD-NEXT: str wzr, [x1] 384; CHECK-SD-NEXT: .LBB12_2: // %e 385; CHECK-SD-NEXT: fmov d0, d1 386; CHECK-SD-NEXT: ret 387; 388; CHECK-GI-LABEL: tv4i8: 389; CHECK-GI: // %bb.0: // %entry 390; CHECK-GI-NEXT: tbz w0, #0, .LBB12_2 391; CHECK-GI-NEXT: // %bb.1: // %t 392; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b 393; CHECK-GI-NEXT: str wzr, [x1] 394; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0 395; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 396; CHECK-GI-NEXT: ret 397; CHECK-GI-NEXT: .LBB12_2: 398; CHECK-GI-NEXT: uzp1 v0.8b, v1.8b, v0.8b 399; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0 400; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 401; CHECK-GI-NEXT: ret 402entry: 403 br i1 %c, label %t, label %e 404t: 405 store i32 0, ptr %p 406 br label %e 407e: 408 %h = phi <4 x i8> [%a, %t], [%b, %entry] 409 ret <4 x i8> %h 410} 411 412define <8 x i8> @tv8i8(i1 %c, ptr %p, <8 x i8> %a, <8 x i8> %b) { 413; CHECK-LABEL: tv8i8: 414; CHECK: // %bb.0: // %entry 415; CHECK-NEXT: tbz w0, #0, .LBB13_2 416; CHECK-NEXT: // %bb.1: // %t 417; CHECK-NEXT: fmov d1, d0 418; CHECK-NEXT: str wzr, [x1] 419; CHECK-NEXT: .LBB13_2: // %e 420; CHECK-NEXT: fmov d0, d1 421; CHECK-NEXT: ret 422entry: 423 br i1 %c, label %t, label %e 424t: 425 store i32 0, ptr %p 426 br label %e 427e: 428 %h = phi <8 x i8> [%a, %t], [%b, %entry] 429 ret <8 x i8> %h 430} 431 432define <16 x i8> @tv16i8(i1 %c, ptr %p, <16 x i8> %a, <16 x i8> %b) { 433; CHECK-LABEL: tv16i8: 434; CHECK: // %bb.0: // %entry 435; CHECK-NEXT: tbz w0, #0, .LBB14_2 436; CHECK-NEXT: // %bb.1: // %t 437; CHECK-NEXT: mov v1.16b, v0.16b 438; CHECK-NEXT: str wzr, [x1] 439; CHECK-NEXT: .LBB14_2: // %e 440; CHECK-NEXT: mov v0.16b, v1.16b 441; CHECK-NEXT: ret 442entry: 443 br i1 %c, label %t, label %e 444t: 445 store i32 0, ptr %p 446 br label %e 447e: 448 %h = phi <16 x i8> [%a, %t], [%b, %entry] 449 ret <16 x i8> %h 450} 451 452define <32 x i8> @tv32i8(i1 %c, ptr %p, <32 x i8> %a, <32 x i8> %b) { 453; CHECK-SD-LABEL: tv32i8: 454; CHECK-SD: // %bb.0: // %entry 455; CHECK-SD-NEXT: tbz w0, #0, .LBB15_2 456; CHECK-SD-NEXT: // %bb.1: // %t 457; CHECK-SD-NEXT: mov v2.16b, v0.16b 458; CHECK-SD-NEXT: mov v3.16b, v1.16b 459; CHECK-SD-NEXT: str wzr, [x1] 460; CHECK-SD-NEXT: .LBB15_2: // %e 461; CHECK-SD-NEXT: mov v0.16b, v2.16b 462; CHECK-SD-NEXT: mov v1.16b, v3.16b 463; CHECK-SD-NEXT: ret 464; 465; CHECK-GI-LABEL: tv32i8: 466; CHECK-GI: // %bb.0: // %entry 467; CHECK-GI-NEXT: mov v4.16b, v0.16b 468; CHECK-GI-NEXT: mov v0.16b, v2.16b 469; CHECK-GI-NEXT: tbz w0, #0, .LBB15_2 470; CHECK-GI-NEXT: // %bb.1: // %t 471; CHECK-GI-NEXT: mov v0.16b, v4.16b 472; CHECK-GI-NEXT: mov v3.16b, v1.16b 473; CHECK-GI-NEXT: str wzr, [x1] 474; CHECK-GI-NEXT: .LBB15_2: // %e 475; CHECK-GI-NEXT: mov v1.16b, v3.16b 476; CHECK-GI-NEXT: ret 477entry: 478 br i1 %c, label %t, label %e 479t: 480 store i32 0, ptr %p 481 br label %e 482e: 483 %h = phi <32 x i8> [%a, %t], [%b, %entry] 484 ret <32 x i8> %h 485} 486 487define <2 x i16> @tv2i16(i1 %c, ptr %p, <2 x i16> %a, <2 x i16> %b) { 488; CHECK-SD-LABEL: tv2i16: 489; CHECK-SD: // %bb.0: // %entry 490; CHECK-SD-NEXT: tbz w0, #0, .LBB16_2 491; CHECK-SD-NEXT: // %bb.1: // %t 492; CHECK-SD-NEXT: fmov d1, d0 493; CHECK-SD-NEXT: str wzr, [x1] 494; CHECK-SD-NEXT: .LBB16_2: // %e 495; CHECK-SD-NEXT: fmov d0, d1 496; CHECK-SD-NEXT: ret 497; 498; CHECK-GI-LABEL: tv2i16: 499; CHECK-GI: // %bb.0: // %entry 500; CHECK-GI-NEXT: tbz w0, #0, .LBB16_2 501; CHECK-GI-NEXT: // %bb.1: // %t 502; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h 503; CHECK-GI-NEXT: str wzr, [x1] 504; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 505; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 506; CHECK-GI-NEXT: ret 507; CHECK-GI-NEXT: .LBB16_2: 508; CHECK-GI-NEXT: uzp1 v0.4h, v1.4h, v0.4h 509; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 510; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 511; CHECK-GI-NEXT: ret 512entry: 513 br i1 %c, label %t, label %e 514t: 515 store i32 0, ptr %p 516 br label %e 517e: 518 %h = phi <2 x i16> [%a, %t], [%b, %entry] 519 ret <2 x i16> %h 520} 521 522define <3 x i16> @tv3i16(i1 %c, ptr %p, <3 x i16> %a, <3 x i16> %b) { 523; CHECK-LABEL: tv3i16: 524; CHECK: // %bb.0: // %entry 525; CHECK-NEXT: tbz w0, #0, .LBB17_2 526; CHECK-NEXT: // %bb.1: // %t 527; CHECK-NEXT: fmov d1, d0 528; CHECK-NEXT: str wzr, [x1] 529; CHECK-NEXT: .LBB17_2: // %e 530; CHECK-NEXT: fmov d0, d1 531; CHECK-NEXT: ret 532entry: 533 br i1 %c, label %t, label %e 534t: 535 store i32 0, ptr %p 536 br label %e 537e: 538 %h = phi <3 x i16> [%a, %t], [%b, %entry] 539 ret <3 x i16> %h 540} 541 542define <4 x i16> @tv4i16(i1 %c, ptr %p, <4 x i16> %a, <4 x i16> %b) { 543; CHECK-LABEL: tv4i16: 544; CHECK: // %bb.0: // %entry 545; CHECK-NEXT: tbz w0, #0, .LBB18_2 546; CHECK-NEXT: // %bb.1: // %t 547; CHECK-NEXT: fmov d1, d0 548; CHECK-NEXT: str wzr, [x1] 549; CHECK-NEXT: .LBB18_2: // %e 550; CHECK-NEXT: fmov d0, d1 551; CHECK-NEXT: ret 552entry: 553 br i1 %c, label %t, label %e 554t: 555 store i32 0, ptr %p 556 br label %e 557e: 558 %h = phi <4 x i16> [%a, %t], [%b, %entry] 559 ret <4 x i16> %h 560} 561 562define <8 x i16> @tv8i16(i1 %c, ptr %p, <8 x i16> %a, <8 x i16> %b) { 563; CHECK-LABEL: tv8i16: 564; CHECK: // %bb.0: // %entry 565; CHECK-NEXT: tbz w0, #0, .LBB19_2 566; CHECK-NEXT: // %bb.1: // %t 567; CHECK-NEXT: mov v1.16b, v0.16b 568; CHECK-NEXT: str wzr, [x1] 569; CHECK-NEXT: .LBB19_2: // %e 570; CHECK-NEXT: mov v0.16b, v1.16b 571; CHECK-NEXT: ret 572entry: 573 br i1 %c, label %t, label %e 574t: 575 store i32 0, ptr %p 576 br label %e 577e: 578 %h = phi <8 x i16> [%a, %t], [%b, %entry] 579 ret <8 x i16> %h 580} 581 582define <16 x i16> @tv16i16(i1 %c, ptr %p, <16 x i16> %a, <16 x i16> %b) { 583; CHECK-SD-LABEL: tv16i16: 584; CHECK-SD: // %bb.0: // %entry 585; CHECK-SD-NEXT: tbz w0, #0, .LBB20_2 586; CHECK-SD-NEXT: // %bb.1: // %t 587; CHECK-SD-NEXT: mov v2.16b, v0.16b 588; CHECK-SD-NEXT: mov v3.16b, v1.16b 589; CHECK-SD-NEXT: str wzr, [x1] 590; CHECK-SD-NEXT: .LBB20_2: // %e 591; CHECK-SD-NEXT: mov v0.16b, v2.16b 592; CHECK-SD-NEXT: mov v1.16b, v3.16b 593; CHECK-SD-NEXT: ret 594; 595; CHECK-GI-LABEL: tv16i16: 596; CHECK-GI: // %bb.0: // %entry 597; CHECK-GI-NEXT: mov v4.16b, v0.16b 598; CHECK-GI-NEXT: mov v0.16b, v2.16b 599; CHECK-GI-NEXT: tbz w0, #0, .LBB20_2 600; CHECK-GI-NEXT: // %bb.1: // %t 601; CHECK-GI-NEXT: mov v0.16b, v4.16b 602; CHECK-GI-NEXT: mov v3.16b, v1.16b 603; CHECK-GI-NEXT: str wzr, [x1] 604; CHECK-GI-NEXT: .LBB20_2: // %e 605; CHECK-GI-NEXT: mov v1.16b, v3.16b 606; CHECK-GI-NEXT: ret 607entry: 608 br i1 %c, label %t, label %e 609t: 610 store i32 0, ptr %p 611 br label %e 612e: 613 %h = phi <16 x i16> [%a, %t], [%b, %entry] 614 ret <16 x i16> %h 615} 616 617define <2 x i32> @tv2i32(i1 %c, ptr %p, <2 x i32> %a, <2 x i32> %b) { 618; CHECK-LABEL: tv2i32: 619; CHECK: // %bb.0: // %entry 620; CHECK-NEXT: tbz w0, #0, .LBB21_2 621; CHECK-NEXT: // %bb.1: // %t 622; CHECK-NEXT: fmov d1, d0 623; CHECK-NEXT: str wzr, [x1] 624; CHECK-NEXT: .LBB21_2: // %e 625; CHECK-NEXT: fmov d0, d1 626; CHECK-NEXT: ret 627entry: 628 br i1 %c, label %t, label %e 629t: 630 store i32 0, ptr %p 631 br label %e 632e: 633 %h = phi <2 x i32> [%a, %t], [%b, %entry] 634 ret <2 x i32> %h 635} 636 637define <3 x i32> @tv3i32(i1 %c, ptr %p, <3 x i32> %a, <3 x i32> %b) { 638; CHECK-LABEL: tv3i32: 639; CHECK: // %bb.0: // %entry 640; CHECK-NEXT: tbz w0, #0, .LBB22_2 641; CHECK-NEXT: // %bb.1: // %t 642; CHECK-NEXT: mov v1.16b, v0.16b 643; CHECK-NEXT: str wzr, [x1] 644; CHECK-NEXT: .LBB22_2: // %e 645; CHECK-NEXT: mov v0.16b, v1.16b 646; CHECK-NEXT: ret 647entry: 648 br i1 %c, label %t, label %e 649t: 650 store i32 0, ptr %p 651 br label %e 652e: 653 %h = phi <3 x i32> [%a, %t], [%b, %entry] 654 ret <3 x i32> %h 655} 656 657define <4 x i32> @tv4i32(i1 %c, ptr %p, <4 x i32> %a, <4 x i32> %b) { 658; CHECK-LABEL: tv4i32: 659; CHECK: // %bb.0: // %entry 660; CHECK-NEXT: tbz w0, #0, .LBB23_2 661; CHECK-NEXT: // %bb.1: // %t 662; CHECK-NEXT: mov v1.16b, v0.16b 663; CHECK-NEXT: str wzr, [x1] 664; CHECK-NEXT: .LBB23_2: // %e 665; CHECK-NEXT: mov v0.16b, v1.16b 666; CHECK-NEXT: ret 667entry: 668 br i1 %c, label %t, label %e 669t: 670 store i32 0, ptr %p 671 br label %e 672e: 673 %h = phi <4 x i32> [%a, %t], [%b, %entry] 674 ret <4 x i32> %h 675} 676 677define <8 x i32> @tv8i32(i1 %c, ptr %p, <8 x i32> %a, <8 x i32> %b) { 678; CHECK-SD-LABEL: tv8i32: 679; CHECK-SD: // %bb.0: // %entry 680; CHECK-SD-NEXT: tbz w0, #0, .LBB24_2 681; CHECK-SD-NEXT: // %bb.1: // %t 682; CHECK-SD-NEXT: mov v2.16b, v0.16b 683; CHECK-SD-NEXT: mov v3.16b, v1.16b 684; CHECK-SD-NEXT: str wzr, [x1] 685; CHECK-SD-NEXT: .LBB24_2: // %e 686; CHECK-SD-NEXT: mov v0.16b, v2.16b 687; CHECK-SD-NEXT: mov v1.16b, v3.16b 688; CHECK-SD-NEXT: ret 689; 690; CHECK-GI-LABEL: tv8i32: 691; CHECK-GI: // %bb.0: // %entry 692; CHECK-GI-NEXT: mov v4.16b, v0.16b 693; CHECK-GI-NEXT: mov v0.16b, v2.16b 694; CHECK-GI-NEXT: tbz w0, #0, .LBB24_2 695; CHECK-GI-NEXT: // %bb.1: // %t 696; CHECK-GI-NEXT: mov v0.16b, v4.16b 697; CHECK-GI-NEXT: mov v3.16b, v1.16b 698; CHECK-GI-NEXT: str wzr, [x1] 699; CHECK-GI-NEXT: .LBB24_2: // %e 700; CHECK-GI-NEXT: mov v1.16b, v3.16b 701; CHECK-GI-NEXT: ret 702entry: 703 br i1 %c, label %t, label %e 704t: 705 store i32 0, ptr %p 706 br label %e 707e: 708 %h = phi <8 x i32> [%a, %t], [%b, %entry] 709 ret <8 x i32> %h 710} 711 712define <2 x i64> @tv2i64(i1 %c, ptr %p, <2 x i64> %a, <2 x i64> %b) { 713; CHECK-LABEL: tv2i64: 714; CHECK: // %bb.0: // %entry 715; CHECK-NEXT: tbz w0, #0, .LBB25_2 716; CHECK-NEXT: // %bb.1: // %t 717; CHECK-NEXT: mov v1.16b, v0.16b 718; CHECK-NEXT: str wzr, [x1] 719; CHECK-NEXT: .LBB25_2: // %e 720; CHECK-NEXT: mov v0.16b, v1.16b 721; CHECK-NEXT: ret 722entry: 723 br i1 %c, label %t, label %e 724t: 725 store i32 0, ptr %p 726 br label %e 727e: 728 %h = phi <2 x i64> [%a, %t], [%b, %entry] 729 ret <2 x i64> %h 730} 731 732define <3 x i64> @tv3i64(i1 %c, ptr %p, <3 x i64> %a, <3 x i64> %b) { 733; CHECK-SD-LABEL: tv3i64: 734; CHECK-SD: // %bb.0: // %entry 735; CHECK-SD-NEXT: tbz w0, #0, .LBB26_2 736; CHECK-SD-NEXT: // %bb.1: // %t 737; CHECK-SD-NEXT: fmov d3, d0 738; CHECK-SD-NEXT: fmov d4, d1 739; CHECK-SD-NEXT: str wzr, [x1] 740; CHECK-SD-NEXT: fmov d5, d2 741; CHECK-SD-NEXT: .LBB26_2: // %e 742; CHECK-SD-NEXT: fmov d0, d3 743; CHECK-SD-NEXT: fmov d1, d4 744; CHECK-SD-NEXT: fmov d2, d5 745; CHECK-SD-NEXT: ret 746; 747; CHECK-GI-LABEL: tv3i64: 748; CHECK-GI: // %bb.0: // %entry 749; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 750; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4 751; CHECK-GI-NEXT: tbz w0, #0, .LBB26_2 752; CHECK-GI-NEXT: // %bb.1: // %t 753; CHECK-GI-NEXT: fmov d6, d0 754; CHECK-GI-NEXT: fmov d7, d2 755; CHECK-GI-NEXT: str wzr, [x1] 756; CHECK-GI-NEXT: mov v6.d[1], v1.d[0] 757; CHECK-GI-NEXT: mov v2.16b, v7.16b 758; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 759; CHECK-GI-NEXT: mov d1, v6.d[1] 760; CHECK-GI-NEXT: mov v0.16b, v6.16b 761; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 762; CHECK-GI-NEXT: ret 763; CHECK-GI-NEXT: .LBB26_2: 764; CHECK-GI-NEXT: fmov d0, d3 765; CHECK-GI-NEXT: fmov d2, d5 766; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 767; CHECK-GI-NEXT: mov v0.d[1], v4.d[0] 768; CHECK-GI-NEXT: mov d1, v0.d[1] 769; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 770; CHECK-GI-NEXT: ret 771entry: 772 br i1 %c, label %t, label %e 773t: 774 store i32 0, ptr %p 775 br label %e 776e: 777 %h = phi <3 x i64> [%a, %t], [%b, %entry] 778 ret <3 x i64> %h 779} 780 781define <4 x i64> @tv4i64(i1 %c, ptr %p, <4 x i64> %a, <4 x i64> %b) { 782; CHECK-SD-LABEL: tv4i64: 783; CHECK-SD: // %bb.0: // %entry 784; CHECK-SD-NEXT: tbz w0, #0, .LBB27_2 785; CHECK-SD-NEXT: // %bb.1: // %t 786; CHECK-SD-NEXT: mov v2.16b, v0.16b 787; CHECK-SD-NEXT: mov v3.16b, v1.16b 788; CHECK-SD-NEXT: str wzr, [x1] 789; CHECK-SD-NEXT: .LBB27_2: // %e 790; CHECK-SD-NEXT: mov v0.16b, v2.16b 791; CHECK-SD-NEXT: mov v1.16b, v3.16b 792; CHECK-SD-NEXT: ret 793; 794; CHECK-GI-LABEL: tv4i64: 795; CHECK-GI: // %bb.0: // %entry 796; CHECK-GI-NEXT: mov v4.16b, v0.16b 797; CHECK-GI-NEXT: mov v0.16b, v2.16b 798; CHECK-GI-NEXT: tbz w0, #0, .LBB27_2 799; CHECK-GI-NEXT: // %bb.1: // %t 800; CHECK-GI-NEXT: mov v0.16b, v4.16b 801; CHECK-GI-NEXT: mov v3.16b, v1.16b 802; CHECK-GI-NEXT: str wzr, [x1] 803; CHECK-GI-NEXT: .LBB27_2: // %e 804; CHECK-GI-NEXT: mov v1.16b, v3.16b 805; CHECK-GI-NEXT: ret 806entry: 807 br i1 %c, label %t, label %e 808t: 809 store i32 0, ptr %p 810 br label %e 811e: 812 %h = phi <4 x i64> [%a, %t], [%b, %entry] 813 ret <4 x i64> %h 814} 815 816define <2 x i128> @tv2i128(i1 %c, ptr %p, <2 x i128> %a, <2 x i128> %b) { 817; CHECK-SD-LABEL: tv2i128: 818; CHECK-SD: // %bb.0: // %entry 819; CHECK-SD-NEXT: tbz w0, #0, .LBB28_2 820; CHECK-SD-NEXT: // %bb.1: // %t 821; CHECK-SD-NEXT: mov x6, x2 822; CHECK-SD-NEXT: mov x7, x3 823; CHECK-SD-NEXT: str wzr, [x1] 824; CHECK-SD-NEXT: b .LBB28_3 825; CHECK-SD-NEXT: .LBB28_2: 826; CHECK-SD-NEXT: ldp x4, x5, [sp] 827; CHECK-SD-NEXT: .LBB28_3: // %e 828; CHECK-SD-NEXT: mov x0, x6 829; CHECK-SD-NEXT: mov x1, x7 830; CHECK-SD-NEXT: mov x2, x4 831; CHECK-SD-NEXT: mov x3, x5 832; CHECK-SD-NEXT: ret 833; 834; CHECK-GI-LABEL: tv2i128: 835; CHECK-GI: // %bb.0: // %entry 836; CHECK-GI-NEXT: tbz w0, #0, .LBB28_2 837; CHECK-GI-NEXT: // %bb.1: // %t 838; CHECK-GI-NEXT: mov x9, x2 839; CHECK-GI-NEXT: mov x10, x3 840; CHECK-GI-NEXT: mov x2, x4 841; CHECK-GI-NEXT: mov x3, x5 842; CHECK-GI-NEXT: str wzr, [x1] 843; CHECK-GI-NEXT: mov x0, x9 844; CHECK-GI-NEXT: mov x1, x10 845; CHECK-GI-NEXT: ret 846; CHECK-GI-NEXT: .LBB28_2: 847; CHECK-GI-NEXT: ldp x2, x3, [sp] 848; CHECK-GI-NEXT: mov x0, x6 849; CHECK-GI-NEXT: mov x1, x7 850; CHECK-GI-NEXT: ret 851entry: 852 br i1 %c, label %t, label %e 853t: 854 store i32 0, ptr %p 855 br label %e 856e: 857 %h = phi <2 x i128> [%a, %t], [%b, %entry] 858 ret <2 x i128> %h 859} 860 861define <2 x ptr> @tv2p0(i1 %c, ptr %p, <2 x ptr> %a, <2 x ptr> %b) { 862; CHECK-LABEL: tv2p0: 863; CHECK: // %bb.0: // %entry 864; CHECK-NEXT: tbz w0, #0, .LBB29_2 865; CHECK-NEXT: // %bb.1: // %t 866; CHECK-NEXT: mov v1.16b, v0.16b 867; CHECK-NEXT: str wzr, [x1] 868; CHECK-NEXT: .LBB29_2: // %e 869; CHECK-NEXT: mov v0.16b, v1.16b 870; CHECK-NEXT: ret 871entry: 872 br i1 %c, label %t, label %e 873t: 874 store i32 0, ptr %p 875 br label %e 876e: 877 %h = phi <2 x ptr> [%a, %t], [%b, %entry] 878 ret <2 x ptr> %h 879} 880 881define <3 x ptr> @tv3p0(i1 %c, ptr %p, <3 x ptr> %a, <3 x ptr> %b) { 882; CHECK-SD-LABEL: tv3p0: 883; CHECK-SD: // %bb.0: // %entry 884; CHECK-SD-NEXT: tbz w0, #0, .LBB30_2 885; CHECK-SD-NEXT: // %bb.1: // %t 886; CHECK-SD-NEXT: fmov d3, d0 887; CHECK-SD-NEXT: fmov d4, d1 888; CHECK-SD-NEXT: str wzr, [x1] 889; CHECK-SD-NEXT: fmov d5, d2 890; CHECK-SD-NEXT: .LBB30_2: // %e 891; CHECK-SD-NEXT: fmov d0, d3 892; CHECK-SD-NEXT: fmov d1, d4 893; CHECK-SD-NEXT: fmov d2, d5 894; CHECK-SD-NEXT: ret 895; 896; CHECK-GI-LABEL: tv3p0: 897; CHECK-GI: // %bb.0: // %entry 898; CHECK-GI-NEXT: tbz w0, #0, .LBB30_2 899; CHECK-GI-NEXT: // %bb.1: // %t 900; CHECK-GI-NEXT: fmov x8, d0 901; CHECK-GI-NEXT: fmov x9, d2 902; CHECK-GI-NEXT: str wzr, [x1] 903; CHECK-GI-NEXT: mov v0.d[0], x8 904; CHECK-GI-NEXT: fmov x8, d1 905; CHECK-GI-NEXT: b .LBB30_3 906; CHECK-GI-NEXT: .LBB30_2: 907; CHECK-GI-NEXT: fmov x8, d3 908; CHECK-GI-NEXT: fmov x9, d5 909; CHECK-GI-NEXT: mov v0.d[0], x8 910; CHECK-GI-NEXT: fmov x8, d4 911; CHECK-GI-NEXT: .LBB30_3: // %e 912; CHECK-GI-NEXT: mov v1.d[0], x9 913; CHECK-GI-NEXT: mov v0.d[1], x8 914; CHECK-GI-NEXT: mov d2, v0.d[1] 915; CHECK-GI-NEXT: fmov x10, d1 916; CHECK-GI-NEXT: fmov d1, d2 917; CHECK-GI-NEXT: fmov d2, x10 918; CHECK-GI-NEXT: ret 919entry: 920 br i1 %c, label %t, label %e 921t: 922 store i32 0, ptr %p 923 br label %e 924e: 925 %h = phi <3 x ptr> [%a, %t], [%b, %entry] 926 ret <3 x ptr> %h 927} 928 929define <4 x ptr> @tv4p0(i1 %c, ptr %p, <4 x ptr> %a, <4 x ptr> %b) { 930; CHECK-SD-LABEL: tv4p0: 931; CHECK-SD: // %bb.0: // %entry 932; CHECK-SD-NEXT: tbz w0, #0, .LBB31_2 933; CHECK-SD-NEXT: // %bb.1: // %t 934; CHECK-SD-NEXT: mov v2.16b, v0.16b 935; CHECK-SD-NEXT: mov v3.16b, v1.16b 936; CHECK-SD-NEXT: str wzr, [x1] 937; CHECK-SD-NEXT: .LBB31_2: // %e 938; CHECK-SD-NEXT: mov v0.16b, v2.16b 939; CHECK-SD-NEXT: mov v1.16b, v3.16b 940; CHECK-SD-NEXT: ret 941; 942; CHECK-GI-LABEL: tv4p0: 943; CHECK-GI: // %bb.0: // %entry 944; CHECK-GI-NEXT: mov v4.16b, v0.16b 945; CHECK-GI-NEXT: mov v0.16b, v2.16b 946; CHECK-GI-NEXT: tbz w0, #0, .LBB31_2 947; CHECK-GI-NEXT: // %bb.1: // %t 948; CHECK-GI-NEXT: mov v0.16b, v4.16b 949; CHECK-GI-NEXT: mov v3.16b, v1.16b 950; CHECK-GI-NEXT: str wzr, [x1] 951; CHECK-GI-NEXT: .LBB31_2: // %e 952; CHECK-GI-NEXT: mov v1.16b, v3.16b 953; CHECK-GI-NEXT: ret 954entry: 955 br i1 %c, label %t, label %e 956t: 957 store i32 0, ptr %p 958 br label %e 959e: 960 %h = phi <4 x ptr> [%a, %t], [%b, %entry] 961 ret <4 x ptr> %h 962} 963 964define <2 x half> @tv2f16(i1 %c, ptr %p, <2 x half> %a, <2 x half> %b) { 965; CHECK-LABEL: tv2f16: 966; CHECK: // %bb.0: // %entry 967; CHECK-NEXT: tbz w0, #0, .LBB32_2 968; CHECK-NEXT: // %bb.1: // %t 969; CHECK-NEXT: fmov d1, d0 970; CHECK-NEXT: str wzr, [x1] 971; CHECK-NEXT: .LBB32_2: // %e 972; CHECK-NEXT: fmov d0, d1 973; CHECK-NEXT: ret 974entry: 975 br i1 %c, label %t, label %e 976t: 977 store i32 0, ptr %p 978 br label %e 979e: 980 %h = phi <2 x half> [%a, %t], [%b, %entry] 981 ret <2 x half> %h 982} 983 984define <3 x half> @tv3f16(i1 %c, ptr %p, <3 x half> %a, <3 x half> %b) { 985; CHECK-LABEL: tv3f16: 986; CHECK: // %bb.0: // %entry 987; CHECK-NEXT: tbz w0, #0, .LBB33_2 988; CHECK-NEXT: // %bb.1: // %t 989; CHECK-NEXT: fmov d1, d0 990; CHECK-NEXT: str wzr, [x1] 991; CHECK-NEXT: .LBB33_2: // %e 992; CHECK-NEXT: fmov d0, d1 993; CHECK-NEXT: ret 994entry: 995 br i1 %c, label %t, label %e 996t: 997 store i32 0, ptr %p 998 br label %e 999e: 1000 %h = phi <3 x half> [%a, %t], [%b, %entry] 1001 ret <3 x half> %h 1002} 1003 1004define <4 x half> @tv4f16(i1 %c, ptr %p, <4 x half> %a, <4 x half> %b) { 1005; CHECK-LABEL: tv4f16: 1006; CHECK: // %bb.0: // %entry 1007; CHECK-NEXT: tbz w0, #0, .LBB34_2 1008; CHECK-NEXT: // %bb.1: // %t 1009; CHECK-NEXT: fmov d1, d0 1010; CHECK-NEXT: str wzr, [x1] 1011; CHECK-NEXT: .LBB34_2: // %e 1012; CHECK-NEXT: fmov d0, d1 1013; CHECK-NEXT: ret 1014entry: 1015 br i1 %c, label %t, label %e 1016t: 1017 store i32 0, ptr %p 1018 br label %e 1019e: 1020 %h = phi <4 x half> [%a, %t], [%b, %entry] 1021 ret <4 x half> %h 1022} 1023 1024define <8 x half> @tv8f16(i1 %c, ptr %p, <8 x half> %a, <8 x half> %b) { 1025; CHECK-LABEL: tv8f16: 1026; CHECK: // %bb.0: // %entry 1027; CHECK-NEXT: tbz w0, #0, .LBB35_2 1028; CHECK-NEXT: // %bb.1: // %t 1029; CHECK-NEXT: mov v1.16b, v0.16b 1030; CHECK-NEXT: str wzr, [x1] 1031; CHECK-NEXT: .LBB35_2: // %e 1032; CHECK-NEXT: mov v0.16b, v1.16b 1033; CHECK-NEXT: ret 1034entry: 1035 br i1 %c, label %t, label %e 1036t: 1037 store i32 0, ptr %p 1038 br label %e 1039e: 1040 %h = phi <8 x half> [%a, %t], [%b, %entry] 1041 ret <8 x half> %h 1042} 1043 1044define <16 x half> @tv16f16(i1 %c, ptr %p, <16 x half> %a, <16 x half> %b) { 1045; CHECK-SD-LABEL: tv16f16: 1046; CHECK-SD: // %bb.0: // %entry 1047; CHECK-SD-NEXT: tbz w0, #0, .LBB36_2 1048; CHECK-SD-NEXT: // %bb.1: // %t 1049; CHECK-SD-NEXT: mov v2.16b, v0.16b 1050; CHECK-SD-NEXT: mov v3.16b, v1.16b 1051; CHECK-SD-NEXT: str wzr, [x1] 1052; CHECK-SD-NEXT: .LBB36_2: // %e 1053; CHECK-SD-NEXT: mov v0.16b, v2.16b 1054; CHECK-SD-NEXT: mov v1.16b, v3.16b 1055; CHECK-SD-NEXT: ret 1056; 1057; CHECK-GI-LABEL: tv16f16: 1058; CHECK-GI: // %bb.0: // %entry 1059; CHECK-GI-NEXT: mov v4.16b, v0.16b 1060; CHECK-GI-NEXT: mov v0.16b, v2.16b 1061; CHECK-GI-NEXT: tbz w0, #0, .LBB36_2 1062; CHECK-GI-NEXT: // %bb.1: // %t 1063; CHECK-GI-NEXT: mov v0.16b, v4.16b 1064; CHECK-GI-NEXT: mov v3.16b, v1.16b 1065; CHECK-GI-NEXT: str wzr, [x1] 1066; CHECK-GI-NEXT: .LBB36_2: // %e 1067; CHECK-GI-NEXT: mov v1.16b, v3.16b 1068; CHECK-GI-NEXT: ret 1069entry: 1070 br i1 %c, label %t, label %e 1071t: 1072 store i32 0, ptr %p 1073 br label %e 1074e: 1075 %h = phi <16 x half> [%a, %t], [%b, %entry] 1076 ret <16 x half> %h 1077} 1078 1079define <2 x float> @tv2f32(i1 %c, ptr %p, <2 x float> %a, <2 x float> %b) { 1080; CHECK-LABEL: tv2f32: 1081; CHECK: // %bb.0: // %entry 1082; CHECK-NEXT: tbz w0, #0, .LBB37_2 1083; CHECK-NEXT: // %bb.1: // %t 1084; CHECK-NEXT: fmov d1, d0 1085; CHECK-NEXT: str wzr, [x1] 1086; CHECK-NEXT: .LBB37_2: // %e 1087; CHECK-NEXT: fmov d0, d1 1088; CHECK-NEXT: ret 1089entry: 1090 br i1 %c, label %t, label %e 1091t: 1092 store i32 0, ptr %p 1093 br label %e 1094e: 1095 %h = phi <2 x float> [%a, %t], [%b, %entry] 1096 ret <2 x float> %h 1097} 1098 1099define <3 x float> @tv3f32(i1 %c, ptr %p, <3 x float> %a, <3 x float> %b) { 1100; CHECK-LABEL: tv3f32: 1101; CHECK: // %bb.0: // %entry 1102; CHECK-NEXT: tbz w0, #0, .LBB38_2 1103; CHECK-NEXT: // %bb.1: // %t 1104; CHECK-NEXT: mov v1.16b, v0.16b 1105; CHECK-NEXT: str wzr, [x1] 1106; CHECK-NEXT: .LBB38_2: // %e 1107; CHECK-NEXT: mov v0.16b, v1.16b 1108; CHECK-NEXT: ret 1109entry: 1110 br i1 %c, label %t, label %e 1111t: 1112 store i32 0, ptr %p 1113 br label %e 1114e: 1115 %h = phi <3 x float> [%a, %t], [%b, %entry] 1116 ret <3 x float> %h 1117} 1118 1119define <4 x float> @tv4f32(i1 %c, ptr %p, <4 x float> %a, <4 x float> %b) { 1120; CHECK-LABEL: tv4f32: 1121; CHECK: // %bb.0: // %entry 1122; CHECK-NEXT: tbz w0, #0, .LBB39_2 1123; CHECK-NEXT: // %bb.1: // %t 1124; CHECK-NEXT: mov v1.16b, v0.16b 1125; CHECK-NEXT: str wzr, [x1] 1126; CHECK-NEXT: .LBB39_2: // %e 1127; CHECK-NEXT: mov v0.16b, v1.16b 1128; CHECK-NEXT: ret 1129entry: 1130 br i1 %c, label %t, label %e 1131t: 1132 store i32 0, ptr %p 1133 br label %e 1134e: 1135 %h = phi <4 x float> [%a, %t], [%b, %entry] 1136 ret <4 x float> %h 1137} 1138 1139define <8 x float> @tv8f32(i1 %c, ptr %p, <8 x float> %a, <8 x float> %b) { 1140; CHECK-SD-LABEL: tv8f32: 1141; CHECK-SD: // %bb.0: // %entry 1142; CHECK-SD-NEXT: tbz w0, #0, .LBB40_2 1143; CHECK-SD-NEXT: // %bb.1: // %t 1144; CHECK-SD-NEXT: mov v2.16b, v0.16b 1145; CHECK-SD-NEXT: mov v3.16b, v1.16b 1146; CHECK-SD-NEXT: str wzr, [x1] 1147; CHECK-SD-NEXT: .LBB40_2: // %e 1148; CHECK-SD-NEXT: mov v0.16b, v2.16b 1149; CHECK-SD-NEXT: mov v1.16b, v3.16b 1150; CHECK-SD-NEXT: ret 1151; 1152; CHECK-GI-LABEL: tv8f32: 1153; CHECK-GI: // %bb.0: // %entry 1154; CHECK-GI-NEXT: mov v4.16b, v0.16b 1155; CHECK-GI-NEXT: mov v0.16b, v2.16b 1156; CHECK-GI-NEXT: tbz w0, #0, .LBB40_2 1157; CHECK-GI-NEXT: // %bb.1: // %t 1158; CHECK-GI-NEXT: mov v0.16b, v4.16b 1159; CHECK-GI-NEXT: mov v3.16b, v1.16b 1160; CHECK-GI-NEXT: str wzr, [x1] 1161; CHECK-GI-NEXT: .LBB40_2: // %e 1162; CHECK-GI-NEXT: mov v1.16b, v3.16b 1163; CHECK-GI-NEXT: ret 1164entry: 1165 br i1 %c, label %t, label %e 1166t: 1167 store i32 0, ptr %p 1168 br label %e 1169e: 1170 %h = phi <8 x float> [%a, %t], [%b, %entry] 1171 ret <8 x float> %h 1172} 1173 1174define <2 x double> @tv2f64(i1 %c, ptr %p, <2 x double> %a, <2 x double> %b) { 1175; CHECK-LABEL: tv2f64: 1176; CHECK: // %bb.0: // %entry 1177; CHECK-NEXT: tbz w0, #0, .LBB41_2 1178; CHECK-NEXT: // %bb.1: // %t 1179; CHECK-NEXT: mov v1.16b, v0.16b 1180; CHECK-NEXT: str wzr, [x1] 1181; CHECK-NEXT: .LBB41_2: // %e 1182; CHECK-NEXT: mov v0.16b, v1.16b 1183; CHECK-NEXT: ret 1184entry: 1185 br i1 %c, label %t, label %e 1186t: 1187 store i32 0, ptr %p 1188 br label %e 1189e: 1190 %h = phi <2 x double> [%a, %t], [%b, %entry] 1191 ret <2 x double> %h 1192} 1193 1194define <3 x double> @tv3f64(i1 %c, ptr %p, <3 x double> %a, <3 x double> %b) { 1195; CHECK-SD-LABEL: tv3f64: 1196; CHECK-SD: // %bb.0: // %entry 1197; CHECK-SD-NEXT: tbz w0, #0, .LBB42_2 1198; CHECK-SD-NEXT: // %bb.1: // %t 1199; CHECK-SD-NEXT: fmov d3, d0 1200; CHECK-SD-NEXT: fmov d4, d1 1201; CHECK-SD-NEXT: str wzr, [x1] 1202; CHECK-SD-NEXT: fmov d5, d2 1203; CHECK-SD-NEXT: .LBB42_2: // %e 1204; CHECK-SD-NEXT: fmov d0, d3 1205; CHECK-SD-NEXT: fmov d1, d4 1206; CHECK-SD-NEXT: fmov d2, d5 1207; CHECK-SD-NEXT: ret 1208; 1209; CHECK-GI-LABEL: tv3f64: 1210; CHECK-GI: // %bb.0: // %entry 1211; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1212; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4 1213; CHECK-GI-NEXT: tbz w0, #0, .LBB42_2 1214; CHECK-GI-NEXT: // %bb.1: // %t 1215; CHECK-GI-NEXT: fmov d6, d0 1216; CHECK-GI-NEXT: fmov d7, d2 1217; CHECK-GI-NEXT: str wzr, [x1] 1218; CHECK-GI-NEXT: mov v6.d[1], v1.d[0] 1219; CHECK-GI-NEXT: mov v2.16b, v7.16b 1220; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 1221; CHECK-GI-NEXT: mov d1, v6.d[1] 1222; CHECK-GI-NEXT: mov v0.16b, v6.16b 1223; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1224; CHECK-GI-NEXT: ret 1225; CHECK-GI-NEXT: .LBB42_2: 1226; CHECK-GI-NEXT: fmov d0, d3 1227; CHECK-GI-NEXT: fmov d2, d5 1228; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 1229; CHECK-GI-NEXT: mov v0.d[1], v4.d[0] 1230; CHECK-GI-NEXT: mov d1, v0.d[1] 1231; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1232; CHECK-GI-NEXT: ret 1233entry: 1234 br i1 %c, label %t, label %e 1235t: 1236 store i32 0, ptr %p 1237 br label %e 1238e: 1239 %h = phi <3 x double> [%a, %t], [%b, %entry] 1240 ret <3 x double> %h 1241} 1242 1243define <4 x double> @tv4f64(i1 %c, ptr %p, <4 x double> %a, <4 x double> %b) { 1244; CHECK-SD-LABEL: tv4f64: 1245; CHECK-SD: // %bb.0: // %entry 1246; CHECK-SD-NEXT: tbz w0, #0, .LBB43_2 1247; CHECK-SD-NEXT: // %bb.1: // %t 1248; CHECK-SD-NEXT: mov v2.16b, v0.16b 1249; CHECK-SD-NEXT: mov v3.16b, v1.16b 1250; CHECK-SD-NEXT: str wzr, [x1] 1251; CHECK-SD-NEXT: .LBB43_2: // %e 1252; CHECK-SD-NEXT: mov v0.16b, v2.16b 1253; CHECK-SD-NEXT: mov v1.16b, v3.16b 1254; CHECK-SD-NEXT: ret 1255; 1256; CHECK-GI-LABEL: tv4f64: 1257; CHECK-GI: // %bb.0: // %entry 1258; CHECK-GI-NEXT: mov v4.16b, v0.16b 1259; CHECK-GI-NEXT: mov v0.16b, v2.16b 1260; CHECK-GI-NEXT: tbz w0, #0, .LBB43_2 1261; CHECK-GI-NEXT: // %bb.1: // %t 1262; CHECK-GI-NEXT: mov v0.16b, v4.16b 1263; CHECK-GI-NEXT: mov v3.16b, v1.16b 1264; CHECK-GI-NEXT: str wzr, [x1] 1265; CHECK-GI-NEXT: .LBB43_2: // %e 1266; CHECK-GI-NEXT: mov v1.16b, v3.16b 1267; CHECK-GI-NEXT: ret 1268entry: 1269 br i1 %c, label %t, label %e 1270t: 1271 store i32 0, ptr %p 1272 br label %e 1273e: 1274 %h = phi <4 x double> [%a, %t], [%b, %entry] 1275 ret <4 x double> %h 1276} 1277 1278define <2 x fp128> @tv2f128(i1 %c, ptr %p, <2 x fp128> %a, <2 x fp128> %b) { 1279; CHECK-SD-LABEL: tv2f128: 1280; CHECK-SD: // %bb.0: // %entry 1281; CHECK-SD-NEXT: tbz w0, #0, .LBB44_2 1282; CHECK-SD-NEXT: // %bb.1: // %t 1283; CHECK-SD-NEXT: mov v2.16b, v0.16b 1284; CHECK-SD-NEXT: mov v3.16b, v1.16b 1285; CHECK-SD-NEXT: str wzr, [x1] 1286; CHECK-SD-NEXT: .LBB44_2: // %e 1287; CHECK-SD-NEXT: mov v0.16b, v2.16b 1288; CHECK-SD-NEXT: mov v1.16b, v3.16b 1289; CHECK-SD-NEXT: ret 1290; 1291; CHECK-GI-LABEL: tv2f128: 1292; CHECK-GI: // %bb.0: // %entry 1293; CHECK-GI-NEXT: tbz w0, #0, .LBB44_2 1294; CHECK-GI-NEXT: // %bb.1: // %t 1295; CHECK-GI-NEXT: mov d4, v1.d[1] 1296; CHECK-GI-NEXT: mov d5, v0.d[1] 1297; CHECK-GI-NEXT: str wzr, [x1] 1298; CHECK-GI-NEXT: fmov d2, d0 1299; CHECK-GI-NEXT: fmov d3, d1 1300; CHECK-GI-NEXT: b .LBB44_3 1301; CHECK-GI-NEXT: .LBB44_2: 1302; CHECK-GI-NEXT: mov d4, v3.d[1] 1303; CHECK-GI-NEXT: mov d5, v2.d[1] 1304; CHECK-GI-NEXT: .LBB44_3: // %e 1305; CHECK-GI-NEXT: fmov x8, d2 1306; CHECK-GI-NEXT: fmov x9, d3 1307; CHECK-GI-NEXT: mov v0.d[0], x8 1308; CHECK-GI-NEXT: mov v1.d[0], x9 1309; CHECK-GI-NEXT: fmov x8, d5 1310; CHECK-GI-NEXT: fmov x9, d4 1311; CHECK-GI-NEXT: mov v0.d[1], x8 1312; CHECK-GI-NEXT: mov v1.d[1], x9 1313; CHECK-GI-NEXT: ret 1314entry: 1315 br i1 %c, label %t, label %e 1316t: 1317 store i32 0, ptr %p 1318 br label %e 1319e: 1320 %h = phi <2 x fp128> [%a, %t], [%b, %entry] 1321 ret <2 x fp128> %h 1322} 1323