brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.7 KiB · b97b9b1 Raw
426 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s3 4define <8 x i8> @inserti8_first(ptr %p) {5; CHECK-LABEL: inserti8_first:6; CHECK:       // %bb.0:7; CHECK-NEXT:    ldr d0, [x0]8; CHECK-NEXT:    ret9  %q = getelementptr inbounds i8, ptr %p, i32 110  %l1 = load <8 x i8>, ptr %q11  %l2 = load i8, ptr %p12  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>13  %ins = insertelement <8 x i8> %s, i8 %l2, i32 014  ret <8 x i8> %ins15}16 17define <8 x i8> @inserti8_last(ptr %p) {18; CHECK-LABEL: inserti8_last:19; CHECK:       // %bb.0:20; CHECK-NEXT:    ldur d0, [x0, #1]21; CHECK-NEXT:    ret22  %q = getelementptr inbounds i8, ptr %p, i32 823  %l1 = load <8 x i8>, ptr %p24  %l2 = load i8, ptr %q25  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>26  %ins = insertelement <8 x i8> %s, i8 %l2, i32 727  ret <8 x i8> %ins28}29 30define <8 x i16> @inserti8_first_sext(ptr %p) {31; CHECK-LABEL: inserti8_first_sext:32; CHECK:       // %bb.0:33; CHECK-NEXT:    ldr d0, [x0]34; CHECK-NEXT:    sshll v0.8h, v0.8b, #035; CHECK-NEXT:    ret36  %q = getelementptr inbounds i8, ptr %p, i32 137  %l1 = load <8 x i8>, ptr %q38  %s1 = sext <8 x i8> %l1 to <8 x i16>39  %l2 = load i8, ptr %p40  %s2 = sext i8 %l2 to i1641  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>42  %ins = insertelement <8 x i16> %s, i16 %s2, i32 043  ret <8 x i16> %ins44}45 46define <8 x i16> @inserti8_last_sext(ptr %p) {47; CHECK-LABEL: inserti8_last_sext:48; CHECK:       // %bb.0:49; CHECK-NEXT:    ldur d0, [x0, #1]50; CHECK-NEXT:    sshll v0.8h, v0.8b, #051; CHECK-NEXT:    ret52  %q = getelementptr inbounds i8, ptr %p, i32 853  %l1 = load <8 x i8>, ptr %p54  %s1 = sext <8 x i8> %l1 to <8 x i16>55  %l2 = load i8, ptr %q56  %s2 = sext i8 %l2 to i1657  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>58  %ins = insertelement <8 x i16> %s, i16 %s2, i32 759  ret <8 x i16> %ins60}61 62define <8 x i16> @inserti8_first_zext(ptr %p) {63; CHECK-LABEL: inserti8_first_zext:64; CHECK:       // %bb.0:65; CHECK-NEXT:    ldr d0, [x0]66; CHECK-NEXT:    ushll v0.8h, v0.8b, #067; CHECK-NEXT:    ret68  %q = getelementptr inbounds i8, ptr %p, i32 169  %l1 = load <8 x i8>, ptr %q70  %s1 = zext <8 x i8> %l1 to <8 x i16>71  %l2 = load i8, ptr %p72  %s2 = zext i8 %l2 to i1673  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>74  %ins = insertelement <8 x i16> %s, i16 %s2, i32 075  ret <8 x i16> %ins76}77 78define <8 x i16> @inserti8_last_zext(ptr %p) {79; CHECK-LABEL: inserti8_last_zext:80; CHECK:       // %bb.0:81; CHECK-NEXT:    ldur d0, [x0, #1]82; CHECK-NEXT:    ushll v0.8h, v0.8b, #083; CHECK-NEXT:    ret84  %q = getelementptr inbounds i8, ptr %p, i32 885  %l1 = load <8 x i8>, ptr %p86  %s1 = zext <8 x i8> %l1 to <8 x i16>87  %l2 = load i8, ptr %q88  %s2 = zext i8 %l2 to i1689  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>90  %ins = insertelement <8 x i16> %s, i16 %s2, i32 791  ret <8 x i16> %ins92}93 94define <8 x i32> @inserti32_first(ptr %p) {95; CHECK-LABEL: inserti32_first:96; CHECK:       // %bb.0:97; CHECK-NEXT:    ldp q0, q1, [x0]98; CHECK-NEXT:    ret99  %q = getelementptr inbounds i8, ptr %p, i32 4100  %l1 = load <8 x i32>, ptr %q101  %l2 = load i32, ptr %p102  %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>103  %ins = insertelement <8 x i32> %s, i32 %l2, i32 0104  ret <8 x i32> %ins105}106 107define <8 x i32> @inserti32_last(ptr %p) {108; CHECK-LABEL: inserti32_last:109; CHECK:       // %bb.0:110; CHECK-NEXT:    ldur q0, [x0, #4]111; CHECK-NEXT:    ldur q1, [x0, #20]112; CHECK-NEXT:    ret113  %q = getelementptr inbounds i8, ptr %p, i32 32114  %l1 = load <8 x i32>, ptr %p115  %l2 = load i32, ptr %q116  %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>117  %ins = insertelement <8 x i32> %s, i32 %l2, i32 7118  ret <8 x i32> %ins119}120 121define <8 x i32> @inserti32_first_multiuse(ptr %p) {122; CHECK-LABEL: inserti32_first_multiuse:123; CHECK:       // %bb.0:124; CHECK-NEXT:    ldp q3, q2, [x0]125; CHECK-NEXT:    ldur q1, [x0, #20]126; CHECK-NEXT:    ldur q0, [x0, #4]127; CHECK-NEXT:    add v0.4s, v0.4s, v3.4s128; CHECK-NEXT:    add v1.4s, v1.4s, v2.4s129; CHECK-NEXT:    ret130  %q = getelementptr inbounds i8, ptr %p, i32 4131  %l1 = load <8 x i32>, ptr %q132  %l2 = load i32, ptr %p133  %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>134  %ins = insertelement <8 x i32> %s, i32 %l2, i32 0135  %a = add <8 x i32> %l1, %ins136  ret <8 x i32> %a137}138 139define <8 x i32> @inserti32_last_multiuse(ptr %p) {140; CHECK-LABEL: inserti32_last_multiuse:141; CHECK:       // %bb.0:142; CHECK-NEXT:    ldp q0, q1, [x0]143; CHECK-NEXT:    ldur q2, [x0, #20]144; CHECK-NEXT:    ldur q3, [x0, #4]145; CHECK-NEXT:    add v0.4s, v0.4s, v3.4s146; CHECK-NEXT:    add v1.4s, v1.4s, v2.4s147; CHECK-NEXT:    ret148  %q = getelementptr inbounds i8, ptr %p, i32 32149  %l1 = load <8 x i32>, ptr %p150  %l2 = load i32, ptr %q151  %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>152  %ins = insertelement <8 x i32> %s, i32 %l2, i32 7153  %a = add <8 x i32> %l1, %ins154  ret <8 x i32> %a155}156 157define <4 x float> @insertf32_first(ptr %p) {158; CHECK-LABEL: insertf32_first:159; CHECK:       // %bb.0:160; CHECK-NEXT:    ldr q0, [x0]161; CHECK-NEXT:    ret162  %q = getelementptr inbounds i8, ptr %p, i32 4163  %l1 = load <4 x float>, ptr %q164  %l2 = load float, ptr %p165  %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>166  %ins = insertelement <4 x float> %s, float %l2, i32 0167  ret <4 x float> %ins168}169 170define <4 x float> @insertf32_last(ptr %p) {171; CHECK-LABEL: insertf32_last:172; CHECK:       // %bb.0:173; CHECK-NEXT:    ldur q0, [x0, #4]174; CHECK-NEXT:    ret175  %q = getelementptr inbounds i8, ptr %p, i32 16176  %l1 = load <4 x float>, ptr %p177  %l2 = load float, ptr %q178  %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 undef>179  %ins = insertelement <4 x float> %s, float %l2, i32 3180  ret <4 x float> %ins181}182 183define <2 x i64> @inserti64_first(ptr %p) {184; CHECK-LABEL: inserti64_first:185; CHECK:       // %bb.0:186; CHECK-NEXT:    ldr q0, [x0]187; CHECK-NEXT:    ret188  %q = getelementptr inbounds i8, ptr %p, i32 8189  %l1 = load <2 x i64>, ptr %q190  %l2 = load i64, ptr %p191  %s = shufflevector <2 x i64> %l1, <2 x i64> undef, <2 x i32> <i32 undef, i32 0>192  %ins = insertelement <2 x i64> %s, i64 %l2, i32 0193  ret <2 x i64> %ins194}195 196define <2 x i64> @inserti64_last(ptr %p) {197; CHECK-LABEL: inserti64_last:198; CHECK:       // %bb.0:199; CHECK-NEXT:    ldur q0, [x0, #8]200; CHECK-NEXT:    ret201  %q = getelementptr inbounds i8, ptr %p, i32 16202  %l1 = load <2 x i64>, ptr %p203  %l2 = load i64, ptr %q204  %s = shufflevector <2 x i64> %l1, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>205  %ins = insertelement <2 x i64> %s, i64 %l2, i32 1206  ret <2 x i64> %ins207}208 209define <8 x i8> @inserti8_first_undef(ptr %p) {210; CHECK-LABEL: inserti8_first_undef:211; CHECK:       // %bb.0:212; CHECK-NEXT:    ldr d0, [x0]213; CHECK-NEXT:    ret214  %q = getelementptr inbounds i8, ptr %p, i32 1215  %l1 = load <8 x i8>, ptr %q216  %l2 = load i8, ptr %p217  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 undef, i32 3, i32 4, i32 5, i32 6>218  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0219  ret <8 x i8> %ins220}221 222define <8 x i8> @inserti8_last_undef(ptr %p) {223; CHECK-LABEL: inserti8_last_undef:224; CHECK:       // %bb.0:225; CHECK-NEXT:    ldur d0, [x0, #1]226; CHECK-NEXT:    ret227  %q = getelementptr inbounds i8, ptr %p, i32 8228  %l1 = load <8 x i8>, ptr %p229  %l2 = load i8, ptr %q230  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>231  %ins = insertelement <8 x i8> %s, i8 %l2, i32 7232  ret <8 x i8> %ins233}234 235 236 237define <8 x i16> @wrong_zextandsext(ptr %p) {238; CHECK-LABEL: wrong_zextandsext:239; CHECK:       // %bb.0:240; CHECK-NEXT:    ldur d0, [x0, #1]241; CHECK-NEXT:    ldrsb w8, [x0]242; CHECK-NEXT:    ushll v0.8h, v0.8b, #0243; CHECK-NEXT:    ext v0.16b, v0.16b, v0.16b, #14244; CHECK-NEXT:    mov v0.h[0], w8245; CHECK-NEXT:    ret246  %q = getelementptr inbounds i8, ptr %p, i32 1247  %l1 = load <8 x i8>, ptr %q248  %s1 = zext <8 x i8> %l1 to <8 x i16>249  %l2 = load i8, ptr %p250  %s2 = sext i8 %l2 to i16251  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>252  %ins = insertelement <8 x i16> %s, i16 %s2, i32 0253  ret <8 x i16> %ins254}255 256define <8 x i8> @wrongidx_first(ptr %p) {257; CHECK-LABEL: wrongidx_first:258; CHECK:       // %bb.0:259; CHECK-NEXT:    ldur d0, [x0, #1]260; CHECK-NEXT:    ext v0.8b, v0.8b, v0.8b, #7261; CHECK-NEXT:    ld1 { v0.b }[7], [x0]262; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0263; CHECK-NEXT:    ret264  %q = getelementptr inbounds i8, ptr %p, i32 1265  %l1 = load <8 x i8>, ptr %q266  %l2 = load i8, ptr %p267  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>268  %ins = insertelement <8 x i8> %s, i8 %l2, i32 7269  ret <8 x i8> %ins270}271 272define <8 x i8> @wrong_last(ptr %p) {273; CHECK-LABEL: wrong_last:274; CHECK:       // %bb.0:275; CHECK-NEXT:    ldr d0, [x0]276; CHECK-NEXT:    add x8, x0, #8277; CHECK-NEXT:    ext v0.8b, v0.8b, v0.8b, #1278; CHECK-NEXT:    ld1 { v0.b }[0], [x8]279; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0280; CHECK-NEXT:    ret281  %q = getelementptr inbounds i8, ptr %p, i32 8282  %l1 = load <8 x i8>, ptr %p283  %l2 = load i8, ptr %q284  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>285  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0286  ret <8 x i8> %ins287}288 289define <8 x i8> @wrong_shuffle(ptr %p) {290; CHECK-LABEL: wrong_shuffle:291; CHECK:       // %bb.0:292; CHECK-NEXT:    ldur d0, [x0, #1]293; CHECK-NEXT:    adrp x8, .LCPI19_0294; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI19_0]295; CHECK-NEXT:    mov v0.d[1], v0.d[0]296; CHECK-NEXT:    tbl v0.8b, { v0.16b }, v1.8b297; CHECK-NEXT:    ld1 { v0.b }[0], [x0]298; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0299; CHECK-NEXT:    ret300  %q = getelementptr inbounds i8, ptr %p, i32 1301  %l1 = load <8 x i8>, ptr %q302  %l2 = load i8, ptr %p303  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6>304  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0305  ret <8 x i8> %ins306}307 308define <8 x i16> @wrong_exttype(ptr %p) {309; CHECK-LABEL: wrong_exttype:310; CHECK:       // %bb.0:311; CHECK-NEXT:    ldur d0, [x0, #1]312; CHECK-NEXT:    sshll v0.8h, v0.8b, #0313; CHECK-NEXT:    ext v0.16b, v0.16b, v0.16b, #14314; CHECK-NEXT:    ld1 { v0.h }[0], [x0]315; CHECK-NEXT:    ret316  %q = getelementptr inbounds i8, ptr %p, i32 1317  %l1 = load <8 x i8>, ptr %q318  %s1 = sext <8 x i8> %l1 to <8 x i16>319  %l2 = load i16, ptr %p320  %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>321  %ins = insertelement <8 x i16> %s, i16 %l2, i32 0322  ret <8 x i16> %ins323}324 325define <4 x i32> @wrong_exttype2(ptr %p) {326; CHECK-LABEL: wrong_exttype2:327; CHECK:       // %bb.0:328; CHECK-NEXT:    ldur s0, [x0, #1]329; CHECK-NEXT:    ldrsh w8, [x0]330; CHECK-NEXT:    sshll v0.8h, v0.8b, #0331; CHECK-NEXT:    sshll v0.4s, v0.4h, #0332; CHECK-NEXT:    ext v0.16b, v0.16b, v0.16b, #12333; CHECK-NEXT:    mov v0.s[0], w8334; CHECK-NEXT:    ret335  %q = getelementptr inbounds i8, ptr %p, i32 1336  %l1 = load <4 x i8>, ptr %q337  %s1 = sext <4 x i8> %l1 to <4 x i32>338  %l2 = load i16, ptr %p339  %s2 = sext i16 %l2 to i32340  %s = shufflevector <4 x i32> %s1, <4 x i32> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>341  %ins = insertelement <4 x i32> %s, i32 %s2, i32 0342  ret <4 x i32> %ins343}344 345define <8 x i8> @wrong_offsetfirst(ptr %p) {346; CHECK-LABEL: wrong_offsetfirst:347; CHECK:       // %bb.0:348; CHECK-NEXT:    ldur d0, [x0, #-1]349; CHECK-NEXT:    ext v0.8b, v0.8b, v0.8b, #7350; CHECK-NEXT:    ld1 { v0.b }[0], [x0]351; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0352; CHECK-NEXT:    ret353  %q = getelementptr inbounds i8, ptr %p, i32 -1354  %l1 = load <8 x i8>, ptr %q355  %l2 = load i8, ptr %p356  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>357  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0358  ret <8 x i8> %ins359}360 361define <8 x i8> @wrong_offsetlast(ptr %p) {362; CHECK-LABEL: wrong_offsetlast:363; CHECK:       // %bb.0:364; CHECK-NEXT:    ldr d0, [x0]365; CHECK-NEXT:    add x8, x0, #7366; CHECK-NEXT:    ext v0.8b, v0.8b, v0.8b, #1367; CHECK-NEXT:    ld1 { v0.b }[7], [x8]368; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0369; CHECK-NEXT:    ret370  %q = getelementptr inbounds i8, ptr %p, i32 7371  %l1 = load <8 x i8>, ptr %p372  %l2 = load i8, ptr %q373  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>374  %ins = insertelement <8 x i8> %s, i8 %l2, i32 7375  ret <8 x i8> %ins376}377 378 379define <8 x i8> @storebetween(ptr %p, ptr %r) {380; CHECK-LABEL: storebetween:381; CHECK:       // %bb.0:382; CHECK-NEXT:    ldur d0, [x0, #1]383; CHECK-NEXT:    strb wzr, [x1]384; CHECK-NEXT:    ext v0.8b, v0.8b, v0.8b, #7385; CHECK-NEXT:    ld1 { v0.b }[0], [x0]386; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0387; CHECK-NEXT:    ret388  %q = getelementptr inbounds i8, ptr %p, i32 1389  %l1 = load <8 x i8>, ptr %q390  store i8 0, ptr %r391  %l2 = load i8, ptr %p392  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>393  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0394  ret <8 x i8> %ins395}396 397define <8 x i8> @storebefore(ptr %p, ptr %r) {398; CHECK-LABEL: storebefore:399; CHECK:       // %bb.0:400; CHECK-NEXT:    strb wzr, [x1]401; CHECK-NEXT:    ldr d0, [x0]402; CHECK-NEXT:    ret403  %q = getelementptr inbounds i8, ptr %p, i32 1404  store i8 0, ptr %r405  %l1 = load <8 x i8>, ptr %q406  %l2 = load i8, ptr %p407  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>408  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0409  ret <8 x i8> %ins410}411 412define <8 x i8> @storeafter(ptr %p, ptr %r) {413; CHECK-LABEL: storeafter:414; CHECK:       // %bb.0:415; CHECK-NEXT:    ldr d0, [x0]416; CHECK-NEXT:    strb wzr, [x1]417; CHECK-NEXT:    ret418  %q = getelementptr inbounds i8, ptr %p, i32 1419  %l1 = load <8 x i8>, ptr %q420  %l2 = load i8, ptr %p421  store i8 0, ptr %r422  %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>423  %ins = insertelement <8 x i8> %s, i8 %l2, i32 0424  ret <8 x i8> %ins425}426