brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.9 KiB · e8e5631 Raw
768 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK643; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,GISEL4; RUN: llc < %s -mtriple=arm64_32-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK325 6define ptr @store64(ptr %ptr, i64 %index, i64 %spacing) {7; CHECK-LABEL: store64:8; CHECK:       ; %bb.0:9; CHECK-NEXT:    str x2, [x0], #810; CHECK-NEXT:    ret11  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 112  store i64 %spacing, ptr %ptr, align 413  ret ptr %incdec.ptr14}15 16define ptr @store64idxpos256(ptr %ptr, i64 %index, i64 %spacing) {17; CHECK-LABEL: store64idxpos256:18; CHECK:       ; %bb.0:19; CHECK-NEXT:    mov x8, x020; CHECK-NEXT:    add x0, x0, #25621; CHECK-NEXT:    str x2, [x8]22; CHECK-NEXT:    ret23  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 3224  store i64 %spacing, ptr %ptr, align 425  ret ptr %incdec.ptr26}27 28define ptr @store64idxneg256(ptr %ptr, i64 %index, i64 %spacing) {29; CHECK-LABEL: store64idxneg256:30; CHECK:       ; %bb.0:31; CHECK-NEXT:    str x2, [x0], #-25632; CHECK-NEXT:    ret33  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -3234  store i64 %spacing, ptr %ptr, align 435  ret ptr %incdec.ptr36}37 38define ptr @store32(ptr %ptr, i32 %index, i32 %spacing) {39; CHECK-LABEL: store32:40; CHECK:       ; %bb.0:41; CHECK-NEXT:    str w2, [x0], #442; CHECK-NEXT:    ret43  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 144  store i32 %spacing, ptr %ptr, align 445  ret ptr %incdec.ptr46}47 48define ptr @store32idxpos256(ptr %ptr, i32 %index, i32 %spacing) {49; CHECK-LABEL: store32idxpos256:50; CHECK:       ; %bb.0:51; CHECK-NEXT:    mov x8, x052; CHECK-NEXT:    add x0, x0, #25653; CHECK-NEXT:    str w2, [x8]54; CHECK-NEXT:    ret55  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 6456  store i32 %spacing, ptr %ptr, align 457  ret ptr %incdec.ptr58}59 60define ptr @store32idxneg256(ptr %ptr, i32 %index, i32 %spacing) {61; CHECK-LABEL: store32idxneg256:62; CHECK:       ; %bb.0:63; CHECK-NEXT:    str w2, [x0], #-25664; CHECK-NEXT:    ret65  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -6466  store i32 %spacing, ptr %ptr, align 467  ret ptr %incdec.ptr68}69 70define ptr @store16(ptr %ptr, i16 %index, i16 %spacing) {71; CHECK-LABEL: store16:72; CHECK:       ; %bb.0:73; CHECK-NEXT:    strh w2, [x0], #274; CHECK-NEXT:    ret75  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 176  store i16 %spacing, ptr %ptr, align 477  ret ptr %incdec.ptr78}79 80define ptr @store16idxpos256(ptr %ptr, i16 %index, i16 %spacing) {81; CHECK-LABEL: store16idxpos256:82; CHECK:       ; %bb.0:83; CHECK-NEXT:    mov x8, x084; CHECK-NEXT:    add x0, x0, #25685; CHECK-NEXT:    strh w2, [x8]86; CHECK-NEXT:    ret87  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 12888  store i16 %spacing, ptr %ptr, align 489  ret ptr %incdec.ptr90}91 92define ptr @store16idxneg256(ptr %ptr, i16 %index, i16 %spacing) {93; CHECK-LABEL: store16idxneg256:94; CHECK:       ; %bb.0:95; CHECK-NEXT:    strh w2, [x0], #-25696; CHECK-NEXT:    ret97  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -12898  store i16 %spacing, ptr %ptr, align 499  ret ptr %incdec.ptr100}101 102define ptr @store8(ptr %ptr, i8 %index, i8 %spacing) {103; CHECK-LABEL: store8:104; CHECK:       ; %bb.0:105; CHECK-NEXT:    strb w2, [x0], #1106; CHECK-NEXT:    ret107  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1108  store i8 %spacing, ptr %ptr, align 4109  ret ptr %incdec.ptr110}111 112define ptr @store8idxpos256(ptr %ptr, i8 %index, i8 %spacing) {113; CHECK-LABEL: store8idxpos256:114; CHECK:       ; %bb.0:115; CHECK-NEXT:    mov x8, x0116; CHECK-NEXT:    add x0, x0, #256117; CHECK-NEXT:    strb w2, [x8]118; CHECK-NEXT:    ret119  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256120  store i8 %spacing, ptr %ptr, align 4121  ret ptr %incdec.ptr122}123 124define ptr @store8idxneg256(ptr %ptr, i8 %index, i8 %spacing) {125; CHECK-LABEL: store8idxneg256:126; CHECK:       ; %bb.0:127; CHECK-NEXT:    strb w2, [x0], #-256128; CHECK-NEXT:    ret129  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256130  store i8 %spacing, ptr %ptr, align 4131  ret ptr %incdec.ptr132}133 134define ptr @truncst64to32(ptr %ptr, i32 %index, i64 %spacing) {135; CHECK-LABEL: truncst64to32:136; CHECK:       ; %bb.0:137; CHECK-NEXT:    str w2, [x0], #4138; CHECK-NEXT:    ret139  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1140  %trunc = trunc i64 %spacing to i32141  store i32 %trunc, ptr %ptr, align 4142  ret ptr %incdec.ptr143}144 145define ptr @truncst64to16(ptr %ptr, i16 %index, i64 %spacing) {146; CHECK-LABEL: truncst64to16:147; CHECK:       ; %bb.0:148; CHECK-NEXT:    strh w2, [x0], #2149; CHECK-NEXT:    ret150  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1151  %trunc = trunc i64 %spacing to i16152  store i16 %trunc, ptr %ptr, align 4153  ret ptr %incdec.ptr154}155 156define ptr @truncst64to8(ptr %ptr, i8 %index, i64 %spacing) {157; CHECK-LABEL: truncst64to8:158; CHECK:       ; %bb.0:159; CHECK-NEXT:    strb w2, [x0], #1160; CHECK-NEXT:    ret161  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1162  %trunc = trunc i64 %spacing to i8163  store i8 %trunc, ptr %ptr, align 4164  ret ptr %incdec.ptr165}166 167 168define ptr @storef16(ptr %ptr, half %index, half %spacing) nounwind {169; CHECK-LABEL: storef16:170; CHECK:       ; %bb.0:171; CHECK-NEXT:    str h1, [x0], #2172; CHECK-NEXT:    ret173  %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 1174  store half %spacing, ptr %ptr, align 2175  ret ptr %incdec.ptr176}177 178define ptr @storef32(ptr %ptr, float %index, float %spacing) {179; CHECK-LABEL: storef32:180; CHECK:       ; %bb.0:181; CHECK-NEXT:    str s1, [x0], #4182; CHECK-NEXT:    ret183  %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 1184  store float %spacing, ptr %ptr, align 4185  ret ptr %incdec.ptr186}187 188define ptr @storef64(ptr %ptr, double %index, double %spacing) {189; CHECK-LABEL: storef64:190; CHECK:       ; %bb.0:191; CHECK-NEXT:    str d1, [x0], #8192; CHECK-NEXT:    ret193  %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 1194  store double %spacing, ptr %ptr, align 4195  ret ptr %incdec.ptr196}197 198 199define ptr @pref64(ptr %ptr, double %spacing) {200; CHECK-LABEL: pref64:201; CHECK:       ; %bb.0:202; CHECK-NEXT:    str d0, [x0, #32]!203; CHECK-NEXT:    ret204  %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 4205  store double %spacing, ptr %incdec.ptr, align 4206  ret ptr %incdec.ptr207}208 209define ptr @pref32(ptr %ptr, float %spacing) {210; CHECK-LABEL: pref32:211; CHECK:       ; %bb.0:212; CHECK-NEXT:    str s0, [x0, #12]!213; CHECK-NEXT:    ret214  %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 3215  store float %spacing, ptr %incdec.ptr, align 4216  ret ptr %incdec.ptr217}218 219define ptr @pref16(ptr %ptr, half %spacing) nounwind {220; CHECK-LABEL: pref16:221; CHECK:       ; %bb.0:222; CHECK-NEXT:    str h0, [x0, #6]!223; CHECK-NEXT:    ret224  %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 3225  store half %spacing, ptr %incdec.ptr, align 2226  ret ptr %incdec.ptr227}228 229define ptr @pre64(ptr %ptr, i64 %spacing) {230; CHECK-LABEL: pre64:231; CHECK:       ; %bb.0:232; CHECK-NEXT:    str x1, [x0, #16]!233; CHECK-NEXT:    ret234  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 2235  store i64 %spacing, ptr %incdec.ptr, align 4236  ret ptr %incdec.ptr237}238 239define ptr @pre64idxpos256(ptr %ptr, i64 %spacing) {240; CHECK-LABEL: pre64idxpos256:241; CHECK:       ; %bb.0:242; CHECK-NEXT:    mov x8, x0243; CHECK-NEXT:    add x0, x0, #256244; CHECK-NEXT:    str x1, [x8, #256]245; CHECK-NEXT:    ret246  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32247  store i64 %spacing, ptr %incdec.ptr, align 4248  ret ptr %incdec.ptr249}250 251define ptr @pre64idxneg256(ptr %ptr, i64 %spacing) {252; CHECK-LABEL: pre64idxneg256:253; CHECK:       ; %bb.0:254; CHECK-NEXT:    str x1, [x0, #-256]!255; CHECK-NEXT:    ret256  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32257  store i64 %spacing, ptr %incdec.ptr, align 4258  ret ptr %incdec.ptr259}260 261define ptr @pre32(ptr %ptr, i32 %spacing) {262; CHECK-LABEL: pre32:263; CHECK:       ; %bb.0:264; CHECK-NEXT:    str w1, [x0, #8]!265; CHECK-NEXT:    ret266  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2267  store i32 %spacing, ptr %incdec.ptr, align 4268  ret ptr %incdec.ptr269}270 271define ptr @pre32idxpos256(ptr %ptr, i32 %spacing) {272; CHECK-LABEL: pre32idxpos256:273; CHECK:       ; %bb.0:274; CHECK-NEXT:    mov x8, x0275; CHECK-NEXT:    add x0, x0, #256276; CHECK-NEXT:    str w1, [x8, #256]277; CHECK-NEXT:    ret278  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64279  store i32 %spacing, ptr %incdec.ptr, align 4280  ret ptr %incdec.ptr281}282 283define ptr @pre32idxneg256(ptr %ptr, i32 %spacing) {284; CHECK-LABEL: pre32idxneg256:285; CHECK:       ; %bb.0:286; CHECK-NEXT:    str w1, [x0, #-256]!287; CHECK-NEXT:    ret288  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64289  store i32 %spacing, ptr %incdec.ptr, align 4290  ret ptr %incdec.ptr291}292 293define ptr @pre16(ptr %ptr, i16 %spacing) {294; CHECK-LABEL: pre16:295; CHECK:       ; %bb.0:296; CHECK-NEXT:    strh w1, [x0, #4]!297; CHECK-NEXT:    ret298  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2299  store i16 %spacing, ptr %incdec.ptr, align 4300  ret ptr %incdec.ptr301}302 303define ptr @pre16idxpos256(ptr %ptr, i16 %spacing) {304; CHECK-LABEL: pre16idxpos256:305; CHECK:       ; %bb.0:306; CHECK-NEXT:    mov x8, x0307; CHECK-NEXT:    add x0, x0, #256308; CHECK-NEXT:    strh w1, [x8, #256]309; CHECK-NEXT:    ret310  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128311  store i16 %spacing, ptr %incdec.ptr, align 4312  ret ptr %incdec.ptr313}314 315define ptr @pre16idxneg256(ptr %ptr, i16 %spacing) {316; CHECK-LABEL: pre16idxneg256:317; CHECK:       ; %bb.0:318; CHECK-NEXT:    strh w1, [x0, #-256]!319; CHECK-NEXT:    ret320  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128321  store i16 %spacing, ptr %incdec.ptr, align 4322  ret ptr %incdec.ptr323}324 325define ptr @pre8(ptr %ptr, i8 %spacing) {326; CHECK-LABEL: pre8:327; CHECK:       ; %bb.0:328; CHECK-NEXT:    strb w1, [x0, #2]!329; CHECK-NEXT:    ret330  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2331  store i8 %spacing, ptr %incdec.ptr, align 4332  ret ptr %incdec.ptr333}334 335define ptr @pre8idxpos256(ptr %ptr, i8 %spacing) {336; CHECK-LABEL: pre8idxpos256:337; CHECK:       ; %bb.0:338; CHECK-NEXT:    mov x8, x0339; CHECK-NEXT:    add x0, x0, #256340; CHECK-NEXT:    strb w1, [x8, #256]341; CHECK-NEXT:    ret342  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256343  store i8 %spacing, ptr %incdec.ptr, align 4344  ret ptr %incdec.ptr345}346 347define ptr @pre8idxneg256(ptr %ptr, i8 %spacing) {348; CHECK-LABEL: pre8idxneg256:349; CHECK:       ; %bb.0:350; CHECK-NEXT:    strb w1, [x0, #-256]!351; CHECK-NEXT:    ret352  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256353  store i8 %spacing, ptr %incdec.ptr, align 4354  ret ptr %incdec.ptr355}356 357define ptr @pretrunc64to32(ptr %ptr, i64 %spacing) {358; CHECK-LABEL: pretrunc64to32:359; CHECK:       ; %bb.0:360; CHECK-NEXT:    str w1, [x0, #8]!361; CHECK-NEXT:    ret362  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2363  %trunc = trunc i64 %spacing to i32364  store i32 %trunc, ptr %incdec.ptr, align 4365  ret ptr %incdec.ptr366}367 368define ptr @pretrunc64to16(ptr %ptr, i64 %spacing) {369; CHECK-LABEL: pretrunc64to16:370; CHECK:       ; %bb.0:371; CHECK-NEXT:    strh w1, [x0, #4]!372; CHECK-NEXT:    ret373  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2374  %trunc = trunc i64 %spacing to i16375  store i16 %trunc, ptr %incdec.ptr, align 4376  ret ptr %incdec.ptr377}378 379define ptr @pretrunc64to8(ptr %ptr, i64 %spacing) {380; CHECK-LABEL: pretrunc64to8:381; CHECK:       ; %bb.0:382; CHECK-NEXT:    strb w1, [x0, #2]!383; CHECK-NEXT:    ret384  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2385  %trunc = trunc i64 %spacing to i8386  store i8 %trunc, ptr %incdec.ptr, align 4387  ret ptr %incdec.ptr388}389 390;-----391; Pre-indexed loads392;-----393define ptr @preidxf64(ptr %src, ptr %out) {394; CHECK-LABEL: preidxf64:395; CHECK:       ; %bb.0:396; CHECK-NEXT:    ldr d0, [x0, #8]!397; CHECK-NEXT:    str d0, [x1]398; CHECK-NEXT:    ret399  %ptr = getelementptr inbounds double, ptr %src, i64 1400  %tmp = load double, ptr %ptr, align 4401  store double %tmp, ptr %out, align 4402  ret ptr %ptr403}404 405define ptr @preidxf32(ptr %src, ptr %out) {406; CHECK-LABEL: preidxf32:407; CHECK:       ; %bb.0:408; CHECK-NEXT:    ldr s0, [x0, #4]!409; CHECK-NEXT:    str s0, [x1]410; CHECK-NEXT:    ret411  %ptr = getelementptr inbounds float, ptr %src, i64 1412  %tmp = load float, ptr %ptr, align 4413  store float %tmp, ptr %out, align 4414  ret ptr %ptr415}416 417define ptr @preidxf16(ptr %src, ptr %out) {418; CHECK-LABEL: preidxf16:419; CHECK:       ; %bb.0:420; CHECK-NEXT:    ldr h0, [x0, #2]!421; CHECK-NEXT:    str h0, [x1]422; CHECK-NEXT:    ret423  %ptr = getelementptr inbounds half, ptr %src, i64 1424  %tmp = load half, ptr %ptr, align 2425  store half %tmp, ptr %out, align 2426  ret ptr %ptr427}428 429define ptr @preidx64(ptr %src, ptr %out) {430; CHECK-LABEL: preidx64:431; CHECK:       ; %bb.0:432; CHECK-NEXT:    ldr x8, [x0, #8]!433; CHECK-NEXT:    str x8, [x1]434; CHECK-NEXT:    ret435  %ptr = getelementptr inbounds i64, ptr %src, i64 1436  %tmp = load i64, ptr %ptr, align 4437  store i64 %tmp, ptr %out, align 4438  ret ptr %ptr439}440 441define ptr @preidx32(ptr %src, ptr %out) {442; CHECK-LABEL: preidx32:443; CHECK:       ; %bb.0:444; CHECK-NEXT:    ldr w8, [x0, #4]!445; CHECK-NEXT:    str w8, [x1]446; CHECK-NEXT:    ret447  %ptr = getelementptr inbounds i32, ptr %src, i64 1448  %tmp = load i32, ptr %ptr, align 4449  store i32 %tmp, ptr %out, align 4450  ret ptr %ptr451}452 453define ptr @preidx16zext32(ptr %src, ptr %out) {454; CHECK-LABEL: preidx16zext32:455; CHECK:       ; %bb.0:456; CHECK-NEXT:    ldrh w8, [x0, #2]!457; CHECK-NEXT:    str w8, [x1]458; CHECK-NEXT:    ret459  %ptr = getelementptr inbounds i16, ptr %src, i64 1460  %tmp = load i16, ptr %ptr, align 4461  %ext = zext i16 %tmp to i32462  store i32 %ext, ptr %out, align 4463  ret ptr %ptr464}465 466define ptr @preidx16zext64(ptr %src, ptr %out) {467; CHECK-LABEL: preidx16zext64:468; CHECK:       ; %bb.0:469; CHECK-NEXT:    ldrh w8, [x0, #2]!470; CHECK-NEXT:    str x8, [x1]471; CHECK-NEXT:    ret472  %ptr = getelementptr inbounds i16, ptr %src, i64 1473  %tmp = load i16, ptr %ptr, align 4474  %ext = zext i16 %tmp to i64475  store i64 %ext, ptr %out, align 4476  ret ptr %ptr477}478 479define ptr @preidx8zext32(ptr %src, ptr %out) {480; CHECK-LABEL: preidx8zext32:481; CHECK:       ; %bb.0:482; CHECK-NEXT:    ldrb w8, [x0, #1]!483; CHECK-NEXT:    str w8, [x1]484; CHECK-NEXT:    ret485  %ptr = getelementptr inbounds i8, ptr %src, i64 1486  %tmp = load i8, ptr %ptr, align 4487  %ext = zext i8 %tmp to i32488  store i32 %ext, ptr %out, align 4489  ret ptr %ptr490}491 492define ptr @preidx8zext64(ptr %src, ptr %out) {493; CHECK-LABEL: preidx8zext64:494; CHECK:       ; %bb.0:495; CHECK-NEXT:    ldrb w8, [x0, #1]!496; CHECK-NEXT:    str x8, [x1]497; CHECK-NEXT:    ret498  %ptr = getelementptr inbounds i8, ptr %src, i64 1499  %tmp = load i8, ptr %ptr, align 4500  %ext = zext i8 %tmp to i64501  store i64 %ext, ptr %out, align 4502  ret ptr %ptr503}504 505define ptr @preidx32sext64(ptr %src, ptr %out) {506; CHECK-LABEL: preidx32sext64:507; CHECK:       ; %bb.0:508; CHECK-NEXT:    ldrsw x8, [x0, #4]!509; CHECK-NEXT:    str x8, [x1]510; CHECK-NEXT:    ret511  %ptr = getelementptr inbounds i32, ptr %src, i64 1512  %tmp = load i32, ptr %ptr, align 4513  %ext = sext i32 %tmp to i64514  store i64 %ext, ptr %out, align 8515  ret ptr %ptr516}517 518define ptr @preidx16sext32(ptr %src, ptr %out) {519; CHECK-LABEL: preidx16sext32:520; CHECK:       ; %bb.0:521; CHECK-NEXT:    ldrsh w8, [x0, #2]!522; CHECK-NEXT:    str w8, [x1]523; CHECK-NEXT:    ret524  %ptr = getelementptr inbounds i16, ptr %src, i64 1525  %tmp = load i16, ptr %ptr, align 4526  %ext = sext i16 %tmp to i32527  store i32 %ext, ptr %out, align 4528  ret ptr %ptr529}530 531define ptr @preidx16sext64(ptr %src, ptr %out) {532; CHECK-LABEL: preidx16sext64:533; CHECK:       ; %bb.0:534; CHECK-NEXT:    ldrsh x8, [x0, #2]!535; CHECK-NEXT:    str x8, [x1]536; CHECK-NEXT:    ret537  %ptr = getelementptr inbounds i16, ptr %src, i64 1538  %tmp = load i16, ptr %ptr, align 4539  %ext = sext i16 %tmp to i64540  store i64 %ext, ptr %out, align 4541  ret ptr %ptr542}543 544define ptr @preidx8sext32(ptr %src, ptr %out) {545; CHECK-LABEL: preidx8sext32:546; CHECK:       ; %bb.0:547; CHECK-NEXT:    ldrsb w8, [x0, #1]!548; CHECK-NEXT:    str w8, [x1]549; CHECK-NEXT:    ret550  %ptr = getelementptr inbounds i8, ptr %src, i64 1551  %tmp = load i8, ptr %ptr, align 4552  %ext = sext i8 %tmp to i32553  store i32 %ext, ptr %out, align 4554  ret ptr %ptr555}556 557define ptr @preidx8sext64(ptr %src, ptr %out) {558; CHECK-LABEL: preidx8sext64:559; CHECK:       ; %bb.0:560; CHECK-NEXT:    ldrsb x8, [x0, #1]!561; CHECK-NEXT:    str x8, [x1]562; CHECK-NEXT:    ret563  %ptr = getelementptr inbounds i8, ptr %src, i64 1564  %tmp = load i8, ptr %ptr, align 4565  %ext = sext i8 %tmp to i64566  store i64 %ext, ptr %out, align 4567  ret ptr %ptr568}569 570; This test checks if illegal post-index is generated571 572define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp {573; CHECK64-LABEL: postidx_clobber:574; CHECK64:       ; %bb.0:575; CHECK64-NEXT:    mov x8, x0576; CHECK64-NEXT:    str x0, [x8], #8577; CHECK64-NEXT:    mov x0, x8578; CHECK64-NEXT:    ret579;580; GISEL-LABEL: postidx_clobber:581; GISEL:       ; %bb.0:582; GISEL-NEXT:    mov x8, x0583; GISEL-NEXT:    str x0, [x8], #8584; GISEL-NEXT:    mov x0, x8585; GISEL-NEXT:    ret586;587; CHECK32-LABEL: postidx_clobber:588; CHECK32:       ; %bb.0:589; CHECK32-NEXT:    mov x8, x0590; CHECK32-NEXT:    add w0, w8, #8591; CHECK32-NEXT:    str w8, [x8]592; CHECK32-NEXT:    ret593; ret594 store ptr %addr, ptr %addr595 %newaddr = getelementptr i64, ptr %addr, i32 1596 ret ptr %newaddr597}598 599define ptr @preidx32_sb(ptr %src, ptr %out) {600; CHECK-LABEL: preidx32_sb:601; CHECK:       ; %bb.0:602; CHECK-NEXT:    ldrsb w8, [x0, #1]!603; CHECK-NEXT:    str w8, [x1]604; CHECK-NEXT:    ret605  %ptr = getelementptr inbounds i8, ptr %src, i64 1606  %tmp = load i8, ptr %ptr, align 1607  %sext = sext i8 %tmp to i32608  store i32 %sext, ptr %out, align 4609  ret ptr %ptr610}611 612define ptr @preidx32_sh(ptr %src, ptr %out) {613; CHECK-LABEL: preidx32_sh:614; CHECK:       ; %bb.0:615; CHECK-NEXT:    ldrsh w8, [x0, #2]!616; CHECK-NEXT:    str w8, [x1]617; CHECK-NEXT:    ret618  %ptr = getelementptr inbounds i16, ptr %src, i64 1619  %tmp = load i16, ptr %ptr, align 2620  %sext = sext i16 %tmp to i32621  store i32 %sext, ptr %out, align 4622  ret ptr %ptr623}624 625define ptr @preidx64_sb(ptr %src, ptr %out) {626; CHECK-LABEL: preidx64_sb:627; CHECK:       ; %bb.0:628; CHECK-NEXT:    ldrsb x8, [x0, #1]!629; CHECK-NEXT:    str x8, [x1]630; CHECK-NEXT:    ret631  %ptr = getelementptr inbounds i8, ptr %src, i64 1632  %tmp = load i8, ptr %ptr, align 1633  %sext = sext i8 %tmp to i64634  store i64 %sext, ptr %out, align 8635  ret ptr %ptr636}637 638define ptr @preidx64_sh(ptr %src, ptr %out) {639; CHECK-LABEL: preidx64_sh:640; CHECK:       ; %bb.0:641; CHECK-NEXT:    ldrsh x8, [x0, #2]!642; CHECK-NEXT:    str x8, [x1]643; CHECK-NEXT:    ret644  %ptr = getelementptr inbounds i16, ptr %src, i64 1645  %tmp = load i16, ptr %ptr, align 2646  %sext = sext i16 %tmp to i64647  store i64 %sext, ptr %out, align 8648  ret ptr %ptr649}650 651define ptr @preidx64_sw(ptr %src, ptr %out) {652; CHECK-LABEL: preidx64_sw:653; CHECK:       ; %bb.0:654; CHECK-NEXT:    ldrsw x8, [x0, #4]!655; CHECK-NEXT:    str x8, [x1]656; CHECK-NEXT:    ret657  %ptr = getelementptr inbounds i32, ptr %src, i64 1658  %tmp = load i32, ptr %ptr, align 2659  %sext = sext i32 %tmp to i64660  store i64 %sext, ptr %out, align 8661  ret ptr %ptr662}663 664define ptr @postidx32_sb(ptr %src, ptr %out) {665; CHECK-LABEL: postidx32_sb:666; CHECK:       ; %bb.0:667; CHECK-NEXT:    ldrsb w8, [x0], #1668; CHECK-NEXT:    str w8, [x1]669; CHECK-NEXT:    ret670  %tmp = load i8, ptr %src, align 1671  %ptr = getelementptr inbounds i8, ptr %src, i64 1672  %sext = sext i8 %tmp to i32673  store i32 %sext, ptr %out, align 4674  ret ptr %ptr675}676 677define ptr @postidx32_sh(ptr %src, ptr %out) {678; CHECK-LABEL: postidx32_sh:679; CHECK:       ; %bb.0:680; CHECK-NEXT:    ldrsh w8, [x0], #2681; CHECK-NEXT:    str w8, [x1]682; CHECK-NEXT:    ret683  %tmp = load i16, ptr %src, align 2684  %ptr = getelementptr inbounds i16, ptr %src, i64 1685  %sext = sext i16 %tmp to i32686  store i32 %sext, ptr %out, align 4687  ret ptr %ptr688}689 690define ptr @postidx64_sb(ptr %src, ptr %out) {691; CHECK-LABEL: postidx64_sb:692; CHECK:       ; %bb.0:693; CHECK-NEXT:    ldrsb x8, [x0], #1694; CHECK-NEXT:    str x8, [x1]695; CHECK-NEXT:    ret696  %tmp = load i8, ptr %src, align 1697  %ptr = getelementptr inbounds i8, ptr %src, i64 1698  %sext = sext i8 %tmp to i64699  store i64 %sext, ptr %out, align 8700  ret ptr %ptr701}702 703define ptr @postidx64_sh(ptr %src, ptr %out) {704; CHECK-LABEL: postidx64_sh:705; CHECK:       ; %bb.0:706; CHECK-NEXT:    ldrsh x8, [x0], #2707; CHECK-NEXT:    str x8, [x1]708; CHECK-NEXT:    ret709  %tmp = load i16, ptr %src, align 2710  %ptr = getelementptr inbounds i16, ptr %src, i64 1711  %sext = sext i16 %tmp to i64712  store i64 %sext, ptr %out, align 8713  ret ptr %ptr714}715 716define ptr @postidx64_sw(ptr %src, ptr %out) {717; CHECK-LABEL: postidx64_sw:718; CHECK:       ; %bb.0:719; CHECK-NEXT:    ldrsw x8, [x0], #4720; CHECK-NEXT:    str x8, [x1]721; CHECK-NEXT:    ret722  %tmp = load i32, ptr %src, align 4723  %ptr = getelementptr inbounds i32, ptr %src, i64 1724  %sext = sext i32 %tmp to i64725  store i64 %sext, ptr %out, align 8726  ret ptr %ptr727}728 729define ptr @postidx32_shalf(ptr %src, ptr %out, half %a) {730; CHECK64-LABEL: postidx32_shalf:731; CHECK64:       ; %bb.0:732; CHECK64-NEXT:    ldr h1, [x0], #4733; CHECK64-NEXT:    ; kill: def $h0 killed $h0 def $s0734; CHECK64-NEXT:    fcvt s2, h1735; CHECK64-NEXT:    fcmp s2, #0.0736; CHECK64-NEXT:    fcsel s0, s1, s0, mi737; CHECK64-NEXT:    str h0, [x1]738; CHECK64-NEXT:    ret739;740; GISEL-LABEL: postidx32_shalf:741; GISEL:       ; %bb.0:742; GISEL-NEXT:    ldr h1, [x0], #4743; GISEL-NEXT:    ; kill: def $h0 killed $h0 def $s0744; GISEL-NEXT:    fmov w9, s0745; GISEL-NEXT:    fcvt s2, h1746; GISEL-NEXT:    fmov w8, s1747; GISEL-NEXT:    fcmp s2, #0.0748; GISEL-NEXT:    csel w8, w8, w9, mi749; GISEL-NEXT:    strh w8, [x1]750; GISEL-NEXT:    ret751;752; CHECK32-LABEL: postidx32_shalf:753; CHECK32:       ; %bb.0:754; CHECK32-NEXT:    ldr h1, [x0], #4755; CHECK32-NEXT:    ; kill: def $h0 killed $h0 def $s0756; CHECK32-NEXT:    fcvt s2, h1757; CHECK32-NEXT:    fcmp s2, #0.0758; CHECK32-NEXT:    fcsel s0, s1, s0, mi759; CHECK32-NEXT:    str h0, [x1]760; CHECK32-NEXT:    ret761  %tmp = load half, ptr %src, align 2762  %ptr = getelementptr inbounds i32, ptr %src, i64 1763  %c = fcmp olt half %tmp, 0.0764  %s = select i1 %c, half %tmp, half %a765  store half %s, ptr %out, align 8766  ret ptr %ptr767}768