202 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; extractelement10;11 12define half @extractelement_v2f16(<2 x half> %op1) {13; CHECK-LABEL: extractelement_v2f16:14; CHECK: // %bb.0:15; CHECK-NEXT: // kill: def $d0 killed $d0 def $z016; CHECK-NEXT: mov z0.h, z0.h[1]17; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z018; CHECK-NEXT: ret19;20; NONEON-NOSVE-LABEL: extractelement_v2f16:21; NONEON-NOSVE: // %bb.0:22; NONEON-NOSVE-NEXT: sub sp, sp, #1623; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1624; NONEON-NOSVE-NEXT: str d0, [sp, #8]25; NONEON-NOSVE-NEXT: ldr h0, [sp, #10]26; NONEON-NOSVE-NEXT: add sp, sp, #1627; NONEON-NOSVE-NEXT: ret28 %r = extractelement <2 x half> %op1, i64 129 ret half %r30}31 32define half @extractelement_v4f16(<4 x half> %op1) {33; CHECK-LABEL: extractelement_v4f16:34; CHECK: // %bb.0:35; CHECK-NEXT: // kill: def $d0 killed $d0 def $z036; CHECK-NEXT: mov z0.h, z0.h[3]37; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z038; CHECK-NEXT: ret39;40; NONEON-NOSVE-LABEL: extractelement_v4f16:41; NONEON-NOSVE: // %bb.0:42; NONEON-NOSVE-NEXT: sub sp, sp, #1643; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1644; NONEON-NOSVE-NEXT: str d0, [sp, #8]45; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]46; NONEON-NOSVE-NEXT: add sp, sp, #1647; NONEON-NOSVE-NEXT: ret48 %r = extractelement <4 x half> %op1, i64 349 ret half %r50}51 52define half @extractelement_v8f16(<8 x half> %op1) {53; CHECK-LABEL: extractelement_v8f16:54; CHECK: // %bb.0:55; CHECK-NEXT: // kill: def $q0 killed $q0 def $z056; CHECK-NEXT: mov z0.h, z0.h[7]57; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z058; CHECK-NEXT: ret59;60; NONEON-NOSVE-LABEL: extractelement_v8f16:61; NONEON-NOSVE: // %bb.0:62; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!63; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1664; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]65; NONEON-NOSVE-NEXT: add sp, sp, #1666; NONEON-NOSVE-NEXT: ret67 %r = extractelement <8 x half> %op1, i64 768 ret half %r69}70 71define half @extractelement_v16f16(ptr %a) {72; CHECK-LABEL: extractelement_v16f16:73; CHECK: // %bb.0:74; CHECK-NEXT: ldr q0, [x0, #16]75; CHECK-NEXT: mov z0.h, z0.h[7]76; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z077; CHECK-NEXT: ret78;79; NONEON-NOSVE-LABEL: extractelement_v16f16:80; NONEON-NOSVE: // %bb.0:81; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]82; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!83; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 1684; NONEON-NOSVE-NEXT: ldr h0, [sp, #14]85; NONEON-NOSVE-NEXT: add sp, sp, #1686; NONEON-NOSVE-NEXT: ret87 %op1 = load <16 x half>, ptr %a88 %r = extractelement <16 x half> %op1, i64 1589 ret half %r90}91 92define float @extractelement_v2f32(<2 x float> %op1) {93; CHECK-LABEL: extractelement_v2f32:94; CHECK: // %bb.0:95; CHECK-NEXT: // kill: def $d0 killed $d0 def $z096; CHECK-NEXT: mov z0.s, z0.s[1]97; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z098; CHECK-NEXT: ret99;100; NONEON-NOSVE-LABEL: extractelement_v2f32:101; NONEON-NOSVE: // %bb.0:102; NONEON-NOSVE-NEXT: sub sp, sp, #16103; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16104; NONEON-NOSVE-NEXT: str d0, [sp, #8]105; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]106; NONEON-NOSVE-NEXT: add sp, sp, #16107; NONEON-NOSVE-NEXT: ret108 %r = extractelement <2 x float> %op1, i64 1109 ret float %r110}111 112define float @extractelement_v4f32(<4 x float> %op1) {113; CHECK-LABEL: extractelement_v4f32:114; CHECK: // %bb.0:115; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0116; CHECK-NEXT: mov z0.s, z0.s[3]117; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0118; CHECK-NEXT: ret119;120; NONEON-NOSVE-LABEL: extractelement_v4f32:121; NONEON-NOSVE: // %bb.0:122; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!123; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16124; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]125; NONEON-NOSVE-NEXT: add sp, sp, #16126; NONEON-NOSVE-NEXT: ret127 %r = extractelement <4 x float> %op1, i64 3128 ret float %r129}130 131define float @extractelement_v8f32(ptr %a) {132; CHECK-LABEL: extractelement_v8f32:133; CHECK: // %bb.0:134; CHECK-NEXT: ldr q0, [x0, #16]135; CHECK-NEXT: mov z0.s, z0.s[3]136; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0137; CHECK-NEXT: ret138;139; NONEON-NOSVE-LABEL: extractelement_v8f32:140; NONEON-NOSVE: // %bb.0:141; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]142; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!143; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16144; NONEON-NOSVE-NEXT: ldr s0, [sp, #12]145; NONEON-NOSVE-NEXT: add sp, sp, #16146; NONEON-NOSVE-NEXT: ret147 %op1 = load <8 x float>, ptr %a148 %r = extractelement <8 x float> %op1, i64 7149 ret float %r150}151 152define double @extractelement_v1f64(<1 x double> %op1) {153; CHECK-LABEL: extractelement_v1f64:154; CHECK: // %bb.0:155; CHECK-NEXT: ret156;157; NONEON-NOSVE-LABEL: extractelement_v1f64:158; NONEON-NOSVE: // %bb.0:159; NONEON-NOSVE-NEXT: ret160 %r = extractelement <1 x double> %op1, i64 0161 ret double %r162}163define double @extractelement_v2f64(<2 x double> %op1) {164; CHECK-LABEL: extractelement_v2f64:165; CHECK: // %bb.0:166; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0167; CHECK-NEXT: mov z0.d, z0.d[1]168; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0169; CHECK-NEXT: ret170;171; NONEON-NOSVE-LABEL: extractelement_v2f64:172; NONEON-NOSVE: // %bb.0:173; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!174; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16175; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]176; NONEON-NOSVE-NEXT: add sp, sp, #16177; NONEON-NOSVE-NEXT: ret178 %r = extractelement <2 x double> %op1, i64 1179 ret double %r180}181 182define double @extractelement_v4f64(ptr %a) {183; CHECK-LABEL: extractelement_v4f64:184; CHECK: // %bb.0:185; CHECK-NEXT: ldr q0, [x0, #16]186; CHECK-NEXT: mov z0.d, z0.d[1]187; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0188; CHECK-NEXT: ret189;190; NONEON-NOSVE-LABEL: extractelement_v4f64:191; NONEON-NOSVE: // %bb.0:192; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]193; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!194; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16195; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]196; NONEON-NOSVE-NEXT: add sp, sp, #16197; NONEON-NOSVE-NEXT: ret198 %op1 = load <4 x double>, ptr %a199 %r = extractelement <4 x double> %op1, i64 3200 ret double %r201}202