1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 4 5define <2 x double> @insert_v2f64_0(<2 x double> %a, double %b, i32 %c) { 6; CHECK-LABEL: insert_v2f64_0: 7; CHECK: // %bb.0: // %entry 8; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1 9; CHECK-NEXT: mov v0.d[0], v1.d[0] 10; CHECK-NEXT: ret 11entry: 12 %d = insertelement <2 x double> %a, double %b, i32 0 13 ret <2 x double> %d 14} 15 16define <2 x double> @insert_v2f64_1(<2 x double> %a, double %b, i32 %c) { 17; CHECK-LABEL: insert_v2f64_1: 18; CHECK: // %bb.0: // %entry 19; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1 20; CHECK-NEXT: mov v0.d[1], v1.d[0] 21; CHECK-NEXT: ret 22entry: 23 %d = insertelement <2 x double> %a, double %b, i32 1 24 ret <2 x double> %d 25} 26 27define <2 x double> @insert_v2f64_c(<2 x double> %a, double %b, i32 %c) { 28; CHECK-SD-LABEL: insert_v2f64_c: 29; CHECK-SD: // %bb.0: // %entry 30; CHECK-SD-NEXT: sub sp, sp, #16 31; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 32; CHECK-SD-NEXT: mov x8, sp 33; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 34; CHECK-SD-NEXT: str q0, [sp] 35; CHECK-SD-NEXT: bfi x8, x0, #3, #1 36; CHECK-SD-NEXT: str d1, [x8] 37; CHECK-SD-NEXT: ldr q0, [sp], #16 38; CHECK-SD-NEXT: ret 39; 40; CHECK-GI-LABEL: insert_v2f64_c: 41; CHECK-GI: // %bb.0: // %entry 42; CHECK-GI-NEXT: sub sp, sp, #16 43; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 44; CHECK-GI-NEXT: mov w9, w0 45; CHECK-GI-NEXT: mov x8, sp 46; CHECK-GI-NEXT: str q0, [sp] 47; CHECK-GI-NEXT: and x9, x9, #0x1 48; CHECK-GI-NEXT: str d1, [x8, x9, lsl #3] 49; CHECK-GI-NEXT: ldr q0, [sp], #16 50; CHECK-GI-NEXT: ret 51entry: 52 %d = insertelement <2 x double> %a, double %b, i32 %c 53 ret <2 x double> %d 54} 55 56define <3 x double> @insert_v3f64_0(<3 x double> %a, double %b, i32 %c) { 57; CHECK-SD-LABEL: insert_v3f64_0: 58; CHECK-SD: // %bb.0: // %entry 59; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 60; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 61; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q3 62; CHECK-SD-NEXT: mov v0.d[0], v3.d[0] 63; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 64; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 65; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 66; CHECK-SD-NEXT: ret 67; 68; CHECK-GI-LABEL: insert_v3f64_0: 69; CHECK-GI: // %bb.0: // %entry 70; CHECK-GI-NEXT: fmov d0, d3 71; CHECK-GI-NEXT: ret 72entry: 73 %d = insertelement <3 x double> %a, double %b, i32 0 74 ret <3 x double> %d 75} 76 77define <3 x double> @insert_v3f64_2(<3 x double> %a, double %b, i32 %c) { 78; CHECK-LABEL: insert_v3f64_2: 79; CHECK: // %bb.0: // %entry 80; CHECK-NEXT: fmov d2, d3 81; CHECK-NEXT: ret 82entry: 83 %d = insertelement <3 x double> %a, double %b, i32 2 84 ret <3 x double> %d 85} 86 87define <3 x double> @insert_v3f64_c(<3 x double> %a, double %b, i32 %c) { 88; CHECK-SD-LABEL: insert_v3f64_c: 89; CHECK-SD: // %bb.0: // %entry 90; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 91; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 92; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 93; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 94; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 95; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]! 96; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 97; CHECK-SD-NEXT: mov x8, sp 98; CHECK-SD-NEXT: and x9, x0, #0x3 99; CHECK-SD-NEXT: str d3, [x8, x9, lsl #3] 100; CHECK-SD-NEXT: ldr q0, [sp] 101; CHECK-SD-NEXT: ldr d2, [sp, #16] 102; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 103; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 104; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 105; CHECK-SD-NEXT: add sp, sp, #32 106; CHECK-SD-NEXT: ret 107; 108; CHECK-GI-LABEL: insert_v3f64_c: 109; CHECK-GI: // %bb.0: // %entry 110; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 111; CHECK-GI-NEXT: sub x9, sp, #48 112; CHECK-GI-NEXT: mov x29, sp 113; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 114; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 115; CHECK-GI-NEXT: .cfi_offset w30, -8 116; CHECK-GI-NEXT: .cfi_offset w29, -16 117; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 118; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 119; CHECK-GI-NEXT: mov w8, w0 120; CHECK-GI-NEXT: mov x9, sp 121; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 122; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 123; CHECK-GI-NEXT: and x8, x8, #0x3 124; CHECK-GI-NEXT: stp q0, q2, [sp] 125; CHECK-GI-NEXT: str d3, [x9, x8, lsl #3] 126; CHECK-GI-NEXT: ldp q0, q2, [sp] 127; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 128; CHECK-GI-NEXT: mov d1, v0.d[1] 129; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 130; CHECK-GI-NEXT: mov sp, x29 131; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 132; CHECK-GI-NEXT: ret 133entry: 134 %d = insertelement <3 x double> %a, double %b, i32 %c 135 ret <3 x double> %d 136} 137 138define <4 x double> @insert_v4f64_0(<4 x double> %a, double %b, i32 %c) { 139; CHECK-LABEL: insert_v4f64_0: 140; CHECK: // %bb.0: // %entry 141; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2 142; CHECK-NEXT: mov v0.d[0], v2.d[0] 143; CHECK-NEXT: ret 144entry: 145 %d = insertelement <4 x double> %a, double %b, i32 0 146 ret <4 x double> %d 147} 148 149define <4 x double> @insert_v4f64_2(<4 x double> %a, double %b, i32 %c) { 150; CHECK-LABEL: insert_v4f64_2: 151; CHECK: // %bb.0: // %entry 152; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2 153; CHECK-NEXT: mov v1.d[0], v2.d[0] 154; CHECK-NEXT: ret 155entry: 156 %d = insertelement <4 x double> %a, double %b, i32 2 157 ret <4 x double> %d 158} 159 160define <4 x double> @insert_v4f64_c(<4 x double> %a, double %b, i32 %c) { 161; CHECK-SD-LABEL: insert_v4f64_c: 162; CHECK-SD: // %bb.0: // %entry 163; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 164; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 165; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 166; CHECK-SD-NEXT: and x8, x0, #0x3 167; CHECK-SD-NEXT: mov x9, sp 168; CHECK-SD-NEXT: str d2, [x9, x8, lsl #3] 169; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 170; CHECK-SD-NEXT: ret 171; 172; CHECK-GI-LABEL: insert_v4f64_c: 173; CHECK-GI: // %bb.0: // %entry 174; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 175; CHECK-GI-NEXT: sub x9, sp, #48 176; CHECK-GI-NEXT: mov x29, sp 177; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 178; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 179; CHECK-GI-NEXT: .cfi_offset w30, -8 180; CHECK-GI-NEXT: .cfi_offset w29, -16 181; CHECK-GI-NEXT: mov w8, w0 182; CHECK-GI-NEXT: mov x9, sp 183; CHECK-GI-NEXT: stp q0, q1, [sp] 184; CHECK-GI-NEXT: and x8, x8, #0x3 185; CHECK-GI-NEXT: str d2, [x9, x8, lsl #3] 186; CHECK-GI-NEXT: ldp q0, q1, [sp] 187; CHECK-GI-NEXT: mov sp, x29 188; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 189; CHECK-GI-NEXT: ret 190entry: 191 %d = insertelement <4 x double> %a, double %b, i32 %c 192 ret <4 x double> %d 193} 194 195define <2 x float> @insert_v2f32_0(<2 x float> %a, float %b, i32 %c) { 196; CHECK-LABEL: insert_v2f32_0: 197; CHECK: // %bb.0: // %entry 198; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 199; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 200; CHECK-NEXT: mov v0.s[0], v1.s[0] 201; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 202; CHECK-NEXT: ret 203entry: 204 %d = insertelement <2 x float> %a, float %b, i32 0 205 ret <2 x float> %d 206} 207 208define <2 x float> @insert_v2f32_1(<2 x float> %a, float %b, i32 %c) { 209; CHECK-LABEL: insert_v2f32_1: 210; CHECK: // %bb.0: // %entry 211; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 212; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 213; CHECK-NEXT: mov v0.s[1], v1.s[0] 214; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 215; CHECK-NEXT: ret 216entry: 217 %d = insertelement <2 x float> %a, float %b, i32 1 218 ret <2 x float> %d 219} 220 221define <2 x float> @insert_v2f32_c(<2 x float> %a, float %b, i32 %c) { 222; CHECK-SD-LABEL: insert_v2f32_c: 223; CHECK-SD: // %bb.0: // %entry 224; CHECK-SD-NEXT: sub sp, sp, #16 225; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 226; CHECK-SD-NEXT: add x8, sp, #8 227; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 228; CHECK-SD-NEXT: str d0, [sp, #8] 229; CHECK-SD-NEXT: bfi x8, x0, #2, #1 230; CHECK-SD-NEXT: str s1, [x8] 231; CHECK-SD-NEXT: ldr d0, [sp, #8] 232; CHECK-SD-NEXT: add sp, sp, #16 233; CHECK-SD-NEXT: ret 234; 235; CHECK-GI-LABEL: insert_v2f32_c: 236; CHECK-GI: // %bb.0: // %entry 237; CHECK-GI-NEXT: sub sp, sp, #16 238; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 239; CHECK-GI-NEXT: mov w9, w0 240; CHECK-GI-NEXT: add x8, sp, #8 241; CHECK-GI-NEXT: str d0, [sp, #8] 242; CHECK-GI-NEXT: and x9, x9, #0x1 243; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2] 244; CHECK-GI-NEXT: ldr d0, [sp, #8] 245; CHECK-GI-NEXT: add sp, sp, #16 246; CHECK-GI-NEXT: ret 247entry: 248 %d = insertelement <2 x float> %a, float %b, i32 %c 249 ret <2 x float> %d 250} 251 252define <3 x float> @insert_v3f32_0(<3 x float> %a, float %b, i32 %c) { 253; CHECK-LABEL: insert_v3f32_0: 254; CHECK: // %bb.0: // %entry 255; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 256; CHECK-NEXT: mov v1.s[1], v0.s[1] 257; CHECK-NEXT: mov v1.s[2], v0.s[2] 258; CHECK-NEXT: mov v0.16b, v1.16b 259; CHECK-NEXT: ret 260entry: 261 %d = insertelement <3 x float> %a, float %b, i32 0 262 ret <3 x float> %d 263} 264 265define <3 x float> @insert_v3f32_2(<3 x float> %a, float %b, i32 %c) { 266; CHECK-SD-LABEL: insert_v3f32_2: 267; CHECK-SD: // %bb.0: // %entry 268; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1 269; CHECK-SD-NEXT: mov v0.s[2], v1.s[0] 270; CHECK-SD-NEXT: ret 271; 272; CHECK-GI-LABEL: insert_v3f32_2: 273; CHECK-GI: // %bb.0: // %entry 274; CHECK-GI-NEXT: mov v2.s[0], v0.s[0] 275; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1 276; CHECK-GI-NEXT: mov v2.s[1], v0.s[1] 277; CHECK-GI-NEXT: mov v2.s[2], v1.s[0] 278; CHECK-GI-NEXT: mov v0.16b, v2.16b 279; CHECK-GI-NEXT: ret 280entry: 281 %d = insertelement <3 x float> %a, float %b, i32 2 282 ret <3 x float> %d 283} 284 285define <3 x float> @insert_v3f32_c(<3 x float> %a, float %b, i32 %c) { 286; CHECK-SD-LABEL: insert_v3f32_c: 287; CHECK-SD: // %bb.0: // %entry 288; CHECK-SD-NEXT: sub sp, sp, #16 289; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 290; CHECK-SD-NEXT: mov x8, sp 291; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 292; CHECK-SD-NEXT: str q0, [sp] 293; CHECK-SD-NEXT: bfi x8, x0, #2, #2 294; CHECK-SD-NEXT: str s1, [x8] 295; CHECK-SD-NEXT: ldr q0, [sp], #16 296; CHECK-SD-NEXT: ret 297; 298; CHECK-GI-LABEL: insert_v3f32_c: 299; CHECK-GI: // %bb.0: // %entry 300; CHECK-GI-NEXT: sub sp, sp, #16 301; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 302; CHECK-GI-NEXT: mov w9, w0 303; CHECK-GI-NEXT: mov x8, sp 304; CHECK-GI-NEXT: str q0, [sp] 305; CHECK-GI-NEXT: and x9, x9, #0x3 306; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2] 307; CHECK-GI-NEXT: ldr q0, [sp], #16 308; CHECK-GI-NEXT: ret 309entry: 310 %d = insertelement <3 x float> %a, float %b, i32 %c 311 ret <3 x float> %d 312} 313 314define <4 x float> @insert_v4f32_0(<4 x float> %a, float %b, i32 %c) { 315; CHECK-LABEL: insert_v4f32_0: 316; CHECK: // %bb.0: // %entry 317; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 318; CHECK-NEXT: mov v0.s[0], v1.s[0] 319; CHECK-NEXT: ret 320entry: 321 %d = insertelement <4 x float> %a, float %b, i32 0 322 ret <4 x float> %d 323} 324 325define <4 x float> @insert_v4f32_2(<4 x float> %a, float %b, i32 %c) { 326; CHECK-LABEL: insert_v4f32_2: 327; CHECK: // %bb.0: // %entry 328; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 329; CHECK-NEXT: mov v0.s[2], v1.s[0] 330; CHECK-NEXT: ret 331entry: 332 %d = insertelement <4 x float> %a, float %b, i32 2 333 ret <4 x float> %d 334} 335 336define <4 x float> @insert_v4f32_c(<4 x float> %a, float %b, i32 %c) { 337; CHECK-SD-LABEL: insert_v4f32_c: 338; CHECK-SD: // %bb.0: // %entry 339; CHECK-SD-NEXT: sub sp, sp, #16 340; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 341; CHECK-SD-NEXT: mov x8, sp 342; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 343; CHECK-SD-NEXT: str q0, [sp] 344; CHECK-SD-NEXT: bfi x8, x0, #2, #2 345; CHECK-SD-NEXT: str s1, [x8] 346; CHECK-SD-NEXT: ldr q0, [sp], #16 347; CHECK-SD-NEXT: ret 348; 349; CHECK-GI-LABEL: insert_v4f32_c: 350; CHECK-GI: // %bb.0: // %entry 351; CHECK-GI-NEXT: sub sp, sp, #16 352; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 353; CHECK-GI-NEXT: mov w9, w0 354; CHECK-GI-NEXT: mov x8, sp 355; CHECK-GI-NEXT: str q0, [sp] 356; CHECK-GI-NEXT: and x9, x9, #0x3 357; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2] 358; CHECK-GI-NEXT: ldr q0, [sp], #16 359; CHECK-GI-NEXT: ret 360entry: 361 %d = insertelement <4 x float> %a, float %b, i32 %c 362 ret <4 x float> %d 363} 364 365define <8 x float> @insert_v8f32_0(<8 x float> %a, float %b, i32 %c) { 366; CHECK-LABEL: insert_v8f32_0: 367; CHECK: // %bb.0: // %entry 368; CHECK-NEXT: // kill: def $s2 killed $s2 def $q2 369; CHECK-NEXT: mov v0.s[0], v2.s[0] 370; CHECK-NEXT: ret 371entry: 372 %d = insertelement <8 x float> %a, float %b, i32 0 373 ret <8 x float> %d 374} 375 376define <8 x float> @insert_v8f32_2(<8 x float> %a, float %b, i32 %c) { 377; CHECK-LABEL: insert_v8f32_2: 378; CHECK: // %bb.0: // %entry 379; CHECK-NEXT: // kill: def $s2 killed $s2 def $q2 380; CHECK-NEXT: mov v0.s[2], v2.s[0] 381; CHECK-NEXT: ret 382entry: 383 %d = insertelement <8 x float> %a, float %b, i32 2 384 ret <8 x float> %d 385} 386 387define <8 x float> @insert_v8f32_c(<8 x float> %a, float %b, i32 %c) { 388; CHECK-SD-LABEL: insert_v8f32_c: 389; CHECK-SD: // %bb.0: // %entry 390; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 391; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 392; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 393; CHECK-SD-NEXT: and x8, x0, #0x7 394; CHECK-SD-NEXT: mov x9, sp 395; CHECK-SD-NEXT: str s2, [x9, x8, lsl #2] 396; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 397; CHECK-SD-NEXT: ret 398; 399; CHECK-GI-LABEL: insert_v8f32_c: 400; CHECK-GI: // %bb.0: // %entry 401; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 402; CHECK-GI-NEXT: sub x9, sp, #48 403; CHECK-GI-NEXT: mov x29, sp 404; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 405; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 406; CHECK-GI-NEXT: .cfi_offset w30, -8 407; CHECK-GI-NEXT: .cfi_offset w29, -16 408; CHECK-GI-NEXT: mov w8, w0 409; CHECK-GI-NEXT: mov x9, sp 410; CHECK-GI-NEXT: stp q0, q1, [sp] 411; CHECK-GI-NEXT: and x8, x8, #0x7 412; CHECK-GI-NEXT: str s2, [x9, x8, lsl #2] 413; CHECK-GI-NEXT: ldp q0, q1, [sp] 414; CHECK-GI-NEXT: mov sp, x29 415; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 416; CHECK-GI-NEXT: ret 417entry: 418 %d = insertelement <8 x float> %a, float %b, i32 %c 419 ret <8 x float> %d 420} 421 422define <4 x half> @insert_v4f16_0(<4 x half> %a, half %b, i32 %c) { 423; CHECK-LABEL: insert_v4f16_0: 424; CHECK: // %bb.0: // %entry 425; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 426; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1 427; CHECK-NEXT: mov v0.h[0], v1.h[0] 428; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 429; CHECK-NEXT: ret 430entry: 431 %d = insertelement <4 x half> %a, half %b, i32 0 432 ret <4 x half> %d 433} 434 435define <4 x half> @insert_v4f16_2(<4 x half> %a, half %b, i32 %c) { 436; CHECK-LABEL: insert_v4f16_2: 437; CHECK: // %bb.0: // %entry 438; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 439; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1 440; CHECK-NEXT: mov v0.h[2], v1.h[0] 441; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 442; CHECK-NEXT: ret 443entry: 444 %d = insertelement <4 x half> %a, half %b, i32 2 445 ret <4 x half> %d 446} 447 448define <4 x half> @insert_v4f16_c(<4 x half> %a, half %b, i32 %c) { 449; CHECK-SD-LABEL: insert_v4f16_c: 450; CHECK-SD: // %bb.0: // %entry 451; CHECK-SD-NEXT: sub sp, sp, #16 452; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 453; CHECK-SD-NEXT: add x8, sp, #8 454; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 455; CHECK-SD-NEXT: str d0, [sp, #8] 456; CHECK-SD-NEXT: bfi x8, x0, #1, #2 457; CHECK-SD-NEXT: str h1, [x8] 458; CHECK-SD-NEXT: ldr d0, [sp, #8] 459; CHECK-SD-NEXT: add sp, sp, #16 460; CHECK-SD-NEXT: ret 461; 462; CHECK-GI-LABEL: insert_v4f16_c: 463; CHECK-GI: // %bb.0: // %entry 464; CHECK-GI-NEXT: sub sp, sp, #16 465; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 466; CHECK-GI-NEXT: mov w9, w0 467; CHECK-GI-NEXT: add x8, sp, #8 468; CHECK-GI-NEXT: str d0, [sp, #8] 469; CHECK-GI-NEXT: and x9, x9, #0x3 470; CHECK-GI-NEXT: str h1, [x8, x9, lsl #1] 471; CHECK-GI-NEXT: ldr d0, [sp, #8] 472; CHECK-GI-NEXT: add sp, sp, #16 473; CHECK-GI-NEXT: ret 474entry: 475 %d = insertelement <4 x half> %a, half %b, i32 %c 476 ret <4 x half> %d 477} 478 479define <8 x half> @insert_v8f16_0(<8 x half> %a, half %b, i32 %c) { 480; CHECK-LABEL: insert_v8f16_0: 481; CHECK: // %bb.0: // %entry 482; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1 483; CHECK-NEXT: mov v0.h[0], v1.h[0] 484; CHECK-NEXT: ret 485entry: 486 %d = insertelement <8 x half> %a, half %b, i32 0 487 ret <8 x half> %d 488} 489 490define <8 x half> @insert_v8f16_2(<8 x half> %a, half %b, i32 %c) { 491; CHECK-LABEL: insert_v8f16_2: 492; CHECK: // %bb.0: // %entry 493; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1 494; CHECK-NEXT: mov v0.h[2], v1.h[0] 495; CHECK-NEXT: ret 496entry: 497 %d = insertelement <8 x half> %a, half %b, i32 2 498 ret <8 x half> %d 499} 500 501define <8 x half> @insert_v8f16_c(<8 x half> %a, half %b, i32 %c) { 502; CHECK-SD-LABEL: insert_v8f16_c: 503; CHECK-SD: // %bb.0: // %entry 504; CHECK-SD-NEXT: sub sp, sp, #16 505; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 506; CHECK-SD-NEXT: mov x8, sp 507; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 508; CHECK-SD-NEXT: str q0, [sp] 509; CHECK-SD-NEXT: bfi x8, x0, #1, #3 510; CHECK-SD-NEXT: str h1, [x8] 511; CHECK-SD-NEXT: ldr q0, [sp], #16 512; CHECK-SD-NEXT: ret 513; 514; CHECK-GI-LABEL: insert_v8f16_c: 515; CHECK-GI: // %bb.0: // %entry 516; CHECK-GI-NEXT: sub sp, sp, #16 517; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 518; CHECK-GI-NEXT: mov w9, w0 519; CHECK-GI-NEXT: mov x8, sp 520; CHECK-GI-NEXT: str q0, [sp] 521; CHECK-GI-NEXT: and x9, x9, #0x7 522; CHECK-GI-NEXT: str h1, [x8, x9, lsl #1] 523; CHECK-GI-NEXT: ldr q0, [sp], #16 524; CHECK-GI-NEXT: ret 525entry: 526 %d = insertelement <8 x half> %a, half %b, i32 %c 527 ret <8 x half> %d 528} 529 530define <16 x half> @insert_v16f16_0(<16 x half> %a, half %b, i32 %c) { 531; CHECK-LABEL: insert_v16f16_0: 532; CHECK: // %bb.0: // %entry 533; CHECK-NEXT: // kill: def $h2 killed $h2 def $q2 534; CHECK-NEXT: mov v0.h[0], v2.h[0] 535; CHECK-NEXT: ret 536entry: 537 %d = insertelement <16 x half> %a, half %b, i32 0 538 ret <16 x half> %d 539} 540 541define <16 x half> @insert_v16f16_2(<16 x half> %a, half %b, i32 %c) { 542; CHECK-LABEL: insert_v16f16_2: 543; CHECK: // %bb.0: // %entry 544; CHECK-NEXT: // kill: def $h2 killed $h2 def $q2 545; CHECK-NEXT: mov v0.h[2], v2.h[0] 546; CHECK-NEXT: ret 547entry: 548 %d = insertelement <16 x half> %a, half %b, i32 2 549 ret <16 x half> %d 550} 551 552define <16 x half> @insert_v16f16_c(<16 x half> %a, half %b, i32 %c) { 553; CHECK-SD-LABEL: insert_v16f16_c: 554; CHECK-SD: // %bb.0: // %entry 555; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 556; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 557; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 558; CHECK-SD-NEXT: and x8, x0, #0xf 559; CHECK-SD-NEXT: mov x9, sp 560; CHECK-SD-NEXT: str h2, [x9, x8, lsl #1] 561; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 562; CHECK-SD-NEXT: ret 563; 564; CHECK-GI-LABEL: insert_v16f16_c: 565; CHECK-GI: // %bb.0: // %entry 566; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 567; CHECK-GI-NEXT: sub x9, sp, #48 568; CHECK-GI-NEXT: mov x29, sp 569; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 570; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 571; CHECK-GI-NEXT: .cfi_offset w30, -8 572; CHECK-GI-NEXT: .cfi_offset w29, -16 573; CHECK-GI-NEXT: mov w8, w0 574; CHECK-GI-NEXT: mov x9, sp 575; CHECK-GI-NEXT: stp q0, q1, [sp] 576; CHECK-GI-NEXT: and x8, x8, #0xf 577; CHECK-GI-NEXT: str h2, [x9, x8, lsl #1] 578; CHECK-GI-NEXT: ldp q0, q1, [sp] 579; CHECK-GI-NEXT: mov sp, x29 580; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 581; CHECK-GI-NEXT: ret 582entry: 583 %d = insertelement <16 x half> %a, half %b, i32 %c 584 ret <16 x half> %d 585} 586 587define <8 x i8> @insert_v8i8_0(<8 x i8> %a, i8 %b, i32 %c) { 588; CHECK-LABEL: insert_v8i8_0: 589; CHECK: // %bb.0: // %entry 590; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 591; CHECK-NEXT: mov v0.b[0], w0 592; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 593; CHECK-NEXT: ret 594entry: 595 %d = insertelement <8 x i8> %a, i8 %b, i32 0 596 ret <8 x i8> %d 597} 598 599define <8 x i8> @insert_v8i8_2(<8 x i8> %a, i8 %b, i32 %c) { 600; CHECK-LABEL: insert_v8i8_2: 601; CHECK: // %bb.0: // %entry 602; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 603; CHECK-NEXT: mov v0.b[2], w0 604; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 605; CHECK-NEXT: ret 606entry: 607 %d = insertelement <8 x i8> %a, i8 %b, i32 2 608 ret <8 x i8> %d 609} 610 611define <8 x i8> @insert_v8i8_c(<8 x i8> %a, i8 %b, i32 %c) { 612; CHECK-SD-LABEL: insert_v8i8_c: 613; CHECK-SD: // %bb.0: // %entry 614; CHECK-SD-NEXT: sub sp, sp, #16 615; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 616; CHECK-SD-NEXT: add x8, sp, #8 617; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 618; CHECK-SD-NEXT: str d0, [sp, #8] 619; CHECK-SD-NEXT: bfxil x8, x1, #0, #3 620; CHECK-SD-NEXT: strb w0, [x8] 621; CHECK-SD-NEXT: ldr d0, [sp, #8] 622; CHECK-SD-NEXT: add sp, sp, #16 623; CHECK-SD-NEXT: ret 624; 625; CHECK-GI-LABEL: insert_v8i8_c: 626; CHECK-GI: // %bb.0: // %entry 627; CHECK-GI-NEXT: sub sp, sp, #16 628; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 629; CHECK-GI-NEXT: mov w9, w1 630; CHECK-GI-NEXT: mov w8, #1 // =0x1 631; CHECK-GI-NEXT: str d0, [sp, #8] 632; CHECK-GI-NEXT: and x9, x9, #0x7 633; CHECK-GI-NEXT: mul x8, x9, x8 634; CHECK-GI-NEXT: add x9, sp, #8 635; CHECK-GI-NEXT: strb w0, [x9, x8] 636; CHECK-GI-NEXT: ldr d0, [sp, #8] 637; CHECK-GI-NEXT: add sp, sp, #16 638; CHECK-GI-NEXT: ret 639entry: 640 %d = insertelement <8 x i8> %a, i8 %b, i32 %c 641 ret <8 x i8> %d 642} 643 644define <16 x i8> @insert_v16i8_0(<16 x i8> %a, i8 %b, i32 %c) { 645; CHECK-LABEL: insert_v16i8_0: 646; CHECK: // %bb.0: // %entry 647; CHECK-NEXT: mov v0.b[0], w0 648; CHECK-NEXT: ret 649entry: 650 %d = insertelement <16 x i8> %a, i8 %b, i32 0 651 ret <16 x i8> %d 652} 653 654define <16 x i8> @insert_v16i8_2(<16 x i8> %a, i8 %b, i32 %c) { 655; CHECK-LABEL: insert_v16i8_2: 656; CHECK: // %bb.0: // %entry 657; CHECK-NEXT: mov v0.b[2], w0 658; CHECK-NEXT: ret 659entry: 660 %d = insertelement <16 x i8> %a, i8 %b, i32 2 661 ret <16 x i8> %d 662} 663 664define <16 x i8> @insert_v16i8_c(<16 x i8> %a, i8 %b, i32 %c) { 665; CHECK-SD-LABEL: insert_v16i8_c: 666; CHECK-SD: // %bb.0: // %entry 667; CHECK-SD-NEXT: sub sp, sp, #16 668; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 669; CHECK-SD-NEXT: mov x8, sp 670; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 671; CHECK-SD-NEXT: str q0, [sp] 672; CHECK-SD-NEXT: bfxil x8, x1, #0, #4 673; CHECK-SD-NEXT: strb w0, [x8] 674; CHECK-SD-NEXT: ldr q0, [sp], #16 675; CHECK-SD-NEXT: ret 676; 677; CHECK-GI-LABEL: insert_v16i8_c: 678; CHECK-GI: // %bb.0: // %entry 679; CHECK-GI-NEXT: sub sp, sp, #16 680; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 681; CHECK-GI-NEXT: mov w9, w1 682; CHECK-GI-NEXT: mov w8, #1 // =0x1 683; CHECK-GI-NEXT: str q0, [sp] 684; CHECK-GI-NEXT: and x9, x9, #0xf 685; CHECK-GI-NEXT: mul x8, x9, x8 686; CHECK-GI-NEXT: mov x9, sp 687; CHECK-GI-NEXT: strb w0, [x9, x8] 688; CHECK-GI-NEXT: ldr q0, [sp], #16 689; CHECK-GI-NEXT: ret 690entry: 691 %d = insertelement <16 x i8> %a, i8 %b, i32 %c 692 ret <16 x i8> %d 693} 694 695define <32 x i8> @insert_v32i8_0(<32 x i8> %a, i8 %b, i32 %c) { 696; CHECK-LABEL: insert_v32i8_0: 697; CHECK: // %bb.0: // %entry 698; CHECK-NEXT: mov v0.b[0], w0 699; CHECK-NEXT: ret 700entry: 701 %d = insertelement <32 x i8> %a, i8 %b, i32 0 702 ret <32 x i8> %d 703} 704 705define <32 x i8> @insert_v32i8_2(<32 x i8> %a, i8 %b, i32 %c) { 706; CHECK-LABEL: insert_v32i8_2: 707; CHECK: // %bb.0: // %entry 708; CHECK-NEXT: mov v0.b[2], w0 709; CHECK-NEXT: ret 710entry: 711 %d = insertelement <32 x i8> %a, i8 %b, i32 2 712 ret <32 x i8> %d 713} 714 715define <32 x i8> @insert_v32i8_c(<32 x i8> %a, i8 %b, i32 %c) { 716; CHECK-SD-LABEL: insert_v32i8_c: 717; CHECK-SD: // %bb.0: // %entry 718; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 719; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 720; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 721; CHECK-SD-NEXT: and x8, x1, #0x1f 722; CHECK-SD-NEXT: mov x9, sp 723; CHECK-SD-NEXT: strb w0, [x9, x8] 724; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 725; CHECK-SD-NEXT: ret 726; 727; CHECK-GI-LABEL: insert_v32i8_c: 728; CHECK-GI: // %bb.0: // %entry 729; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 730; CHECK-GI-NEXT: sub x9, sp, #48 731; CHECK-GI-NEXT: mov x29, sp 732; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 733; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 734; CHECK-GI-NEXT: .cfi_offset w30, -8 735; CHECK-GI-NEXT: .cfi_offset w29, -16 736; CHECK-GI-NEXT: mov w8, w1 737; CHECK-GI-NEXT: mov x10, sp 738; CHECK-GI-NEXT: stp q0, q1, [sp] 739; CHECK-GI-NEXT: and x8, x8, #0x1f 740; CHECK-GI-NEXT: lsl x9, x8, #1 741; CHECK-GI-NEXT: sub x8, x9, x8 742; CHECK-GI-NEXT: strb w0, [x10, x8] 743; CHECK-GI-NEXT: ldp q0, q1, [sp] 744; CHECK-GI-NEXT: mov sp, x29 745; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 746; CHECK-GI-NEXT: ret 747entry: 748 %d = insertelement <32 x i8> %a, i8 %b, i32 %c 749 ret <32 x i8> %d 750} 751 752define <4 x i16> @insert_v4i16_0(<4 x i16> %a, i16 %b, i32 %c) { 753; CHECK-LABEL: insert_v4i16_0: 754; CHECK: // %bb.0: // %entry 755; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 756; CHECK-NEXT: mov v0.h[0], w0 757; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 758; CHECK-NEXT: ret 759entry: 760 %d = insertelement <4 x i16> %a, i16 %b, i32 0 761 ret <4 x i16> %d 762} 763 764define <4 x i16> @insert_v4i16_2(<4 x i16> %a, i16 %b, i32 %c) { 765; CHECK-LABEL: insert_v4i16_2: 766; CHECK: // %bb.0: // %entry 767; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 768; CHECK-NEXT: mov v0.h[2], w0 769; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 770; CHECK-NEXT: ret 771entry: 772 %d = insertelement <4 x i16> %a, i16 %b, i32 2 773 ret <4 x i16> %d 774} 775 776define <4 x i16> @insert_v4i16_c(<4 x i16> %a, i16 %b, i32 %c) { 777; CHECK-SD-LABEL: insert_v4i16_c: 778; CHECK-SD: // %bb.0: // %entry 779; CHECK-SD-NEXT: sub sp, sp, #16 780; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 781; CHECK-SD-NEXT: add x8, sp, #8 782; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 783; CHECK-SD-NEXT: str d0, [sp, #8] 784; CHECK-SD-NEXT: bfi x8, x1, #1, #2 785; CHECK-SD-NEXT: strh w0, [x8] 786; CHECK-SD-NEXT: ldr d0, [sp, #8] 787; CHECK-SD-NEXT: add sp, sp, #16 788; CHECK-SD-NEXT: ret 789; 790; CHECK-GI-LABEL: insert_v4i16_c: 791; CHECK-GI: // %bb.0: // %entry 792; CHECK-GI-NEXT: sub sp, sp, #16 793; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 794; CHECK-GI-NEXT: mov w9, w1 795; CHECK-GI-NEXT: add x8, sp, #8 796; CHECK-GI-NEXT: str d0, [sp, #8] 797; CHECK-GI-NEXT: and x9, x9, #0x3 798; CHECK-GI-NEXT: strh w0, [x8, x9, lsl #1] 799; CHECK-GI-NEXT: ldr d0, [sp, #8] 800; CHECK-GI-NEXT: add sp, sp, #16 801; CHECK-GI-NEXT: ret 802entry: 803 %d = insertelement <4 x i16> %a, i16 %b, i32 %c 804 ret <4 x i16> %d 805} 806 807define <8 x i16> @insert_v8i16_0(<8 x i16> %a, i16 %b, i32 %c) { 808; CHECK-LABEL: insert_v8i16_0: 809; CHECK: // %bb.0: // %entry 810; CHECK-NEXT: mov v0.h[0], w0 811; CHECK-NEXT: ret 812entry: 813 %d = insertelement <8 x i16> %a, i16 %b, i32 0 814 ret <8 x i16> %d 815} 816 817define <8 x i16> @insert_v8i16_2(<8 x i16> %a, i16 %b, i32 %c) { 818; CHECK-LABEL: insert_v8i16_2: 819; CHECK: // %bb.0: // %entry 820; CHECK-NEXT: mov v0.h[2], w0 821; CHECK-NEXT: ret 822entry: 823 %d = insertelement <8 x i16> %a, i16 %b, i32 2 824 ret <8 x i16> %d 825} 826 827define <8 x i16> @insert_v8i16_c(<8 x i16> %a, i16 %b, i32 %c) { 828; CHECK-SD-LABEL: insert_v8i16_c: 829; CHECK-SD: // %bb.0: // %entry 830; CHECK-SD-NEXT: sub sp, sp, #16 831; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 832; CHECK-SD-NEXT: mov x8, sp 833; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 834; CHECK-SD-NEXT: str q0, [sp] 835; CHECK-SD-NEXT: bfi x8, x1, #1, #3 836; CHECK-SD-NEXT: strh w0, [x8] 837; CHECK-SD-NEXT: ldr q0, [sp], #16 838; CHECK-SD-NEXT: ret 839; 840; CHECK-GI-LABEL: insert_v8i16_c: 841; CHECK-GI: // %bb.0: // %entry 842; CHECK-GI-NEXT: sub sp, sp, #16 843; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 844; CHECK-GI-NEXT: mov w9, w1 845; CHECK-GI-NEXT: mov x8, sp 846; CHECK-GI-NEXT: str q0, [sp] 847; CHECK-GI-NEXT: and x9, x9, #0x7 848; CHECK-GI-NEXT: strh w0, [x8, x9, lsl #1] 849; CHECK-GI-NEXT: ldr q0, [sp], #16 850; CHECK-GI-NEXT: ret 851entry: 852 %d = insertelement <8 x i16> %a, i16 %b, i32 %c 853 ret <8 x i16> %d 854} 855 856define <16 x i16> @insert_v16i16_0(<16 x i16> %a, i16 %b, i32 %c) { 857; CHECK-LABEL: insert_v16i16_0: 858; CHECK: // %bb.0: // %entry 859; CHECK-NEXT: mov v0.h[0], w0 860; CHECK-NEXT: ret 861entry: 862 %d = insertelement <16 x i16> %a, i16 %b, i32 0 863 ret <16 x i16> %d 864} 865 866define <16 x i16> @insert_v16i16_2(<16 x i16> %a, i16 %b, i32 %c) { 867; CHECK-LABEL: insert_v16i16_2: 868; CHECK: // %bb.0: // %entry 869; CHECK-NEXT: mov v0.h[2], w0 870; CHECK-NEXT: ret 871entry: 872 %d = insertelement <16 x i16> %a, i16 %b, i32 2 873 ret <16 x i16> %d 874} 875 876define <16 x i16> @insert_v16i16_c(<16 x i16> %a, i16 %b, i32 %c) { 877; CHECK-SD-LABEL: insert_v16i16_c: 878; CHECK-SD: // %bb.0: // %entry 879; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 880; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 881; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 882; CHECK-SD-NEXT: and x8, x1, #0xf 883; CHECK-SD-NEXT: mov x9, sp 884; CHECK-SD-NEXT: strh w0, [x9, x8, lsl #1] 885; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 886; CHECK-SD-NEXT: ret 887; 888; CHECK-GI-LABEL: insert_v16i16_c: 889; CHECK-GI: // %bb.0: // %entry 890; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 891; CHECK-GI-NEXT: sub x9, sp, #48 892; CHECK-GI-NEXT: mov x29, sp 893; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 894; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 895; CHECK-GI-NEXT: .cfi_offset w30, -8 896; CHECK-GI-NEXT: .cfi_offset w29, -16 897; CHECK-GI-NEXT: mov w8, w1 898; CHECK-GI-NEXT: mov x9, sp 899; CHECK-GI-NEXT: stp q0, q1, [sp] 900; CHECK-GI-NEXT: and x8, x8, #0xf 901; CHECK-GI-NEXT: strh w0, [x9, x8, lsl #1] 902; CHECK-GI-NEXT: ldp q0, q1, [sp] 903; CHECK-GI-NEXT: mov sp, x29 904; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 905; CHECK-GI-NEXT: ret 906entry: 907 %d = insertelement <16 x i16> %a, i16 %b, i32 %c 908 ret <16 x i16> %d 909} 910 911define <2 x i32> @insert_v2i32_0(<2 x i32> %a, i32 %b, i32 %c) { 912; CHECK-LABEL: insert_v2i32_0: 913; CHECK: // %bb.0: // %entry 914; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 915; CHECK-NEXT: mov v0.s[0], w0 916; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 917; CHECK-NEXT: ret 918entry: 919 %d = insertelement <2 x i32> %a, i32 %b, i32 0 920 ret <2 x i32> %d 921} 922 923define <2 x i32> @insert_v2i32_1(<2 x i32> %a, i32 %b, i32 %c) { 924; CHECK-LABEL: insert_v2i32_1: 925; CHECK: // %bb.0: // %entry 926; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 927; CHECK-NEXT: mov v0.s[1], w0 928; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 929; CHECK-NEXT: ret 930entry: 931 %d = insertelement <2 x i32> %a, i32 %b, i32 1 932 ret <2 x i32> %d 933} 934 935define <2 x i32> @insert_v2i32_c(<2 x i32> %a, i32 %b, i32 %c) { 936; CHECK-SD-LABEL: insert_v2i32_c: 937; CHECK-SD: // %bb.0: // %entry 938; CHECK-SD-NEXT: sub sp, sp, #16 939; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 940; CHECK-SD-NEXT: add x8, sp, #8 941; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 942; CHECK-SD-NEXT: str d0, [sp, #8] 943; CHECK-SD-NEXT: bfi x8, x1, #2, #1 944; CHECK-SD-NEXT: str w0, [x8] 945; CHECK-SD-NEXT: ldr d0, [sp, #8] 946; CHECK-SD-NEXT: add sp, sp, #16 947; CHECK-SD-NEXT: ret 948; 949; CHECK-GI-LABEL: insert_v2i32_c: 950; CHECK-GI: // %bb.0: // %entry 951; CHECK-GI-NEXT: sub sp, sp, #16 952; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 953; CHECK-GI-NEXT: mov w9, w1 954; CHECK-GI-NEXT: add x8, sp, #8 955; CHECK-GI-NEXT: str d0, [sp, #8] 956; CHECK-GI-NEXT: and x9, x9, #0x1 957; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2] 958; CHECK-GI-NEXT: ldr d0, [sp, #8] 959; CHECK-GI-NEXT: add sp, sp, #16 960; CHECK-GI-NEXT: ret 961entry: 962 %d = insertelement <2 x i32> %a, i32 %b, i32 %c 963 ret <2 x i32> %d 964} 965 966define <3 x i32> @insert_v3i32_0(<3 x i32> %a, i32 %b, i32 %c) { 967; CHECK-SD-LABEL: insert_v3i32_0: 968; CHECK-SD: // %bb.0: // %entry 969; CHECK-SD-NEXT: fmov s1, w0 970; CHECK-SD-NEXT: mov v1.s[1], v0.s[1] 971; CHECK-SD-NEXT: mov v1.s[2], v0.s[2] 972; CHECK-SD-NEXT: mov v0.16b, v1.16b 973; CHECK-SD-NEXT: ret 974; 975; CHECK-GI-LABEL: insert_v3i32_0: 976; CHECK-GI: // %bb.0: // %entry 977; CHECK-GI-NEXT: mov v1.s[0], w0 978; CHECK-GI-NEXT: mov v1.s[1], v0.s[1] 979; CHECK-GI-NEXT: mov v1.s[2], v0.s[2] 980; CHECK-GI-NEXT: mov v0.16b, v1.16b 981; CHECK-GI-NEXT: ret 982entry: 983 %d = insertelement <3 x i32> %a, i32 %b, i32 0 984 ret <3 x i32> %d 985} 986 987define <3 x i32> @insert_v3i32_2(<3 x i32> %a, i32 %b, i32 %c) { 988; CHECK-SD-LABEL: insert_v3i32_2: 989; CHECK-SD: // %bb.0: // %entry 990; CHECK-SD-NEXT: mov v0.s[2], w0 991; CHECK-SD-NEXT: ret 992; 993; CHECK-GI-LABEL: insert_v3i32_2: 994; CHECK-GI: // %bb.0: // %entry 995; CHECK-GI-NEXT: mov v1.s[0], v0.s[0] 996; CHECK-GI-NEXT: mov v1.s[1], v0.s[1] 997; CHECK-GI-NEXT: mov v1.s[2], w0 998; CHECK-GI-NEXT: mov v0.16b, v1.16b 999; CHECK-GI-NEXT: ret 1000entry: 1001 %d = insertelement <3 x i32> %a, i32 %b, i32 2 1002 ret <3 x i32> %d 1003} 1004 1005define <3 x i32> @insert_v3i32_c(<3 x i32> %a, i32 %b, i32 %c) { 1006; CHECK-SD-LABEL: insert_v3i32_c: 1007; CHECK-SD: // %bb.0: // %entry 1008; CHECK-SD-NEXT: sub sp, sp, #16 1009; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1010; CHECK-SD-NEXT: mov x8, sp 1011; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1012; CHECK-SD-NEXT: str q0, [sp] 1013; CHECK-SD-NEXT: bfi x8, x1, #2, #2 1014; CHECK-SD-NEXT: str w0, [x8] 1015; CHECK-SD-NEXT: ldr q0, [sp], #16 1016; CHECK-SD-NEXT: ret 1017; 1018; CHECK-GI-LABEL: insert_v3i32_c: 1019; CHECK-GI: // %bb.0: // %entry 1020; CHECK-GI-NEXT: sub sp, sp, #16 1021; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1022; CHECK-GI-NEXT: mov w9, w1 1023; CHECK-GI-NEXT: mov x8, sp 1024; CHECK-GI-NEXT: str q0, [sp] 1025; CHECK-GI-NEXT: and x9, x9, #0x3 1026; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2] 1027; CHECK-GI-NEXT: ldr q0, [sp], #16 1028; CHECK-GI-NEXT: ret 1029entry: 1030 %d = insertelement <3 x i32> %a, i32 %b, i32 %c 1031 ret <3 x i32> %d 1032} 1033 1034define <4 x i32> @insert_v4i32_0(<4 x i32> %a, i32 %b, i32 %c) { 1035; CHECK-LABEL: insert_v4i32_0: 1036; CHECK: // %bb.0: // %entry 1037; CHECK-NEXT: mov v0.s[0], w0 1038; CHECK-NEXT: ret 1039entry: 1040 %d = insertelement <4 x i32> %a, i32 %b, i32 0 1041 ret <4 x i32> %d 1042} 1043 1044define <4 x i32> @insert_v4i32_2(<4 x i32> %a, i32 %b, i32 %c) { 1045; CHECK-LABEL: insert_v4i32_2: 1046; CHECK: // %bb.0: // %entry 1047; CHECK-NEXT: mov v0.s[2], w0 1048; CHECK-NEXT: ret 1049entry: 1050 %d = insertelement <4 x i32> %a, i32 %b, i32 2 1051 ret <4 x i32> %d 1052} 1053 1054define <4 x i32> @insert_v4i32_c(<4 x i32> %a, i32 %b, i32 %c) { 1055; CHECK-SD-LABEL: insert_v4i32_c: 1056; CHECK-SD: // %bb.0: // %entry 1057; CHECK-SD-NEXT: sub sp, sp, #16 1058; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1059; CHECK-SD-NEXT: mov x8, sp 1060; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1061; CHECK-SD-NEXT: str q0, [sp] 1062; CHECK-SD-NEXT: bfi x8, x1, #2, #2 1063; CHECK-SD-NEXT: str w0, [x8] 1064; CHECK-SD-NEXT: ldr q0, [sp], #16 1065; CHECK-SD-NEXT: ret 1066; 1067; CHECK-GI-LABEL: insert_v4i32_c: 1068; CHECK-GI: // %bb.0: // %entry 1069; CHECK-GI-NEXT: sub sp, sp, #16 1070; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1071; CHECK-GI-NEXT: mov w9, w1 1072; CHECK-GI-NEXT: mov x8, sp 1073; CHECK-GI-NEXT: str q0, [sp] 1074; CHECK-GI-NEXT: and x9, x9, #0x3 1075; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2] 1076; CHECK-GI-NEXT: ldr q0, [sp], #16 1077; CHECK-GI-NEXT: ret 1078entry: 1079 %d = insertelement <4 x i32> %a, i32 %b, i32 %c 1080 ret <4 x i32> %d 1081} 1082 1083define <8 x i32> @insert_v8i32_0(<8 x i32> %a, i32 %b, i32 %c) { 1084; CHECK-LABEL: insert_v8i32_0: 1085; CHECK: // %bb.0: // %entry 1086; CHECK-NEXT: mov v0.s[0], w0 1087; CHECK-NEXT: ret 1088entry: 1089 %d = insertelement <8 x i32> %a, i32 %b, i32 0 1090 ret <8 x i32> %d 1091} 1092 1093define <8 x i32> @insert_v8i32_2(<8 x i32> %a, i32 %b, i32 %c) { 1094; CHECK-LABEL: insert_v8i32_2: 1095; CHECK: // %bb.0: // %entry 1096; CHECK-NEXT: mov v0.s[2], w0 1097; CHECK-NEXT: ret 1098entry: 1099 %d = insertelement <8 x i32> %a, i32 %b, i32 2 1100 ret <8 x i32> %d 1101} 1102 1103define <8 x i32> @insert_v8i32_c(<8 x i32> %a, i32 %b, i32 %c) { 1104; CHECK-SD-LABEL: insert_v8i32_c: 1105; CHECK-SD: // %bb.0: // %entry 1106; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1107; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1108; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1109; CHECK-SD-NEXT: and x8, x1, #0x7 1110; CHECK-SD-NEXT: mov x9, sp 1111; CHECK-SD-NEXT: str w0, [x9, x8, lsl #2] 1112; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 1113; CHECK-SD-NEXT: ret 1114; 1115; CHECK-GI-LABEL: insert_v8i32_c: 1116; CHECK-GI: // %bb.0: // %entry 1117; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1118; CHECK-GI-NEXT: sub x9, sp, #48 1119; CHECK-GI-NEXT: mov x29, sp 1120; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1121; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1122; CHECK-GI-NEXT: .cfi_offset w30, -8 1123; CHECK-GI-NEXT: .cfi_offset w29, -16 1124; CHECK-GI-NEXT: mov w8, w1 1125; CHECK-GI-NEXT: mov x9, sp 1126; CHECK-GI-NEXT: stp q0, q1, [sp] 1127; CHECK-GI-NEXT: and x8, x8, #0x7 1128; CHECK-GI-NEXT: str w0, [x9, x8, lsl #2] 1129; CHECK-GI-NEXT: ldp q0, q1, [sp] 1130; CHECK-GI-NEXT: mov sp, x29 1131; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1132; CHECK-GI-NEXT: ret 1133entry: 1134 %d = insertelement <8 x i32> %a, i32 %b, i32 %c 1135 ret <8 x i32> %d 1136} 1137 1138define <2 x i64> @insert_v2i64_0(<2 x i64> %a, i64 %b, i32 %c) { 1139; CHECK-LABEL: insert_v2i64_0: 1140; CHECK: // %bb.0: // %entry 1141; CHECK-NEXT: mov v0.d[0], x0 1142; CHECK-NEXT: ret 1143entry: 1144 %d = insertelement <2 x i64> %a, i64 %b, i32 0 1145 ret <2 x i64> %d 1146} 1147 1148define <2 x i64> @insert_v2i64_1(<2 x i64> %a, i64 %b, i32 %c) { 1149; CHECK-LABEL: insert_v2i64_1: 1150; CHECK: // %bb.0: // %entry 1151; CHECK-NEXT: mov v0.d[1], x0 1152; CHECK-NEXT: ret 1153entry: 1154 %d = insertelement <2 x i64> %a, i64 %b, i32 1 1155 ret <2 x i64> %d 1156} 1157 1158define <2 x i64> @insert_v2i64_c(<2 x i64> %a, i64 %b, i32 %c) { 1159; CHECK-SD-LABEL: insert_v2i64_c: 1160; CHECK-SD: // %bb.0: // %entry 1161; CHECK-SD-NEXT: sub sp, sp, #16 1162; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1163; CHECK-SD-NEXT: mov x8, sp 1164; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1165; CHECK-SD-NEXT: str q0, [sp] 1166; CHECK-SD-NEXT: bfi x8, x1, #3, #1 1167; CHECK-SD-NEXT: str x0, [x8] 1168; CHECK-SD-NEXT: ldr q0, [sp], #16 1169; CHECK-SD-NEXT: ret 1170; 1171; CHECK-GI-LABEL: insert_v2i64_c: 1172; CHECK-GI: // %bb.0: // %entry 1173; CHECK-GI-NEXT: sub sp, sp, #16 1174; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1175; CHECK-GI-NEXT: mov w9, w1 1176; CHECK-GI-NEXT: mov x8, sp 1177; CHECK-GI-NEXT: str q0, [sp] 1178; CHECK-GI-NEXT: and x9, x9, #0x1 1179; CHECK-GI-NEXT: str x0, [x8, x9, lsl #3] 1180; CHECK-GI-NEXT: ldr q0, [sp], #16 1181; CHECK-GI-NEXT: ret 1182entry: 1183 %d = insertelement <2 x i64> %a, i64 %b, i32 %c 1184 ret <2 x i64> %d 1185} 1186 1187define <3 x i64> @insert_v3i64_0(<3 x i64> %a, i64 %b, i32 %c) { 1188; CHECK-SD-LABEL: insert_v3i64_0: 1189; CHECK-SD: // %bb.0: // %entry 1190; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1191; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1192; CHECK-SD-NEXT: mov v0.d[0], x0 1193; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1194; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1195; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1196; CHECK-SD-NEXT: ret 1197; 1198; CHECK-GI-LABEL: insert_v3i64_0: 1199; CHECK-GI: // %bb.0: // %entry 1200; CHECK-GI-NEXT: fmov d0, x0 1201; CHECK-GI-NEXT: ret 1202entry: 1203 %d = insertelement <3 x i64> %a, i64 %b, i32 0 1204 ret <3 x i64> %d 1205} 1206 1207define <3 x i64> @insert_v3i64_2(<3 x i64> %a, i64 %b, i32 %c) { 1208; CHECK-LABEL: insert_v3i64_2: 1209; CHECK: // %bb.0: // %entry 1210; CHECK-NEXT: fmov d2, x0 1211; CHECK-NEXT: ret 1212entry: 1213 %d = insertelement <3 x i64> %a, i64 %b, i32 2 1214 ret <3 x i64> %d 1215} 1216 1217define <3 x i64> @insert_v3i64_c(<3 x i64> %a, i64 %b, i32 %c) { 1218; CHECK-SD-LABEL: insert_v3i64_c: 1219; CHECK-SD: // %bb.0: // %entry 1220; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1221; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1222; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1223; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1224; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1225; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]! 1226; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1227; CHECK-SD-NEXT: mov x8, sp 1228; CHECK-SD-NEXT: and x9, x1, #0x3 1229; CHECK-SD-NEXT: str x0, [x8, x9, lsl #3] 1230; CHECK-SD-NEXT: ldr q0, [sp] 1231; CHECK-SD-NEXT: ldr d2, [sp, #16] 1232; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1233; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1234; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1235; CHECK-SD-NEXT: add sp, sp, #32 1236; CHECK-SD-NEXT: ret 1237; 1238; CHECK-GI-LABEL: insert_v3i64_c: 1239; CHECK-GI: // %bb.0: // %entry 1240; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1241; CHECK-GI-NEXT: sub x9, sp, #48 1242; CHECK-GI-NEXT: mov x29, sp 1243; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1244; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1245; CHECK-GI-NEXT: .cfi_offset w30, -8 1246; CHECK-GI-NEXT: .cfi_offset w29, -16 1247; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1248; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1249; CHECK-GI-NEXT: mov w8, w1 1250; CHECK-GI-NEXT: mov x9, sp 1251; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 1252; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1253; CHECK-GI-NEXT: and x8, x8, #0x3 1254; CHECK-GI-NEXT: stp q0, q2, [sp] 1255; CHECK-GI-NEXT: str x0, [x9, x8, lsl #3] 1256; CHECK-GI-NEXT: ldp q0, q2, [sp] 1257; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 1258; CHECK-GI-NEXT: mov d1, v0.d[1] 1259; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1260; CHECK-GI-NEXT: mov sp, x29 1261; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1262; CHECK-GI-NEXT: ret 1263entry: 1264 %d = insertelement <3 x i64> %a, i64 %b, i32 %c 1265 ret <3 x i64> %d 1266} 1267 1268define <4 x i64> @insert_v4i64_0(<4 x i64> %a, i64 %b, i32 %c) { 1269; CHECK-LABEL: insert_v4i64_0: 1270; CHECK: // %bb.0: // %entry 1271; CHECK-NEXT: mov v0.d[0], x0 1272; CHECK-NEXT: ret 1273entry: 1274 %d = insertelement <4 x i64> %a, i64 %b, i32 0 1275 ret <4 x i64> %d 1276} 1277 1278define <4 x i64> @insert_v4i64_2(<4 x i64> %a, i64 %b, i32 %c) { 1279; CHECK-LABEL: insert_v4i64_2: 1280; CHECK: // %bb.0: // %entry 1281; CHECK-NEXT: mov v1.d[0], x0 1282; CHECK-NEXT: ret 1283entry: 1284 %d = insertelement <4 x i64> %a, i64 %b, i32 2 1285 ret <4 x i64> %d 1286} 1287 1288define <4 x i64> @insert_v4i64_c(<4 x i64> %a, i64 %b, i32 %c) { 1289; CHECK-SD-LABEL: insert_v4i64_c: 1290; CHECK-SD: // %bb.0: // %entry 1291; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1292; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1293; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1 1294; CHECK-SD-NEXT: and x8, x1, #0x3 1295; CHECK-SD-NEXT: mov x9, sp 1296; CHECK-SD-NEXT: str x0, [x9, x8, lsl #3] 1297; CHECK-SD-NEXT: ldp q0, q1, [sp], #32 1298; CHECK-SD-NEXT: ret 1299; 1300; CHECK-GI-LABEL: insert_v4i64_c: 1301; CHECK-GI: // %bb.0: // %entry 1302; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1303; CHECK-GI-NEXT: sub x9, sp, #48 1304; CHECK-GI-NEXT: mov x29, sp 1305; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1306; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1307; CHECK-GI-NEXT: .cfi_offset w30, -8 1308; CHECK-GI-NEXT: .cfi_offset w29, -16 1309; CHECK-GI-NEXT: mov w8, w1 1310; CHECK-GI-NEXT: mov x9, sp 1311; CHECK-GI-NEXT: stp q0, q1, [sp] 1312; CHECK-GI-NEXT: and x8, x8, #0x3 1313; CHECK-GI-NEXT: str x0, [x9, x8, lsl #3] 1314; CHECK-GI-NEXT: ldp q0, q1, [sp] 1315; CHECK-GI-NEXT: mov sp, x29 1316; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1317; CHECK-GI-NEXT: ret 1318entry: 1319 %d = insertelement <4 x i64> %a, i64 %b, i32 %c 1320 ret <4 x i64> %d 1321} 1322 1323define double @extract_v2f64_0(<2 x double> %a, i32 %c) { 1324; CHECK-LABEL: extract_v2f64_0: 1325; CHECK: // %bb.0: // %entry 1326; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 1327; CHECK-NEXT: ret 1328entry: 1329 %d = extractelement <2 x double> %a, i32 0 1330 ret double %d 1331} 1332 1333define double @extract_v2f64_1(<2 x double> %a, i32 %c) { 1334; CHECK-LABEL: extract_v2f64_1: 1335; CHECK: // %bb.0: // %entry 1336; CHECK-NEXT: mov d0, v0.d[1] 1337; CHECK-NEXT: ret 1338entry: 1339 %d = extractelement <2 x double> %a, i32 1 1340 ret double %d 1341} 1342 1343define double @extract_v2f64_c(<2 x double> %a, i32 %c) { 1344; CHECK-SD-LABEL: extract_v2f64_c: 1345; CHECK-SD: // %bb.0: // %entry 1346; CHECK-SD-NEXT: sub sp, sp, #16 1347; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1348; CHECK-SD-NEXT: mov x8, sp 1349; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1350; CHECK-SD-NEXT: str q0, [sp] 1351; CHECK-SD-NEXT: bfi x8, x0, #3, #1 1352; CHECK-SD-NEXT: ldr d0, [x8] 1353; CHECK-SD-NEXT: add sp, sp, #16 1354; CHECK-SD-NEXT: ret 1355; 1356; CHECK-GI-LABEL: extract_v2f64_c: 1357; CHECK-GI: // %bb.0: // %entry 1358; CHECK-GI-NEXT: sub sp, sp, #16 1359; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1360; CHECK-GI-NEXT: mov w9, w0 1361; CHECK-GI-NEXT: mov x8, sp 1362; CHECK-GI-NEXT: str q0, [sp] 1363; CHECK-GI-NEXT: and x9, x9, #0x1 1364; CHECK-GI-NEXT: ldr d0, [x8, x9, lsl #3] 1365; CHECK-GI-NEXT: add sp, sp, #16 1366; CHECK-GI-NEXT: ret 1367entry: 1368 %d = extractelement <2 x double> %a, i32 %c 1369 ret double %d 1370} 1371 1372define double @extract_v3f64_0(<3 x double> %a, i32 %c) { 1373; CHECK-LABEL: extract_v3f64_0: 1374; CHECK: // %bb.0: // %entry 1375; CHECK-NEXT: ret 1376entry: 1377 %d = extractelement <3 x double> %a, i32 0 1378 ret double %d 1379} 1380 1381define double @extract_v3f64_2(<3 x double> %a, i32 %c) { 1382; CHECK-LABEL: extract_v3f64_2: 1383; CHECK: // %bb.0: // %entry 1384; CHECK-NEXT: fmov d0, d2 1385; CHECK-NEXT: ret 1386entry: 1387 %d = extractelement <3 x double> %a, i32 2 1388 ret double %d 1389} 1390 1391define double @extract_v3f64_c(<3 x double> %a, i32 %c) { 1392; CHECK-SD-LABEL: extract_v3f64_c: 1393; CHECK-SD: // %bb.0: // %entry 1394; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1395; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1396; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1397; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1398; CHECK-SD-NEXT: and x8, x0, #0x3 1399; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1400; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]! 1401; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1402; CHECK-SD-NEXT: mov x9, sp 1403; CHECK-SD-NEXT: ldr d0, [x9, x8, lsl #3] 1404; CHECK-SD-NEXT: add sp, sp, #32 1405; CHECK-SD-NEXT: ret 1406; 1407; CHECK-GI-LABEL: extract_v3f64_c: 1408; CHECK-GI: // %bb.0: // %entry 1409; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1410; CHECK-GI-NEXT: sub x9, sp, #48 1411; CHECK-GI-NEXT: mov x29, sp 1412; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1413; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1414; CHECK-GI-NEXT: .cfi_offset w30, -8 1415; CHECK-GI-NEXT: .cfi_offset w29, -16 1416; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1417; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1418; CHECK-GI-NEXT: mov w8, w0 1419; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 1420; CHECK-GI-NEXT: mov x9, sp 1421; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1422; CHECK-GI-NEXT: and x8, x8, #0x3 1423; CHECK-GI-NEXT: stp q0, q2, [sp] 1424; CHECK-GI-NEXT: ldr d0, [x9, x8, lsl #3] 1425; CHECK-GI-NEXT: mov sp, x29 1426; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1427; CHECK-GI-NEXT: ret 1428entry: 1429 %d = extractelement <3 x double> %a, i32 %c 1430 ret double %d 1431} 1432 1433define double @extract_v4f64_0(<4 x double> %a, i32 %c) { 1434; CHECK-LABEL: extract_v4f64_0: 1435; CHECK: // %bb.0: // %entry 1436; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 1437; CHECK-NEXT: ret 1438entry: 1439 %d = extractelement <4 x double> %a, i32 0 1440 ret double %d 1441} 1442 1443define double @extract_v4f64_2(<4 x double> %a, i32 %c) { 1444; CHECK-LABEL: extract_v4f64_2: 1445; CHECK: // %bb.0: // %entry 1446; CHECK-NEXT: mov v0.16b, v1.16b 1447; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 1448; CHECK-NEXT: ret 1449entry: 1450 %d = extractelement <4 x double> %a, i32 2 1451 ret double %d 1452} 1453 1454define double @extract_v4f64_c(<4 x double> %a, i32 %c) { 1455; CHECK-SD-LABEL: extract_v4f64_c: 1456; CHECK-SD: // %bb.0: // %entry 1457; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1458; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1459; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1460; CHECK-SD-NEXT: and x8, x0, #0x3 1461; CHECK-SD-NEXT: mov x9, sp 1462; CHECK-SD-NEXT: ldr d0, [x9, x8, lsl #3] 1463; CHECK-SD-NEXT: add sp, sp, #32 1464; CHECK-SD-NEXT: ret 1465; 1466; CHECK-GI-LABEL: extract_v4f64_c: 1467; CHECK-GI: // %bb.0: // %entry 1468; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1469; CHECK-GI-NEXT: sub x9, sp, #48 1470; CHECK-GI-NEXT: mov x29, sp 1471; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1472; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1473; CHECK-GI-NEXT: .cfi_offset w30, -8 1474; CHECK-GI-NEXT: .cfi_offset w29, -16 1475; CHECK-GI-NEXT: mov w8, w0 1476; CHECK-GI-NEXT: stp q0, q1, [sp] 1477; CHECK-GI-NEXT: mov x9, sp 1478; CHECK-GI-NEXT: and x8, x8, #0x3 1479; CHECK-GI-NEXT: ldr d0, [x9, x8, lsl #3] 1480; CHECK-GI-NEXT: mov sp, x29 1481; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1482; CHECK-GI-NEXT: ret 1483entry: 1484 %d = extractelement <4 x double> %a, i32 %c 1485 ret double %d 1486} 1487 1488define float @extract_v2f32_0(<2 x float> %a, i32 %c) { 1489; CHECK-SD-LABEL: extract_v2f32_0: 1490; CHECK-SD: // %bb.0: // %entry 1491; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1492; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 1493; CHECK-SD-NEXT: ret 1494; 1495; CHECK-GI-LABEL: extract_v2f32_0: 1496; CHECK-GI: // %bb.0: // %entry 1497; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $d0 1498; CHECK-GI-NEXT: ret 1499entry: 1500 %d = extractelement <2 x float> %a, i32 0 1501 ret float %d 1502} 1503 1504define float @extract_v2f32_1(<2 x float> %a, i32 %c) { 1505; CHECK-LABEL: extract_v2f32_1: 1506; CHECK: // %bb.0: // %entry 1507; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 1508; CHECK-NEXT: mov s0, v0.s[1] 1509; CHECK-NEXT: ret 1510entry: 1511 %d = extractelement <2 x float> %a, i32 1 1512 ret float %d 1513} 1514 1515define float @extract_v2f32_c(<2 x float> %a, i32 %c) { 1516; CHECK-SD-LABEL: extract_v2f32_c: 1517; CHECK-SD: // %bb.0: // %entry 1518; CHECK-SD-NEXT: sub sp, sp, #16 1519; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1520; CHECK-SD-NEXT: add x8, sp, #8 1521; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1522; CHECK-SD-NEXT: str d0, [sp, #8] 1523; CHECK-SD-NEXT: bfi x8, x0, #2, #1 1524; CHECK-SD-NEXT: ldr s0, [x8] 1525; CHECK-SD-NEXT: add sp, sp, #16 1526; CHECK-SD-NEXT: ret 1527; 1528; CHECK-GI-LABEL: extract_v2f32_c: 1529; CHECK-GI: // %bb.0: // %entry 1530; CHECK-GI-NEXT: sub sp, sp, #16 1531; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1532; CHECK-GI-NEXT: mov w9, w0 1533; CHECK-GI-NEXT: add x8, sp, #8 1534; CHECK-GI-NEXT: str d0, [sp, #8] 1535; CHECK-GI-NEXT: and x9, x9, #0x1 1536; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2] 1537; CHECK-GI-NEXT: add sp, sp, #16 1538; CHECK-GI-NEXT: ret 1539entry: 1540 %d = extractelement <2 x float> %a, i32 %c 1541 ret float %d 1542} 1543 1544define float @extract_v3f32_0(<3 x float> %a, i32 %c) { 1545; CHECK-LABEL: extract_v3f32_0: 1546; CHECK: // %bb.0: // %entry 1547; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 1548; CHECK-NEXT: ret 1549entry: 1550 %d = extractelement <3 x float> %a, i32 0 1551 ret float %d 1552} 1553 1554define float @extract_v3f32_2(<3 x float> %a, i32 %c) { 1555; CHECK-LABEL: extract_v3f32_2: 1556; CHECK: // %bb.0: // %entry 1557; CHECK-NEXT: mov s0, v0.s[2] 1558; CHECK-NEXT: ret 1559entry: 1560 %d = extractelement <3 x float> %a, i32 2 1561 ret float %d 1562} 1563 1564define float @extract_v3f32_c(<3 x float> %a, i32 %c) { 1565; CHECK-SD-LABEL: extract_v3f32_c: 1566; CHECK-SD: // %bb.0: // %entry 1567; CHECK-SD-NEXT: sub sp, sp, #16 1568; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1569; CHECK-SD-NEXT: mov x8, sp 1570; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1571; CHECK-SD-NEXT: str q0, [sp] 1572; CHECK-SD-NEXT: bfi x8, x0, #2, #2 1573; CHECK-SD-NEXT: ldr s0, [x8] 1574; CHECK-SD-NEXT: add sp, sp, #16 1575; CHECK-SD-NEXT: ret 1576; 1577; CHECK-GI-LABEL: extract_v3f32_c: 1578; CHECK-GI: // %bb.0: // %entry 1579; CHECK-GI-NEXT: sub sp, sp, #16 1580; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1581; CHECK-GI-NEXT: mov w9, w0 1582; CHECK-GI-NEXT: mov x8, sp 1583; CHECK-GI-NEXT: str q0, [sp] 1584; CHECK-GI-NEXT: and x9, x9, #0x3 1585; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2] 1586; CHECK-GI-NEXT: add sp, sp, #16 1587; CHECK-GI-NEXT: ret 1588entry: 1589 %d = extractelement <3 x float> %a, i32 %c 1590 ret float %d 1591} 1592 1593define float @extract_v4f32_0(<4 x float> %a, i32 %c) { 1594; CHECK-LABEL: extract_v4f32_0: 1595; CHECK: // %bb.0: // %entry 1596; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 1597; CHECK-NEXT: ret 1598entry: 1599 %d = extractelement <4 x float> %a, i32 0 1600 ret float %d 1601} 1602 1603define float @extract_v4f32_2(<4 x float> %a, i32 %c) { 1604; CHECK-LABEL: extract_v4f32_2: 1605; CHECK: // %bb.0: // %entry 1606; CHECK-NEXT: mov s0, v0.s[2] 1607; CHECK-NEXT: ret 1608entry: 1609 %d = extractelement <4 x float> %a, i32 2 1610 ret float %d 1611} 1612 1613define float @extract_v4f32_c(<4 x float> %a, i32 %c) { 1614; CHECK-SD-LABEL: extract_v4f32_c: 1615; CHECK-SD: // %bb.0: // %entry 1616; CHECK-SD-NEXT: sub sp, sp, #16 1617; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1618; CHECK-SD-NEXT: mov x8, sp 1619; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1620; CHECK-SD-NEXT: str q0, [sp] 1621; CHECK-SD-NEXT: bfi x8, x0, #2, #2 1622; CHECK-SD-NEXT: ldr s0, [x8] 1623; CHECK-SD-NEXT: add sp, sp, #16 1624; CHECK-SD-NEXT: ret 1625; 1626; CHECK-GI-LABEL: extract_v4f32_c: 1627; CHECK-GI: // %bb.0: // %entry 1628; CHECK-GI-NEXT: sub sp, sp, #16 1629; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1630; CHECK-GI-NEXT: mov w9, w0 1631; CHECK-GI-NEXT: mov x8, sp 1632; CHECK-GI-NEXT: str q0, [sp] 1633; CHECK-GI-NEXT: and x9, x9, #0x3 1634; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2] 1635; CHECK-GI-NEXT: add sp, sp, #16 1636; CHECK-GI-NEXT: ret 1637entry: 1638 %d = extractelement <4 x float> %a, i32 %c 1639 ret float %d 1640} 1641 1642define float @extract_v8f32_0(<8 x float> %a, i32 %c) { 1643; CHECK-LABEL: extract_v8f32_0: 1644; CHECK: // %bb.0: // %entry 1645; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 1646; CHECK-NEXT: ret 1647entry: 1648 %d = extractelement <8 x float> %a, i32 0 1649 ret float %d 1650} 1651 1652define float @extract_v8f32_2(<8 x float> %a, i32 %c) { 1653; CHECK-LABEL: extract_v8f32_2: 1654; CHECK: // %bb.0: // %entry 1655; CHECK-NEXT: mov s0, v0.s[2] 1656; CHECK-NEXT: ret 1657entry: 1658 %d = extractelement <8 x float> %a, i32 2 1659 ret float %d 1660} 1661 1662define float @extract_v8f32_c(<8 x float> %a, i32 %c) { 1663; CHECK-SD-LABEL: extract_v8f32_c: 1664; CHECK-SD: // %bb.0: // %entry 1665; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1666; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1667; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1668; CHECK-SD-NEXT: and x8, x0, #0x7 1669; CHECK-SD-NEXT: mov x9, sp 1670; CHECK-SD-NEXT: ldr s0, [x9, x8, lsl #2] 1671; CHECK-SD-NEXT: add sp, sp, #32 1672; CHECK-SD-NEXT: ret 1673; 1674; CHECK-GI-LABEL: extract_v8f32_c: 1675; CHECK-GI: // %bb.0: // %entry 1676; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1677; CHECK-GI-NEXT: sub x9, sp, #48 1678; CHECK-GI-NEXT: mov x29, sp 1679; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1680; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1681; CHECK-GI-NEXT: .cfi_offset w30, -8 1682; CHECK-GI-NEXT: .cfi_offset w29, -16 1683; CHECK-GI-NEXT: mov w8, w0 1684; CHECK-GI-NEXT: stp q0, q1, [sp] 1685; CHECK-GI-NEXT: mov x9, sp 1686; CHECK-GI-NEXT: and x8, x8, #0x7 1687; CHECK-GI-NEXT: ldr s0, [x9, x8, lsl #2] 1688; CHECK-GI-NEXT: mov sp, x29 1689; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1690; CHECK-GI-NEXT: ret 1691entry: 1692 %d = extractelement <8 x float> %a, i32 %c 1693 ret float %d 1694} 1695 1696define half @extract_v4f16_0(<4 x half> %a, i32 %c) { 1697; CHECK-SD-LABEL: extract_v4f16_0: 1698; CHECK-SD: // %bb.0: // %entry 1699; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1700; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $q0 1701; CHECK-SD-NEXT: ret 1702; 1703; CHECK-GI-LABEL: extract_v4f16_0: 1704; CHECK-GI: // %bb.0: // %entry 1705; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $d0 1706; CHECK-GI-NEXT: ret 1707entry: 1708 %d = extractelement <4 x half> %a, i32 0 1709 ret half %d 1710} 1711 1712define half @extract_v4f16_2(<4 x half> %a, i32 %c) { 1713; CHECK-LABEL: extract_v4f16_2: 1714; CHECK: // %bb.0: // %entry 1715; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 1716; CHECK-NEXT: mov h0, v0.h[2] 1717; CHECK-NEXT: ret 1718entry: 1719 %d = extractelement <4 x half> %a, i32 2 1720 ret half %d 1721} 1722 1723define half @extract_v4f16_c(<4 x half> %a, i32 %c) { 1724; CHECK-SD-LABEL: extract_v4f16_c: 1725; CHECK-SD: // %bb.0: // %entry 1726; CHECK-SD-NEXT: sub sp, sp, #16 1727; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1728; CHECK-SD-NEXT: add x8, sp, #8 1729; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1730; CHECK-SD-NEXT: str d0, [sp, #8] 1731; CHECK-SD-NEXT: bfi x8, x0, #1, #2 1732; CHECK-SD-NEXT: ldr h0, [x8] 1733; CHECK-SD-NEXT: add sp, sp, #16 1734; CHECK-SD-NEXT: ret 1735; 1736; CHECK-GI-LABEL: extract_v4f16_c: 1737; CHECK-GI: // %bb.0: // %entry 1738; CHECK-GI-NEXT: sub sp, sp, #16 1739; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1740; CHECK-GI-NEXT: mov w9, w0 1741; CHECK-GI-NEXT: add x8, sp, #8 1742; CHECK-GI-NEXT: str d0, [sp, #8] 1743; CHECK-GI-NEXT: and x9, x9, #0x3 1744; CHECK-GI-NEXT: ldr h0, [x8, x9, lsl #1] 1745; CHECK-GI-NEXT: add sp, sp, #16 1746; CHECK-GI-NEXT: ret 1747entry: 1748 %d = extractelement <4 x half> %a, i32 %c 1749 ret half %d 1750} 1751 1752define half @extract_v8f16_0(<8 x half> %a, i32 %c) { 1753; CHECK-LABEL: extract_v8f16_0: 1754; CHECK: // %bb.0: // %entry 1755; CHECK-NEXT: // kill: def $h0 killed $h0 killed $q0 1756; CHECK-NEXT: ret 1757entry: 1758 %d = extractelement <8 x half> %a, i32 0 1759 ret half %d 1760} 1761 1762define half @extract_v8f16_2(<8 x half> %a, i32 %c) { 1763; CHECK-LABEL: extract_v8f16_2: 1764; CHECK: // %bb.0: // %entry 1765; CHECK-NEXT: mov h0, v0.h[2] 1766; CHECK-NEXT: ret 1767entry: 1768 %d = extractelement <8 x half> %a, i32 2 1769 ret half %d 1770} 1771 1772define half @extract_v8f16_c(<8 x half> %a, i32 %c) { 1773; CHECK-SD-LABEL: extract_v8f16_c: 1774; CHECK-SD: // %bb.0: // %entry 1775; CHECK-SD-NEXT: sub sp, sp, #16 1776; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1777; CHECK-SD-NEXT: mov x8, sp 1778; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1779; CHECK-SD-NEXT: str q0, [sp] 1780; CHECK-SD-NEXT: bfi x8, x0, #1, #3 1781; CHECK-SD-NEXT: ldr h0, [x8] 1782; CHECK-SD-NEXT: add sp, sp, #16 1783; CHECK-SD-NEXT: ret 1784; 1785; CHECK-GI-LABEL: extract_v8f16_c: 1786; CHECK-GI: // %bb.0: // %entry 1787; CHECK-GI-NEXT: sub sp, sp, #16 1788; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1789; CHECK-GI-NEXT: mov w9, w0 1790; CHECK-GI-NEXT: mov x8, sp 1791; CHECK-GI-NEXT: str q0, [sp] 1792; CHECK-GI-NEXT: and x9, x9, #0x7 1793; CHECK-GI-NEXT: ldr h0, [x8, x9, lsl #1] 1794; CHECK-GI-NEXT: add sp, sp, #16 1795; CHECK-GI-NEXT: ret 1796entry: 1797 %d = extractelement <8 x half> %a, i32 %c 1798 ret half %d 1799} 1800 1801define half @extract_v16f16_0(<16 x half> %a, i32 %c) { 1802; CHECK-LABEL: extract_v16f16_0: 1803; CHECK: // %bb.0: // %entry 1804; CHECK-NEXT: // kill: def $h0 killed $h0 killed $q0 1805; CHECK-NEXT: ret 1806entry: 1807 %d = extractelement <16 x half> %a, i32 0 1808 ret half %d 1809} 1810 1811define half @extract_v16f16_2(<16 x half> %a, i32 %c) { 1812; CHECK-LABEL: extract_v16f16_2: 1813; CHECK: // %bb.0: // %entry 1814; CHECK-NEXT: mov h0, v0.h[2] 1815; CHECK-NEXT: ret 1816entry: 1817 %d = extractelement <16 x half> %a, i32 2 1818 ret half %d 1819} 1820 1821define half @extract_v16f16_c(<16 x half> %a, i32 %c) { 1822; CHECK-SD-LABEL: extract_v16f16_c: 1823; CHECK-SD: // %bb.0: // %entry 1824; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1825; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1826; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1827; CHECK-SD-NEXT: and x8, x0, #0xf 1828; CHECK-SD-NEXT: mov x9, sp 1829; CHECK-SD-NEXT: ldr h0, [x9, x8, lsl #1] 1830; CHECK-SD-NEXT: add sp, sp, #32 1831; CHECK-SD-NEXT: ret 1832; 1833; CHECK-GI-LABEL: extract_v16f16_c: 1834; CHECK-GI: // %bb.0: // %entry 1835; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1836; CHECK-GI-NEXT: sub x9, sp, #48 1837; CHECK-GI-NEXT: mov x29, sp 1838; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1839; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1840; CHECK-GI-NEXT: .cfi_offset w30, -8 1841; CHECK-GI-NEXT: .cfi_offset w29, -16 1842; CHECK-GI-NEXT: mov w8, w0 1843; CHECK-GI-NEXT: stp q0, q1, [sp] 1844; CHECK-GI-NEXT: mov x9, sp 1845; CHECK-GI-NEXT: and x8, x8, #0xf 1846; CHECK-GI-NEXT: ldr h0, [x9, x8, lsl #1] 1847; CHECK-GI-NEXT: mov sp, x29 1848; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 1849; CHECK-GI-NEXT: ret 1850entry: 1851 %d = extractelement <16 x half> %a, i32 %c 1852 ret half %d 1853} 1854 1855define i8 @extract_v8i8_0(<8 x i8> %a, i32 %c) { 1856; CHECK-LABEL: extract_v8i8_0: 1857; CHECK: // %bb.0: // %entry 1858; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 1859; CHECK-NEXT: umov w0, v0.b[0] 1860; CHECK-NEXT: ret 1861entry: 1862 %d = extractelement <8 x i8> %a, i32 0 1863 ret i8 %d 1864} 1865 1866define i8 @extract_v8i8_2(<8 x i8> %a, i32 %c) { 1867; CHECK-LABEL: extract_v8i8_2: 1868; CHECK: // %bb.0: // %entry 1869; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 1870; CHECK-NEXT: umov w0, v0.b[2] 1871; CHECK-NEXT: ret 1872entry: 1873 %d = extractelement <8 x i8> %a, i32 2 1874 ret i8 %d 1875} 1876 1877define i8 @extract_v8i8_c(<8 x i8> %a, i32 %c) { 1878; CHECK-SD-LABEL: extract_v8i8_c: 1879; CHECK-SD: // %bb.0: // %entry 1880; CHECK-SD-NEXT: sub sp, sp, #16 1881; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1882; CHECK-SD-NEXT: add x8, sp, #8 1883; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1884; CHECK-SD-NEXT: str d0, [sp, #8] 1885; CHECK-SD-NEXT: bfxil x8, x0, #0, #3 1886; CHECK-SD-NEXT: ldrb w0, [x8] 1887; CHECK-SD-NEXT: add sp, sp, #16 1888; CHECK-SD-NEXT: ret 1889; 1890; CHECK-GI-LABEL: extract_v8i8_c: 1891; CHECK-GI: // %bb.0: // %entry 1892; CHECK-GI-NEXT: sub sp, sp, #16 1893; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1894; CHECK-GI-NEXT: mov w9, w0 1895; CHECK-GI-NEXT: add x8, sp, #8 1896; CHECK-GI-NEXT: str d0, [sp, #8] 1897; CHECK-GI-NEXT: and x9, x9, #0x7 1898; CHECK-GI-NEXT: lsl x10, x9, #1 1899; CHECK-GI-NEXT: sub x9, x10, x9 1900; CHECK-GI-NEXT: ldrb w0, [x8, x9] 1901; CHECK-GI-NEXT: add sp, sp, #16 1902; CHECK-GI-NEXT: ret 1903entry: 1904 %d = extractelement <8 x i8> %a, i32 %c 1905 ret i8 %d 1906} 1907 1908define i8 @extract_v16i8_0(<16 x i8> %a, i32 %c) { 1909; CHECK-LABEL: extract_v16i8_0: 1910; CHECK: // %bb.0: // %entry 1911; CHECK-NEXT: umov w0, v0.b[0] 1912; CHECK-NEXT: ret 1913entry: 1914 %d = extractelement <16 x i8> %a, i32 0 1915 ret i8 %d 1916} 1917 1918define i8 @extract_v16i8_2(<16 x i8> %a, i32 %c) { 1919; CHECK-LABEL: extract_v16i8_2: 1920; CHECK: // %bb.0: // %entry 1921; CHECK-NEXT: umov w0, v0.b[2] 1922; CHECK-NEXT: ret 1923entry: 1924 %d = extractelement <16 x i8> %a, i32 2 1925 ret i8 %d 1926} 1927 1928define i8 @extract_v16i8_c(<16 x i8> %a, i32 %c) { 1929; CHECK-SD-LABEL: extract_v16i8_c: 1930; CHECK-SD: // %bb.0: // %entry 1931; CHECK-SD-NEXT: sub sp, sp, #16 1932; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 1933; CHECK-SD-NEXT: mov x8, sp 1934; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1935; CHECK-SD-NEXT: str q0, [sp] 1936; CHECK-SD-NEXT: bfxil x8, x0, #0, #4 1937; CHECK-SD-NEXT: ldrb w0, [x8] 1938; CHECK-SD-NEXT: add sp, sp, #16 1939; CHECK-SD-NEXT: ret 1940; 1941; CHECK-GI-LABEL: extract_v16i8_c: 1942; CHECK-GI: // %bb.0: // %entry 1943; CHECK-GI-NEXT: sub sp, sp, #16 1944; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 1945; CHECK-GI-NEXT: mov w9, w0 1946; CHECK-GI-NEXT: mov x8, sp 1947; CHECK-GI-NEXT: str q0, [sp] 1948; CHECK-GI-NEXT: and x9, x9, #0xf 1949; CHECK-GI-NEXT: lsl x10, x9, #1 1950; CHECK-GI-NEXT: sub x9, x10, x9 1951; CHECK-GI-NEXT: ldrb w0, [x8, x9] 1952; CHECK-GI-NEXT: add sp, sp, #16 1953; CHECK-GI-NEXT: ret 1954entry: 1955 %d = extractelement <16 x i8> %a, i32 %c 1956 ret i8 %d 1957} 1958 1959define i8 @extract_v32i8_0(<32 x i8> %a, i32 %c) { 1960; CHECK-LABEL: extract_v32i8_0: 1961; CHECK: // %bb.0: // %entry 1962; CHECK-NEXT: umov w0, v0.b[0] 1963; CHECK-NEXT: ret 1964entry: 1965 %d = extractelement <32 x i8> %a, i32 0 1966 ret i8 %d 1967} 1968 1969define i8 @extract_v32i8_2(<32 x i8> %a, i32 %c) { 1970; CHECK-LABEL: extract_v32i8_2: 1971; CHECK: // %bb.0: // %entry 1972; CHECK-NEXT: umov w0, v0.b[2] 1973; CHECK-NEXT: ret 1974entry: 1975 %d = extractelement <32 x i8> %a, i32 2 1976 ret i8 %d 1977} 1978 1979define i8 @extract_v32i8_c(<32 x i8> %a, i32 %c) { 1980; CHECK-SD-LABEL: extract_v32i8_c: 1981; CHECK-SD: // %bb.0: // %entry 1982; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 1983; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1984; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 1985; CHECK-SD-NEXT: and x8, x0, #0x1f 1986; CHECK-SD-NEXT: mov x9, sp 1987; CHECK-SD-NEXT: ldrb w0, [x9, x8] 1988; CHECK-SD-NEXT: add sp, sp, #32 1989; CHECK-SD-NEXT: ret 1990; 1991; CHECK-GI-LABEL: extract_v32i8_c: 1992; CHECK-GI: // %bb.0: // %entry 1993; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 1994; CHECK-GI-NEXT: sub x9, sp, #48 1995; CHECK-GI-NEXT: mov x29, sp 1996; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 1997; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 1998; CHECK-GI-NEXT: .cfi_offset w30, -8 1999; CHECK-GI-NEXT: .cfi_offset w29, -16 2000; CHECK-GI-NEXT: mov w8, w0 2001; CHECK-GI-NEXT: stp q0, q1, [sp] 2002; CHECK-GI-NEXT: mov x10, sp 2003; CHECK-GI-NEXT: and x8, x8, #0x1f 2004; CHECK-GI-NEXT: lsl x9, x8, #1 2005; CHECK-GI-NEXT: sub x8, x9, x8 2006; CHECK-GI-NEXT: ldrb w0, [x10, x8] 2007; CHECK-GI-NEXT: mov sp, x29 2008; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 2009; CHECK-GI-NEXT: ret 2010entry: 2011 %d = extractelement <32 x i8> %a, i32 %c 2012 ret i8 %d 2013} 2014 2015define i16 @extract_v4i16_0(<4 x i16> %a, i32 %c) { 2016; CHECK-LABEL: extract_v4i16_0: 2017; CHECK: // %bb.0: // %entry 2018; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2019; CHECK-NEXT: umov w0, v0.h[0] 2020; CHECK-NEXT: ret 2021entry: 2022 %d = extractelement <4 x i16> %a, i32 0 2023 ret i16 %d 2024} 2025 2026define i16 @extract_v4i16_2(<4 x i16> %a, i32 %c) { 2027; CHECK-LABEL: extract_v4i16_2: 2028; CHECK: // %bb.0: // %entry 2029; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2030; CHECK-NEXT: umov w0, v0.h[2] 2031; CHECK-NEXT: ret 2032entry: 2033 %d = extractelement <4 x i16> %a, i32 2 2034 ret i16 %d 2035} 2036 2037define i16 @extract_v4i16_c(<4 x i16> %a, i32 %c) { 2038; CHECK-SD-LABEL: extract_v4i16_c: 2039; CHECK-SD: // %bb.0: // %entry 2040; CHECK-SD-NEXT: sub sp, sp, #16 2041; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2042; CHECK-SD-NEXT: add x8, sp, #8 2043; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2044; CHECK-SD-NEXT: str d0, [sp, #8] 2045; CHECK-SD-NEXT: bfi x8, x0, #1, #2 2046; CHECK-SD-NEXT: ldrh w0, [x8] 2047; CHECK-SD-NEXT: add sp, sp, #16 2048; CHECK-SD-NEXT: ret 2049; 2050; CHECK-GI-LABEL: extract_v4i16_c: 2051; CHECK-GI: // %bb.0: // %entry 2052; CHECK-GI-NEXT: sub sp, sp, #16 2053; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2054; CHECK-GI-NEXT: mov w9, w0 2055; CHECK-GI-NEXT: add x8, sp, #8 2056; CHECK-GI-NEXT: str d0, [sp, #8] 2057; CHECK-GI-NEXT: and x9, x9, #0x3 2058; CHECK-GI-NEXT: ldrh w0, [x8, x9, lsl #1] 2059; CHECK-GI-NEXT: add sp, sp, #16 2060; CHECK-GI-NEXT: ret 2061entry: 2062 %d = extractelement <4 x i16> %a, i32 %c 2063 ret i16 %d 2064} 2065 2066define i16 @extract_v8i16_0(<8 x i16> %a, i32 %c) { 2067; CHECK-LABEL: extract_v8i16_0: 2068; CHECK: // %bb.0: // %entry 2069; CHECK-NEXT: umov w0, v0.h[0] 2070; CHECK-NEXT: ret 2071entry: 2072 %d = extractelement <8 x i16> %a, i32 0 2073 ret i16 %d 2074} 2075 2076define i16 @extract_v8i16_2(<8 x i16> %a, i32 %c) { 2077; CHECK-LABEL: extract_v8i16_2: 2078; CHECK: // %bb.0: // %entry 2079; CHECK-NEXT: umov w0, v0.h[2] 2080; CHECK-NEXT: ret 2081entry: 2082 %d = extractelement <8 x i16> %a, i32 2 2083 ret i16 %d 2084} 2085 2086define i16 @extract_v8i16_c(<8 x i16> %a, i32 %c) { 2087; CHECK-SD-LABEL: extract_v8i16_c: 2088; CHECK-SD: // %bb.0: // %entry 2089; CHECK-SD-NEXT: sub sp, sp, #16 2090; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2091; CHECK-SD-NEXT: mov x8, sp 2092; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2093; CHECK-SD-NEXT: str q0, [sp] 2094; CHECK-SD-NEXT: bfi x8, x0, #1, #3 2095; CHECK-SD-NEXT: ldrh w0, [x8] 2096; CHECK-SD-NEXT: add sp, sp, #16 2097; CHECK-SD-NEXT: ret 2098; 2099; CHECK-GI-LABEL: extract_v8i16_c: 2100; CHECK-GI: // %bb.0: // %entry 2101; CHECK-GI-NEXT: sub sp, sp, #16 2102; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2103; CHECK-GI-NEXT: mov w9, w0 2104; CHECK-GI-NEXT: mov x8, sp 2105; CHECK-GI-NEXT: str q0, [sp] 2106; CHECK-GI-NEXT: and x9, x9, #0x7 2107; CHECK-GI-NEXT: ldrh w0, [x8, x9, lsl #1] 2108; CHECK-GI-NEXT: add sp, sp, #16 2109; CHECK-GI-NEXT: ret 2110entry: 2111 %d = extractelement <8 x i16> %a, i32 %c 2112 ret i16 %d 2113} 2114 2115define i16 @extract_v16i16_0(<16 x i16> %a, i32 %c) { 2116; CHECK-LABEL: extract_v16i16_0: 2117; CHECK: // %bb.0: // %entry 2118; CHECK-NEXT: umov w0, v0.h[0] 2119; CHECK-NEXT: ret 2120entry: 2121 %d = extractelement <16 x i16> %a, i32 0 2122 ret i16 %d 2123} 2124 2125define i16 @extract_v16i16_2(<16 x i16> %a, i32 %c) { 2126; CHECK-LABEL: extract_v16i16_2: 2127; CHECK: // %bb.0: // %entry 2128; CHECK-NEXT: umov w0, v0.h[2] 2129; CHECK-NEXT: ret 2130entry: 2131 %d = extractelement <16 x i16> %a, i32 2 2132 ret i16 %d 2133} 2134 2135define i16 @extract_v16i16_c(<16 x i16> %a, i32 %c) { 2136; CHECK-SD-LABEL: extract_v16i16_c: 2137; CHECK-SD: // %bb.0: // %entry 2138; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 2139; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 2140; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2141; CHECK-SD-NEXT: and x8, x0, #0xf 2142; CHECK-SD-NEXT: mov x9, sp 2143; CHECK-SD-NEXT: ldrh w0, [x9, x8, lsl #1] 2144; CHECK-SD-NEXT: add sp, sp, #32 2145; CHECK-SD-NEXT: ret 2146; 2147; CHECK-GI-LABEL: extract_v16i16_c: 2148; CHECK-GI: // %bb.0: // %entry 2149; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 2150; CHECK-GI-NEXT: sub x9, sp, #48 2151; CHECK-GI-NEXT: mov x29, sp 2152; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 2153; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 2154; CHECK-GI-NEXT: .cfi_offset w30, -8 2155; CHECK-GI-NEXT: .cfi_offset w29, -16 2156; CHECK-GI-NEXT: mov w8, w0 2157; CHECK-GI-NEXT: stp q0, q1, [sp] 2158; CHECK-GI-NEXT: mov x9, sp 2159; CHECK-GI-NEXT: and x8, x8, #0xf 2160; CHECK-GI-NEXT: ldrh w0, [x9, x8, lsl #1] 2161; CHECK-GI-NEXT: mov sp, x29 2162; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 2163; CHECK-GI-NEXT: ret 2164entry: 2165 %d = extractelement <16 x i16> %a, i32 %c 2166 ret i16 %d 2167} 2168 2169define i32 @extract_v2i32_0(<2 x i32> %a, i32 %c) { 2170; CHECK-SD-LABEL: extract_v2i32_0: 2171; CHECK-SD: // %bb.0: // %entry 2172; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 2173; CHECK-SD-NEXT: fmov w0, s0 2174; CHECK-SD-NEXT: ret 2175; 2176; CHECK-GI-LABEL: extract_v2i32_0: 2177; CHECK-GI: // %bb.0: // %entry 2178; CHECK-GI-NEXT: fmov w0, s0 2179; CHECK-GI-NEXT: ret 2180entry: 2181 %d = extractelement <2 x i32> %a, i32 0 2182 ret i32 %d 2183} 2184 2185define i32 @extract_v2i32_1(<2 x i32> %a, i32 %c) { 2186; CHECK-SD-LABEL: extract_v2i32_1: 2187; CHECK-SD: // %bb.0: // %entry 2188; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 2189; CHECK-SD-NEXT: mov w0, v0.s[1] 2190; CHECK-SD-NEXT: ret 2191; 2192; CHECK-GI-LABEL: extract_v2i32_1: 2193; CHECK-GI: // %bb.0: // %entry 2194; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 2195; CHECK-GI-NEXT: mov s0, v0.s[1] 2196; CHECK-GI-NEXT: fmov w0, s0 2197; CHECK-GI-NEXT: ret 2198entry: 2199 %d = extractelement <2 x i32> %a, i32 1 2200 ret i32 %d 2201} 2202 2203define i32 @extract_v2i32_c(<2 x i32> %a, i32 %c) { 2204; CHECK-SD-LABEL: extract_v2i32_c: 2205; CHECK-SD: // %bb.0: // %entry 2206; CHECK-SD-NEXT: sub sp, sp, #16 2207; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2208; CHECK-SD-NEXT: add x8, sp, #8 2209; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2210; CHECK-SD-NEXT: str d0, [sp, #8] 2211; CHECK-SD-NEXT: bfi x8, x0, #2, #1 2212; CHECK-SD-NEXT: ldr w0, [x8] 2213; CHECK-SD-NEXT: add sp, sp, #16 2214; CHECK-SD-NEXT: ret 2215; 2216; CHECK-GI-LABEL: extract_v2i32_c: 2217; CHECK-GI: // %bb.0: // %entry 2218; CHECK-GI-NEXT: sub sp, sp, #16 2219; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2220; CHECK-GI-NEXT: mov w9, w0 2221; CHECK-GI-NEXT: add x8, sp, #8 2222; CHECK-GI-NEXT: str d0, [sp, #8] 2223; CHECK-GI-NEXT: and x9, x9, #0x1 2224; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2] 2225; CHECK-GI-NEXT: add sp, sp, #16 2226; CHECK-GI-NEXT: ret 2227entry: 2228 %d = extractelement <2 x i32> %a, i32 %c 2229 ret i32 %d 2230} 2231 2232define i32 @extract_v3i32_0(<3 x i32> %a, i32 %c) { 2233; CHECK-LABEL: extract_v3i32_0: 2234; CHECK: // %bb.0: // %entry 2235; CHECK-NEXT: fmov w0, s0 2236; CHECK-NEXT: ret 2237entry: 2238 %d = extractelement <3 x i32> %a, i32 0 2239 ret i32 %d 2240} 2241 2242define i32 @extract_v3i32_2(<3 x i32> %a, i32 %c) { 2243; CHECK-SD-LABEL: extract_v3i32_2: 2244; CHECK-SD: // %bb.0: // %entry 2245; CHECK-SD-NEXT: mov w0, v0.s[2] 2246; CHECK-SD-NEXT: ret 2247; 2248; CHECK-GI-LABEL: extract_v3i32_2: 2249; CHECK-GI: // %bb.0: // %entry 2250; CHECK-GI-NEXT: mov s0, v0.s[2] 2251; CHECK-GI-NEXT: fmov w0, s0 2252; CHECK-GI-NEXT: ret 2253entry: 2254 %d = extractelement <3 x i32> %a, i32 2 2255 ret i32 %d 2256} 2257 2258define i32 @extract_v3i32_c(<3 x i32> %a, i32 %c) { 2259; CHECK-SD-LABEL: extract_v3i32_c: 2260; CHECK-SD: // %bb.0: // %entry 2261; CHECK-SD-NEXT: sub sp, sp, #16 2262; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2263; CHECK-SD-NEXT: mov x8, sp 2264; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2265; CHECK-SD-NEXT: str q0, [sp] 2266; CHECK-SD-NEXT: bfi x8, x0, #2, #2 2267; CHECK-SD-NEXT: ldr w0, [x8] 2268; CHECK-SD-NEXT: add sp, sp, #16 2269; CHECK-SD-NEXT: ret 2270; 2271; CHECK-GI-LABEL: extract_v3i32_c: 2272; CHECK-GI: // %bb.0: // %entry 2273; CHECK-GI-NEXT: sub sp, sp, #16 2274; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2275; CHECK-GI-NEXT: mov w9, w0 2276; CHECK-GI-NEXT: mov x8, sp 2277; CHECK-GI-NEXT: str q0, [sp] 2278; CHECK-GI-NEXT: and x9, x9, #0x3 2279; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2] 2280; CHECK-GI-NEXT: add sp, sp, #16 2281; CHECK-GI-NEXT: ret 2282entry: 2283 %d = extractelement <3 x i32> %a, i32 %c 2284 ret i32 %d 2285} 2286 2287define i32 @extract_v4i32_0(<4 x i32> %a, i32 %c) { 2288; CHECK-LABEL: extract_v4i32_0: 2289; CHECK: // %bb.0: // %entry 2290; CHECK-NEXT: fmov w0, s0 2291; CHECK-NEXT: ret 2292entry: 2293 %d = extractelement <4 x i32> %a, i32 0 2294 ret i32 %d 2295} 2296 2297define i32 @extract_v4i32_2(<4 x i32> %a, i32 %c) { 2298; CHECK-SD-LABEL: extract_v4i32_2: 2299; CHECK-SD: // %bb.0: // %entry 2300; CHECK-SD-NEXT: mov w0, v0.s[2] 2301; CHECK-SD-NEXT: ret 2302; 2303; CHECK-GI-LABEL: extract_v4i32_2: 2304; CHECK-GI: // %bb.0: // %entry 2305; CHECK-GI-NEXT: mov s0, v0.s[2] 2306; CHECK-GI-NEXT: fmov w0, s0 2307; CHECK-GI-NEXT: ret 2308entry: 2309 %d = extractelement <4 x i32> %a, i32 2 2310 ret i32 %d 2311} 2312 2313define i32 @extract_v4i32_c(<4 x i32> %a, i32 %c) { 2314; CHECK-SD-LABEL: extract_v4i32_c: 2315; CHECK-SD: // %bb.0: // %entry 2316; CHECK-SD-NEXT: sub sp, sp, #16 2317; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2318; CHECK-SD-NEXT: mov x8, sp 2319; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2320; CHECK-SD-NEXT: str q0, [sp] 2321; CHECK-SD-NEXT: bfi x8, x0, #2, #2 2322; CHECK-SD-NEXT: ldr w0, [x8] 2323; CHECK-SD-NEXT: add sp, sp, #16 2324; CHECK-SD-NEXT: ret 2325; 2326; CHECK-GI-LABEL: extract_v4i32_c: 2327; CHECK-GI: // %bb.0: // %entry 2328; CHECK-GI-NEXT: sub sp, sp, #16 2329; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2330; CHECK-GI-NEXT: mov w9, w0 2331; CHECK-GI-NEXT: mov x8, sp 2332; CHECK-GI-NEXT: str q0, [sp] 2333; CHECK-GI-NEXT: and x9, x9, #0x3 2334; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2] 2335; CHECK-GI-NEXT: add sp, sp, #16 2336; CHECK-GI-NEXT: ret 2337entry: 2338 %d = extractelement <4 x i32> %a, i32 %c 2339 ret i32 %d 2340} 2341 2342define i32 @extract_v8i32_0(<8 x i32> %a, i32 %c) { 2343; CHECK-LABEL: extract_v8i32_0: 2344; CHECK: // %bb.0: // %entry 2345; CHECK-NEXT: fmov w0, s0 2346; CHECK-NEXT: ret 2347entry: 2348 %d = extractelement <8 x i32> %a, i32 0 2349 ret i32 %d 2350} 2351 2352define i32 @extract_v8i32_2(<8 x i32> %a, i32 %c) { 2353; CHECK-SD-LABEL: extract_v8i32_2: 2354; CHECK-SD: // %bb.0: // %entry 2355; CHECK-SD-NEXT: mov w0, v0.s[2] 2356; CHECK-SD-NEXT: ret 2357; 2358; CHECK-GI-LABEL: extract_v8i32_2: 2359; CHECK-GI: // %bb.0: // %entry 2360; CHECK-GI-NEXT: mov s0, v0.s[2] 2361; CHECK-GI-NEXT: fmov w0, s0 2362; CHECK-GI-NEXT: ret 2363entry: 2364 %d = extractelement <8 x i32> %a, i32 2 2365 ret i32 %d 2366} 2367 2368define i32 @extract_v8i32_c(<8 x i32> %a, i32 %c) { 2369; CHECK-SD-LABEL: extract_v8i32_c: 2370; CHECK-SD: // %bb.0: // %entry 2371; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 2372; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 2373; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2374; CHECK-SD-NEXT: and x8, x0, #0x7 2375; CHECK-SD-NEXT: mov x9, sp 2376; CHECK-SD-NEXT: ldr w0, [x9, x8, lsl #2] 2377; CHECK-SD-NEXT: add sp, sp, #32 2378; CHECK-SD-NEXT: ret 2379; 2380; CHECK-GI-LABEL: extract_v8i32_c: 2381; CHECK-GI: // %bb.0: // %entry 2382; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 2383; CHECK-GI-NEXT: sub x9, sp, #48 2384; CHECK-GI-NEXT: mov x29, sp 2385; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 2386; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 2387; CHECK-GI-NEXT: .cfi_offset w30, -8 2388; CHECK-GI-NEXT: .cfi_offset w29, -16 2389; CHECK-GI-NEXT: mov w8, w0 2390; CHECK-GI-NEXT: stp q0, q1, [sp] 2391; CHECK-GI-NEXT: mov x9, sp 2392; CHECK-GI-NEXT: and x8, x8, #0x7 2393; CHECK-GI-NEXT: ldr w0, [x9, x8, lsl #2] 2394; CHECK-GI-NEXT: mov sp, x29 2395; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 2396; CHECK-GI-NEXT: ret 2397entry: 2398 %d = extractelement <8 x i32> %a, i32 %c 2399 ret i32 %d 2400} 2401 2402define i64 @extract_v2i64_0(<2 x i64> %a, i32 %c) { 2403; CHECK-LABEL: extract_v2i64_0: 2404; CHECK: // %bb.0: // %entry 2405; CHECK-NEXT: fmov x0, d0 2406; CHECK-NEXT: ret 2407entry: 2408 %d = extractelement <2 x i64> %a, i32 0 2409 ret i64 %d 2410} 2411 2412define i64 @extract_v2i64_1(<2 x i64> %a, i32 %c) { 2413; CHECK-SD-LABEL: extract_v2i64_1: 2414; CHECK-SD: // %bb.0: // %entry 2415; CHECK-SD-NEXT: mov x0, v0.d[1] 2416; CHECK-SD-NEXT: ret 2417; 2418; CHECK-GI-LABEL: extract_v2i64_1: 2419; CHECK-GI: // %bb.0: // %entry 2420; CHECK-GI-NEXT: mov d0, v0.d[1] 2421; CHECK-GI-NEXT: fmov x0, d0 2422; CHECK-GI-NEXT: ret 2423entry: 2424 %d = extractelement <2 x i64> %a, i32 1 2425 ret i64 %d 2426} 2427 2428define i64 @extract_v2i64_c(<2 x i64> %a, i32 %c) { 2429; CHECK-SD-LABEL: extract_v2i64_c: 2430; CHECK-SD: // %bb.0: // %entry 2431; CHECK-SD-NEXT: sub sp, sp, #16 2432; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 2433; CHECK-SD-NEXT: mov x8, sp 2434; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2435; CHECK-SD-NEXT: str q0, [sp] 2436; CHECK-SD-NEXT: bfi x8, x0, #3, #1 2437; CHECK-SD-NEXT: ldr x0, [x8] 2438; CHECK-SD-NEXT: add sp, sp, #16 2439; CHECK-SD-NEXT: ret 2440; 2441; CHECK-GI-LABEL: extract_v2i64_c: 2442; CHECK-GI: // %bb.0: // %entry 2443; CHECK-GI-NEXT: sub sp, sp, #16 2444; CHECK-GI-NEXT: .cfi_def_cfa_offset 16 2445; CHECK-GI-NEXT: mov w9, w0 2446; CHECK-GI-NEXT: mov x8, sp 2447; CHECK-GI-NEXT: str q0, [sp] 2448; CHECK-GI-NEXT: and x9, x9, #0x1 2449; CHECK-GI-NEXT: ldr x0, [x8, x9, lsl #3] 2450; CHECK-GI-NEXT: add sp, sp, #16 2451; CHECK-GI-NEXT: ret 2452entry: 2453 %d = extractelement <2 x i64> %a, i32 %c 2454 ret i64 %d 2455} 2456 2457define i64 @extract_v3i64_0(<3 x i64> %a, i32 %c) { 2458; CHECK-SD-LABEL: extract_v3i64_0: 2459; CHECK-SD: // %bb.0: // %entry 2460; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 2461; CHECK-SD-NEXT: fmov x0, d0 2462; CHECK-SD-NEXT: ret 2463; 2464; CHECK-GI-LABEL: extract_v3i64_0: 2465; CHECK-GI: // %bb.0: // %entry 2466; CHECK-GI-NEXT: fmov x0, d0 2467; CHECK-GI-NEXT: ret 2468entry: 2469 %d = extractelement <3 x i64> %a, i32 0 2470 ret i64 %d 2471} 2472 2473define i64 @extract_v3i64_2(<3 x i64> %a, i32 %c) { 2474; CHECK-SD-LABEL: extract_v3i64_2: 2475; CHECK-SD: // %bb.0: // %entry 2476; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 2477; CHECK-SD-NEXT: fmov x0, d2 2478; CHECK-SD-NEXT: ret 2479; 2480; CHECK-GI-LABEL: extract_v3i64_2: 2481; CHECK-GI: // %bb.0: // %entry 2482; CHECK-GI-NEXT: fmov x0, d2 2483; CHECK-GI-NEXT: ret 2484entry: 2485 %d = extractelement <3 x i64> %a, i32 2 2486 ret i64 %d 2487} 2488 2489define i64 @extract_v3i64_c(<3 x i64> %a, i32 %c) { 2490; CHECK-SD-LABEL: extract_v3i64_c: 2491; CHECK-SD: // %bb.0: // %entry 2492; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 2493; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 2494; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2495; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 2496; CHECK-SD-NEXT: and x8, x0, #0x3 2497; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 2498; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]! 2499; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 2500; CHECK-SD-NEXT: mov x9, sp 2501; CHECK-SD-NEXT: ldr x0, [x9, x8, lsl #3] 2502; CHECK-SD-NEXT: add sp, sp, #32 2503; CHECK-SD-NEXT: ret 2504; 2505; CHECK-GI-LABEL: extract_v3i64_c: 2506; CHECK-GI: // %bb.0: // %entry 2507; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 2508; CHECK-GI-NEXT: sub x9, sp, #48 2509; CHECK-GI-NEXT: mov x29, sp 2510; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 2511; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 2512; CHECK-GI-NEXT: .cfi_offset w30, -8 2513; CHECK-GI-NEXT: .cfi_offset w29, -16 2514; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 2515; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 2516; CHECK-GI-NEXT: mov w8, w0 2517; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 2518; CHECK-GI-NEXT: mov x9, sp 2519; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 2520; CHECK-GI-NEXT: and x8, x8, #0x3 2521; CHECK-GI-NEXT: stp q0, q2, [sp] 2522; CHECK-GI-NEXT: ldr x0, [x9, x8, lsl #3] 2523; CHECK-GI-NEXT: mov sp, x29 2524; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 2525; CHECK-GI-NEXT: ret 2526entry: 2527 %d = extractelement <3 x i64> %a, i32 %c 2528 ret i64 %d 2529} 2530 2531define i64 @extract_v4i64_0(<4 x i64> %a, i32 %c) { 2532; CHECK-LABEL: extract_v4i64_0: 2533; CHECK: // %bb.0: // %entry 2534; CHECK-NEXT: fmov x0, d0 2535; CHECK-NEXT: ret 2536entry: 2537 %d = extractelement <4 x i64> %a, i32 0 2538 ret i64 %d 2539} 2540 2541define i64 @extract_v4i64_2(<4 x i64> %a, i32 %c) { 2542; CHECK-LABEL: extract_v4i64_2: 2543; CHECK: // %bb.0: // %entry 2544; CHECK-NEXT: fmov x0, d1 2545; CHECK-NEXT: ret 2546entry: 2547 %d = extractelement <4 x i64> %a, i32 2 2548 ret i64 %d 2549} 2550 2551define i64 @extract_v4i64_c(<4 x i64> %a, i32 %c) { 2552; CHECK-SD-LABEL: extract_v4i64_c: 2553; CHECK-SD: // %bb.0: // %entry 2554; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]! 2555; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 2556; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0 2557; CHECK-SD-NEXT: and x8, x0, #0x3 2558; CHECK-SD-NEXT: mov x9, sp 2559; CHECK-SD-NEXT: ldr x0, [x9, x8, lsl #3] 2560; CHECK-SD-NEXT: add sp, sp, #32 2561; CHECK-SD-NEXT: ret 2562; 2563; CHECK-GI-LABEL: extract_v4i64_c: 2564; CHECK-GI: // %bb.0: // %entry 2565; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill 2566; CHECK-GI-NEXT: sub x9, sp, #48 2567; CHECK-GI-NEXT: mov x29, sp 2568; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0 2569; CHECK-GI-NEXT: .cfi_def_cfa w29, 16 2570; CHECK-GI-NEXT: .cfi_offset w30, -8 2571; CHECK-GI-NEXT: .cfi_offset w29, -16 2572; CHECK-GI-NEXT: mov w8, w0 2573; CHECK-GI-NEXT: stp q0, q1, [sp] 2574; CHECK-GI-NEXT: mov x9, sp 2575; CHECK-GI-NEXT: and x8, x8, #0x3 2576; CHECK-GI-NEXT: ldr x0, [x9, x8, lsl #3] 2577; CHECK-GI-NEXT: mov sp, x29 2578; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload 2579; CHECK-GI-NEXT: ret 2580entry: 2581 %d = extractelement <4 x i64> %a, i32 %c 2582 ret i64 %d 2583} 2584