203 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3 4; EXTRACT VECTOR ELT5 6define i32 @promote_extract_2i32_idx(<vscale x 2 x i32> %a, i32 %idx) {7; CHECK-LABEL: promote_extract_2i32_idx:8; CHECK: // %bb.0:9; CHECK-NEXT: mov w8, w010; CHECK-NEXT: whilels p0.d, xzr, x811; CHECK-NEXT: lastb x0, p0, z0.d12; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x013; CHECK-NEXT: ret14 %ext = extractelement <vscale x 2 x i32> %a, i32 %idx15 ret i32 %ext16}17 18define i8 @split_extract_32i8_idx(<vscale x 32 x i8> %a, i32 %idx) {19; CHECK-LABEL: split_extract_32i8_idx:20; CHECK: // %bb.0:21; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill22; CHECK-NEXT: addvl sp, sp, #-223; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG24; CHECK-NEXT: .cfi_offset w29, -1625; CHECK-NEXT: rdvl x8, #226; CHECK-NEXT: mov w9, w027; CHECK-NEXT: str z1, [sp, #1, mul vl]28; CHECK-NEXT: sub x8, x8, #129; CHECK-NEXT: str z0, [sp]30; CHECK-NEXT: cmp x9, x831; CHECK-NEXT: csel x8, x9, x8, lo32; CHECK-NEXT: mov x9, sp33; CHECK-NEXT: ldrb w0, [x9, x8]34; CHECK-NEXT: addvl sp, sp, #235; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload36; CHECK-NEXT: ret37 %ext = extractelement <vscale x 32 x i8> %a, i32 %idx38 ret i8 %ext39}40 41define i16 @split_extract_16i16_idx(<vscale x 16 x i16> %a, i32 %idx) {42; CHECK-LABEL: split_extract_16i16_idx:43; CHECK: // %bb.0:44; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill45; CHECK-NEXT: addvl sp, sp, #-246; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG47; CHECK-NEXT: .cfi_offset w29, -1648; CHECK-NEXT: rdvl x8, #149; CHECK-NEXT: mov w9, w050; CHECK-NEXT: str z1, [sp, #1, mul vl]51; CHECK-NEXT: sub x8, x8, #152; CHECK-NEXT: str z0, [sp]53; CHECK-NEXT: cmp x9, x854; CHECK-NEXT: csel x8, x9, x8, lo55; CHECK-NEXT: mov x9, sp56; CHECK-NEXT: ldrh w0, [x9, x8, lsl #1]57; CHECK-NEXT: addvl sp, sp, #258; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload59; CHECK-NEXT: ret60 %ext = extractelement <vscale x 16 x i16> %a, i32 %idx61 ret i16 %ext62}63 64define i32 @split_extract_8i32_idx(<vscale x 8 x i32> %a, i32 %idx) {65; CHECK-LABEL: split_extract_8i32_idx:66; CHECK: // %bb.0:67; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill68; CHECK-NEXT: addvl sp, sp, #-269; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG70; CHECK-NEXT: .cfi_offset w29, -1671; CHECK-NEXT: cnth x872; CHECK-NEXT: mov w9, w073; CHECK-NEXT: str z1, [sp, #1, mul vl]74; CHECK-NEXT: sub x8, x8, #175; CHECK-NEXT: str z0, [sp]76; CHECK-NEXT: cmp x9, x877; CHECK-NEXT: csel x8, x9, x8, lo78; CHECK-NEXT: mov x9, sp79; CHECK-NEXT: ldr w0, [x9, x8, lsl #2]80; CHECK-NEXT: addvl sp, sp, #281; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload82; CHECK-NEXT: ret83 %ext = extractelement <vscale x 8 x i32> %a, i32 %idx84 ret i32 %ext85}86 87define i64 @split_extract_8i64_idx(<vscale x 8 x i64> %a, i32 %idx) {88; CHECK-LABEL: split_extract_8i64_idx:89; CHECK: // %bb.0:90; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill91; CHECK-NEXT: addvl sp, sp, #-492; CHECK-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22 // sp + 16 + 32 * VG93; CHECK-NEXT: .cfi_offset w29, -1694; CHECK-NEXT: cnth x895; CHECK-NEXT: mov w9, w096; CHECK-NEXT: str z3, [sp, #3, mul vl]97; CHECK-NEXT: sub x8, x8, #198; CHECK-NEXT: str z2, [sp, #2, mul vl]99; CHECK-NEXT: cmp x9, x8100; CHECK-NEXT: str z1, [sp, #1, mul vl]101; CHECK-NEXT: str z0, [sp]102; CHECK-NEXT: csel x8, x9, x8, lo103; CHECK-NEXT: mov x9, sp104; CHECK-NEXT: ldr x0, [x9, x8, lsl #3]105; CHECK-NEXT: addvl sp, sp, #4106; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload107; CHECK-NEXT: ret108 %ext = extractelement <vscale x 8 x i64> %a, i32 %idx109 ret i64 %ext110}111 112; EXTRACT VECTOR ELT, CONSTANT IDX113 114define i16 @promote_extract_4i16(<vscale x 4 x i16> %a) {115; CHECK-LABEL: promote_extract_4i16:116; CHECK: // %bb.0:117; CHECK-NEXT: mov w0, v0.s[1]118; CHECK-NEXT: ret119 %ext = extractelement <vscale x 4 x i16> %a, i32 1120 ret i16 %ext121}122 123define i8 @split_extract_32i8(<vscale x 32 x i8> %a) {124; CHECK-LABEL: split_extract_32i8:125; CHECK: // %bb.0:126; CHECK-NEXT: umov w0, v0.b[3]127; CHECK-NEXT: ret128 %ext = extractelement <vscale x 32 x i8> %a, i32 3129 ret i8 %ext130}131 132define i16 @split_extract_16i16(<vscale x 16 x i16> %a) {133; CHECK-LABEL: split_extract_16i16:134; CHECK: // %bb.0:135; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill136; CHECK-NEXT: addvl sp, sp, #-2137; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG138; CHECK-NEXT: .cfi_offset w29, -16139; CHECK-NEXT: rdvl x8, #1140; CHECK-NEXT: mov w9, #128 // =0x80141; CHECK-NEXT: str z1, [sp, #1, mul vl]142; CHECK-NEXT: sub x8, x8, #1143; CHECK-NEXT: str z0, [sp]144; CHECK-NEXT: cmp x8, #128145; CHECK-NEXT: csel x8, x8, x9, lo146; CHECK-NEXT: mov x9, sp147; CHECK-NEXT: ldrh w0, [x9, x8, lsl #1]148; CHECK-NEXT: addvl sp, sp, #2149; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload150; CHECK-NEXT: ret151 %ext = extractelement <vscale x 16 x i16> %a, i32 128152 ret i16 %ext153}154 155define i32 @split_extract_16i32(<vscale x 16 x i32> %a) {156; CHECK-LABEL: split_extract_16i32:157; CHECK: // %bb.0:158; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill159; CHECK-NEXT: addvl sp, sp, #-4160; CHECK-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22 // sp + 16 + 32 * VG161; CHECK-NEXT: .cfi_offset w29, -16162; CHECK-NEXT: rdvl x8, #1163; CHECK-NEXT: mov w9, #34464 // =0x86a0164; CHECK-NEXT: str z3, [sp, #3, mul vl]165; CHECK-NEXT: movk w9, #1, lsl #16166; CHECK-NEXT: sub x8, x8, #1167; CHECK-NEXT: str z2, [sp, #2, mul vl]168; CHECK-NEXT: cmp x8, x9169; CHECK-NEXT: str z1, [sp, #1, mul vl]170; CHECK-NEXT: str z0, [sp]171; CHECK-NEXT: csel x8, x8, x9, lo172; CHECK-NEXT: mov x9, sp173; CHECK-NEXT: ldr w0, [x9, x8, lsl #2]174; CHECK-NEXT: addvl sp, sp, #4175; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload176; CHECK-NEXT: ret177 %ext = extractelement <vscale x 16 x i32> %a, i32 100000178 ret i32 %ext179}180 181define i64 @split_extract_4i64(<vscale x 4 x i64> %a) {182; CHECK-LABEL: split_extract_4i64:183; CHECK: // %bb.0:184; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill185; CHECK-NEXT: addvl sp, sp, #-2186; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG187; CHECK-NEXT: .cfi_offset w29, -16188; CHECK-NEXT: cntw x8189; CHECK-NEXT: mov w9, #10 // =0xa190; CHECK-NEXT: str z1, [sp, #1, mul vl]191; CHECK-NEXT: sub x8, x8, #1192; CHECK-NEXT: str z0, [sp]193; CHECK-NEXT: cmp x8, #10194; CHECK-NEXT: csel x8, x8, x9, lo195; CHECK-NEXT: mov x9, sp196; CHECK-NEXT: ldr x0, [x9, x8, lsl #3]197; CHECK-NEXT: addvl sp, sp, #2198; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload199; CHECK-NEXT: ret200 %ext = extractelement <vscale x 4 x i64> %a, i32 10201 ret i64 %ext202}203