brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.5 KiB · 69b3010 Raw
352 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast -aarch64-enable-sink-fold=true | FileCheck %s --check-prefix=CHECK-SDAG3; RUN: llc < %s -global-isel -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast -aarch64-enable-sink-fold=true | FileCheck %s --check-prefix=CHECK-GISEL4 5define <4 x i8> @test_varidx_extract_v8s8(<8 x i8> %x, i32 %idx) {6; CHECK-SDAG-LABEL: test_varidx_extract_v8s8:7; CHECK-SDAG:       // %bb.0:8; CHECK-SDAG-NEXT:    sub sp, sp, #169; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 1610; CHECK-SDAG-NEXT:    add x8, sp, #811; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x012; CHECK-SDAG-NEXT:    // kill: def $d0 killed $d0 def $q013; CHECK-SDAG-NEXT:    str d0, [sp, #8]14; CHECK-SDAG-NEXT:    bfxil x8, x0, #0, #315; CHECK-SDAG-NEXT:    ld1 { v1.b }[0], [x8]16; CHECK-SDAG-NEXT:    mov v1.b[2], v0.b[1]17; CHECK-SDAG-NEXT:    mov v1.b[4], v0.b[2]18; CHECK-SDAG-NEXT:    mov v1.b[6], v0.b[3]19; CHECK-SDAG-NEXT:    fmov d0, d120; CHECK-SDAG-NEXT:    add sp, sp, #1621; CHECK-SDAG-NEXT:    ret22;23; CHECK-GISEL-LABEL: test_varidx_extract_v8s8:24; CHECK-GISEL:       // %bb.0:25; CHECK-GISEL-NEXT:    sub sp, sp, #1626; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 1627; CHECK-GISEL-NEXT:    mov w9, w028; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 def $q029; CHECK-GISEL-NEXT:    mov b1, v0.b[1]30; CHECK-GISEL-NEXT:    add x8, sp, #831; CHECK-GISEL-NEXT:    and x9, x9, #0x732; CHECK-GISEL-NEXT:    str d0, [sp, #8]33; CHECK-GISEL-NEXT:    mov b2, v0.b[2]34; CHECK-GISEL-NEXT:    lsl x10, x9, #135; CHECK-GISEL-NEXT:    mov b0, v0.b[3]36; CHECK-GISEL-NEXT:    sub x9, x10, x937; CHECK-GISEL-NEXT:    ldrb w8, [x8, x9]38; CHECK-GISEL-NEXT:    fmov w9, s139; CHECK-GISEL-NEXT:    fmov s1, w840; CHECK-GISEL-NEXT:    fmov w8, s241; CHECK-GISEL-NEXT:    mov v1.h[1], w942; CHECK-GISEL-NEXT:    mov v1.h[2], w843; CHECK-GISEL-NEXT:    fmov w8, s044; CHECK-GISEL-NEXT:    mov v1.h[3], w845; CHECK-GISEL-NEXT:    fmov d0, d146; CHECK-GISEL-NEXT:    add sp, sp, #1647; CHECK-GISEL-NEXT:    ret48  %tmp = extractelement <8 x i8> %x, i32 %idx49  %tmp2 = insertelement <4 x i8> undef, i8 %tmp, i32 050  %tmp3 = extractelement <8 x i8> %x, i32 151  %tmp4 = insertelement <4 x i8> %tmp2, i8 %tmp3, i32 152  %tmp5 = extractelement <8 x i8> %x, i32 253  %tmp6 = insertelement <4 x i8> %tmp4, i8 %tmp5, i32 254  %tmp7 = extractelement <8 x i8> %x, i32 355  %tmp8 = insertelement <4 x i8> %tmp6, i8 %tmp7, i32 356  ret <4 x i8> %tmp857}58 59define <8 x i8> @test_varidx_extract_v16s8(<16 x i8> %x, i32 %idx) {60; CHECK-SDAG-LABEL: test_varidx_extract_v16s8:61; CHECK-SDAG:       // %bb.0:62; CHECK-SDAG-NEXT:    sub sp, sp, #1663; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 1664; CHECK-SDAG-NEXT:    mov x8, sp65; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x066; CHECK-SDAG-NEXT:    str q0, [sp]67; CHECK-SDAG-NEXT:    bfxil x8, x0, #0, #468; CHECK-SDAG-NEXT:    ldr b1, [x8]69; CHECK-SDAG-NEXT:    mov v1.b[1], v0.b[1]70; CHECK-SDAG-NEXT:    mov v1.b[2], v0.b[2]71; CHECK-SDAG-NEXT:    mov v1.b[3], v0.b[3]72; CHECK-SDAG-NEXT:    mov v1.b[4], v0.b[4]73; CHECK-SDAG-NEXT:    mov v1.b[5], v0.b[5]74; CHECK-SDAG-NEXT:    mov v1.b[6], v0.b[6]75; CHECK-SDAG-NEXT:    mov v1.b[7], v0.b[7]76; CHECK-SDAG-NEXT:    fmov d0, d177; CHECK-SDAG-NEXT:    add sp, sp, #1678; CHECK-SDAG-NEXT:    ret79;80; CHECK-GISEL-LABEL: test_varidx_extract_v16s8:81; CHECK-GISEL:       // %bb.0:82; CHECK-GISEL-NEXT:    sub sp, sp, #1683; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 1684; CHECK-GISEL-NEXT:    mov w9, w085; CHECK-GISEL-NEXT:    mov x8, sp86; CHECK-GISEL-NEXT:    str q0, [sp]87; CHECK-GISEL-NEXT:    and x9, x9, #0xf88; CHECK-GISEL-NEXT:    lsl x10, x9, #189; CHECK-GISEL-NEXT:    sub x9, x10, x990; CHECK-GISEL-NEXT:    ldr b1, [x8, x9]91; CHECK-GISEL-NEXT:    mov v1.b[1], v0.b[1]92; CHECK-GISEL-NEXT:    mov v1.b[2], v0.b[2]93; CHECK-GISEL-NEXT:    mov v1.b[3], v0.b[3]94; CHECK-GISEL-NEXT:    mov v1.b[4], v0.b[4]95; CHECK-GISEL-NEXT:    mov v1.b[5], v0.b[5]96; CHECK-GISEL-NEXT:    mov v1.b[6], v0.b[6]97; CHECK-GISEL-NEXT:    mov v1.b[7], v0.b[7]98; CHECK-GISEL-NEXT:    fmov d0, d199; CHECK-GISEL-NEXT:    add sp, sp, #16100; CHECK-GISEL-NEXT:    ret101  %tmp = extractelement <16 x i8> %x, i32 %idx102  %tmp2 = insertelement <8 x i8> undef, i8 %tmp, i32 0103  %tmp3 = extractelement <16 x i8> %x, i32 1104  %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 1105  %tmp5 = extractelement <16 x i8> %x, i32 2106  %tmp6 = insertelement <8 x i8> %tmp4, i8 %tmp5, i32 2107  %tmp7 = extractelement <16 x i8> %x, i32 3108  %tmp8 = insertelement <8 x i8> %tmp6, i8 %tmp7, i32 3109  %tmp9 = extractelement <16 x i8> %x, i32 4110  %tmp10 = insertelement <8 x i8> %tmp8, i8 %tmp9, i32 4111  %tmp11 = extractelement <16 x i8> %x, i32 5112  %tmp12 = insertelement <8 x i8> %tmp10, i8 %tmp11, i32 5113  %tmp13 = extractelement <16 x i8> %x, i32 6114  %tmp14 = insertelement <8 x i8> %tmp12, i8 %tmp13, i32 6115  %tmp15 = extractelement <16 x i8> %x, i32 7116  %tmp16 = insertelement <8 x i8> %tmp14, i8 %tmp15, i32 7117  ret <8 x i8> %tmp16118}119 120define i16 @test_varidx_extract_v2s16(<2 x i16> %x, i32 %idx) {121; CHECK-SDAG-LABEL: test_varidx_extract_v2s16:122; CHECK-SDAG:       // %bb.0:123; CHECK-SDAG-NEXT:    sub sp, sp, #16124; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16125; CHECK-SDAG-NEXT:    add x8, sp, #8126; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0127; CHECK-SDAG-NEXT:    str d0, [sp, #8]128; CHECK-SDAG-NEXT:    bfi x8, x0, #2, #1129; CHECK-SDAG-NEXT:    ldr w0, [x8]130; CHECK-SDAG-NEXT:    add sp, sp, #16131; CHECK-SDAG-NEXT:    ret132;133; CHECK-GISEL-LABEL: test_varidx_extract_v2s16:134; CHECK-GISEL:       // %bb.0:135; CHECK-GISEL-NEXT:    sub sp, sp, #16136; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16137; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0138; CHECK-GISEL-NEXT:    mov s1, v0.s[1]139; CHECK-GISEL-NEXT:    mov w9, w0140; CHECK-GISEL-NEXT:    add x8, sp, #12141; CHECK-GISEL-NEXT:    str h0, [sp, #12]142; CHECK-GISEL-NEXT:    and x9, x9, #0x1143; CHECK-GISEL-NEXT:    str h1, [sp, #14]144; CHECK-GISEL-NEXT:    ldrh w0, [x8, x9, lsl #1]145; CHECK-GISEL-NEXT:    add sp, sp, #16146; CHECK-GISEL-NEXT:    ret147  %tmp = extractelement <2 x i16> %x, i32 %idx148  ret i16 %tmp149}150 151define <2 x i16> @test_varidx_extract_v4s16(<4 x i16> %x, i32 %idx) {152; CHECK-SDAG-LABEL: test_varidx_extract_v4s16:153; CHECK-SDAG:       // %bb.0:154; CHECK-SDAG-NEXT:    sub sp, sp, #16155; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16156; CHECK-SDAG-NEXT:    add x8, sp, #8157; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0158; CHECK-SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0159; CHECK-SDAG-NEXT:    str d0, [sp, #8]160; CHECK-SDAG-NEXT:    bfi x8, x0, #1, #2161; CHECK-SDAG-NEXT:    ld1 { v1.h }[0], [x8]162; CHECK-SDAG-NEXT:    mov v1.h[2], v0.h[1]163; CHECK-SDAG-NEXT:    fmov d0, d1164; CHECK-SDAG-NEXT:    add sp, sp, #16165; CHECK-SDAG-NEXT:    ret166;167; CHECK-GISEL-LABEL: test_varidx_extract_v4s16:168; CHECK-GISEL:       // %bb.0:169; CHECK-GISEL-NEXT:    sub sp, sp, #16170; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16171; CHECK-GISEL-NEXT:    mov w9, w0172; CHECK-GISEL-NEXT:    mov w8, #2 // =0x2173; CHECK-GISEL-NEXT:    add x10, sp, #8174; CHECK-GISEL-NEXT:    and x9, x9, #0x3175; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0176; CHECK-GISEL-NEXT:    str d0, [sp, #8]177; CHECK-GISEL-NEXT:    umaddl x8, w9, w8, x10178; CHECK-GISEL-NEXT:    umov w9, v0.h[1]179; CHECK-GISEL-NEXT:    ld1 { v0.h }[0], [x8]180; CHECK-GISEL-NEXT:    mov v0.s[1], w9181; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0182; CHECK-GISEL-NEXT:    add sp, sp, #16183; CHECK-GISEL-NEXT:    ret184  %tmp = extractelement <4 x i16> %x, i32 %idx185  %tmp2 = insertelement <2 x i16> undef, i16 %tmp, i32 0186  %tmp3 = extractelement <4 x i16> %x, i32 1187  %tmp4 = insertelement <2 x i16> %tmp2, i16 %tmp3, i32 1188  ret <2 x i16> %tmp4189}190 191define <4 x i16> @test_varidx_extract_v8s16(<8 x i16> %x, i32 %idx) {192; CHECK-SDAG-LABEL: test_varidx_extract_v8s16:193; CHECK-SDAG:       // %bb.0:194; CHECK-SDAG-NEXT:    sub sp, sp, #16195; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16196; CHECK-SDAG-NEXT:    mov x8, sp197; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0198; CHECK-SDAG-NEXT:    str q0, [sp]199; CHECK-SDAG-NEXT:    bfi x8, x0, #1, #3200; CHECK-SDAG-NEXT:    ldr h1, [x8]201; CHECK-SDAG-NEXT:    mov v1.h[1], v0.h[1]202; CHECK-SDAG-NEXT:    mov v1.h[2], v0.h[2]203; CHECK-SDAG-NEXT:    mov v1.h[3], v0.h[3]204; CHECK-SDAG-NEXT:    fmov d0, d1205; CHECK-SDAG-NEXT:    add sp, sp, #16206; CHECK-SDAG-NEXT:    ret207;208; CHECK-GISEL-LABEL: test_varidx_extract_v8s16:209; CHECK-GISEL:       // %bb.0:210; CHECK-GISEL-NEXT:    sub sp, sp, #16211; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16212; CHECK-GISEL-NEXT:    mov w9, w0213; CHECK-GISEL-NEXT:    mov x8, sp214; CHECK-GISEL-NEXT:    str q0, [sp]215; CHECK-GISEL-NEXT:    and x9, x9, #0x7216; CHECK-GISEL-NEXT:    ldr h1, [x8, x9, lsl #1]217; CHECK-GISEL-NEXT:    mov v1.h[1], v0.h[1]218; CHECK-GISEL-NEXT:    mov v1.h[2], v0.h[2]219; CHECK-GISEL-NEXT:    mov v1.h[3], v0.h[3]220; CHECK-GISEL-NEXT:    fmov d0, d1221; CHECK-GISEL-NEXT:    add sp, sp, #16222; CHECK-GISEL-NEXT:    ret223  %tmp = extractelement <8 x i16> %x, i32 %idx224  %tmp2 = insertelement <4 x i16> undef, i16 %tmp, i32 0225  %tmp3 = extractelement <8 x i16> %x, i32 1226  %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 1227  %tmp5 = extractelement <8 x i16> %x, i32 2228  %tmp6 = insertelement <4 x i16> %tmp4, i16 %tmp5, i32 2229  %tmp7 = extractelement <8 x i16> %x, i32 3230  %tmp8 = insertelement <4 x i16> %tmp6, i16 %tmp7, i32 3231  ret <4 x i16> %tmp8232}233 234define i32 @test_varidx_extract_v2s32(<2 x i32> %x, i32 %idx) {235; CHECK-SDAG-LABEL: test_varidx_extract_v2s32:236; CHECK-SDAG:       // %bb.0:237; CHECK-SDAG-NEXT:    sub sp, sp, #16238; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16239; CHECK-SDAG-NEXT:    add x8, sp, #8240; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0241; CHECK-SDAG-NEXT:    str d0, [sp, #8]242; CHECK-SDAG-NEXT:    bfi x8, x0, #2, #1243; CHECK-SDAG-NEXT:    ldr w0, [x8]244; CHECK-SDAG-NEXT:    add sp, sp, #16245; CHECK-SDAG-NEXT:    ret246;247; CHECK-GISEL-LABEL: test_varidx_extract_v2s32:248; CHECK-GISEL:       // %bb.0:249; CHECK-GISEL-NEXT:    sub sp, sp, #16250; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16251; CHECK-GISEL-NEXT:    mov w9, w0252; CHECK-GISEL-NEXT:    add x8, sp, #8253; CHECK-GISEL-NEXT:    str d0, [sp, #8]254; CHECK-GISEL-NEXT:    and x9, x9, #0x1255; CHECK-GISEL-NEXT:    ldr w0, [x8, x9, lsl #2]256; CHECK-GISEL-NEXT:    add sp, sp, #16257; CHECK-GISEL-NEXT:    ret258  %tmp = extractelement <2 x i32> %x, i32 %idx259  ret i32 %tmp260}261 262define <2 x i32> @test_varidx_extract_v4s32(<4 x i32> %x, i32 %idx) {263; CHECK-SDAG-LABEL: test_varidx_extract_v4s32:264; CHECK-SDAG:       // %bb.0:265; CHECK-SDAG-NEXT:    sub sp, sp, #16266; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16267; CHECK-SDAG-NEXT:    mov x8, sp268; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0269; CHECK-SDAG-NEXT:    str q0, [sp]270; CHECK-SDAG-NEXT:    bfi x8, x0, #2, #2271; CHECK-SDAG-NEXT:    ldr s1, [x8]272; CHECK-SDAG-NEXT:    mov v1.s[1], v0.s[1]273; CHECK-SDAG-NEXT:    fmov d0, d1274; CHECK-SDAG-NEXT:    add sp, sp, #16275; CHECK-SDAG-NEXT:    ret276;277; CHECK-GISEL-LABEL: test_varidx_extract_v4s32:278; CHECK-GISEL:       // %bb.0:279; CHECK-GISEL-NEXT:    sub sp, sp, #16280; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16281; CHECK-GISEL-NEXT:    mov w9, w0282; CHECK-GISEL-NEXT:    mov x8, sp283; CHECK-GISEL-NEXT:    str q0, [sp]284; CHECK-GISEL-NEXT:    and x9, x9, #0x3285; CHECK-GISEL-NEXT:    ldr s1, [x8, x9, lsl #2]286; CHECK-GISEL-NEXT:    mov v1.s[1], v0.s[1]287; CHECK-GISEL-NEXT:    fmov d0, d1288; CHECK-GISEL-NEXT:    add sp, sp, #16289; CHECK-GISEL-NEXT:    ret290  %tmp = extractelement <4 x i32> %x, i32 %idx291  %tmp2 = insertelement <2 x i32> undef, i32 %tmp, i32 0292  %tmp3 = extractelement <4 x i32> %x, i32 1293  %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1294  ret <2 x i32> %tmp4295}296 297define i64 @test_varidx_extract_v2s64(<2 x i64> %x, i32 %idx) {298; CHECK-SDAG-LABEL: test_varidx_extract_v2s64:299; CHECK-SDAG:       // %bb.0:300; CHECK-SDAG-NEXT:    sub sp, sp, #16301; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16302; CHECK-SDAG-NEXT:    mov x8, sp303; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0304; CHECK-SDAG-NEXT:    str q0, [sp]305; CHECK-SDAG-NEXT:    bfi x8, x0, #3, #1306; CHECK-SDAG-NEXT:    ldr x0, [x8]307; CHECK-SDAG-NEXT:    add sp, sp, #16308; CHECK-SDAG-NEXT:    ret309;310; CHECK-GISEL-LABEL: test_varidx_extract_v2s64:311; CHECK-GISEL:       // %bb.0:312; CHECK-GISEL-NEXT:    sub sp, sp, #16313; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16314; CHECK-GISEL-NEXT:    mov w9, w0315; CHECK-GISEL-NEXT:    mov x8, sp316; CHECK-GISEL-NEXT:    str q0, [sp]317; CHECK-GISEL-NEXT:    and x9, x9, #0x1318; CHECK-GISEL-NEXT:    ldr x0, [x8, x9, lsl #3]319; CHECK-GISEL-NEXT:    add sp, sp, #16320; CHECK-GISEL-NEXT:    ret321  %tmp = extractelement <2 x i64> %x, i32 %idx322  ret i64 %tmp323}324 325define ptr @test_varidx_extract_v2p0(<2 x ptr> %x, i32 %idx) {326; CHECK-SDAG-LABEL: test_varidx_extract_v2p0:327; CHECK-SDAG:       // %bb.0:328; CHECK-SDAG-NEXT:    sub sp, sp, #16329; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16330; CHECK-SDAG-NEXT:    mov x8, sp331; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0332; CHECK-SDAG-NEXT:    str q0, [sp]333; CHECK-SDAG-NEXT:    bfi x8, x0, #3, #1334; CHECK-SDAG-NEXT:    ldr x0, [x8]335; CHECK-SDAG-NEXT:    add sp, sp, #16336; CHECK-SDAG-NEXT:    ret337;338; CHECK-GISEL-LABEL: test_varidx_extract_v2p0:339; CHECK-GISEL:       // %bb.0:340; CHECK-GISEL-NEXT:    sub sp, sp, #16341; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16342; CHECK-GISEL-NEXT:    mov w9, w0343; CHECK-GISEL-NEXT:    mov x8, sp344; CHECK-GISEL-NEXT:    str q0, [sp]345; CHECK-GISEL-NEXT:    and x9, x9, #0x1346; CHECK-GISEL-NEXT:    ldr x0, [x8, x9, lsl #3]347; CHECK-GISEL-NEXT:    add sp, sp, #16348; CHECK-GISEL-NEXT:    ret349  %tmp = extractelement <2 x ptr> %x, i32 %idx350  ret ptr %tmp351}352