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