brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 4ed59bc Raw
182 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; INSERT VECTOR ELT5 6define <vscale x 8 x i8> @promote_insert_8i8(<vscale x 8 x i8> %a, i8 %elt, i64 %idx) {7; CHECK-LABEL: promote_insert_8i8:8; CHECK:       // %bb.0:9; CHECK-NEXT:    index z1.h, #0, #110; CHECK-NEXT:    mov z2.h, w111; CHECK-NEXT:    ptrue p0.h12; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h13; CHECK-NEXT:    mov z0.h, p0/m, w014; CHECK-NEXT:    ret15  %ins = insertelement <vscale x 8 x i8> %a, i8 %elt, i64 %idx16  ret <vscale x 8 x i8> %ins17}18 19define <vscale x 32 x i8> @split_insert_32i8_idx(<vscale x 32 x i8> %a, i8 %elt, i64 %idx) {20; CHECK-LABEL: split_insert_32i8_idx:21; CHECK:       // %bb.0:22; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill23; CHECK-NEXT:    addvl sp, sp, #-224; CHECK-NEXT:    .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG25; CHECK-NEXT:    .cfi_offset w29, -1626; CHECK-NEXT:    rdvl x8, #227; CHECK-NEXT:    mov x9, sp28; CHECK-NEXT:    str z1, [sp, #1, mul vl]29; CHECK-NEXT:    sub x8, x8, #130; CHECK-NEXT:    str z0, [sp]31; CHECK-NEXT:    cmp x1, x832; CHECK-NEXT:    csel x8, x1, x8, lo33; CHECK-NEXT:    strb w0, [x9, x8]34; CHECK-NEXT:    ldr z0, [sp]35; CHECK-NEXT:    ldr z1, [sp, #1, mul vl]36; CHECK-NEXT:    addvl sp, sp, #237; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload38; CHECK-NEXT:    ret39  %ins = insertelement <vscale x 32 x i8> %a, i8 %elt, i64 %idx40  ret <vscale x 32 x i8> %ins41}42 43define <vscale x 8 x float> @split_insert_8f32_idx(<vscale x 8 x float> %a, float %elt, i64 %idx) {44; CHECK-LABEL: split_insert_8f32_idx:45; CHECK:       // %bb.0:46; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill47; CHECK-NEXT:    addvl sp, sp, #-248; CHECK-NEXT:    .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG49; CHECK-NEXT:    .cfi_offset w29, -1650; CHECK-NEXT:    cnth x851; CHECK-NEXT:    mov x9, sp52; CHECK-NEXT:    str z1, [sp, #1, mul vl]53; CHECK-NEXT:    sub x8, x8, #154; CHECK-NEXT:    str z0, [sp]55; CHECK-NEXT:    cmp x0, x856; CHECK-NEXT:    csel x8, x0, x8, lo57; CHECK-NEXT:    str s2, [x9, x8, lsl #2]58; CHECK-NEXT:    ldr z0, [sp]59; CHECK-NEXT:    ldr z1, [sp, #1, mul vl]60; CHECK-NEXT:    addvl sp, sp, #261; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload62; CHECK-NEXT:    ret63  %ins = insertelement <vscale x 8 x float> %a, float %elt, i64 %idx64  ret <vscale x 8 x float> %ins65}66 67define <vscale x 8 x i64> @split_insert_8i64_idx(<vscale x 8 x i64> %a, i64 %elt, i64 %idx) {68; CHECK-LABEL: split_insert_8i64_idx:69; CHECK:       // %bb.0:70; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill71; CHECK-NEXT:    addvl sp, sp, #-472; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22 // sp + 16 + 32 * VG73; CHECK-NEXT:    .cfi_offset w29, -1674; CHECK-NEXT:    cnth x875; CHECK-NEXT:    mov x9, sp76; CHECK-NEXT:    str z3, [sp, #3, mul vl]77; CHECK-NEXT:    sub x8, x8, #178; CHECK-NEXT:    str z2, [sp, #2, mul vl]79; CHECK-NEXT:    cmp x1, x880; CHECK-NEXT:    str z1, [sp, #1, mul vl]81; CHECK-NEXT:    csel x8, x1, x8, lo82; CHECK-NEXT:    str z0, [sp]83; CHECK-NEXT:    str x0, [x9, x8, lsl #3]84; CHECK-NEXT:    ldr z0, [sp]85; CHECK-NEXT:    ldr z1, [sp, #1, mul vl]86; CHECK-NEXT:    ldr z2, [sp, #2, mul vl]87; CHECK-NEXT:    ldr z3, [sp, #3, mul vl]88; CHECK-NEXT:    addvl sp, sp, #489; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload90; CHECK-NEXT:    ret91  %ins = insertelement <vscale x 8 x i64> %a, i64 %elt, i64 %idx92  ret <vscale x 8 x i64> %ins93}94 95; INSERT VECTOR ELT, CONSTANT IDX96 97define <vscale x 4 x i16> @promote_insert_4i16(<vscale x 4 x i16> %a, i16 %elt) {98; CHECK-LABEL: promote_insert_4i16:99; CHECK:       // %bb.0:100; CHECK-NEXT:    mov w8, #5 // =0x5101; CHECK-NEXT:    index z1.s, #0, #1102; CHECK-NEXT:    ptrue p0.s103; CHECK-NEXT:    mov z2.s, w8104; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s105; CHECK-NEXT:    mov z0.s, p0/m, w0106; CHECK-NEXT:    ret107  %ins = insertelement <vscale x 4 x i16> %a, i16 %elt, i64 5108  ret <vscale x 4 x i16> %ins109}110 111; In this test, the index is small enough that we know it will be in the112; low half of the vector and there is no need to go through the stack as113; done in the remaining tests114define <vscale x 32 x i8> @split_insert_32i8(<vscale x 32 x i8> %a, i8 %elt) {115; CHECK-LABEL: split_insert_32i8:116; CHECK:       // %bb.0:117; CHECK-NEXT:    mov w8, #3 // =0x3118; CHECK-NEXT:    index z2.b, #0, #1119; CHECK-NEXT:    ptrue p0.b120; CHECK-NEXT:    mov z3.b, w8121; CHECK-NEXT:    cmpeq p0.b, p0/z, z2.b, z3.b122; CHECK-NEXT:    mov z0.b, p0/m, w0123; CHECK-NEXT:    ret124  %ins = insertelement <vscale x 32 x i8> %a, i8 %elt, i64 3125  ret <vscale x 32 x i8> %ins126}127 128define <vscale x 32 x i16> @split_insert_32i16(<vscale x 32 x i16> %a, i16 %elt) {129; CHECK-LABEL: split_insert_32i16:130; CHECK:       // %bb.0:131; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill132; CHECK-NEXT:    addvl sp, sp, #-4133; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22 // sp + 16 + 32 * VG134; CHECK-NEXT:    .cfi_offset w29, -16135; CHECK-NEXT:    rdvl x8, #2136; CHECK-NEXT:    mov w9, #128 // =0x80137; CHECK-NEXT:    str z3, [sp, #3, mul vl]138; CHECK-NEXT:    sub x8, x8, #1139; CHECK-NEXT:    str z2, [sp, #2, mul vl]140; CHECK-NEXT:    cmp x8, #128141; CHECK-NEXT:    str z1, [sp, #1, mul vl]142; CHECK-NEXT:    csel x8, x8, x9, lo143; CHECK-NEXT:    mov x9, sp144; CHECK-NEXT:    str z0, [sp]145; CHECK-NEXT:    strh w0, [x9, x8, lsl #1]146; CHECK-NEXT:    ldr z0, [sp]147; CHECK-NEXT:    ldr z1, [sp, #1, mul vl]148; CHECK-NEXT:    ldr z2, [sp, #2, mul vl]149; CHECK-NEXT:    ldr z3, [sp, #3, mul vl]150; CHECK-NEXT:    addvl sp, sp, #4151; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload152; CHECK-NEXT:    ret153  %ins = insertelement <vscale x 32 x i16> %a, i16 %elt, i64 128154  ret <vscale x 32 x i16> %ins155}156 157define <vscale x 8 x i32> @split_insert_8i32(<vscale x 8 x i32> %a, i32 %elt) {158; CHECK-LABEL: split_insert_8i32:159; CHECK:       // %bb.0:160; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill161; CHECK-NEXT:    addvl sp, sp, #-2162; CHECK-NEXT:    .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG163; CHECK-NEXT:    .cfi_offset w29, -16164; CHECK-NEXT:    cnth x8165; CHECK-NEXT:    mov w9, #16960 // =0x4240166; CHECK-NEXT:    str z1, [sp, #1, mul vl]167; CHECK-NEXT:    movk w9, #15, lsl #16168; CHECK-NEXT:    sub x8, x8, #1169; CHECK-NEXT:    str z0, [sp]170; CHECK-NEXT:    cmp x8, x9171; CHECK-NEXT:    csel x8, x8, x9, lo172; CHECK-NEXT:    mov x9, sp173; CHECK-NEXT:    str w0, [x9, x8, lsl #2]174; CHECK-NEXT:    ldr z0, [sp]175; CHECK-NEXT:    ldr z1, [sp, #1, mul vl]176; CHECK-NEXT:    addvl sp, sp, #2177; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload178; CHECK-NEXT:    ret179  %ins = insertelement <vscale x 8 x i32> %a, i32 %elt, i64 1000000180  ret <vscale x 8 x i32> %ins181}182