2966 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 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: // %entry8; CHECK-NEXT: // kill: def $d1 killed $d1 def $q19; CHECK-NEXT: mov v0.d[0], v1.d[0]10; CHECK-NEXT: ret11entry:12 %d = insertelement <2 x double> %a, double %b, i32 013 ret <2 x double> %d14}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: // %entry19; CHECK-NEXT: // kill: def $d1 killed $d1 def $q120; CHECK-NEXT: mov v0.d[1], v1.d[0]21; CHECK-NEXT: ret22entry:23 %d = insertelement <2 x double> %a, double %b, i32 124 ret <2 x double> %d25}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: // %entry30; CHECK-SD-NEXT: sub sp, sp, #1631; CHECK-SD-NEXT: .cfi_def_cfa_offset 1632; CHECK-SD-NEXT: mov x8, sp33; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x034; CHECK-SD-NEXT: str q0, [sp]35; CHECK-SD-NEXT: bfi x8, x0, #3, #136; CHECK-SD-NEXT: str d1, [x8]37; CHECK-SD-NEXT: ldr q0, [sp], #1638; CHECK-SD-NEXT: ret39;40; CHECK-GI-LABEL: insert_v2f64_c:41; CHECK-GI: // %bb.0: // %entry42; CHECK-GI-NEXT: sub sp, sp, #1643; CHECK-GI-NEXT: .cfi_def_cfa_offset 1644; CHECK-GI-NEXT: mov w9, w045; CHECK-GI-NEXT: mov x8, sp46; CHECK-GI-NEXT: str q0, [sp]47; CHECK-GI-NEXT: and x9, x9, #0x148; CHECK-GI-NEXT: str d1, [x8, x9, lsl #3]49; CHECK-GI-NEXT: ldr q0, [sp], #1650; CHECK-GI-NEXT: ret51entry:52 %d = insertelement <2 x double> %a, double %b, i32 %c53 ret <2 x double> %d54}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: // %entry59; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q160; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]61; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q362; CHECK-SD-NEXT: mov v0.d[0], v3.d[0]63; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #864; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q065; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q166; CHECK-SD-NEXT: ret67;68; CHECK-GI-LABEL: insert_v3f64_0:69; CHECK-GI: // %bb.0: // %entry70; CHECK-GI-NEXT: fmov d0, d371; CHECK-GI-NEXT: ret72entry:73 %d = insertelement <3 x double> %a, double %b, i32 074 ret <3 x double> %d75}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: // %entry80; CHECK-NEXT: fmov d2, d381; CHECK-NEXT: ret82entry:83 %d = insertelement <3 x double> %a, double %b, i32 284 ret <3 x double> %d85}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: // %entry90; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q091; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q192; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x093; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q294; 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 3297; CHECK-SD-NEXT: mov x8, sp98; CHECK-SD-NEXT: and x9, x0, #0x399; 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, #8103; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0104; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1105; CHECK-SD-NEXT: add sp, sp, #32106; CHECK-SD-NEXT: ret107;108; CHECK-GI-LABEL: insert_v3f64_c:109; CHECK-GI: // %bb.0: // %entry110; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill111; CHECK-GI-NEXT: sub x9, sp, #48112; CHECK-GI-NEXT: mov x29, sp113; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0114; CHECK-GI-NEXT: .cfi_def_cfa w29, 16115; CHECK-GI-NEXT: .cfi_offset w30, -8116; CHECK-GI-NEXT: .cfi_offset w29, -16117; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0118; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1119; CHECK-GI-NEXT: mov w8, w0120; CHECK-GI-NEXT: mov x9, sp121; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2122; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]123; CHECK-GI-NEXT: and x8, x8, #0x3124; 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 $q2128; CHECK-GI-NEXT: mov d1, v0.d[1]129; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0130; CHECK-GI-NEXT: mov sp, x29131; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload132; CHECK-GI-NEXT: ret133entry:134 %d = insertelement <3 x double> %a, double %b, i32 %c135 ret <3 x double> %d136}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: // %entry141; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2142; CHECK-NEXT: mov v0.d[0], v2.d[0]143; CHECK-NEXT: ret144entry:145 %d = insertelement <4 x double> %a, double %b, i32 0146 ret <4 x double> %d147}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: // %entry152; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2153; CHECK-NEXT: mov v1.d[0], v2.d[0]154; CHECK-NEXT: ret155entry:156 %d = insertelement <4 x double> %a, double %b, i32 2157 ret <4 x double> %d158}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: // %entry163; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!164; CHECK-SD-NEXT: .cfi_def_cfa_offset 32165; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0166; CHECK-SD-NEXT: and x8, x0, #0x3167; CHECK-SD-NEXT: mov x9, sp168; CHECK-SD-NEXT: str d2, [x9, x8, lsl #3]169; CHECK-SD-NEXT: ldp q0, q1, [sp], #32170; CHECK-SD-NEXT: ret171;172; CHECK-GI-LABEL: insert_v4f64_c:173; CHECK-GI: // %bb.0: // %entry174; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill175; CHECK-GI-NEXT: sub x9, sp, #48176; CHECK-GI-NEXT: mov x29, sp177; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0178; CHECK-GI-NEXT: .cfi_def_cfa w29, 16179; CHECK-GI-NEXT: .cfi_offset w30, -8180; CHECK-GI-NEXT: .cfi_offset w29, -16181; CHECK-GI-NEXT: mov w8, w0182; CHECK-GI-NEXT: mov x9, sp183; CHECK-GI-NEXT: stp q0, q1, [sp]184; CHECK-GI-NEXT: and x8, x8, #0x3185; CHECK-GI-NEXT: str d2, [x9, x8, lsl #3]186; CHECK-GI-NEXT: ldp q0, q1, [sp]187; CHECK-GI-NEXT: mov sp, x29188; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload189; CHECK-GI-NEXT: ret190entry:191 %d = insertelement <4 x double> %a, double %b, i32 %c192 ret <4 x double> %d193}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: // %entry198; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0199; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1200; CHECK-NEXT: mov v0.s[0], v1.s[0]201; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0202; CHECK-NEXT: ret203entry:204 %d = insertelement <2 x float> %a, float %b, i32 0205 ret <2 x float> %d206}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: // %entry211; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0212; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1213; CHECK-NEXT: mov v0.s[1], v1.s[0]214; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0215; CHECK-NEXT: ret216entry:217 %d = insertelement <2 x float> %a, float %b, i32 1218 ret <2 x float> %d219}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: // %entry224; CHECK-SD-NEXT: sub sp, sp, #16225; CHECK-SD-NEXT: .cfi_def_cfa_offset 16226; CHECK-SD-NEXT: add x8, sp, #8227; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0228; CHECK-SD-NEXT: str d0, [sp, #8]229; CHECK-SD-NEXT: bfi x8, x0, #2, #1230; CHECK-SD-NEXT: str s1, [x8]231; CHECK-SD-NEXT: ldr d0, [sp, #8]232; CHECK-SD-NEXT: add sp, sp, #16233; CHECK-SD-NEXT: ret234;235; CHECK-GI-LABEL: insert_v2f32_c:236; CHECK-GI: // %bb.0: // %entry237; CHECK-GI-NEXT: sub sp, sp, #16238; CHECK-GI-NEXT: .cfi_def_cfa_offset 16239; CHECK-GI-NEXT: mov w9, w0240; CHECK-GI-NEXT: add x8, sp, #8241; CHECK-GI-NEXT: str d0, [sp, #8]242; CHECK-GI-NEXT: and x9, x9, #0x1243; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2]244; CHECK-GI-NEXT: ldr d0, [sp, #8]245; CHECK-GI-NEXT: add sp, sp, #16246; CHECK-GI-NEXT: ret247entry:248 %d = insertelement <2 x float> %a, float %b, i32 %c249 ret <2 x float> %d250}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: // %entry255; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1256; 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.16b259; CHECK-NEXT: ret260entry:261 %d = insertelement <3 x float> %a, float %b, i32 0262 ret <3 x float> %d263}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: // %entry268; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1269; CHECK-SD-NEXT: mov v0.s[2], v1.s[0]270; CHECK-SD-NEXT: ret271;272; CHECK-GI-LABEL: insert_v3f32_2:273; CHECK-GI: // %bb.0: // %entry274; CHECK-GI-NEXT: mov s2, v0.s[0]275; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1276; 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.16b279; CHECK-GI-NEXT: ret280entry:281 %d = insertelement <3 x float> %a, float %b, i32 2282 ret <3 x float> %d283}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: // %entry288; CHECK-SD-NEXT: sub sp, sp, #16289; CHECK-SD-NEXT: .cfi_def_cfa_offset 16290; CHECK-SD-NEXT: mov x8, sp291; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0292; CHECK-SD-NEXT: str q0, [sp]293; CHECK-SD-NEXT: bfi x8, x0, #2, #2294; CHECK-SD-NEXT: str s1, [x8]295; CHECK-SD-NEXT: ldr q0, [sp], #16296; CHECK-SD-NEXT: ret297;298; CHECK-GI-LABEL: insert_v3f32_c:299; CHECK-GI: // %bb.0: // %entry300; CHECK-GI-NEXT: sub sp, sp, #16301; CHECK-GI-NEXT: .cfi_def_cfa_offset 16302; CHECK-GI-NEXT: mov w9, w0303; CHECK-GI-NEXT: mov x8, sp304; CHECK-GI-NEXT: str q0, [sp]305; CHECK-GI-NEXT: and x9, x9, #0x3306; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2]307; CHECK-GI-NEXT: ldr q0, [sp], #16308; CHECK-GI-NEXT: ret309entry:310 %d = insertelement <3 x float> %a, float %b, i32 %c311 ret <3 x float> %d312}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: // %entry317; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1318; CHECK-NEXT: mov v0.s[0], v1.s[0]319; CHECK-NEXT: ret320entry:321 %d = insertelement <4 x float> %a, float %b, i32 0322 ret <4 x float> %d323}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: // %entry328; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1329; CHECK-NEXT: mov v0.s[2], v1.s[0]330; CHECK-NEXT: ret331entry:332 %d = insertelement <4 x float> %a, float %b, i32 2333 ret <4 x float> %d334}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: // %entry339; CHECK-SD-NEXT: sub sp, sp, #16340; CHECK-SD-NEXT: .cfi_def_cfa_offset 16341; CHECK-SD-NEXT: mov x8, sp342; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0343; CHECK-SD-NEXT: str q0, [sp]344; CHECK-SD-NEXT: bfi x8, x0, #2, #2345; CHECK-SD-NEXT: str s1, [x8]346; CHECK-SD-NEXT: ldr q0, [sp], #16347; CHECK-SD-NEXT: ret348;349; CHECK-GI-LABEL: insert_v4f32_c:350; CHECK-GI: // %bb.0: // %entry351; CHECK-GI-NEXT: sub sp, sp, #16352; CHECK-GI-NEXT: .cfi_def_cfa_offset 16353; CHECK-GI-NEXT: mov w9, w0354; CHECK-GI-NEXT: mov x8, sp355; CHECK-GI-NEXT: str q0, [sp]356; CHECK-GI-NEXT: and x9, x9, #0x3357; CHECK-GI-NEXT: str s1, [x8, x9, lsl #2]358; CHECK-GI-NEXT: ldr q0, [sp], #16359; CHECK-GI-NEXT: ret360entry:361 %d = insertelement <4 x float> %a, float %b, i32 %c362 ret <4 x float> %d363}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: // %entry368; CHECK-NEXT: // kill: def $s2 killed $s2 def $q2369; CHECK-NEXT: mov v0.s[0], v2.s[0]370; CHECK-NEXT: ret371entry:372 %d = insertelement <8 x float> %a, float %b, i32 0373 ret <8 x float> %d374}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: // %entry379; CHECK-NEXT: // kill: def $s2 killed $s2 def $q2380; CHECK-NEXT: mov v0.s[2], v2.s[0]381; CHECK-NEXT: ret382entry:383 %d = insertelement <8 x float> %a, float %b, i32 2384 ret <8 x float> %d385}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: // %entry390; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!391; CHECK-SD-NEXT: .cfi_def_cfa_offset 32392; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0393; CHECK-SD-NEXT: and x8, x0, #0x7394; CHECK-SD-NEXT: mov x9, sp395; CHECK-SD-NEXT: str s2, [x9, x8, lsl #2]396; CHECK-SD-NEXT: ldp q0, q1, [sp], #32397; CHECK-SD-NEXT: ret398;399; CHECK-GI-LABEL: insert_v8f32_c:400; CHECK-GI: // %bb.0: // %entry401; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill402; CHECK-GI-NEXT: sub x9, sp, #48403; CHECK-GI-NEXT: mov x29, sp404; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0405; CHECK-GI-NEXT: .cfi_def_cfa w29, 16406; CHECK-GI-NEXT: .cfi_offset w30, -8407; CHECK-GI-NEXT: .cfi_offset w29, -16408; CHECK-GI-NEXT: mov w8, w0409; CHECK-GI-NEXT: mov x9, sp410; CHECK-GI-NEXT: stp q0, q1, [sp]411; CHECK-GI-NEXT: and x8, x8, #0x7412; CHECK-GI-NEXT: str s2, [x9, x8, lsl #2]413; CHECK-GI-NEXT: ldp q0, q1, [sp]414; CHECK-GI-NEXT: mov sp, x29415; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload416; CHECK-GI-NEXT: ret417entry:418 %d = insertelement <8 x float> %a, float %b, i32 %c419 ret <8 x float> %d420}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: // %entry425; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0426; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1427; CHECK-NEXT: mov v0.h[0], v1.h[0]428; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0429; CHECK-NEXT: ret430entry:431 %d = insertelement <4 x half> %a, half %b, i32 0432 ret <4 x half> %d433}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: // %entry438; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0439; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1440; CHECK-NEXT: mov v0.h[2], v1.h[0]441; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0442; CHECK-NEXT: ret443entry:444 %d = insertelement <4 x half> %a, half %b, i32 2445 ret <4 x half> %d446}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: // %entry451; CHECK-SD-NEXT: sub sp, sp, #16452; CHECK-SD-NEXT: .cfi_def_cfa_offset 16453; CHECK-SD-NEXT: add x8, sp, #8454; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0455; CHECK-SD-NEXT: str d0, [sp, #8]456; CHECK-SD-NEXT: bfi x8, x0, #1, #2457; CHECK-SD-NEXT: str h1, [x8]458; CHECK-SD-NEXT: ldr d0, [sp, #8]459; CHECK-SD-NEXT: add sp, sp, #16460; CHECK-SD-NEXT: ret461;462; CHECK-GI-LABEL: insert_v4f16_c:463; CHECK-GI: // %bb.0: // %entry464; CHECK-GI-NEXT: sub sp, sp, #16465; CHECK-GI-NEXT: .cfi_def_cfa_offset 16466; CHECK-GI-NEXT: mov w9, w0467; CHECK-GI-NEXT: add x8, sp, #8468; CHECK-GI-NEXT: str d0, [sp, #8]469; CHECK-GI-NEXT: and x9, x9, #0x3470; CHECK-GI-NEXT: str h1, [x8, x9, lsl #1]471; CHECK-GI-NEXT: ldr d0, [sp, #8]472; CHECK-GI-NEXT: add sp, sp, #16473; CHECK-GI-NEXT: ret474entry:475 %d = insertelement <4 x half> %a, half %b, i32 %c476 ret <4 x half> %d477}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: // %entry482; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1483; CHECK-NEXT: mov v0.h[0], v1.h[0]484; CHECK-NEXT: ret485entry:486 %d = insertelement <8 x half> %a, half %b, i32 0487 ret <8 x half> %d488}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: // %entry493; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1494; CHECK-NEXT: mov v0.h[2], v1.h[0]495; CHECK-NEXT: ret496entry:497 %d = insertelement <8 x half> %a, half %b, i32 2498 ret <8 x half> %d499}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: // %entry504; CHECK-SD-NEXT: sub sp, sp, #16505; CHECK-SD-NEXT: .cfi_def_cfa_offset 16506; CHECK-SD-NEXT: mov x8, sp507; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0508; CHECK-SD-NEXT: str q0, [sp]509; CHECK-SD-NEXT: bfi x8, x0, #1, #3510; CHECK-SD-NEXT: str h1, [x8]511; CHECK-SD-NEXT: ldr q0, [sp], #16512; CHECK-SD-NEXT: ret513;514; CHECK-GI-LABEL: insert_v8f16_c:515; CHECK-GI: // %bb.0: // %entry516; CHECK-GI-NEXT: sub sp, sp, #16517; CHECK-GI-NEXT: .cfi_def_cfa_offset 16518; CHECK-GI-NEXT: mov w9, w0519; CHECK-GI-NEXT: mov x8, sp520; CHECK-GI-NEXT: str q0, [sp]521; CHECK-GI-NEXT: and x9, x9, #0x7522; CHECK-GI-NEXT: str h1, [x8, x9, lsl #1]523; CHECK-GI-NEXT: ldr q0, [sp], #16524; CHECK-GI-NEXT: ret525entry:526 %d = insertelement <8 x half> %a, half %b, i32 %c527 ret <8 x half> %d528}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: // %entry533; CHECK-NEXT: // kill: def $h2 killed $h2 def $q2534; CHECK-NEXT: mov v0.h[0], v2.h[0]535; CHECK-NEXT: ret536entry:537 %d = insertelement <16 x half> %a, half %b, i32 0538 ret <16 x half> %d539}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: // %entry544; CHECK-NEXT: // kill: def $h2 killed $h2 def $q2545; CHECK-NEXT: mov v0.h[2], v2.h[0]546; CHECK-NEXT: ret547entry:548 %d = insertelement <16 x half> %a, half %b, i32 2549 ret <16 x half> %d550}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: // %entry555; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!556; CHECK-SD-NEXT: .cfi_def_cfa_offset 32557; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x0558; CHECK-SD-NEXT: and x8, x0, #0xf559; CHECK-SD-NEXT: mov x9, sp560; CHECK-SD-NEXT: str h2, [x9, x8, lsl #1]561; CHECK-SD-NEXT: ldp q0, q1, [sp], #32562; CHECK-SD-NEXT: ret563;564; CHECK-GI-LABEL: insert_v16f16_c:565; CHECK-GI: // %bb.0: // %entry566; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill567; CHECK-GI-NEXT: sub x9, sp, #48568; CHECK-GI-NEXT: mov x29, sp569; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0570; CHECK-GI-NEXT: .cfi_def_cfa w29, 16571; CHECK-GI-NEXT: .cfi_offset w30, -8572; CHECK-GI-NEXT: .cfi_offset w29, -16573; CHECK-GI-NEXT: mov w8, w0574; CHECK-GI-NEXT: mov x9, sp575; CHECK-GI-NEXT: stp q0, q1, [sp]576; CHECK-GI-NEXT: and x8, x8, #0xf577; CHECK-GI-NEXT: str h2, [x9, x8, lsl #1]578; CHECK-GI-NEXT: ldp q0, q1, [sp]579; CHECK-GI-NEXT: mov sp, x29580; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload581; CHECK-GI-NEXT: ret582entry:583 %d = insertelement <16 x half> %a, half %b, i32 %c584 ret <16 x half> %d585}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: // %entry590; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0591; CHECK-NEXT: mov v0.b[0], w0592; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0593; CHECK-NEXT: ret594entry:595 %d = insertelement <8 x i8> %a, i8 %b, i32 0596 ret <8 x i8> %d597}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: // %entry602; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0603; CHECK-NEXT: mov v0.b[2], w0604; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0605; CHECK-NEXT: ret606entry:607 %d = insertelement <8 x i8> %a, i8 %b, i32 2608 ret <8 x i8> %d609}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: // %entry614; CHECK-SD-NEXT: sub sp, sp, #16615; CHECK-SD-NEXT: .cfi_def_cfa_offset 16616; CHECK-SD-NEXT: add x8, sp, #8617; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1618; CHECK-SD-NEXT: str d0, [sp, #8]619; CHECK-SD-NEXT: bfxil x8, x1, #0, #3620; CHECK-SD-NEXT: strb w0, [x8]621; CHECK-SD-NEXT: ldr d0, [sp, #8]622; CHECK-SD-NEXT: add sp, sp, #16623; CHECK-SD-NEXT: ret624;625; CHECK-GI-LABEL: insert_v8i8_c:626; CHECK-GI: // %bb.0: // %entry627; CHECK-GI-NEXT: sub sp, sp, #16628; CHECK-GI-NEXT: .cfi_def_cfa_offset 16629; CHECK-GI-NEXT: mov w9, w1630; CHECK-GI-NEXT: mov w8, #1 // =0x1631; CHECK-GI-NEXT: str d0, [sp, #8]632; CHECK-GI-NEXT: and x9, x9, #0x7633; CHECK-GI-NEXT: umull x8, w9, w8634; CHECK-GI-NEXT: add x9, sp, #8635; CHECK-GI-NEXT: strb w0, [x9, x8]636; CHECK-GI-NEXT: ldr d0, [sp, #8]637; CHECK-GI-NEXT: add sp, sp, #16638; CHECK-GI-NEXT: ret639entry:640 %d = insertelement <8 x i8> %a, i8 %b, i32 %c641 ret <8 x i8> %d642}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: // %entry647; CHECK-NEXT: mov v0.b[0], w0648; CHECK-NEXT: ret649entry:650 %d = insertelement <16 x i8> %a, i8 %b, i32 0651 ret <16 x i8> %d652}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: // %entry657; CHECK-NEXT: mov v0.b[2], w0658; CHECK-NEXT: ret659entry:660 %d = insertelement <16 x i8> %a, i8 %b, i32 2661 ret <16 x i8> %d662}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: // %entry667; CHECK-SD-NEXT: sub sp, sp, #16668; CHECK-SD-NEXT: .cfi_def_cfa_offset 16669; CHECK-SD-NEXT: mov x8, sp670; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1671; CHECK-SD-NEXT: str q0, [sp]672; CHECK-SD-NEXT: bfxil x8, x1, #0, #4673; CHECK-SD-NEXT: strb w0, [x8]674; CHECK-SD-NEXT: ldr q0, [sp], #16675; CHECK-SD-NEXT: ret676;677; CHECK-GI-LABEL: insert_v16i8_c:678; CHECK-GI: // %bb.0: // %entry679; CHECK-GI-NEXT: sub sp, sp, #16680; CHECK-GI-NEXT: .cfi_def_cfa_offset 16681; CHECK-GI-NEXT: mov w9, w1682; CHECK-GI-NEXT: mov w8, #1 // =0x1683; CHECK-GI-NEXT: str q0, [sp]684; CHECK-GI-NEXT: and x9, x9, #0xf685; CHECK-GI-NEXT: umull x8, w9, w8686; CHECK-GI-NEXT: mov x9, sp687; CHECK-GI-NEXT: strb w0, [x9, x8]688; CHECK-GI-NEXT: ldr q0, [sp], #16689; CHECK-GI-NEXT: ret690entry:691 %d = insertelement <16 x i8> %a, i8 %b, i32 %c692 ret <16 x i8> %d693}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: // %entry698; CHECK-NEXT: mov v0.b[0], w0699; CHECK-NEXT: ret700entry:701 %d = insertelement <32 x i8> %a, i8 %b, i32 0702 ret <32 x i8> %d703}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: // %entry708; CHECK-NEXT: mov v0.b[2], w0709; CHECK-NEXT: ret710entry:711 %d = insertelement <32 x i8> %a, i8 %b, i32 2712 ret <32 x i8> %d713}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: // %entry718; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!719; CHECK-SD-NEXT: .cfi_def_cfa_offset 32720; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1721; CHECK-SD-NEXT: and x8, x1, #0x1f722; CHECK-SD-NEXT: mov x9, sp723; CHECK-SD-NEXT: strb w0, [x9, x8]724; CHECK-SD-NEXT: ldp q0, q1, [sp], #32725; CHECK-SD-NEXT: ret726;727; CHECK-GI-LABEL: insert_v32i8_c:728; CHECK-GI: // %bb.0: // %entry729; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill730; CHECK-GI-NEXT: sub x9, sp, #48731; CHECK-GI-NEXT: mov x29, sp732; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0733; CHECK-GI-NEXT: .cfi_def_cfa w29, 16734; CHECK-GI-NEXT: .cfi_offset w30, -8735; CHECK-GI-NEXT: .cfi_offset w29, -16736; CHECK-GI-NEXT: mov w8, w1737; CHECK-GI-NEXT: mov x10, sp738; CHECK-GI-NEXT: stp q0, q1, [sp]739; CHECK-GI-NEXT: and x8, x8, #0x1f740; CHECK-GI-NEXT: lsl x9, x8, #1741; CHECK-GI-NEXT: sub x8, x9, x8742; CHECK-GI-NEXT: strb w0, [x10, x8]743; CHECK-GI-NEXT: ldp q0, q1, [sp]744; CHECK-GI-NEXT: mov sp, x29745; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload746; CHECK-GI-NEXT: ret747entry:748 %d = insertelement <32 x i8> %a, i8 %b, i32 %c749 ret <32 x i8> %d750}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: // %entry755; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0756; CHECK-NEXT: mov v0.h[0], w0757; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0758; CHECK-NEXT: ret759entry:760 %d = insertelement <4 x i16> %a, i16 %b, i32 0761 ret <4 x i16> %d762}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: // %entry767; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0768; CHECK-NEXT: mov v0.h[2], w0769; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0770; CHECK-NEXT: ret771entry:772 %d = insertelement <4 x i16> %a, i16 %b, i32 2773 ret <4 x i16> %d774}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: // %entry779; CHECK-SD-NEXT: sub sp, sp, #16780; CHECK-SD-NEXT: .cfi_def_cfa_offset 16781; CHECK-SD-NEXT: add x8, sp, #8782; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1783; CHECK-SD-NEXT: str d0, [sp, #8]784; CHECK-SD-NEXT: bfi x8, x1, #1, #2785; CHECK-SD-NEXT: strh w0, [x8]786; CHECK-SD-NEXT: ldr d0, [sp, #8]787; CHECK-SD-NEXT: add sp, sp, #16788; CHECK-SD-NEXT: ret789;790; CHECK-GI-LABEL: insert_v4i16_c:791; CHECK-GI: // %bb.0: // %entry792; CHECK-GI-NEXT: sub sp, sp, #16793; CHECK-GI-NEXT: .cfi_def_cfa_offset 16794; CHECK-GI-NEXT: mov w9, w1795; CHECK-GI-NEXT: add x8, sp, #8796; CHECK-GI-NEXT: str d0, [sp, #8]797; CHECK-GI-NEXT: and x9, x9, #0x3798; CHECK-GI-NEXT: strh w0, [x8, x9, lsl #1]799; CHECK-GI-NEXT: ldr d0, [sp, #8]800; CHECK-GI-NEXT: add sp, sp, #16801; CHECK-GI-NEXT: ret802entry:803 %d = insertelement <4 x i16> %a, i16 %b, i32 %c804 ret <4 x i16> %d805}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: // %entry810; CHECK-NEXT: mov v0.h[0], w0811; CHECK-NEXT: ret812entry:813 %d = insertelement <8 x i16> %a, i16 %b, i32 0814 ret <8 x i16> %d815}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: // %entry820; CHECK-NEXT: mov v0.h[2], w0821; CHECK-NEXT: ret822entry:823 %d = insertelement <8 x i16> %a, i16 %b, i32 2824 ret <8 x i16> %d825}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: // %entry830; CHECK-SD-NEXT: sub sp, sp, #16831; CHECK-SD-NEXT: .cfi_def_cfa_offset 16832; CHECK-SD-NEXT: mov x8, sp833; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1834; CHECK-SD-NEXT: str q0, [sp]835; CHECK-SD-NEXT: bfi x8, x1, #1, #3836; CHECK-SD-NEXT: strh w0, [x8]837; CHECK-SD-NEXT: ldr q0, [sp], #16838; CHECK-SD-NEXT: ret839;840; CHECK-GI-LABEL: insert_v8i16_c:841; CHECK-GI: // %bb.0: // %entry842; CHECK-GI-NEXT: sub sp, sp, #16843; CHECK-GI-NEXT: .cfi_def_cfa_offset 16844; CHECK-GI-NEXT: mov w9, w1845; CHECK-GI-NEXT: mov x8, sp846; CHECK-GI-NEXT: str q0, [sp]847; CHECK-GI-NEXT: and x9, x9, #0x7848; CHECK-GI-NEXT: strh w0, [x8, x9, lsl #1]849; CHECK-GI-NEXT: ldr q0, [sp], #16850; CHECK-GI-NEXT: ret851entry:852 %d = insertelement <8 x i16> %a, i16 %b, i32 %c853 ret <8 x i16> %d854}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: // %entry859; CHECK-NEXT: mov v0.h[0], w0860; CHECK-NEXT: ret861entry:862 %d = insertelement <16 x i16> %a, i16 %b, i32 0863 ret <16 x i16> %d864}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: // %entry869; CHECK-NEXT: mov v0.h[2], w0870; CHECK-NEXT: ret871entry:872 %d = insertelement <16 x i16> %a, i16 %b, i32 2873 ret <16 x i16> %d874}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: // %entry879; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!880; CHECK-SD-NEXT: .cfi_def_cfa_offset 32881; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1882; CHECK-SD-NEXT: and x8, x1, #0xf883; CHECK-SD-NEXT: mov x9, sp884; CHECK-SD-NEXT: strh w0, [x9, x8, lsl #1]885; CHECK-SD-NEXT: ldp q0, q1, [sp], #32886; CHECK-SD-NEXT: ret887;888; CHECK-GI-LABEL: insert_v16i16_c:889; CHECK-GI: // %bb.0: // %entry890; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill891; CHECK-GI-NEXT: sub x9, sp, #48892; CHECK-GI-NEXT: mov x29, sp893; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe0894; CHECK-GI-NEXT: .cfi_def_cfa w29, 16895; CHECK-GI-NEXT: .cfi_offset w30, -8896; CHECK-GI-NEXT: .cfi_offset w29, -16897; CHECK-GI-NEXT: mov w8, w1898; CHECK-GI-NEXT: mov x9, sp899; CHECK-GI-NEXT: stp q0, q1, [sp]900; CHECK-GI-NEXT: and x8, x8, #0xf901; CHECK-GI-NEXT: strh w0, [x9, x8, lsl #1]902; CHECK-GI-NEXT: ldp q0, q1, [sp]903; CHECK-GI-NEXT: mov sp, x29904; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload905; CHECK-GI-NEXT: ret906entry:907 %d = insertelement <16 x i16> %a, i16 %b, i32 %c908 ret <16 x i16> %d909}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: // %entry914; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0915; CHECK-NEXT: mov v0.s[0], w0916; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0917; CHECK-NEXT: ret918entry:919 %d = insertelement <2 x i32> %a, i32 %b, i32 0920 ret <2 x i32> %d921}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: // %entry926; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0927; CHECK-NEXT: mov v0.s[1], w0928; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0929; CHECK-NEXT: ret930entry:931 %d = insertelement <2 x i32> %a, i32 %b, i32 1932 ret <2 x i32> %d933}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: // %entry938; CHECK-SD-NEXT: sub sp, sp, #16939; CHECK-SD-NEXT: .cfi_def_cfa_offset 16940; CHECK-SD-NEXT: add x8, sp, #8941; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1942; CHECK-SD-NEXT: str d0, [sp, #8]943; CHECK-SD-NEXT: bfi x8, x1, #2, #1944; CHECK-SD-NEXT: str w0, [x8]945; CHECK-SD-NEXT: ldr d0, [sp, #8]946; CHECK-SD-NEXT: add sp, sp, #16947; CHECK-SD-NEXT: ret948;949; CHECK-GI-LABEL: insert_v2i32_c:950; CHECK-GI: // %bb.0: // %entry951; CHECK-GI-NEXT: sub sp, sp, #16952; CHECK-GI-NEXT: .cfi_def_cfa_offset 16953; CHECK-GI-NEXT: mov w9, w1954; CHECK-GI-NEXT: add x8, sp, #8955; CHECK-GI-NEXT: str d0, [sp, #8]956; CHECK-GI-NEXT: and x9, x9, #0x1957; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2]958; CHECK-GI-NEXT: ldr d0, [sp, #8]959; CHECK-GI-NEXT: add sp, sp, #16960; CHECK-GI-NEXT: ret961entry:962 %d = insertelement <2 x i32> %a, i32 %b, i32 %c963 ret <2 x i32> %d964}965 966define <3 x i32> @insert_v3i32_0(<3 x i32> %a, i32 %b, i32 %c) {967; CHECK-LABEL: insert_v3i32_0:968; CHECK: // %bb.0: // %entry969; CHECK-NEXT: fmov s1, w0970; CHECK-NEXT: mov v1.s[1], v0.s[1]971; CHECK-NEXT: mov v1.s[2], v0.s[2]972; CHECK-NEXT: mov v0.16b, v1.16b973; CHECK-NEXT: ret974entry:975 %d = insertelement <3 x i32> %a, i32 %b, i32 0976 ret <3 x i32> %d977}978 979define <3 x i32> @insert_v3i32_2(<3 x i32> %a, i32 %b, i32 %c) {980; CHECK-SD-LABEL: insert_v3i32_2:981; CHECK-SD: // %bb.0: // %entry982; CHECK-SD-NEXT: mov v0.s[2], w0983; CHECK-SD-NEXT: ret984;985; CHECK-GI-LABEL: insert_v3i32_2:986; CHECK-GI: // %bb.0: // %entry987; CHECK-GI-NEXT: mov s1, v0.s[0]988; CHECK-GI-NEXT: mov v1.s[1], v0.s[1]989; CHECK-GI-NEXT: mov v1.s[2], w0990; CHECK-GI-NEXT: mov v0.16b, v1.16b991; CHECK-GI-NEXT: ret992entry:993 %d = insertelement <3 x i32> %a, i32 %b, i32 2994 ret <3 x i32> %d995}996 997define <3 x i32> @insert_v3i32_c(<3 x i32> %a, i32 %b, i32 %c) {998; CHECK-SD-LABEL: insert_v3i32_c:999; CHECK-SD: // %bb.0: // %entry1000; CHECK-SD-NEXT: sub sp, sp, #161001; CHECK-SD-NEXT: .cfi_def_cfa_offset 161002; CHECK-SD-NEXT: mov x8, sp1003; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11004; CHECK-SD-NEXT: str q0, [sp]1005; CHECK-SD-NEXT: bfi x8, x1, #2, #21006; CHECK-SD-NEXT: str w0, [x8]1007; CHECK-SD-NEXT: ldr q0, [sp], #161008; CHECK-SD-NEXT: ret1009;1010; CHECK-GI-LABEL: insert_v3i32_c:1011; CHECK-GI: // %bb.0: // %entry1012; CHECK-GI-NEXT: sub sp, sp, #161013; CHECK-GI-NEXT: .cfi_def_cfa_offset 161014; CHECK-GI-NEXT: mov w9, w11015; CHECK-GI-NEXT: mov x8, sp1016; CHECK-GI-NEXT: str q0, [sp]1017; CHECK-GI-NEXT: and x9, x9, #0x31018; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2]1019; CHECK-GI-NEXT: ldr q0, [sp], #161020; CHECK-GI-NEXT: ret1021entry:1022 %d = insertelement <3 x i32> %a, i32 %b, i32 %c1023 ret <3 x i32> %d1024}1025 1026define <4 x i32> @insert_v4i32_0(<4 x i32> %a, i32 %b, i32 %c) {1027; CHECK-LABEL: insert_v4i32_0:1028; CHECK: // %bb.0: // %entry1029; CHECK-NEXT: mov v0.s[0], w01030; CHECK-NEXT: ret1031entry:1032 %d = insertelement <4 x i32> %a, i32 %b, i32 01033 ret <4 x i32> %d1034}1035 1036define <4 x i32> @insert_v4i32_2(<4 x i32> %a, i32 %b, i32 %c) {1037; CHECK-LABEL: insert_v4i32_2:1038; CHECK: // %bb.0: // %entry1039; CHECK-NEXT: mov v0.s[2], w01040; CHECK-NEXT: ret1041entry:1042 %d = insertelement <4 x i32> %a, i32 %b, i32 21043 ret <4 x i32> %d1044}1045 1046define <4 x i32> @insert_v4i32_c(<4 x i32> %a, i32 %b, i32 %c) {1047; CHECK-SD-LABEL: insert_v4i32_c:1048; CHECK-SD: // %bb.0: // %entry1049; CHECK-SD-NEXT: sub sp, sp, #161050; CHECK-SD-NEXT: .cfi_def_cfa_offset 161051; CHECK-SD-NEXT: mov x8, sp1052; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11053; CHECK-SD-NEXT: str q0, [sp]1054; CHECK-SD-NEXT: bfi x8, x1, #2, #21055; CHECK-SD-NEXT: str w0, [x8]1056; CHECK-SD-NEXT: ldr q0, [sp], #161057; CHECK-SD-NEXT: ret1058;1059; CHECK-GI-LABEL: insert_v4i32_c:1060; CHECK-GI: // %bb.0: // %entry1061; CHECK-GI-NEXT: sub sp, sp, #161062; CHECK-GI-NEXT: .cfi_def_cfa_offset 161063; CHECK-GI-NEXT: mov w9, w11064; CHECK-GI-NEXT: mov x8, sp1065; CHECK-GI-NEXT: str q0, [sp]1066; CHECK-GI-NEXT: and x9, x9, #0x31067; CHECK-GI-NEXT: str w0, [x8, x9, lsl #2]1068; CHECK-GI-NEXT: ldr q0, [sp], #161069; CHECK-GI-NEXT: ret1070entry:1071 %d = insertelement <4 x i32> %a, i32 %b, i32 %c1072 ret <4 x i32> %d1073}1074 1075define <8 x i32> @insert_v8i32_0(<8 x i32> %a, i32 %b, i32 %c) {1076; CHECK-LABEL: insert_v8i32_0:1077; CHECK: // %bb.0: // %entry1078; CHECK-NEXT: mov v0.s[0], w01079; CHECK-NEXT: ret1080entry:1081 %d = insertelement <8 x i32> %a, i32 %b, i32 01082 ret <8 x i32> %d1083}1084 1085define <8 x i32> @insert_v8i32_2(<8 x i32> %a, i32 %b, i32 %c) {1086; CHECK-LABEL: insert_v8i32_2:1087; CHECK: // %bb.0: // %entry1088; CHECK-NEXT: mov v0.s[2], w01089; CHECK-NEXT: ret1090entry:1091 %d = insertelement <8 x i32> %a, i32 %b, i32 21092 ret <8 x i32> %d1093}1094 1095define <8 x i32> @insert_v8i32_c(<8 x i32> %a, i32 %b, i32 %c) {1096; CHECK-SD-LABEL: insert_v8i32_c:1097; CHECK-SD: // %bb.0: // %entry1098; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!1099; CHECK-SD-NEXT: .cfi_def_cfa_offset 321100; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11101; CHECK-SD-NEXT: and x8, x1, #0x71102; CHECK-SD-NEXT: mov x9, sp1103; CHECK-SD-NEXT: str w0, [x9, x8, lsl #2]1104; CHECK-SD-NEXT: ldp q0, q1, [sp], #321105; CHECK-SD-NEXT: ret1106;1107; CHECK-GI-LABEL: insert_v8i32_c:1108; CHECK-GI: // %bb.0: // %entry1109; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1110; CHECK-GI-NEXT: sub x9, sp, #481111; CHECK-GI-NEXT: mov x29, sp1112; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01113; CHECK-GI-NEXT: .cfi_def_cfa w29, 161114; CHECK-GI-NEXT: .cfi_offset w30, -81115; CHECK-GI-NEXT: .cfi_offset w29, -161116; CHECK-GI-NEXT: mov w8, w11117; CHECK-GI-NEXT: mov x9, sp1118; CHECK-GI-NEXT: stp q0, q1, [sp]1119; CHECK-GI-NEXT: and x8, x8, #0x71120; CHECK-GI-NEXT: str w0, [x9, x8, lsl #2]1121; CHECK-GI-NEXT: ldp q0, q1, [sp]1122; CHECK-GI-NEXT: mov sp, x291123; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1124; CHECK-GI-NEXT: ret1125entry:1126 %d = insertelement <8 x i32> %a, i32 %b, i32 %c1127 ret <8 x i32> %d1128}1129 1130define <2 x i64> @insert_v2i64_0(<2 x i64> %a, i64 %b, i32 %c) {1131; CHECK-LABEL: insert_v2i64_0:1132; CHECK: // %bb.0: // %entry1133; CHECK-NEXT: mov v0.d[0], x01134; CHECK-NEXT: ret1135entry:1136 %d = insertelement <2 x i64> %a, i64 %b, i32 01137 ret <2 x i64> %d1138}1139 1140define <2 x i64> @insert_v2i64_1(<2 x i64> %a, i64 %b, i32 %c) {1141; CHECK-LABEL: insert_v2i64_1:1142; CHECK: // %bb.0: // %entry1143; CHECK-NEXT: mov v0.d[1], x01144; CHECK-NEXT: ret1145entry:1146 %d = insertelement <2 x i64> %a, i64 %b, i32 11147 ret <2 x i64> %d1148}1149 1150define <2 x i64> @insert_v2i64_c(<2 x i64> %a, i64 %b, i32 %c) {1151; CHECK-SD-LABEL: insert_v2i64_c:1152; CHECK-SD: // %bb.0: // %entry1153; CHECK-SD-NEXT: sub sp, sp, #161154; CHECK-SD-NEXT: .cfi_def_cfa_offset 161155; CHECK-SD-NEXT: mov x8, sp1156; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11157; CHECK-SD-NEXT: str q0, [sp]1158; CHECK-SD-NEXT: bfi x8, x1, #3, #11159; CHECK-SD-NEXT: str x0, [x8]1160; CHECK-SD-NEXT: ldr q0, [sp], #161161; CHECK-SD-NEXT: ret1162;1163; CHECK-GI-LABEL: insert_v2i64_c:1164; CHECK-GI: // %bb.0: // %entry1165; CHECK-GI-NEXT: sub sp, sp, #161166; CHECK-GI-NEXT: .cfi_def_cfa_offset 161167; CHECK-GI-NEXT: mov w9, w11168; CHECK-GI-NEXT: mov x8, sp1169; CHECK-GI-NEXT: str q0, [sp]1170; CHECK-GI-NEXT: and x9, x9, #0x11171; CHECK-GI-NEXT: str x0, [x8, x9, lsl #3]1172; CHECK-GI-NEXT: ldr q0, [sp], #161173; CHECK-GI-NEXT: ret1174entry:1175 %d = insertelement <2 x i64> %a, i64 %b, i32 %c1176 ret <2 x i64> %d1177}1178 1179define <3 x i64> @insert_v3i64_0(<3 x i64> %a, i64 %b, i32 %c) {1180; CHECK-SD-LABEL: insert_v3i64_0:1181; CHECK-SD: // %bb.0: // %entry1182; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q11183; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]1184; CHECK-SD-NEXT: mov v0.d[0], x01185; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #81186; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01187; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q11188; CHECK-SD-NEXT: ret1189;1190; CHECK-GI-LABEL: insert_v3i64_0:1191; CHECK-GI: // %bb.0: // %entry1192; CHECK-GI-NEXT: fmov d0, x01193; CHECK-GI-NEXT: ret1194entry:1195 %d = insertelement <3 x i64> %a, i64 %b, i32 01196 ret <3 x i64> %d1197}1198 1199define <3 x i64> @insert_v3i64_2(<3 x i64> %a, i64 %b, i32 %c) {1200; CHECK-LABEL: insert_v3i64_2:1201; CHECK: // %bb.0: // %entry1202; CHECK-NEXT: fmov d2, x01203; CHECK-NEXT: ret1204entry:1205 %d = insertelement <3 x i64> %a, i64 %b, i32 21206 ret <3 x i64> %d1207}1208 1209define <3 x i64> @insert_v3i64_c(<3 x i64> %a, i64 %b, i32 %c) {1210; CHECK-SD-LABEL: insert_v3i64_c:1211; CHECK-SD: // %bb.0: // %entry1212; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01213; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q11214; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11215; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q21216; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]1217; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]!1218; CHECK-SD-NEXT: .cfi_def_cfa_offset 321219; CHECK-SD-NEXT: mov x8, sp1220; CHECK-SD-NEXT: and x9, x1, #0x31221; CHECK-SD-NEXT: str x0, [x8, x9, lsl #3]1222; CHECK-SD-NEXT: ldr q0, [sp]1223; CHECK-SD-NEXT: ldr d2, [sp, #16]1224; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #81225; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01226; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q11227; CHECK-SD-NEXT: add sp, sp, #321228; CHECK-SD-NEXT: ret1229;1230; CHECK-GI-LABEL: insert_v3i64_c:1231; CHECK-GI: // %bb.0: // %entry1232; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1233; CHECK-GI-NEXT: sub x9, sp, #481234; CHECK-GI-NEXT: mov x29, sp1235; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01236; CHECK-GI-NEXT: .cfi_def_cfa w29, 161237; CHECK-GI-NEXT: .cfi_offset w30, -81238; CHECK-GI-NEXT: .cfi_offset w29, -161239; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01240; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q11241; CHECK-GI-NEXT: mov w8, w11242; CHECK-GI-NEXT: mov x9, sp1243; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q21244; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]1245; CHECK-GI-NEXT: and x8, x8, #0x31246; CHECK-GI-NEXT: stp q0, q2, [sp]1247; CHECK-GI-NEXT: str x0, [x9, x8, lsl #3]1248; CHECK-GI-NEXT: ldp q0, q2, [sp]1249; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q21250; CHECK-GI-NEXT: mov d1, v0.d[1]1251; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01252; CHECK-GI-NEXT: mov sp, x291253; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1254; CHECK-GI-NEXT: ret1255entry:1256 %d = insertelement <3 x i64> %a, i64 %b, i32 %c1257 ret <3 x i64> %d1258}1259 1260define <4 x i64> @insert_v4i64_0(<4 x i64> %a, i64 %b, i32 %c) {1261; CHECK-LABEL: insert_v4i64_0:1262; CHECK: // %bb.0: // %entry1263; CHECK-NEXT: mov v0.d[0], x01264; CHECK-NEXT: ret1265entry:1266 %d = insertelement <4 x i64> %a, i64 %b, i32 01267 ret <4 x i64> %d1268}1269 1270define <4 x i64> @insert_v4i64_2(<4 x i64> %a, i64 %b, i32 %c) {1271; CHECK-LABEL: insert_v4i64_2:1272; CHECK: // %bb.0: // %entry1273; CHECK-NEXT: mov v1.d[0], x01274; CHECK-NEXT: ret1275entry:1276 %d = insertelement <4 x i64> %a, i64 %b, i32 21277 ret <4 x i64> %d1278}1279 1280define <4 x i64> @insert_v4i64_c(<4 x i64> %a, i64 %b, i32 %c) {1281; CHECK-SD-LABEL: insert_v4i64_c:1282; CHECK-SD: // %bb.0: // %entry1283; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!1284; CHECK-SD-NEXT: .cfi_def_cfa_offset 321285; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x11286; CHECK-SD-NEXT: and x8, x1, #0x31287; CHECK-SD-NEXT: mov x9, sp1288; CHECK-SD-NEXT: str x0, [x9, x8, lsl #3]1289; CHECK-SD-NEXT: ldp q0, q1, [sp], #321290; CHECK-SD-NEXT: ret1291;1292; CHECK-GI-LABEL: insert_v4i64_c:1293; CHECK-GI: // %bb.0: // %entry1294; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1295; CHECK-GI-NEXT: sub x9, sp, #481296; CHECK-GI-NEXT: mov x29, sp1297; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01298; CHECK-GI-NEXT: .cfi_def_cfa w29, 161299; CHECK-GI-NEXT: .cfi_offset w30, -81300; CHECK-GI-NEXT: .cfi_offset w29, -161301; CHECK-GI-NEXT: mov w8, w11302; CHECK-GI-NEXT: mov x9, sp1303; CHECK-GI-NEXT: stp q0, q1, [sp]1304; CHECK-GI-NEXT: and x8, x8, #0x31305; CHECK-GI-NEXT: str x0, [x9, x8, lsl #3]1306; CHECK-GI-NEXT: ldp q0, q1, [sp]1307; CHECK-GI-NEXT: mov sp, x291308; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1309; CHECK-GI-NEXT: ret1310entry:1311 %d = insertelement <4 x i64> %a, i64 %b, i32 %c1312 ret <4 x i64> %d1313}1314 1315define <2 x i128> @insert_v2i128_0(<2 x i128> %a, i128 %b, i32 %c) {1316; CHECK-SD-LABEL: insert_v2i128_0:1317; CHECK-SD: // %bb.0: // %entry1318; CHECK-SD-NEXT: adds x2, x2, x21319; CHECK-SD-NEXT: mov x1, x51320; CHECK-SD-NEXT: mov x0, x41321; CHECK-SD-NEXT: adc x3, x3, x31322; CHECK-SD-NEXT: ret1323;1324; CHECK-GI-LABEL: insert_v2i128_0:1325; CHECK-GI: // %bb.0: // %entry1326; CHECK-GI-NEXT: adds x2, x2, x21327; CHECK-GI-NEXT: mov x0, x41328; CHECK-GI-NEXT: mov x1, x51329; CHECK-GI-NEXT: adc x3, x3, x31330; CHECK-GI-NEXT: ret1331entry:1332 %aa = add <2 x i128> %a, %a1333 %d = insertelement <2 x i128> %aa, i128 %b, i32 01334 ret <2 x i128> %d1335}1336 1337define <2 x i128> @insert_v2i128_1(<2 x i128> %a, i128 %b, i32 %c) {1338; CHECK-SD-LABEL: insert_v2i128_1:1339; CHECK-SD: // %bb.0: // %entry1340; CHECK-SD-NEXT: adds x0, x0, x01341; CHECK-SD-NEXT: mov x3, x51342; CHECK-SD-NEXT: mov x2, x41343; CHECK-SD-NEXT: adc x1, x1, x11344; CHECK-SD-NEXT: ret1345;1346; CHECK-GI-LABEL: insert_v2i128_1:1347; CHECK-GI: // %bb.0: // %entry1348; CHECK-GI-NEXT: adds x0, x0, x01349; CHECK-GI-NEXT: mov x2, x41350; CHECK-GI-NEXT: mov x3, x51351; CHECK-GI-NEXT: adc x1, x1, x11352; CHECK-GI-NEXT: ret1353entry:1354 %aa = add <2 x i128> %a, %a1355 %d = insertelement <2 x i128> %aa, i128 %b, i32 11356 ret <2 x i128> %d1357}1358 1359define <2 x i128> @insert_v2i128_c(<2 x i128> %a, i128 %b, i32 %c) {1360; CHECK-SD-LABEL: insert_v2i128_c:1361; CHECK-SD: // %bb.0: // %entry1362; CHECK-SD-NEXT: sub sp, sp, #321363; CHECK-SD-NEXT: .cfi_def_cfa_offset 321364; CHECK-SD-NEXT: // kill: def $w6 killed $w6 def $x61365; CHECK-SD-NEXT: adds x8, x0, x01366; CHECK-SD-NEXT: and x11, x6, #0x11367; CHECK-SD-NEXT: mov x12, sp1368; CHECK-SD-NEXT: adc x9, x1, x11369; CHECK-SD-NEXT: adds x10, x2, x21370; CHECK-SD-NEXT: add x11, x12, x11, lsl #41371; CHECK-SD-NEXT: str x8, [sp]1372; CHECK-SD-NEXT: adc x8, x3, x31373; CHECK-SD-NEXT: str x10, [sp, #16]1374; CHECK-SD-NEXT: str x4, [x11]1375; CHECK-SD-NEXT: str x8, [sp, #24]1376; CHECK-SD-NEXT: str x9, [sp, #8]1377; CHECK-SD-NEXT: str x5, [x11, #8]1378; CHECK-SD-NEXT: ldp x0, x1, [sp]1379; CHECK-SD-NEXT: ldp x2, x3, [sp, #16]1380; CHECK-SD-NEXT: add sp, sp, #321381; CHECK-SD-NEXT: ret1382;1383; CHECK-GI-LABEL: insert_v2i128_c:1384; CHECK-GI: // %bb.0: // %entry1385; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1386; CHECK-GI-NEXT: sub x9, sp, #481387; CHECK-GI-NEXT: mov x29, sp1388; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01389; CHECK-GI-NEXT: .cfi_def_cfa w29, 161390; CHECK-GI-NEXT: .cfi_offset w30, -81391; CHECK-GI-NEXT: .cfi_offset w29, -161392; CHECK-GI-NEXT: adds x8, x0, x01393; CHECK-GI-NEXT: mov v2.d[0], x41394; CHECK-GI-NEXT: adc x9, x1, x11395; CHECK-GI-NEXT: mov v0.d[0], x81396; CHECK-GI-NEXT: adds x8, x2, x21397; CHECK-GI-NEXT: mov v1.d[0], x81398; CHECK-GI-NEXT: adc x8, x3, x31399; CHECK-GI-NEXT: mov v2.d[1], x51400; CHECK-GI-NEXT: mov v0.d[1], x91401; CHECK-GI-NEXT: mov x9, sp1402; CHECK-GI-NEXT: mov v1.d[1], x81403; CHECK-GI-NEXT: mov w8, w61404; CHECK-GI-NEXT: and x8, x8, #0x11405; CHECK-GI-NEXT: stp q0, q1, [sp]1406; CHECK-GI-NEXT: str q2, [x9, x8, lsl #4]1407; CHECK-GI-NEXT: ldp q0, q1, [sp]1408; CHECK-GI-NEXT: mov d2, v0.d[1]1409; CHECK-GI-NEXT: mov d3, v1.d[1]1410; CHECK-GI-NEXT: fmov x0, d01411; CHECK-GI-NEXT: fmov x2, d11412; CHECK-GI-NEXT: fmov x1, d21413; CHECK-GI-NEXT: fmov x3, d31414; CHECK-GI-NEXT: mov sp, x291415; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1416; CHECK-GI-NEXT: ret1417entry:1418 %aa = add <2 x i128> %a, %a1419 %d = insertelement <2 x i128> %aa, i128 %b, i32 %c1420 ret <2 x i128> %d1421}1422 1423define <2 x fp128> @insert_v2fp128_0(<2 x fp128> %a, fp128 %b, i32 %c) {1424; CHECK-SD-LABEL: insert_v2fp128_0:1425; CHECK-SD: // %bb.0: // %entry1426; CHECK-SD-NEXT: sub sp, sp, #321427; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Spill1428; CHECK-SD-NEXT: .cfi_def_cfa_offset 321429; CHECK-SD-NEXT: .cfi_offset w30, -161430; CHECK-SD-NEXT: mov v0.16b, v1.16b1431; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill1432; CHECK-SD-NEXT: bl __addtf31433; CHECK-SD-NEXT: mov v1.16b, v0.16b1434; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1435; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Reload1436; CHECK-SD-NEXT: add sp, sp, #321437; CHECK-SD-NEXT: ret1438;1439; CHECK-GI-LABEL: insert_v2fp128_0:1440; CHECK-GI: // %bb.0: // %entry1441; CHECK-GI-NEXT: sub sp, sp, #481442; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Spill1443; CHECK-GI-NEXT: .cfi_def_cfa_offset 481444; CHECK-GI-NEXT: .cfi_offset w30, -161445; CHECK-GI-NEXT: stp q1, q2, [sp] // 32-byte Folded Spill1446; CHECK-GI-NEXT: mov v1.16b, v0.16b1447; CHECK-GI-NEXT: bl __addtf31448; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1449; CHECK-GI-NEXT: mov v1.16b, v0.16b1450; CHECK-GI-NEXT: bl __addtf31451; CHECK-GI-NEXT: mov v1.16b, v0.16b1452; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1453; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Reload1454; CHECK-GI-NEXT: add sp, sp, #481455; CHECK-GI-NEXT: ret1456entry:1457 %aa = fadd <2 x fp128> %a, %a1458 %d = insertelement <2 x fp128> %aa, fp128 %b, i32 01459 ret <2 x fp128> %d1460}1461 1462define <2 x fp128> @insert_v2fp128_1(<2 x fp128> %a, fp128 %b, i32 %c) {1463; CHECK-SD-LABEL: insert_v2fp128_1:1464; CHECK-SD: // %bb.0: // %entry1465; CHECK-SD-NEXT: sub sp, sp, #321466; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Spill1467; CHECK-SD-NEXT: .cfi_def_cfa_offset 321468; CHECK-SD-NEXT: .cfi_offset w30, -161469; CHECK-SD-NEXT: mov v1.16b, v0.16b1470; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill1471; CHECK-SD-NEXT: bl __addtf31472; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1473; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Reload1474; CHECK-SD-NEXT: add sp, sp, #321475; CHECK-SD-NEXT: ret1476;1477; CHECK-GI-LABEL: insert_v2fp128_1:1478; CHECK-GI: // %bb.0: // %entry1479; CHECK-GI-NEXT: sub sp, sp, #641480; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill1481; CHECK-GI-NEXT: .cfi_def_cfa_offset 641482; CHECK-GI-NEXT: .cfi_offset w30, -161483; CHECK-GI-NEXT: stp q1, q2, [sp, #16] // 32-byte Folded Spill1484; CHECK-GI-NEXT: mov v1.16b, v0.16b1485; CHECK-GI-NEXT: bl __addtf31486; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1487; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1488; CHECK-GI-NEXT: mov v1.16b, v0.16b1489; CHECK-GI-NEXT: bl __addtf31490; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1491; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload1492; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload1493; CHECK-GI-NEXT: add sp, sp, #641494; CHECK-GI-NEXT: ret1495entry:1496 %aa = fadd <2 x fp128> %a, %a1497 %d = insertelement <2 x fp128> %aa, fp128 %b, i32 11498 ret <2 x fp128> %d1499}1500 1501define <2 x fp128> @insert_v2fp128_c(<2 x fp128> %a, fp128 %b, i32 %c) {1502; CHECK-SD-LABEL: insert_v2fp128_c:1503; CHECK-SD: // %bb.0: // %entry1504; CHECK-SD-NEXT: sub sp, sp, #961505; CHECK-SD-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill1506; CHECK-SD-NEXT: .cfi_def_cfa_offset 961507; CHECK-SD-NEXT: .cfi_offset w19, -81508; CHECK-SD-NEXT: .cfi_offset w30, -161509; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill1510; CHECK-SD-NEXT: mov v1.16b, v0.16b1511; CHECK-SD-NEXT: mov w19, w01512; CHECK-SD-NEXT: str q2, [sp, #32] // 16-byte Spill1513; CHECK-SD-NEXT: bl __addtf31514; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1515; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1516; CHECK-SD-NEXT: mov v1.16b, v0.16b1517; CHECK-SD-NEXT: bl __addtf31518; CHECK-SD-NEXT: str q0, [sp, #64]1519; CHECK-SD-NEXT: ldp q3, q0, [sp, #16] // 32-byte Folded Reload1520; CHECK-SD-NEXT: and x8, x19, #0x11521; CHECK-SD-NEXT: add x9, sp, #481522; CHECK-SD-NEXT: str q3, [sp, #48]1523; CHECK-SD-NEXT: str q0, [x9, x8, lsl #4]1524; CHECK-SD-NEXT: ldp q0, q1, [sp, #48]1525; CHECK-SD-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload1526; CHECK-SD-NEXT: add sp, sp, #961527; CHECK-SD-NEXT: ret1528;1529; CHECK-GI-LABEL: insert_v2fp128_c:1530; CHECK-GI: // %bb.0: // %entry1531; CHECK-GI-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill1532; CHECK-GI-NEXT: sub x9, sp, #961533; CHECK-GI-NEXT: str x19, [sp, #16] // 8-byte Spill1534; CHECK-GI-NEXT: mov x29, sp1535; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01536; CHECK-GI-NEXT: .cfi_def_cfa w29, 321537; CHECK-GI-NEXT: .cfi_offset w19, -161538; CHECK-GI-NEXT: .cfi_offset w30, -241539; CHECK-GI-NEXT: .cfi_offset w29, -321540; CHECK-GI-NEXT: str q1, [sp, #16] // 16-byte Spill1541; CHECK-GI-NEXT: mov v1.16b, v0.16b1542; CHECK-GI-NEXT: mov w19, w01543; CHECK-GI-NEXT: str q2, [sp, #48] // 16-byte Spill1544; CHECK-GI-NEXT: bl __addtf31545; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill1546; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Reload1547; CHECK-GI-NEXT: mov v1.16b, v0.16b1548; CHECK-GI-NEXT: bl __addtf31549; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload1550; CHECK-GI-NEXT: mov w8, w191551; CHECK-GI-NEXT: add x9, sp, #641552; CHECK-GI-NEXT: and x8, x8, #0x11553; CHECK-GI-NEXT: stp q1, q0, [sp, #64]1554; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Reload1555; CHECK-GI-NEXT: str q0, [x9, x8, lsl #4]1556; CHECK-GI-NEXT: ldp q0, q1, [sp, #64]1557; CHECK-GI-NEXT: mov sp, x291558; CHECK-GI-NEXT: ldr x19, [sp, #16] // 8-byte Reload1559; CHECK-GI-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload1560; CHECK-GI-NEXT: ret1561entry:1562 %aa = fadd <2 x fp128> %a, %a1563 %d = insertelement <2 x fp128> %aa, fp128 %b, i32 %c1564 ret <2 x fp128> %d1565}1566 1567define double @extract_v2f64_0(<2 x double> %a, i32 %c) {1568; CHECK-LABEL: extract_v2f64_0:1569; CHECK: // %bb.0: // %entry1570; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01571; CHECK-NEXT: ret1572entry:1573 %d = extractelement <2 x double> %a, i32 01574 ret double %d1575}1576 1577define double @extract_v2f64_1(<2 x double> %a, i32 %c) {1578; CHECK-LABEL: extract_v2f64_1:1579; CHECK: // %bb.0: // %entry1580; CHECK-NEXT: mov d0, v0.d[1]1581; CHECK-NEXT: ret1582entry:1583 %d = extractelement <2 x double> %a, i32 11584 ret double %d1585}1586 1587define double @extract_v2f64_c(<2 x double> %a, i32 %c) {1588; CHECK-SD-LABEL: extract_v2f64_c:1589; CHECK-SD: // %bb.0: // %entry1590; CHECK-SD-NEXT: sub sp, sp, #161591; CHECK-SD-NEXT: .cfi_def_cfa_offset 161592; CHECK-SD-NEXT: mov x8, sp1593; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01594; CHECK-SD-NEXT: str q0, [sp]1595; CHECK-SD-NEXT: bfi x8, x0, #3, #11596; CHECK-SD-NEXT: ldr d0, [x8]1597; CHECK-SD-NEXT: add sp, sp, #161598; CHECK-SD-NEXT: ret1599;1600; CHECK-GI-LABEL: extract_v2f64_c:1601; CHECK-GI: // %bb.0: // %entry1602; CHECK-GI-NEXT: sub sp, sp, #161603; CHECK-GI-NEXT: .cfi_def_cfa_offset 161604; CHECK-GI-NEXT: mov w9, w01605; CHECK-GI-NEXT: mov x8, sp1606; CHECK-GI-NEXT: str q0, [sp]1607; CHECK-GI-NEXT: and x9, x9, #0x11608; CHECK-GI-NEXT: ldr d0, [x8, x9, lsl #3]1609; CHECK-GI-NEXT: add sp, sp, #161610; CHECK-GI-NEXT: ret1611entry:1612 %d = extractelement <2 x double> %a, i32 %c1613 ret double %d1614}1615 1616define double @extract_v3f64_0(<3 x double> %a, i32 %c) {1617; CHECK-LABEL: extract_v3f64_0:1618; CHECK: // %bb.0: // %entry1619; CHECK-NEXT: ret1620entry:1621 %d = extractelement <3 x double> %a, i32 01622 ret double %d1623}1624 1625define double @extract_v3f64_2(<3 x double> %a, i32 %c) {1626; CHECK-LABEL: extract_v3f64_2:1627; CHECK: // %bb.0: // %entry1628; CHECK-NEXT: fmov d0, d21629; CHECK-NEXT: ret1630entry:1631 %d = extractelement <3 x double> %a, i32 21632 ret double %d1633}1634 1635define double @extract_v3f64_c(<3 x double> %a, i32 %c) {1636; CHECK-SD-LABEL: extract_v3f64_c:1637; CHECK-SD: // %bb.0: // %entry1638; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01639; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q11640; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01641; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q21642; CHECK-SD-NEXT: and x8, x0, #0x31643; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]1644; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]!1645; CHECK-SD-NEXT: .cfi_def_cfa_offset 321646; CHECK-SD-NEXT: mov x9, sp1647; CHECK-SD-NEXT: ldr d0, [x9, x8, lsl #3]1648; CHECK-SD-NEXT: add sp, sp, #321649; CHECK-SD-NEXT: ret1650;1651; CHECK-GI-LABEL: extract_v3f64_c:1652; CHECK-GI: // %bb.0: // %entry1653; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1654; CHECK-GI-NEXT: sub x9, sp, #481655; CHECK-GI-NEXT: mov x29, sp1656; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01657; CHECK-GI-NEXT: .cfi_def_cfa w29, 161658; CHECK-GI-NEXT: .cfi_offset w30, -81659; CHECK-GI-NEXT: .cfi_offset w29, -161660; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01661; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q11662; CHECK-GI-NEXT: mov w8, w01663; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q21664; CHECK-GI-NEXT: mov x9, sp1665; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]1666; CHECK-GI-NEXT: and x8, x8, #0x31667; CHECK-GI-NEXT: stp q0, q2, [sp]1668; CHECK-GI-NEXT: ldr d0, [x9, x8, lsl #3]1669; CHECK-GI-NEXT: mov sp, x291670; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1671; CHECK-GI-NEXT: ret1672entry:1673 %d = extractelement <3 x double> %a, i32 %c1674 ret double %d1675}1676 1677define double @extract_v4f64_0(<4 x double> %a, i32 %c) {1678; CHECK-LABEL: extract_v4f64_0:1679; CHECK: // %bb.0: // %entry1680; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01681; CHECK-NEXT: ret1682entry:1683 %d = extractelement <4 x double> %a, i32 01684 ret double %d1685}1686 1687define double @extract_v4f64_2(<4 x double> %a, i32 %c) {1688; CHECK-LABEL: extract_v4f64_2:1689; CHECK: // %bb.0: // %entry1690; CHECK-NEXT: mov v0.16b, v1.16b1691; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q01692; CHECK-NEXT: ret1693entry:1694 %d = extractelement <4 x double> %a, i32 21695 ret double %d1696}1697 1698define double @extract_v4f64_c(<4 x double> %a, i32 %c) {1699; CHECK-SD-LABEL: extract_v4f64_c:1700; CHECK-SD: // %bb.0: // %entry1701; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!1702; CHECK-SD-NEXT: .cfi_def_cfa_offset 321703; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01704; CHECK-SD-NEXT: and x8, x0, #0x31705; CHECK-SD-NEXT: mov x9, sp1706; CHECK-SD-NEXT: ldr d0, [x9, x8, lsl #3]1707; CHECK-SD-NEXT: add sp, sp, #321708; CHECK-SD-NEXT: ret1709;1710; CHECK-GI-LABEL: extract_v4f64_c:1711; CHECK-GI: // %bb.0: // %entry1712; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1713; CHECK-GI-NEXT: sub x9, sp, #481714; CHECK-GI-NEXT: mov x29, sp1715; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01716; CHECK-GI-NEXT: .cfi_def_cfa w29, 161717; CHECK-GI-NEXT: .cfi_offset w30, -81718; CHECK-GI-NEXT: .cfi_offset w29, -161719; CHECK-GI-NEXT: mov w8, w01720; CHECK-GI-NEXT: stp q0, q1, [sp]1721; CHECK-GI-NEXT: mov x9, sp1722; CHECK-GI-NEXT: and x8, x8, #0x31723; CHECK-GI-NEXT: ldr d0, [x9, x8, lsl #3]1724; CHECK-GI-NEXT: mov sp, x291725; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1726; CHECK-GI-NEXT: ret1727entry:1728 %d = extractelement <4 x double> %a, i32 %c1729 ret double %d1730}1731 1732define float @extract_v2f32_0(<2 x float> %a, i32 %c) {1733; CHECK-SD-LABEL: extract_v2f32_0:1734; CHECK-SD: // %bb.0: // %entry1735; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01736; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01737; CHECK-SD-NEXT: ret1738;1739; CHECK-GI-LABEL: extract_v2f32_0:1740; CHECK-GI: // %bb.0: // %entry1741; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $d01742; CHECK-GI-NEXT: ret1743entry:1744 %d = extractelement <2 x float> %a, i32 01745 ret float %d1746}1747 1748define float @extract_v2f32_1(<2 x float> %a, i32 %c) {1749; CHECK-LABEL: extract_v2f32_1:1750; CHECK: // %bb.0: // %entry1751; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01752; CHECK-NEXT: mov s0, v0.s[1]1753; CHECK-NEXT: ret1754entry:1755 %d = extractelement <2 x float> %a, i32 11756 ret float %d1757}1758 1759define float @extract_v2f32_c(<2 x float> %a, i32 %c) {1760; CHECK-SD-LABEL: extract_v2f32_c:1761; CHECK-SD: // %bb.0: // %entry1762; CHECK-SD-NEXT: sub sp, sp, #161763; CHECK-SD-NEXT: .cfi_def_cfa_offset 161764; CHECK-SD-NEXT: add x8, sp, #81765; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01766; CHECK-SD-NEXT: str d0, [sp, #8]1767; CHECK-SD-NEXT: bfi x8, x0, #2, #11768; CHECK-SD-NEXT: ldr s0, [x8]1769; CHECK-SD-NEXT: add sp, sp, #161770; CHECK-SD-NEXT: ret1771;1772; CHECK-GI-LABEL: extract_v2f32_c:1773; CHECK-GI: // %bb.0: // %entry1774; CHECK-GI-NEXT: sub sp, sp, #161775; CHECK-GI-NEXT: .cfi_def_cfa_offset 161776; CHECK-GI-NEXT: mov w9, w01777; CHECK-GI-NEXT: add x8, sp, #81778; CHECK-GI-NEXT: str d0, [sp, #8]1779; CHECK-GI-NEXT: and x9, x9, #0x11780; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2]1781; CHECK-GI-NEXT: add sp, sp, #161782; CHECK-GI-NEXT: ret1783entry:1784 %d = extractelement <2 x float> %a, i32 %c1785 ret float %d1786}1787 1788define float @extract_v3f32_0(<3 x float> %a, i32 %c) {1789; CHECK-LABEL: extract_v3f32_0:1790; CHECK: // %bb.0: // %entry1791; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q01792; CHECK-NEXT: ret1793entry:1794 %d = extractelement <3 x float> %a, i32 01795 ret float %d1796}1797 1798define float @extract_v3f32_2(<3 x float> %a, i32 %c) {1799; CHECK-LABEL: extract_v3f32_2:1800; CHECK: // %bb.0: // %entry1801; CHECK-NEXT: mov s0, v0.s[2]1802; CHECK-NEXT: ret1803entry:1804 %d = extractelement <3 x float> %a, i32 21805 ret float %d1806}1807 1808define float @extract_v3f32_c(<3 x float> %a, i32 %c) {1809; CHECK-SD-LABEL: extract_v3f32_c:1810; CHECK-SD: // %bb.0: // %entry1811; CHECK-SD-NEXT: sub sp, sp, #161812; CHECK-SD-NEXT: .cfi_def_cfa_offset 161813; CHECK-SD-NEXT: mov x8, sp1814; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01815; CHECK-SD-NEXT: str q0, [sp]1816; CHECK-SD-NEXT: bfi x8, x0, #2, #21817; CHECK-SD-NEXT: ldr s0, [x8]1818; CHECK-SD-NEXT: add sp, sp, #161819; CHECK-SD-NEXT: ret1820;1821; CHECK-GI-LABEL: extract_v3f32_c:1822; CHECK-GI: // %bb.0: // %entry1823; CHECK-GI-NEXT: sub sp, sp, #161824; CHECK-GI-NEXT: .cfi_def_cfa_offset 161825; CHECK-GI-NEXT: mov w9, w01826; CHECK-GI-NEXT: mov x8, sp1827; CHECK-GI-NEXT: str q0, [sp]1828; CHECK-GI-NEXT: and x9, x9, #0x31829; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2]1830; CHECK-GI-NEXT: add sp, sp, #161831; CHECK-GI-NEXT: ret1832entry:1833 %d = extractelement <3 x float> %a, i32 %c1834 ret float %d1835}1836 1837define float @extract_v4f32_0(<4 x float> %a, i32 %c) {1838; CHECK-LABEL: extract_v4f32_0:1839; CHECK: // %bb.0: // %entry1840; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q01841; CHECK-NEXT: ret1842entry:1843 %d = extractelement <4 x float> %a, i32 01844 ret float %d1845}1846 1847define float @extract_v4f32_2(<4 x float> %a, i32 %c) {1848; CHECK-LABEL: extract_v4f32_2:1849; CHECK: // %bb.0: // %entry1850; CHECK-NEXT: mov s0, v0.s[2]1851; CHECK-NEXT: ret1852entry:1853 %d = extractelement <4 x float> %a, i32 21854 ret float %d1855}1856 1857define float @extract_v4f32_c(<4 x float> %a, i32 %c) {1858; CHECK-SD-LABEL: extract_v4f32_c:1859; CHECK-SD: // %bb.0: // %entry1860; CHECK-SD-NEXT: sub sp, sp, #161861; CHECK-SD-NEXT: .cfi_def_cfa_offset 161862; CHECK-SD-NEXT: mov x8, sp1863; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01864; CHECK-SD-NEXT: str q0, [sp]1865; CHECK-SD-NEXT: bfi x8, x0, #2, #21866; CHECK-SD-NEXT: ldr s0, [x8]1867; CHECK-SD-NEXT: add sp, sp, #161868; CHECK-SD-NEXT: ret1869;1870; CHECK-GI-LABEL: extract_v4f32_c:1871; CHECK-GI: // %bb.0: // %entry1872; CHECK-GI-NEXT: sub sp, sp, #161873; CHECK-GI-NEXT: .cfi_def_cfa_offset 161874; CHECK-GI-NEXT: mov w9, w01875; CHECK-GI-NEXT: mov x8, sp1876; CHECK-GI-NEXT: str q0, [sp]1877; CHECK-GI-NEXT: and x9, x9, #0x31878; CHECK-GI-NEXT: ldr s0, [x8, x9, lsl #2]1879; CHECK-GI-NEXT: add sp, sp, #161880; CHECK-GI-NEXT: ret1881entry:1882 %d = extractelement <4 x float> %a, i32 %c1883 ret float %d1884}1885 1886define float @extract_v8f32_0(<8 x float> %a, i32 %c) {1887; CHECK-LABEL: extract_v8f32_0:1888; CHECK: // %bb.0: // %entry1889; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q01890; CHECK-NEXT: ret1891entry:1892 %d = extractelement <8 x float> %a, i32 01893 ret float %d1894}1895 1896define float @extract_v8f32_2(<8 x float> %a, i32 %c) {1897; CHECK-LABEL: extract_v8f32_2:1898; CHECK: // %bb.0: // %entry1899; CHECK-NEXT: mov s0, v0.s[2]1900; CHECK-NEXT: ret1901entry:1902 %d = extractelement <8 x float> %a, i32 21903 ret float %d1904}1905 1906define float @extract_v8f32_c(<8 x float> %a, i32 %c) {1907; CHECK-SD-LABEL: extract_v8f32_c:1908; CHECK-SD: // %bb.0: // %entry1909; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!1910; CHECK-SD-NEXT: .cfi_def_cfa_offset 321911; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01912; CHECK-SD-NEXT: and x8, x0, #0x71913; CHECK-SD-NEXT: mov x9, sp1914; CHECK-SD-NEXT: ldr s0, [x9, x8, lsl #2]1915; CHECK-SD-NEXT: add sp, sp, #321916; CHECK-SD-NEXT: ret1917;1918; CHECK-GI-LABEL: extract_v8f32_c:1919; CHECK-GI: // %bb.0: // %entry1920; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill1921; CHECK-GI-NEXT: sub x9, sp, #481922; CHECK-GI-NEXT: mov x29, sp1923; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe01924; CHECK-GI-NEXT: .cfi_def_cfa w29, 161925; CHECK-GI-NEXT: .cfi_offset w30, -81926; CHECK-GI-NEXT: .cfi_offset w29, -161927; CHECK-GI-NEXT: mov w8, w01928; CHECK-GI-NEXT: stp q0, q1, [sp]1929; CHECK-GI-NEXT: mov x9, sp1930; CHECK-GI-NEXT: and x8, x8, #0x71931; CHECK-GI-NEXT: ldr s0, [x9, x8, lsl #2]1932; CHECK-GI-NEXT: mov sp, x291933; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload1934; CHECK-GI-NEXT: ret1935entry:1936 %d = extractelement <8 x float> %a, i32 %c1937 ret float %d1938}1939 1940define half @extract_v4f16_0(<4 x half> %a, i32 %c) {1941; CHECK-SD-LABEL: extract_v4f16_0:1942; CHECK-SD: // %bb.0: // %entry1943; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01944; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $q01945; CHECK-SD-NEXT: ret1946;1947; CHECK-GI-LABEL: extract_v4f16_0:1948; CHECK-GI: // %bb.0: // %entry1949; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $d01950; CHECK-GI-NEXT: ret1951entry:1952 %d = extractelement <4 x half> %a, i32 01953 ret half %d1954}1955 1956define half @extract_v4f16_2(<4 x half> %a, i32 %c) {1957; CHECK-LABEL: extract_v4f16_2:1958; CHECK: // %bb.0: // %entry1959; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01960; CHECK-NEXT: mov h0, v0.h[2]1961; CHECK-NEXT: ret1962entry:1963 %d = extractelement <4 x half> %a, i32 21964 ret half %d1965}1966 1967define half @extract_v4f16_c(<4 x half> %a, i32 %c) {1968; CHECK-SD-LABEL: extract_v4f16_c:1969; CHECK-SD: // %bb.0: // %entry1970; CHECK-SD-NEXT: sub sp, sp, #161971; CHECK-SD-NEXT: .cfi_def_cfa_offset 161972; CHECK-SD-NEXT: add x8, sp, #81973; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x01974; CHECK-SD-NEXT: str d0, [sp, #8]1975; CHECK-SD-NEXT: bfi x8, x0, #1, #21976; CHECK-SD-NEXT: ldr h0, [x8]1977; CHECK-SD-NEXT: add sp, sp, #161978; CHECK-SD-NEXT: ret1979;1980; CHECK-GI-LABEL: extract_v4f16_c:1981; CHECK-GI: // %bb.0: // %entry1982; CHECK-GI-NEXT: sub sp, sp, #161983; CHECK-GI-NEXT: .cfi_def_cfa_offset 161984; CHECK-GI-NEXT: mov w9, w01985; CHECK-GI-NEXT: add x8, sp, #81986; CHECK-GI-NEXT: str d0, [sp, #8]1987; CHECK-GI-NEXT: and x9, x9, #0x31988; CHECK-GI-NEXT: ldr h0, [x8, x9, lsl #1]1989; CHECK-GI-NEXT: add sp, sp, #161990; CHECK-GI-NEXT: ret1991entry:1992 %d = extractelement <4 x half> %a, i32 %c1993 ret half %d1994}1995 1996define half @extract_v8f16_0(<8 x half> %a, i32 %c) {1997; CHECK-LABEL: extract_v8f16_0:1998; CHECK: // %bb.0: // %entry1999; CHECK-NEXT: // kill: def $h0 killed $h0 killed $q02000; CHECK-NEXT: ret2001entry:2002 %d = extractelement <8 x half> %a, i32 02003 ret half %d2004}2005 2006define half @extract_v8f16_2(<8 x half> %a, i32 %c) {2007; CHECK-LABEL: extract_v8f16_2:2008; CHECK: // %bb.0: // %entry2009; CHECK-NEXT: mov h0, v0.h[2]2010; CHECK-NEXT: ret2011entry:2012 %d = extractelement <8 x half> %a, i32 22013 ret half %d2014}2015 2016define half @extract_v8f16_c(<8 x half> %a, i32 %c) {2017; CHECK-SD-LABEL: extract_v8f16_c:2018; CHECK-SD: // %bb.0: // %entry2019; CHECK-SD-NEXT: sub sp, sp, #162020; CHECK-SD-NEXT: .cfi_def_cfa_offset 162021; CHECK-SD-NEXT: mov x8, sp2022; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02023; CHECK-SD-NEXT: str q0, [sp]2024; CHECK-SD-NEXT: bfi x8, x0, #1, #32025; CHECK-SD-NEXT: ldr h0, [x8]2026; CHECK-SD-NEXT: add sp, sp, #162027; CHECK-SD-NEXT: ret2028;2029; CHECK-GI-LABEL: extract_v8f16_c:2030; CHECK-GI: // %bb.0: // %entry2031; CHECK-GI-NEXT: sub sp, sp, #162032; CHECK-GI-NEXT: .cfi_def_cfa_offset 162033; CHECK-GI-NEXT: mov w9, w02034; CHECK-GI-NEXT: mov x8, sp2035; CHECK-GI-NEXT: str q0, [sp]2036; CHECK-GI-NEXT: and x9, x9, #0x72037; CHECK-GI-NEXT: ldr h0, [x8, x9, lsl #1]2038; CHECK-GI-NEXT: add sp, sp, #162039; CHECK-GI-NEXT: ret2040entry:2041 %d = extractelement <8 x half> %a, i32 %c2042 ret half %d2043}2044 2045define half @extract_v16f16_0(<16 x half> %a, i32 %c) {2046; CHECK-LABEL: extract_v16f16_0:2047; CHECK: // %bb.0: // %entry2048; CHECK-NEXT: // kill: def $h0 killed $h0 killed $q02049; CHECK-NEXT: ret2050entry:2051 %d = extractelement <16 x half> %a, i32 02052 ret half %d2053}2054 2055define half @extract_v16f16_2(<16 x half> %a, i32 %c) {2056; CHECK-LABEL: extract_v16f16_2:2057; CHECK: // %bb.0: // %entry2058; CHECK-NEXT: mov h0, v0.h[2]2059; CHECK-NEXT: ret2060entry:2061 %d = extractelement <16 x half> %a, i32 22062 ret half %d2063}2064 2065define half @extract_v16f16_c(<16 x half> %a, i32 %c) {2066; CHECK-SD-LABEL: extract_v16f16_c:2067; CHECK-SD: // %bb.0: // %entry2068; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2069; CHECK-SD-NEXT: .cfi_def_cfa_offset 322070; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02071; CHECK-SD-NEXT: and x8, x0, #0xf2072; CHECK-SD-NEXT: mov x9, sp2073; CHECK-SD-NEXT: ldr h0, [x9, x8, lsl #1]2074; CHECK-SD-NEXT: add sp, sp, #322075; CHECK-SD-NEXT: ret2076;2077; CHECK-GI-LABEL: extract_v16f16_c:2078; CHECK-GI: // %bb.0: // %entry2079; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2080; CHECK-GI-NEXT: sub x9, sp, #482081; CHECK-GI-NEXT: mov x29, sp2082; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02083; CHECK-GI-NEXT: .cfi_def_cfa w29, 162084; CHECK-GI-NEXT: .cfi_offset w30, -82085; CHECK-GI-NEXT: .cfi_offset w29, -162086; CHECK-GI-NEXT: mov w8, w02087; CHECK-GI-NEXT: stp q0, q1, [sp]2088; CHECK-GI-NEXT: mov x9, sp2089; CHECK-GI-NEXT: and x8, x8, #0xf2090; CHECK-GI-NEXT: ldr h0, [x9, x8, lsl #1]2091; CHECK-GI-NEXT: mov sp, x292092; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2093; CHECK-GI-NEXT: ret2094entry:2095 %d = extractelement <16 x half> %a, i32 %c2096 ret half %d2097}2098 2099define i8 @extract_v8i8_0(<8 x i8> %a, i32 %c) {2100; CHECK-LABEL: extract_v8i8_0:2101; CHECK: // %bb.0: // %entry2102; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02103; CHECK-NEXT: umov w0, v0.b[0]2104; CHECK-NEXT: ret2105entry:2106 %d = extractelement <8 x i8> %a, i32 02107 ret i8 %d2108}2109 2110define i8 @extract_v8i8_2(<8 x i8> %a, i32 %c) {2111; CHECK-LABEL: extract_v8i8_2:2112; CHECK: // %bb.0: // %entry2113; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02114; CHECK-NEXT: umov w0, v0.b[2]2115; CHECK-NEXT: ret2116entry:2117 %d = extractelement <8 x i8> %a, i32 22118 ret i8 %d2119}2120 2121define i8 @extract_v8i8_c(<8 x i8> %a, i32 %c) {2122; CHECK-SD-LABEL: extract_v8i8_c:2123; CHECK-SD: // %bb.0: // %entry2124; CHECK-SD-NEXT: sub sp, sp, #162125; CHECK-SD-NEXT: .cfi_def_cfa_offset 162126; CHECK-SD-NEXT: add x8, sp, #82127; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02128; CHECK-SD-NEXT: str d0, [sp, #8]2129; CHECK-SD-NEXT: bfxil x8, x0, #0, #32130; CHECK-SD-NEXT: ldrb w0, [x8]2131; CHECK-SD-NEXT: add sp, sp, #162132; CHECK-SD-NEXT: ret2133;2134; CHECK-GI-LABEL: extract_v8i8_c:2135; CHECK-GI: // %bb.0: // %entry2136; CHECK-GI-NEXT: sub sp, sp, #162137; CHECK-GI-NEXT: .cfi_def_cfa_offset 162138; CHECK-GI-NEXT: mov w9, w02139; CHECK-GI-NEXT: add x8, sp, #82140; CHECK-GI-NEXT: str d0, [sp, #8]2141; CHECK-GI-NEXT: and x9, x9, #0x72142; CHECK-GI-NEXT: lsl x10, x9, #12143; CHECK-GI-NEXT: sub x9, x10, x92144; CHECK-GI-NEXT: ldrb w0, [x8, x9]2145; CHECK-GI-NEXT: add sp, sp, #162146; CHECK-GI-NEXT: ret2147entry:2148 %d = extractelement <8 x i8> %a, i32 %c2149 ret i8 %d2150}2151 2152define i8 @extract_v16i8_0(<16 x i8> %a, i32 %c) {2153; CHECK-LABEL: extract_v16i8_0:2154; CHECK: // %bb.0: // %entry2155; CHECK-NEXT: umov w0, v0.b[0]2156; CHECK-NEXT: ret2157entry:2158 %d = extractelement <16 x i8> %a, i32 02159 ret i8 %d2160}2161 2162define i8 @extract_v16i8_2(<16 x i8> %a, i32 %c) {2163; CHECK-LABEL: extract_v16i8_2:2164; CHECK: // %bb.0: // %entry2165; CHECK-NEXT: umov w0, v0.b[2]2166; CHECK-NEXT: ret2167entry:2168 %d = extractelement <16 x i8> %a, i32 22169 ret i8 %d2170}2171 2172define i8 @extract_v16i8_c(<16 x i8> %a, i32 %c) {2173; CHECK-SD-LABEL: extract_v16i8_c:2174; CHECK-SD: // %bb.0: // %entry2175; CHECK-SD-NEXT: sub sp, sp, #162176; CHECK-SD-NEXT: .cfi_def_cfa_offset 162177; CHECK-SD-NEXT: mov x8, sp2178; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02179; CHECK-SD-NEXT: str q0, [sp]2180; CHECK-SD-NEXT: bfxil x8, x0, #0, #42181; CHECK-SD-NEXT: ldrb w0, [x8]2182; CHECK-SD-NEXT: add sp, sp, #162183; CHECK-SD-NEXT: ret2184;2185; CHECK-GI-LABEL: extract_v16i8_c:2186; CHECK-GI: // %bb.0: // %entry2187; CHECK-GI-NEXT: sub sp, sp, #162188; CHECK-GI-NEXT: .cfi_def_cfa_offset 162189; CHECK-GI-NEXT: mov w9, w02190; CHECK-GI-NEXT: mov x8, sp2191; CHECK-GI-NEXT: str q0, [sp]2192; CHECK-GI-NEXT: and x9, x9, #0xf2193; CHECK-GI-NEXT: lsl x10, x9, #12194; CHECK-GI-NEXT: sub x9, x10, x92195; CHECK-GI-NEXT: ldrb w0, [x8, x9]2196; CHECK-GI-NEXT: add sp, sp, #162197; CHECK-GI-NEXT: ret2198entry:2199 %d = extractelement <16 x i8> %a, i32 %c2200 ret i8 %d2201}2202 2203define i8 @extract_v32i8_0(<32 x i8> %a, i32 %c) {2204; CHECK-LABEL: extract_v32i8_0:2205; CHECK: // %bb.0: // %entry2206; CHECK-NEXT: umov w0, v0.b[0]2207; CHECK-NEXT: ret2208entry:2209 %d = extractelement <32 x i8> %a, i32 02210 ret i8 %d2211}2212 2213define i8 @extract_v32i8_2(<32 x i8> %a, i32 %c) {2214; CHECK-LABEL: extract_v32i8_2:2215; CHECK: // %bb.0: // %entry2216; CHECK-NEXT: umov w0, v0.b[2]2217; CHECK-NEXT: ret2218entry:2219 %d = extractelement <32 x i8> %a, i32 22220 ret i8 %d2221}2222 2223define i8 @extract_v32i8_c(<32 x i8> %a, i32 %c) {2224; CHECK-SD-LABEL: extract_v32i8_c:2225; CHECK-SD: // %bb.0: // %entry2226; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2227; CHECK-SD-NEXT: .cfi_def_cfa_offset 322228; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02229; CHECK-SD-NEXT: and x8, x0, #0x1f2230; CHECK-SD-NEXT: mov x9, sp2231; CHECK-SD-NEXT: ldrb w0, [x9, x8]2232; CHECK-SD-NEXT: add sp, sp, #322233; CHECK-SD-NEXT: ret2234;2235; CHECK-GI-LABEL: extract_v32i8_c:2236; CHECK-GI: // %bb.0: // %entry2237; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2238; CHECK-GI-NEXT: sub x9, sp, #482239; CHECK-GI-NEXT: mov x29, sp2240; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02241; CHECK-GI-NEXT: .cfi_def_cfa w29, 162242; CHECK-GI-NEXT: .cfi_offset w30, -82243; CHECK-GI-NEXT: .cfi_offset w29, -162244; CHECK-GI-NEXT: mov w8, w02245; CHECK-GI-NEXT: stp q0, q1, [sp]2246; CHECK-GI-NEXT: mov x10, sp2247; CHECK-GI-NEXT: and x8, x8, #0x1f2248; CHECK-GI-NEXT: lsl x9, x8, #12249; CHECK-GI-NEXT: sub x8, x9, x82250; CHECK-GI-NEXT: ldrb w0, [x10, x8]2251; CHECK-GI-NEXT: mov sp, x292252; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2253; CHECK-GI-NEXT: ret2254entry:2255 %d = extractelement <32 x i8> %a, i32 %c2256 ret i8 %d2257}2258 2259define i16 @extract_v4i16_0(<4 x i16> %a, i32 %c) {2260; CHECK-LABEL: extract_v4i16_0:2261; CHECK: // %bb.0: // %entry2262; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02263; CHECK-NEXT: umov w0, v0.h[0]2264; CHECK-NEXT: ret2265entry:2266 %d = extractelement <4 x i16> %a, i32 02267 ret i16 %d2268}2269 2270define i16 @extract_v4i16_2(<4 x i16> %a, i32 %c) {2271; CHECK-LABEL: extract_v4i16_2:2272; CHECK: // %bb.0: // %entry2273; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02274; CHECK-NEXT: umov w0, v0.h[2]2275; CHECK-NEXT: ret2276entry:2277 %d = extractelement <4 x i16> %a, i32 22278 ret i16 %d2279}2280 2281define i16 @extract_v4i16_c(<4 x i16> %a, i32 %c) {2282; CHECK-SD-LABEL: extract_v4i16_c:2283; CHECK-SD: // %bb.0: // %entry2284; CHECK-SD-NEXT: sub sp, sp, #162285; CHECK-SD-NEXT: .cfi_def_cfa_offset 162286; CHECK-SD-NEXT: add x8, sp, #82287; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02288; CHECK-SD-NEXT: str d0, [sp, #8]2289; CHECK-SD-NEXT: bfi x8, x0, #1, #22290; CHECK-SD-NEXT: ldrh w0, [x8]2291; CHECK-SD-NEXT: add sp, sp, #162292; CHECK-SD-NEXT: ret2293;2294; CHECK-GI-LABEL: extract_v4i16_c:2295; CHECK-GI: // %bb.0: // %entry2296; CHECK-GI-NEXT: sub sp, sp, #162297; CHECK-GI-NEXT: .cfi_def_cfa_offset 162298; CHECK-GI-NEXT: mov w9, w02299; CHECK-GI-NEXT: add x8, sp, #82300; CHECK-GI-NEXT: str d0, [sp, #8]2301; CHECK-GI-NEXT: and x9, x9, #0x32302; CHECK-GI-NEXT: ldrh w0, [x8, x9, lsl #1]2303; CHECK-GI-NEXT: add sp, sp, #162304; CHECK-GI-NEXT: ret2305entry:2306 %d = extractelement <4 x i16> %a, i32 %c2307 ret i16 %d2308}2309 2310define i16 @extract_v8i16_0(<8 x i16> %a, i32 %c) {2311; CHECK-LABEL: extract_v8i16_0:2312; CHECK: // %bb.0: // %entry2313; CHECK-NEXT: umov w0, v0.h[0]2314; CHECK-NEXT: ret2315entry:2316 %d = extractelement <8 x i16> %a, i32 02317 ret i16 %d2318}2319 2320define i16 @extract_v8i16_2(<8 x i16> %a, i32 %c) {2321; CHECK-LABEL: extract_v8i16_2:2322; CHECK: // %bb.0: // %entry2323; CHECK-NEXT: umov w0, v0.h[2]2324; CHECK-NEXT: ret2325entry:2326 %d = extractelement <8 x i16> %a, i32 22327 ret i16 %d2328}2329 2330define i16 @extract_v8i16_c(<8 x i16> %a, i32 %c) {2331; CHECK-SD-LABEL: extract_v8i16_c:2332; CHECK-SD: // %bb.0: // %entry2333; CHECK-SD-NEXT: sub sp, sp, #162334; CHECK-SD-NEXT: .cfi_def_cfa_offset 162335; CHECK-SD-NEXT: mov x8, sp2336; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02337; CHECK-SD-NEXT: str q0, [sp]2338; CHECK-SD-NEXT: bfi x8, x0, #1, #32339; CHECK-SD-NEXT: ldrh w0, [x8]2340; CHECK-SD-NEXT: add sp, sp, #162341; CHECK-SD-NEXT: ret2342;2343; CHECK-GI-LABEL: extract_v8i16_c:2344; CHECK-GI: // %bb.0: // %entry2345; CHECK-GI-NEXT: sub sp, sp, #162346; CHECK-GI-NEXT: .cfi_def_cfa_offset 162347; CHECK-GI-NEXT: mov w9, w02348; CHECK-GI-NEXT: mov x8, sp2349; CHECK-GI-NEXT: str q0, [sp]2350; CHECK-GI-NEXT: and x9, x9, #0x72351; CHECK-GI-NEXT: ldrh w0, [x8, x9, lsl #1]2352; CHECK-GI-NEXT: add sp, sp, #162353; CHECK-GI-NEXT: ret2354entry:2355 %d = extractelement <8 x i16> %a, i32 %c2356 ret i16 %d2357}2358 2359define i16 @extract_v16i16_0(<16 x i16> %a, i32 %c) {2360; CHECK-LABEL: extract_v16i16_0:2361; CHECK: // %bb.0: // %entry2362; CHECK-NEXT: umov w0, v0.h[0]2363; CHECK-NEXT: ret2364entry:2365 %d = extractelement <16 x i16> %a, i32 02366 ret i16 %d2367}2368 2369define i16 @extract_v16i16_2(<16 x i16> %a, i32 %c) {2370; CHECK-LABEL: extract_v16i16_2:2371; CHECK: // %bb.0: // %entry2372; CHECK-NEXT: umov w0, v0.h[2]2373; CHECK-NEXT: ret2374entry:2375 %d = extractelement <16 x i16> %a, i32 22376 ret i16 %d2377}2378 2379define i16 @extract_v16i16_c(<16 x i16> %a, i32 %c) {2380; CHECK-SD-LABEL: extract_v16i16_c:2381; CHECK-SD: // %bb.0: // %entry2382; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2383; CHECK-SD-NEXT: .cfi_def_cfa_offset 322384; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02385; CHECK-SD-NEXT: and x8, x0, #0xf2386; CHECK-SD-NEXT: mov x9, sp2387; CHECK-SD-NEXT: ldrh w0, [x9, x8, lsl #1]2388; CHECK-SD-NEXT: add sp, sp, #322389; CHECK-SD-NEXT: ret2390;2391; CHECK-GI-LABEL: extract_v16i16_c:2392; CHECK-GI: // %bb.0: // %entry2393; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2394; CHECK-GI-NEXT: sub x9, sp, #482395; CHECK-GI-NEXT: mov x29, sp2396; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02397; CHECK-GI-NEXT: .cfi_def_cfa w29, 162398; CHECK-GI-NEXT: .cfi_offset w30, -82399; CHECK-GI-NEXT: .cfi_offset w29, -162400; CHECK-GI-NEXT: mov w8, w02401; CHECK-GI-NEXT: stp q0, q1, [sp]2402; CHECK-GI-NEXT: mov x9, sp2403; CHECK-GI-NEXT: and x8, x8, #0xf2404; CHECK-GI-NEXT: ldrh w0, [x9, x8, lsl #1]2405; CHECK-GI-NEXT: mov sp, x292406; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2407; CHECK-GI-NEXT: ret2408entry:2409 %d = extractelement <16 x i16> %a, i32 %c2410 ret i16 %d2411}2412 2413define i32 @extract_v2i32_0(<2 x i32> %a, i32 %c) {2414; CHECK-SD-LABEL: extract_v2i32_0:2415; CHECK-SD: // %bb.0: // %entry2416; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02417; CHECK-SD-NEXT: fmov w0, s02418; CHECK-SD-NEXT: ret2419;2420; CHECK-GI-LABEL: extract_v2i32_0:2421; CHECK-GI: // %bb.0: // %entry2422; CHECK-GI-NEXT: fmov w0, s02423; CHECK-GI-NEXT: ret2424entry:2425 %d = extractelement <2 x i32> %a, i32 02426 ret i32 %d2427}2428 2429define i32 @extract_v2i32_1(<2 x i32> %a, i32 %c) {2430; CHECK-SD-LABEL: extract_v2i32_1:2431; CHECK-SD: // %bb.0: // %entry2432; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02433; CHECK-SD-NEXT: mov w0, v0.s[1]2434; CHECK-SD-NEXT: ret2435;2436; CHECK-GI-LABEL: extract_v2i32_1:2437; CHECK-GI: // %bb.0: // %entry2438; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02439; CHECK-GI-NEXT: mov s0, v0.s[1]2440; CHECK-GI-NEXT: fmov w0, s02441; CHECK-GI-NEXT: ret2442entry:2443 %d = extractelement <2 x i32> %a, i32 12444 ret i32 %d2445}2446 2447define i32 @extract_v2i32_c(<2 x i32> %a, i32 %c) {2448; CHECK-SD-LABEL: extract_v2i32_c:2449; CHECK-SD: // %bb.0: // %entry2450; CHECK-SD-NEXT: sub sp, sp, #162451; CHECK-SD-NEXT: .cfi_def_cfa_offset 162452; CHECK-SD-NEXT: add x8, sp, #82453; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02454; CHECK-SD-NEXT: str d0, [sp, #8]2455; CHECK-SD-NEXT: bfi x8, x0, #2, #12456; CHECK-SD-NEXT: ldr w0, [x8]2457; CHECK-SD-NEXT: add sp, sp, #162458; CHECK-SD-NEXT: ret2459;2460; CHECK-GI-LABEL: extract_v2i32_c:2461; CHECK-GI: // %bb.0: // %entry2462; CHECK-GI-NEXT: sub sp, sp, #162463; CHECK-GI-NEXT: .cfi_def_cfa_offset 162464; CHECK-GI-NEXT: mov w9, w02465; CHECK-GI-NEXT: add x8, sp, #82466; CHECK-GI-NEXT: str d0, [sp, #8]2467; CHECK-GI-NEXT: and x9, x9, #0x12468; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2]2469; CHECK-GI-NEXT: add sp, sp, #162470; CHECK-GI-NEXT: ret2471entry:2472 %d = extractelement <2 x i32> %a, i32 %c2473 ret i32 %d2474}2475 2476define i32 @extract_v3i32_0(<3 x i32> %a, i32 %c) {2477; CHECK-LABEL: extract_v3i32_0:2478; CHECK: // %bb.0: // %entry2479; CHECK-NEXT: fmov w0, s02480; CHECK-NEXT: ret2481entry:2482 %d = extractelement <3 x i32> %a, i32 02483 ret i32 %d2484}2485 2486define i32 @extract_v3i32_2(<3 x i32> %a, i32 %c) {2487; CHECK-SD-LABEL: extract_v3i32_2:2488; CHECK-SD: // %bb.0: // %entry2489; CHECK-SD-NEXT: mov w0, v0.s[2]2490; CHECK-SD-NEXT: ret2491;2492; CHECK-GI-LABEL: extract_v3i32_2:2493; CHECK-GI: // %bb.0: // %entry2494; CHECK-GI-NEXT: mov s0, v0.s[2]2495; CHECK-GI-NEXT: fmov w0, s02496; CHECK-GI-NEXT: ret2497entry:2498 %d = extractelement <3 x i32> %a, i32 22499 ret i32 %d2500}2501 2502define i32 @extract_v3i32_c(<3 x i32> %a, i32 %c) {2503; CHECK-SD-LABEL: extract_v3i32_c:2504; CHECK-SD: // %bb.0: // %entry2505; CHECK-SD-NEXT: sub sp, sp, #162506; CHECK-SD-NEXT: .cfi_def_cfa_offset 162507; CHECK-SD-NEXT: mov x8, sp2508; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02509; CHECK-SD-NEXT: str q0, [sp]2510; CHECK-SD-NEXT: bfi x8, x0, #2, #22511; CHECK-SD-NEXT: ldr w0, [x8]2512; CHECK-SD-NEXT: add sp, sp, #162513; CHECK-SD-NEXT: ret2514;2515; CHECK-GI-LABEL: extract_v3i32_c:2516; CHECK-GI: // %bb.0: // %entry2517; CHECK-GI-NEXT: sub sp, sp, #162518; CHECK-GI-NEXT: .cfi_def_cfa_offset 162519; CHECK-GI-NEXT: mov w9, w02520; CHECK-GI-NEXT: mov x8, sp2521; CHECK-GI-NEXT: str q0, [sp]2522; CHECK-GI-NEXT: and x9, x9, #0x32523; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2]2524; CHECK-GI-NEXT: add sp, sp, #162525; CHECK-GI-NEXT: ret2526entry:2527 %d = extractelement <3 x i32> %a, i32 %c2528 ret i32 %d2529}2530 2531define i32 @extract_v4i32_0(<4 x i32> %a, i32 %c) {2532; CHECK-LABEL: extract_v4i32_0:2533; CHECK: // %bb.0: // %entry2534; CHECK-NEXT: fmov w0, s02535; CHECK-NEXT: ret2536entry:2537 %d = extractelement <4 x i32> %a, i32 02538 ret i32 %d2539}2540 2541define i32 @extract_v4i32_2(<4 x i32> %a, i32 %c) {2542; CHECK-SD-LABEL: extract_v4i32_2:2543; CHECK-SD: // %bb.0: // %entry2544; CHECK-SD-NEXT: mov w0, v0.s[2]2545; CHECK-SD-NEXT: ret2546;2547; CHECK-GI-LABEL: extract_v4i32_2:2548; CHECK-GI: // %bb.0: // %entry2549; CHECK-GI-NEXT: mov s0, v0.s[2]2550; CHECK-GI-NEXT: fmov w0, s02551; CHECK-GI-NEXT: ret2552entry:2553 %d = extractelement <4 x i32> %a, i32 22554 ret i32 %d2555}2556 2557define i32 @extract_v4i32_c(<4 x i32> %a, i32 %c) {2558; CHECK-SD-LABEL: extract_v4i32_c:2559; CHECK-SD: // %bb.0: // %entry2560; CHECK-SD-NEXT: sub sp, sp, #162561; CHECK-SD-NEXT: .cfi_def_cfa_offset 162562; CHECK-SD-NEXT: mov x8, sp2563; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02564; CHECK-SD-NEXT: str q0, [sp]2565; CHECK-SD-NEXT: bfi x8, x0, #2, #22566; CHECK-SD-NEXT: ldr w0, [x8]2567; CHECK-SD-NEXT: add sp, sp, #162568; CHECK-SD-NEXT: ret2569;2570; CHECK-GI-LABEL: extract_v4i32_c:2571; CHECK-GI: // %bb.0: // %entry2572; CHECK-GI-NEXT: sub sp, sp, #162573; CHECK-GI-NEXT: .cfi_def_cfa_offset 162574; CHECK-GI-NEXT: mov w9, w02575; CHECK-GI-NEXT: mov x8, sp2576; CHECK-GI-NEXT: str q0, [sp]2577; CHECK-GI-NEXT: and x9, x9, #0x32578; CHECK-GI-NEXT: ldr w0, [x8, x9, lsl #2]2579; CHECK-GI-NEXT: add sp, sp, #162580; CHECK-GI-NEXT: ret2581entry:2582 %d = extractelement <4 x i32> %a, i32 %c2583 ret i32 %d2584}2585 2586define i32 @extract_v8i32_0(<8 x i32> %a, i32 %c) {2587; CHECK-LABEL: extract_v8i32_0:2588; CHECK: // %bb.0: // %entry2589; CHECK-NEXT: fmov w0, s02590; CHECK-NEXT: ret2591entry:2592 %d = extractelement <8 x i32> %a, i32 02593 ret i32 %d2594}2595 2596define i32 @extract_v8i32_2(<8 x i32> %a, i32 %c) {2597; CHECK-SD-LABEL: extract_v8i32_2:2598; CHECK-SD: // %bb.0: // %entry2599; CHECK-SD-NEXT: mov w0, v0.s[2]2600; CHECK-SD-NEXT: ret2601;2602; CHECK-GI-LABEL: extract_v8i32_2:2603; CHECK-GI: // %bb.0: // %entry2604; CHECK-GI-NEXT: mov s0, v0.s[2]2605; CHECK-GI-NEXT: fmov w0, s02606; CHECK-GI-NEXT: ret2607entry:2608 %d = extractelement <8 x i32> %a, i32 22609 ret i32 %d2610}2611 2612define i32 @extract_v8i32_c(<8 x i32> %a, i32 %c) {2613; CHECK-SD-LABEL: extract_v8i32_c:2614; CHECK-SD: // %bb.0: // %entry2615; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2616; CHECK-SD-NEXT: .cfi_def_cfa_offset 322617; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02618; CHECK-SD-NEXT: and x8, x0, #0x72619; CHECK-SD-NEXT: mov x9, sp2620; CHECK-SD-NEXT: ldr w0, [x9, x8, lsl #2]2621; CHECK-SD-NEXT: add sp, sp, #322622; CHECK-SD-NEXT: ret2623;2624; CHECK-GI-LABEL: extract_v8i32_c:2625; CHECK-GI: // %bb.0: // %entry2626; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2627; CHECK-GI-NEXT: sub x9, sp, #482628; CHECK-GI-NEXT: mov x29, sp2629; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02630; CHECK-GI-NEXT: .cfi_def_cfa w29, 162631; CHECK-GI-NEXT: .cfi_offset w30, -82632; CHECK-GI-NEXT: .cfi_offset w29, -162633; CHECK-GI-NEXT: mov w8, w02634; CHECK-GI-NEXT: stp q0, q1, [sp]2635; CHECK-GI-NEXT: mov x9, sp2636; CHECK-GI-NEXT: and x8, x8, #0x72637; CHECK-GI-NEXT: ldr w0, [x9, x8, lsl #2]2638; CHECK-GI-NEXT: mov sp, x292639; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2640; CHECK-GI-NEXT: ret2641entry:2642 %d = extractelement <8 x i32> %a, i32 %c2643 ret i32 %d2644}2645 2646define i64 @extract_v2i64_0(<2 x i64> %a, i32 %c) {2647; CHECK-LABEL: extract_v2i64_0:2648; CHECK: // %bb.0: // %entry2649; CHECK-NEXT: fmov x0, d02650; CHECK-NEXT: ret2651entry:2652 %d = extractelement <2 x i64> %a, i32 02653 ret i64 %d2654}2655 2656define i64 @extract_v2i64_1(<2 x i64> %a, i32 %c) {2657; CHECK-SD-LABEL: extract_v2i64_1:2658; CHECK-SD: // %bb.0: // %entry2659; CHECK-SD-NEXT: mov x0, v0.d[1]2660; CHECK-SD-NEXT: ret2661;2662; CHECK-GI-LABEL: extract_v2i64_1:2663; CHECK-GI: // %bb.0: // %entry2664; CHECK-GI-NEXT: mov d0, v0.d[1]2665; CHECK-GI-NEXT: fmov x0, d02666; CHECK-GI-NEXT: ret2667entry:2668 %d = extractelement <2 x i64> %a, i32 12669 ret i64 %d2670}2671 2672define i64 @extract_v2i64_c(<2 x i64> %a, i32 %c) {2673; CHECK-SD-LABEL: extract_v2i64_c:2674; CHECK-SD: // %bb.0: // %entry2675; CHECK-SD-NEXT: sub sp, sp, #162676; CHECK-SD-NEXT: .cfi_def_cfa_offset 162677; CHECK-SD-NEXT: mov x8, sp2678; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02679; CHECK-SD-NEXT: str q0, [sp]2680; CHECK-SD-NEXT: bfi x8, x0, #3, #12681; CHECK-SD-NEXT: ldr x0, [x8]2682; CHECK-SD-NEXT: add sp, sp, #162683; CHECK-SD-NEXT: ret2684;2685; CHECK-GI-LABEL: extract_v2i64_c:2686; CHECK-GI: // %bb.0: // %entry2687; CHECK-GI-NEXT: sub sp, sp, #162688; CHECK-GI-NEXT: .cfi_def_cfa_offset 162689; CHECK-GI-NEXT: mov w9, w02690; CHECK-GI-NEXT: mov x8, sp2691; CHECK-GI-NEXT: str q0, [sp]2692; CHECK-GI-NEXT: and x9, x9, #0x12693; CHECK-GI-NEXT: ldr x0, [x8, x9, lsl #3]2694; CHECK-GI-NEXT: add sp, sp, #162695; CHECK-GI-NEXT: ret2696entry:2697 %d = extractelement <2 x i64> %a, i32 %c2698 ret i64 %d2699}2700 2701define i64 @extract_v3i64_0(<3 x i64> %a, i32 %c) {2702; CHECK-SD-LABEL: extract_v3i64_0:2703; CHECK-SD: // %bb.0: // %entry2704; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02705; CHECK-SD-NEXT: fmov x0, d02706; CHECK-SD-NEXT: ret2707;2708; CHECK-GI-LABEL: extract_v3i64_0:2709; CHECK-GI: // %bb.0: // %entry2710; CHECK-GI-NEXT: fmov x0, d02711; CHECK-GI-NEXT: ret2712entry:2713 %d = extractelement <3 x i64> %a, i32 02714 ret i64 %d2715}2716 2717define i64 @extract_v3i64_2(<3 x i64> %a, i32 %c) {2718; CHECK-SD-LABEL: extract_v3i64_2:2719; CHECK-SD: // %bb.0: // %entry2720; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q22721; CHECK-SD-NEXT: fmov x0, d22722; CHECK-SD-NEXT: ret2723;2724; CHECK-GI-LABEL: extract_v3i64_2:2725; CHECK-GI: // %bb.0: // %entry2726; CHECK-GI-NEXT: fmov x0, d22727; CHECK-GI-NEXT: ret2728entry:2729 %d = extractelement <3 x i64> %a, i32 22730 ret i64 %d2731}2732 2733define i64 @extract_v3i64_c(<3 x i64> %a, i32 %c) {2734; CHECK-SD-LABEL: extract_v3i64_c:2735; CHECK-SD: // %bb.0: // %entry2736; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02737; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q12738; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02739; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q22740; CHECK-SD-NEXT: and x8, x0, #0x32741; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]2742; CHECK-SD-NEXT: stp q0, q2, [sp, #-32]!2743; CHECK-SD-NEXT: .cfi_def_cfa_offset 322744; CHECK-SD-NEXT: mov x9, sp2745; CHECK-SD-NEXT: ldr x0, [x9, x8, lsl #3]2746; CHECK-SD-NEXT: add sp, sp, #322747; CHECK-SD-NEXT: ret2748;2749; CHECK-GI-LABEL: extract_v3i64_c:2750; CHECK-GI: // %bb.0: // %entry2751; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2752; CHECK-GI-NEXT: sub x9, sp, #482753; CHECK-GI-NEXT: mov x29, sp2754; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02755; CHECK-GI-NEXT: .cfi_def_cfa w29, 162756; CHECK-GI-NEXT: .cfi_offset w30, -82757; CHECK-GI-NEXT: .cfi_offset w29, -162758; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02759; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q12760; CHECK-GI-NEXT: mov w8, w02761; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q22762; CHECK-GI-NEXT: mov x9, sp2763; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]2764; CHECK-GI-NEXT: and x8, x8, #0x32765; CHECK-GI-NEXT: stp q0, q2, [sp]2766; CHECK-GI-NEXT: ldr x0, [x9, x8, lsl #3]2767; CHECK-GI-NEXT: mov sp, x292768; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2769; CHECK-GI-NEXT: ret2770entry:2771 %d = extractelement <3 x i64> %a, i32 %c2772 ret i64 %d2773}2774 2775define i64 @extract_v4i64_0(<4 x i64> %a, i32 %c) {2776; CHECK-LABEL: extract_v4i64_0:2777; CHECK: // %bb.0: // %entry2778; CHECK-NEXT: fmov x0, d02779; CHECK-NEXT: ret2780entry:2781 %d = extractelement <4 x i64> %a, i32 02782 ret i64 %d2783}2784 2785define i64 @extract_v4i64_2(<4 x i64> %a, i32 %c) {2786; CHECK-LABEL: extract_v4i64_2:2787; CHECK: // %bb.0: // %entry2788; CHECK-NEXT: fmov x0, d12789; CHECK-NEXT: ret2790entry:2791 %d = extractelement <4 x i64> %a, i32 22792 ret i64 %d2793}2794 2795define i64 @extract_v4i64_c(<4 x i64> %a, i32 %c) {2796; CHECK-SD-LABEL: extract_v4i64_c:2797; CHECK-SD: // %bb.0: // %entry2798; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2799; CHECK-SD-NEXT: .cfi_def_cfa_offset 322800; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02801; CHECK-SD-NEXT: and x8, x0, #0x32802; CHECK-SD-NEXT: mov x9, sp2803; CHECK-SD-NEXT: ldr x0, [x9, x8, lsl #3]2804; CHECK-SD-NEXT: add sp, sp, #322805; CHECK-SD-NEXT: ret2806;2807; CHECK-GI-LABEL: extract_v4i64_c:2808; CHECK-GI: // %bb.0: // %entry2809; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2810; CHECK-GI-NEXT: sub x9, sp, #482811; CHECK-GI-NEXT: mov x29, sp2812; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02813; CHECK-GI-NEXT: .cfi_def_cfa w29, 162814; CHECK-GI-NEXT: .cfi_offset w30, -82815; CHECK-GI-NEXT: .cfi_offset w29, -162816; CHECK-GI-NEXT: mov w8, w02817; CHECK-GI-NEXT: stp q0, q1, [sp]2818; CHECK-GI-NEXT: mov x9, sp2819; CHECK-GI-NEXT: and x8, x8, #0x32820; CHECK-GI-NEXT: ldr x0, [x9, x8, lsl #3]2821; CHECK-GI-NEXT: mov sp, x292822; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2823; CHECK-GI-NEXT: ret2824entry:2825 %d = extractelement <4 x i64> %a, i32 %c2826 ret i64 %d2827}2828 2829define i128 @extract_v2i128_0(<2 x i128> %a, i32 %c) {2830; CHECK-LABEL: extract_v2i128_0:2831; CHECK: // %bb.0: // %entry2832; CHECK-NEXT: adds x0, x0, x02833; CHECK-NEXT: adc x1, x1, x12834; CHECK-NEXT: ret2835entry:2836 %b = add <2 x i128> %a, %a2837 %d = extractelement <2 x i128> %b, i32 02838 ret i128 %d2839}2840 2841define i128 @extract_v2i128_1(<2 x i128> %a, i32 %c) {2842; CHECK-LABEL: extract_v2i128_1:2843; CHECK: // %bb.0: // %entry2844; CHECK-NEXT: adds x0, x2, x22845; CHECK-NEXT: adc x1, x3, x32846; CHECK-NEXT: ret2847entry:2848 %b = add <2 x i128> %a, %a2849 %d = extractelement <2 x i128> %b, i32 12850 ret i128 %d2851}2852 2853define i128 @extract_v2i128_c(<2 x i128> %a, i32 %c) {2854; CHECK-SD-LABEL: extract_v2i128_c:2855; CHECK-SD: // %bb.0: // %entry2856; CHECK-SD-NEXT: sub sp, sp, #642857; CHECK-SD-NEXT: .cfi_def_cfa_offset 642858; CHECK-SD-NEXT: adds x9, x0, x02859; CHECK-SD-NEXT: mov w8, w42860; CHECK-SD-NEXT: adc x10, x1, x12861; CHECK-SD-NEXT: adds x11, x2, x22862; CHECK-SD-NEXT: fmov d1, x92863; CHECK-SD-NEXT: fmov d0, x112864; CHECK-SD-NEXT: adc x12, x3, x32865; CHECK-SD-NEXT: add x8, x8, x82866; CHECK-SD-NEXT: and x9, x8, #0x32867; CHECK-SD-NEXT: add w8, w8, #12868; CHECK-SD-NEXT: mov x11, sp2869; CHECK-SD-NEXT: mov v1.d[1], x102870; CHECK-SD-NEXT: add x10, sp, #322871; CHECK-SD-NEXT: and x8, x8, #0x32872; CHECK-SD-NEXT: mov v0.d[1], x122873; CHECK-SD-NEXT: stp q1, q0, [sp]2874; CHECK-SD-NEXT: stp q1, q0, [sp, #32]2875; CHECK-SD-NEXT: ldr x0, [x10, x9, lsl #3]2876; CHECK-SD-NEXT: ldr x1, [x11, x8, lsl #3]2877; CHECK-SD-NEXT: add sp, sp, #642878; CHECK-SD-NEXT: ret2879;2880; CHECK-GI-LABEL: extract_v2i128_c:2881; CHECK-GI: // %bb.0: // %entry2882; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2883; CHECK-GI-NEXT: sub x9, sp, #482884; CHECK-GI-NEXT: mov x29, sp2885; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02886; CHECK-GI-NEXT: .cfi_def_cfa w29, 162887; CHECK-GI-NEXT: .cfi_offset w30, -82888; CHECK-GI-NEXT: .cfi_offset w29, -162889; CHECK-GI-NEXT: adds x8, x0, x02890; CHECK-GI-NEXT: adc x9, x1, x12891; CHECK-GI-NEXT: mov v0.d[0], x82892; CHECK-GI-NEXT: adds x8, x2, x22893; CHECK-GI-NEXT: mov v1.d[0], x82894; CHECK-GI-NEXT: adc x8, x3, x32895; CHECK-GI-NEXT: mov v0.d[1], x92896; CHECK-GI-NEXT: mov x9, sp2897; CHECK-GI-NEXT: mov v1.d[1], x82898; CHECK-GI-NEXT: mov w8, w42899; CHECK-GI-NEXT: and x8, x8, #0x12900; CHECK-GI-NEXT: stp q0, q1, [sp]2901; CHECK-GI-NEXT: ldr q0, [x9, x8, lsl #4]2902; CHECK-GI-NEXT: mov d1, v0.d[1]2903; CHECK-GI-NEXT: fmov x0, d02904; CHECK-GI-NEXT: fmov x1, d12905; CHECK-GI-NEXT: mov sp, x292906; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2907; CHECK-GI-NEXT: ret2908entry:2909 %b = add <2 x i128> %a, %a2910 %d = extractelement <2 x i128> %b, i32 %c2911 ret i128 %d2912}2913 2914define fp128 @extract_v2fp128_0(<2 x fp128> %a, i32 %c) {2915; CHECK-LABEL: extract_v2fp128_0:2916; CHECK: // %bb.0: // %entry2917; CHECK-NEXT: ret2918entry:2919 %d = extractelement <2 x fp128> %a, i32 02920 ret fp128 %d2921}2922 2923define fp128 @extract_v2fp128_1(<2 x fp128> %a, i32 %c) {2924; CHECK-LABEL: extract_v2fp128_1:2925; CHECK: // %bb.0: // %entry2926; CHECK-NEXT: mov v0.16b, v1.16b2927; CHECK-NEXT: ret2928entry:2929 %d = extractelement <2 x fp128> %a, i32 12930 ret fp128 %d2931}2932 2933define fp128 @extract_v2fp128_c(<2 x fp128> %a, i32 %c) {2934; CHECK-SD-LABEL: extract_v2fp128_c:2935; CHECK-SD: // %bb.0: // %entry2936; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!2937; CHECK-SD-NEXT: .cfi_def_cfa_offset 322938; CHECK-SD-NEXT: // kill: def $w0 killed $w0 def $x02939; CHECK-SD-NEXT: and x8, x0, #0x12940; CHECK-SD-NEXT: mov x9, sp2941; CHECK-SD-NEXT: ldr q0, [x9, x8, lsl #4]2942; CHECK-SD-NEXT: add sp, sp, #322943; CHECK-SD-NEXT: ret2944;2945; CHECK-GI-LABEL: extract_v2fp128_c:2946; CHECK-GI: // %bb.0: // %entry2947; CHECK-GI-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill2948; CHECK-GI-NEXT: sub x9, sp, #482949; CHECK-GI-NEXT: mov x29, sp2950; CHECK-GI-NEXT: and sp, x9, #0xffffffffffffffe02951; CHECK-GI-NEXT: .cfi_def_cfa w29, 162952; CHECK-GI-NEXT: .cfi_offset w30, -82953; CHECK-GI-NEXT: .cfi_offset w29, -162954; CHECK-GI-NEXT: mov w8, w02955; CHECK-GI-NEXT: stp q0, q1, [sp]2956; CHECK-GI-NEXT: mov x9, sp2957; CHECK-GI-NEXT: and x8, x8, #0x12958; CHECK-GI-NEXT: ldr q0, [x9, x8, lsl #4]2959; CHECK-GI-NEXT: mov sp, x292960; CHECK-GI-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload2961; CHECK-GI-NEXT: ret2962entry:2963 %d = extractelement <2 x fp128> %a, i32 %c2964 ret fp128 %d2965}2966