brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.0 KiB · d87a1e4 Raw
1010 lines · plain
1; RUN: llc -mtriple=thumbv6m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T12; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T23 4 5; Register offset6 7; CHECK-LABEL: ldrsb_rr8; CHECK:    ldrsb   r0, [r0, r1]9define i32 @ldrsb_rr(ptr %p, i32 %n) {10entry:11  %arrayidx = getelementptr inbounds i8, ptr %p, i32 %n12  %0 = load i8, ptr %arrayidx, align 113  %conv = sext i8 %0 to i3214  ret i32 %conv15}16 17; CHECK-LABEL: ldrsh_rr18; CHECK-T1: lsls    r1, r1, #119; CHECK-T1: ldrsh   r0, [r0, r1]20; CHECK-T2: ldrsh.w r0, [r0, r1, lsl #1]21define i32 @ldrsh_rr(ptr %p, i32 %n) {22entry:23  %arrayidx = getelementptr inbounds i16, ptr %p, i32 %n24  %0 = load i16, ptr %arrayidx, align 225  %conv = sext i16 %0 to i3226  ret i32 %conv27}28 29; CHECK-LABEL: ldrb_rr30; CHECK:    ldrb r0, [r0, r1]31define i32 @ldrb_rr(ptr %p, i32 %n) {32entry:33  %arrayidx = getelementptr inbounds i8, ptr %p, i32 %n34  %0 = load i8, ptr %arrayidx, align 135  %conv = zext i8 %0 to i3236  ret i32 %conv37}38 39; CHECK-LABEL: ldrh_rr40; CHECK-T1: lsls    r1, r1, #141; CHECK-T1: ldrh    r0, [r0, r1]42; CHECK-T2: ldrh.w  r0, [r0, r1, lsl #1]43define i32 @ldrh_rr(ptr %p, i32 %n) {44entry:45  %arrayidx = getelementptr inbounds i16, ptr %p, i32 %n46  %0 = load i16, ptr %arrayidx, align 247  %conv = zext i16 %0 to i3248  ret i32 %conv49}50 51; CHECK-LABEL: ldr_rr52; CHECK-T1: lsls    r1, r1, #253; CHECK-T1: ldr     r0, [r0, r1]54; CHECK-T2: ldr.w   r0, [r0, r1, lsl #2]55define i32 @ldr_rr(ptr %p, i32 %n) {56entry:57  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %n58  %0 = load i32, ptr %arrayidx, align 459  ret i32 %060}61 62; CHECK-LABEL: strb_rr63; CHECK:    strb    r2, [r0, r1]64define void @strb_rr(ptr %p, i32 %n, i32 %x) {65entry:66  %conv = trunc i32 %x to i867  %arrayidx = getelementptr inbounds i8, ptr %p, i32 %n68  store i8 %conv, ptr %arrayidx, align 169  ret void70}71 72; CHECK-LABEL: strh_rr73; CHECK-T1: lsls    r1, r1, #174; CHECK-T1: strh    r2, [r0, r1]75; CHECK-T2: strh.w  r2, [r0, r1, lsl #1]76define void @strh_rr(ptr %p, i32 %n, i32 %x) {77entry:78  %conv = trunc i32 %x to i1679  %arrayidx = getelementptr inbounds i16, ptr %p, i32 %n80  store i16 %conv, ptr %arrayidx, align 281  ret void82}83 84; CHECK-LABEL: str_rr85; CHECK-T1: lsls    r1, r1, #286; CHECK-T1: str     r2, [r0, r1]87; CHECK-T2: str.w   r2, [r0, r1, lsl #2]88define void @str_rr(ptr %p, i32 %n, i32 %x) {89entry:90  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %n91  store i32 %x, ptr %arrayidx, align 492  ret void93}94 95 96; Immediate offset of zero97 98; CHECK-LABEL: ldrsb_ri_zero99; CHECK-T1: movs    r1, #0100; CHECK-T1: ldrsb   r0, [r0, r1]101; CHECK-T2: ldrsb.w r0, [r0]102define i32 @ldrsb_ri_zero(ptr %p) {103entry:104  %0 = load i8, ptr %p, align 1105  %conv = sext i8 %0 to i32106  ret i32 %conv107}108 109; CHECK-LABEL: ldrsh_ri_zero110; CHECK-T1: movs    r1, #0111; CHECK-T1: ldrsh   r0, [r0, r1]112; CHECK-T2: ldrsh.w r0, [r0]113define i32 @ldrsh_ri_zero(ptr %p) {114entry:115  %0 = load i16, ptr %p, align 2116  %conv = sext i16 %0 to i32117  ret i32 %conv118}119 120; CHECK-LABEL: ldrb_ri_zero121; CHECK:    ldrb    r0, [r0]122define i32 @ldrb_ri_zero(ptr %p) {123entry:124  %0 = load i8, ptr %p, align 1125  %conv = zext i8 %0 to i32126  ret i32 %conv127}128 129; CHECK-LABEL: ldrh_ri_zero130; CHECK:    ldrh    r0, [r0]131define i32 @ldrh_ri_zero(ptr %p) {132entry:133  %0 = load i16, ptr %p, align 2134  %conv = zext i16 %0 to i32135  ret i32 %conv136}137 138; CHECK-LABEL: ldr_ri_zero139; CHECK:    ldr     r0, [r0]140define i32 @ldr_ri_zero(ptr %p) {141entry:142  %0 = load i32, ptr %p, align 4143  ret i32 %0144}145 146; CHECK-LABEL: strb_ri_zero147; CHECK:    strb    r1, [r0]148define void @strb_ri_zero(ptr %p, i32 %x) {149entry:150  %conv = trunc i32 %x to i8151  store i8 %conv, ptr %p, align 1152  ret void153}154 155; CHECK-LABEL: strh_ri_zero156; CHECK:    strh    r1, [r0]157define void @strh_ri_zero(ptr %p, i32 %x) {158entry:159  %conv = trunc i32 %x to i16160  store i16 %conv, ptr %p, align 2161  ret void162}163 164; CHECK-LABEL: str_ri_zero165; CHECK:    str     r1, [r0]166define void @str_ri_zero(ptr %p, i32 %x) {167entry:168  store i32 %x, ptr %p, align 4169  ret void170}171 172 173; Maximum Thumb-1 immediate offset174 175; CHECK-LABEL: ldrsb_ri_t1_max176; CHECK-T1: movs    r1, #31177; CHECK-T1: ldrsb   r0, [r0, r1]178; CHECK-T2: ldrsb.w r0, [r0, #31]179define i32 @ldrsb_ri_t1_max(ptr %p) {180entry:181  %arrayidx = getelementptr inbounds i8, ptr %p, i32 31182  %0 = load i8, ptr %arrayidx, align 1183  %conv = sext i8 %0 to i32184  ret i32 %conv185}186 187; CHECK-LABEL: ldrsh_ri_t1_max188; CHECK-T1: movs    r1, #62189; CHECK-T1: ldrsh   r0, [r0, r1]190; CHECK-T2: ldrsh.w r0, [r0, #62]191define i32 @ldrsh_ri_t1_max(ptr %p) {192entry:193  %arrayidx = getelementptr inbounds i16, ptr %p, i32 31194  %0 = load i16, ptr %arrayidx, align 2195  %conv = sext i16 %0 to i32196  ret i32 %conv197}198 199; CHECK-LABEL: ldrb_ri_t1_max200; CHECK:    ldrb    r0, [r0, #31]201define i32 @ldrb_ri_t1_max(ptr %p) {202entry:203  %arrayidx = getelementptr inbounds i8, ptr %p, i32 31204  %0 = load i8, ptr %arrayidx, align 1205  %conv = zext i8 %0 to i32206  ret i32 %conv207}208 209; CHECK-LABEL: ldrh_ri_t1_max210; CHECK:    ldrh    r0, [r0, #62]211define i32 @ldrh_ri_t1_max(ptr %p) {212entry:213  %arrayidx = getelementptr inbounds i16, ptr %p, i32 31214  %0 = load i16, ptr %arrayidx, align 2215  %conv = zext i16 %0 to i32216  ret i32 %conv217}218 219; CHECK-LABEL: ldr_ri_t1_max220; CHECK:    ldr     r0, [r0, #124]221define i32 @ldr_ri_t1_max(ptr %p) {222entry:223  %arrayidx = getelementptr inbounds i32, ptr %p, i32 31224  %0 = load i32, ptr %arrayidx, align 4225  ret i32 %0226}227 228; CHECK-LABEL: strb_ri_t1_max229; CHECK:    strb    r1, [r0, #31]230define void @strb_ri_t1_max(ptr %p, i32 %x) {231entry:232  %conv = trunc i32 %x to i8233  %arrayidx = getelementptr inbounds i8, ptr %p, i32 31234  store i8 %conv, ptr %arrayidx, align 1235  ret void236}237 238; CHECK-LABEL: strh_ri_t1_max239; CHECK:    strh    r1, [r0, #62]240define void @strh_ri_t1_max(ptr %p, i32 %x) {241entry:242  %conv = trunc i32 %x to i16243  %arrayidx = getelementptr inbounds i16, ptr %p, i32 31244  store i16 %conv, ptr %arrayidx, align 2245  ret void246}247 248; CHECK-LABEL: str_ri_t1_max249; CHECK:    str     r1, [r0, #124]250define void @str_ri_t1_max(ptr %p, i32 %x) {251entry:252  %arrayidx = getelementptr inbounds i32, ptr %p, i32 31253  store i32 %x, ptr %arrayidx, align 4254  ret void255}256 257 258; One past maximum Thumb-1 immediate offset259 260; CHECK-LABEL: ldrsb_ri_t1_too_big261; CHECK-T1: movs    r1, #32262; CHECK-T1: ldrsb   r0, [r0, r1]263; CHECK-T2: ldrsb.w r0, [r0, #32]264define i32 @ldrsb_ri_t1_too_big(ptr %p) {265entry:266  %arrayidx = getelementptr inbounds i8, ptr %p, i32 32267  %0 = load i8, ptr %arrayidx, align 1268  %conv = sext i8 %0 to i32269  ret i32 %conv270}271 272; CHECK-LABEL: ldrsh_ri_t1_too_big273; CHECK-T1: movs    r1, #64274; CHECK-T1: ldrsh   r0, [r0, r1]275; CHECK-T2: ldrsh.w r0, [r0, #64]276define i32 @ldrsh_ri_t1_too_big(ptr %p) {277entry:278  %arrayidx = getelementptr inbounds i16, ptr %p, i32 32279  %0 = load i16, ptr %arrayidx, align 2280  %conv = sext i16 %0 to i32281  ret i32 %conv282}283 284; CHECK-LABEL: ldrb_ri_t1_too_big285; CHECK-T1: movs    r1, #32286; CHECK-T1: ldrb    r0, [r0, r1]287; CHECK-T2: ldrb.w  r0, [r0, #32]288define i32 @ldrb_ri_t1_too_big(ptr %p) {289entry:290  %arrayidx = getelementptr inbounds i8, ptr %p, i32 32291  %0 = load i8, ptr %arrayidx, align 1292  %conv = zext i8 %0 to i32293  ret i32 %conv294}295 296; CHECK-LABEL: ldrh_ri_t1_too_big297; CHECK-T1: movs    r1, #64298; CHECK-T1: ldrh    r0, [r0, r1]299; CHECK-T2: ldrh.w  r0, [r0, #64]300define i32 @ldrh_ri_t1_too_big(ptr %p) {301entry:302  %arrayidx = getelementptr inbounds i16, ptr %p, i32 32303  %0 = load i16, ptr %arrayidx, align 2304  %conv = zext i16 %0 to i32305  ret i32 %conv306}307 308; CHECK-LABEL: ldr_ri_t1_too_big309; CHECK-T1: movs    r1, #128310; CHECK-T1: ldr     r0, [r0, r1]311; CHECK-T2: ldr.w   r0, [r0, #128]312define i32 @ldr_ri_t1_too_big(ptr %p) {313entry:314  %arrayidx = getelementptr inbounds i32, ptr %p, i32 32315  %0 = load i32, ptr %arrayidx, align 4316  ret i32 %0317}318 319; CHECK-LABEL: strb_ri_t1_too_big320; CHECK-T1: movs    r2, #32321; CHECK-T1: strb    r1, [r0, r2]322; CHECK-T2: strb.w  r1, [r0, #32]323define void @strb_ri_t1_too_big(ptr %p, i32 %x) {324entry:325  %conv = trunc i32 %x to i8326  %arrayidx = getelementptr inbounds i8, ptr %p, i32 32327  store i8 %conv, ptr %arrayidx, align 1328  ret void329}330 331; CHECK-LABEL: strh_ri_t1_too_big332; CHECK-T1: movs    r2, #64333; CHECK-T1: strh    r1, [r0, r2]334; CHECK-T2: strh.w  r1, [r0, #64]335define void @strh_ri_t1_too_big(ptr %p, i32 %x) {336entry:337  %conv = trunc i32 %x to i16338  %arrayidx = getelementptr inbounds i16, ptr %p, i32 32339  store i16 %conv, ptr %arrayidx, align 2340  ret void341}342 343; CHECK-LABEL: str_ri_t1_too_big344; CHECK-T1: movs    r2, #128345; CHECK-T1: str     r1, [r0, r2]346; CHECK-T2: str.w   r1, [r0, #128]347define void @str_ri_t1_too_big(ptr %p, i32 %x) {348entry:349  %arrayidx = getelementptr inbounds i32, ptr %p, i32 32350  store i32 %x, ptr %arrayidx, align 4351  ret void352}353 354 355; Maximum Thumb-2 immediate offset356 357; CHECK-LABEL: ldrsb_ri_t2_max358; CHECK-T1: ldr     r1, .LCP359; CHECK-T1: ldrsb   r0, [r0, r1]360; CHECK-T2: ldrsb.w r0, [r0, #4095]361define i32 @ldrsb_ri_t2_max(ptr %p) {362entry:363  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095364  %0 = load i8, ptr %add.ptr, align 1365  %conv = sext i8 %0 to i32366  ret i32 %conv367}368 369; CHECK-LABEL: ldrsh_ri_t2_max370; CHECK-T1: ldr     r1, .LCP371; CHECK-T1: ldrsh   r0, [r0, r1]372; CHECK-T2: ldrsh.w r0, [r0, #4095]373define i32 @ldrsh_ri_t2_max(ptr %p) {374entry:375  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095376  %0 = load i16, ptr %add.ptr, align 2377  %conv = sext i16 %0 to i32378  ret i32 %conv379}380 381; CHECK-LABEL: ldrb_ri_t2_max382; CHECK-T1: ldr     r1, .LCP383; CHECK-T1: ldrb    r0, [r0, r1]384; CHECK-T2: ldrb.w  r0, [r0, #4095]385define i32 @ldrb_ri_t2_max(ptr %p) {386entry:387  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095388  %0 = load i8, ptr %add.ptr, align 1389  %conv = zext i8 %0 to i32390  ret i32 %conv391}392 393; CHECK-LABEL: ldrh_ri_t2_max394; CHECK-T1: ldr     r1, .LCP395; CHECK-T1: ldrh    r0, [r0, r1]396; CHECK-T2: ldrh.w  r0, [r0, #4095]397define i32 @ldrh_ri_t2_max(ptr %p) {398entry:399  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095400  %0 = load i16, ptr %add.ptr, align 2401  %conv = zext i16 %0 to i32402  ret i32 %conv403}404 405; CHECK-LABEL: ldr_ri_t2_max406; CHECK-T1: ldr     r1, .LCP407; CHECK-T1: ldr     r0, [r0, r1]408; CHECK-T2: ldr.w   r0, [r0, #4095]409define i32 @ldr_ri_t2_max(ptr %p) {410entry:411  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095412  %0 = load i32, ptr %add.ptr, align 4413  ret i32 %0414}415 416; CHECK-LABEL: strb_ri_t2_max417; CHECK-T1: ldr     r2, .LCP418; CHECK-T1: strb    r1, [r0, r2]419; CHECK-T2: strb.w  r1, [r0, #4095]420define void @strb_ri_t2_max(ptr %p, i32 %x) {421entry:422  %conv = trunc i32 %x to i8423  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095424  store i8 %conv, ptr %add.ptr, align 1425  ret void426}427 428; CHECK-LABEL: strh_ri_t2_max429; CHECK-T1: ldr     r2, .LCP430; CHECK-T1: strh    r1, [r0, r2]431; CHECK-T2: strh.w  r1, [r0, #4095]432define void @strh_ri_t2_max(ptr %p, i32 %x) {433entry:434  %conv = trunc i32 %x to i16435  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095436  store i16 %conv, ptr %add.ptr, align 2437  ret void438}439 440; CHECK-LABEL: str_ri_t2_max441; CHECK-T1: ldr     r2, .LCP442; CHECK-T1: str     r1, [r0, r2]443; CHECK-T2: str.w   r1, [r0, #4095]444define void @str_ri_t2_max(ptr %p, i32 %x) {445entry:446  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4095447  store i32 %x, ptr %add.ptr, align 4448  ret void449}450 451 452; One past maximum Thumb-2 immediate offset453 454; CHECK-LABEL: ldrsb_ri_t2_too_big455; CHECK-T1: movs    r1, #1456; CHECK-T1: lsls    r1, r1, #12457; CHECK-T2: mov.w   r1, #4096458; CHECK:    ldrsb   r0, [r0, r1]459define i32 @ldrsb_ri_t2_too_big(ptr %p) {460entry:461  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096462  %0 = load i8, ptr %add.ptr, align 1463  %conv = sext i8 %0 to i32464  ret i32 %conv465}466 467; CHECK-LABEL: ldrsh_ri_t2_too_big468; CHECK-T1: movs    r1, #1469; CHECK-T1: lsls    r1, r1, #12470; CHECK-T2: mov.w   r1, #4096471; CHECK:    ldrsh   r0, [r0, r1]472define i32 @ldrsh_ri_t2_too_big(ptr %p) {473entry:474  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096475  %0 = load i16, ptr %add.ptr, align 2476  %conv = sext i16 %0 to i32477  ret i32 %conv478}479 480; CHECK-LABEL: ldrb_ri_t2_too_big481; CHECK-T1: movs    r1, #1482; CHECK-T1: lsls    r1, r1, #12483; CHECK-T2: mov.w   r1, #4096484; CHECK:    ldrb    r0, [r0, r1]485define i32 @ldrb_ri_t2_too_big(ptr %p) {486entry:487  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096488  %0 = load i8, ptr %add.ptr, align 1489  %conv = zext i8 %0 to i32490  ret i32 %conv491}492 493; CHECK-LABEL: ldrh_ri_t2_too_big494; CHECK-T1: movs    r1, #1495; CHECK-T1: lsls    r1, r1, #12496; CHECK-T2: mov.w   r1, #4096497; CHECK:    ldrh    r0, [r0, r1]498define i32 @ldrh_ri_t2_too_big(ptr %p) {499entry:500  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096501  %0 = load i16, ptr %add.ptr, align 2502  %conv = zext i16 %0 to i32503  ret i32 %conv504}505 506; CHECK-LABEL: ldr_ri_t2_too_big507; CHECK-T1: movs    r1, #1508; CHECK-T1: lsls    r1, r1, #12509; CHECK-T2: mov.w   r1, #4096510; CHECK:    ldr     r0, [r0, r1]511define i32 @ldr_ri_t2_too_big(ptr %p) {512entry:513  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096514  %0 = load i32, ptr %add.ptr, align 4515  ret i32 %0516}517 518; CHECK-LABEL: strb_ri_t2_too_big519; CHECK-T1: movs    r2, #1520; CHECK-T1: lsls    r2, r2, #12521; CHECK-T2: mov.w   r2, #4096522; CHECK:    strb    r1, [r0, r2]523define void @strb_ri_t2_too_big(ptr %p, i32 %x) {524entry:525  %conv = trunc i32 %x to i8526  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096527  store i8 %conv, ptr %add.ptr, align 1528  ret void529}530 531; CHECK-LABEL: strh_ri_t2_too_big532; CHECK-T1: movs    r2, #1533; CHECK-T1: lsls    r2, r2, #12534; CHECK-T2: mov.w   r2, #4096535; CHECK:    strh    r1, [r0, r2]536define void @strh_ri_t2_too_big(ptr %p, i32 %x) {537entry:538  %conv = trunc i32 %x to i16539  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096540  store i16 %conv, ptr %add.ptr, align 2541  ret void542}543 544; CHECK-LABEL: str_ri_t2_too_big545; CHECK-T1: movs    r2, #1546; CHECK-T1: lsls    r2, r2, #12547; CHECK-T2: mov.w   r2, #4096548; CHECK:    str     r1, [r0, r2]549define void @str_ri_t2_too_big(ptr %p, i32 %x) {550entry:551  %add.ptr = getelementptr inbounds i8, ptr %p, i32 4096552  store i32 %x, ptr %add.ptr, align 4553  ret void554}555 556 557; Negative offset558 559define i32 @ldrsb_ri_negative(ptr %p) {560; CHECK-T1-LABEL: ldrsb_ri_negative:561; CHECK-T1:       @ %bb.0: @ %entry562; CHECK-T1-NEXT:    movs r1, #0563; CHECK-T1-NEXT:    mvns r1, r1564; CHECK-T1-NEXT:    ldrsb r0, [r0, r1]565; CHECK-T1-NEXT:    bx lr566;567; CHECK-T2-LABEL: ldrsb_ri_negative:568; CHECK-T2:       @ %bb.0: @ %entry569; CHECK-T2-NEXT:    ldrsb r0, [r0, #-1]570; CHECK-T2-NEXT:    bx lr571entry:572  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1573  %0 = load i8, ptr %add.ptr, align 1574  %conv = sext i8 %0 to i32575  ret i32 %conv576}577 578define i32 @ldrsh_ri_negative(ptr %p) {579; CHECK-T1-LABEL: ldrsh_ri_negative:580; CHECK-T1:       @ %bb.0: @ %entry581; CHECK-T1-NEXT:    movs r1, #0582; CHECK-T1-NEXT:    mvns r1, r1583; CHECK-T1-NEXT:    ldrsh r0, [r0, r1]584; CHECK-T1-NEXT:    bx lr585;586; CHECK-T2-LABEL: ldrsh_ri_negative:587; CHECK-T2:       @ %bb.0: @ %entry588; CHECK-T2-NEXT:    ldrsh r0, [r0, #-1]589; CHECK-T2-NEXT:    bx lr590entry:591  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1592  %0 = load i16, ptr %add.ptr, align 2593  %conv = sext i16 %0 to i32594  ret i32 %conv595}596 597define i32 @ldrb_ri_negative(ptr %p) {598; CHECK-T1-LABEL: ldrb_ri_negative:599; CHECK-T1:       @ %bb.0: @ %entry600; CHECK-T1-NEXT:    subs r0, r0, #1601; CHECK-T1-NEXT:    ldrb r0, [r0]602; CHECK-T1-NEXT:    bx lr603;604; CHECK-T2-LABEL: ldrb_ri_negative:605; CHECK-T2:       @ %bb.0: @ %entry606; CHECK-T2-NEXT:    ldrb r0, [r0, #-1]607; CHECK-T2-NEXT:    bx lr608entry:609  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1610  %0 = load i8, ptr %add.ptr, align 1611  %conv = zext i8 %0 to i32612  ret i32 %conv613}614 615define i32 @ldrh_ri_negative(ptr %p) {616; CHECK-T1-LABEL: ldrh_ri_negative:617; CHECK-T1:       @ %bb.0: @ %entry618; CHECK-T1-NEXT:    subs r0, r0, #1619; CHECK-T1-NEXT:    ldrh r0, [r0]620; CHECK-T1-NEXT:    bx lr621;622; CHECK-T2-LABEL: ldrh_ri_negative:623; CHECK-T2:       @ %bb.0: @ %entry624; CHECK-T2-NEXT:    ldrh r0, [r0, #-1]625; CHECK-T2-NEXT:    bx lr626entry:627  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1628  %0 = load i16, ptr %add.ptr, align 2629  %conv = zext i16 %0 to i32630  ret i32 %conv631}632 633define i32 @ldr_ri_negative(ptr %p) {634; CHECK-T1-LABEL: ldr_ri_negative:635; CHECK-T1:       @ %bb.0: @ %entry636; CHECK-T1-NEXT:    subs r0, r0, #1637; CHECK-T1-NEXT:    ldr r0, [r0]638; CHECK-T1-NEXT:    bx lr639;640; CHECK-T2-LABEL: ldr_ri_negative:641; CHECK-T2:       @ %bb.0: @ %entry642; CHECK-T2-NEXT:    ldr r0, [r0, #-1]643; CHECK-T2-NEXT:    bx lr644entry:645  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1646  %0 = load i32, ptr %add.ptr, align 4647  ret i32 %0648}649 650define void @strb_ri_negative(ptr %p, i32 %x) {651; CHECK-T1-LABEL: strb_ri_negative:652; CHECK-T1:       @ %bb.0: @ %entry653; CHECK-T1-NEXT:    subs r0, r0, #1654; CHECK-T1-NEXT:    strb r1, [r0]655; CHECK-T1-NEXT:    bx lr656;657; CHECK-T2-LABEL: strb_ri_negative:658; CHECK-T2:       @ %bb.0: @ %entry659; CHECK-T2-NEXT:    strb r1, [r0, #-1]660; CHECK-T2-NEXT:    bx lr661entry:662  %conv = trunc i32 %x to i8663  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1664  store i8 %conv, ptr %add.ptr, align 1665  ret void666}667 668define void @strh_ri_negative(ptr %p, i32 %x) {669; CHECK-T1-LABEL: strh_ri_negative:670; CHECK-T1:       @ %bb.0: @ %entry671; CHECK-T1-NEXT:    subs r0, r0, #1672; CHECK-T1-NEXT:    strh r1, [r0]673; CHECK-T1-NEXT:    bx lr674;675; CHECK-T2-LABEL: strh_ri_negative:676; CHECK-T2:       @ %bb.0: @ %entry677; CHECK-T2-NEXT:    strh r1, [r0, #-1]678; CHECK-T2-NEXT:    bx lr679entry:680  %conv = trunc i32 %x to i16681  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1682  store i16 %conv, ptr %add.ptr, align 2683  ret void684}685 686define void @str_ri_negative(ptr %p, i32 %x) {687; CHECK-T1-LABEL: str_ri_negative:688; CHECK-T1:       @ %bb.0: @ %entry689; CHECK-T1-NEXT:    subs r0, r0, #1690; CHECK-T1-NEXT:    str r1, [r0]691; CHECK-T1-NEXT:    bx lr692;693; CHECK-T2-LABEL: str_ri_negative:694; CHECK-T2:       @ %bb.0: @ %entry695; CHECK-T2-NEXT:    str r1, [r0, #-1]696; CHECK-T2-NEXT:    bx lr697entry:698  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -1699  store i32 %x, ptr %add.ptr, align 4700  ret void701}702 703 704; Negative 255 offset705 706define i32 @ldrsb_ri_negative255(ptr %p) {707; CHECK-T1-LABEL: ldrsb_ri_negative255:708; CHECK-T1:       @ %bb.0: @ %entry709; CHECK-T1-NEXT:    movs r1, #254710; CHECK-T1-NEXT:    mvns r1, r1711; CHECK-T1-NEXT:    ldrsb r0, [r0, r1]712; CHECK-T1-NEXT:    bx lr713;714; CHECK-T2-LABEL: ldrsb_ri_negative255:715; CHECK-T2:       @ %bb.0: @ %entry716; CHECK-T2-NEXT:    ldrsb r0, [r0, #-255]717; CHECK-T2-NEXT:    bx lr718entry:719  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255720  %0 = load i8, ptr %add.ptr, align 1721  %conv = sext i8 %0 to i32722  ret i32 %conv723}724 725define i32 @ldrsh_ri_negative255(ptr %p) {726; CHECK-T1-LABEL: ldrsh_ri_negative255:727; CHECK-T1:       @ %bb.0: @ %entry728; CHECK-T1-NEXT:    movs r1, #254729; CHECK-T1-NEXT:    mvns r1, r1730; CHECK-T1-NEXT:    ldrsh r0, [r0, r1]731; CHECK-T1-NEXT:    bx lr732;733; CHECK-T2-LABEL: ldrsh_ri_negative255:734; CHECK-T2:       @ %bb.0: @ %entry735; CHECK-T2-NEXT:    ldrsh r0, [r0, #-255]736; CHECK-T2-NEXT:    bx lr737entry:738  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255739  %0 = load i16, ptr %add.ptr, align 2740  %conv = sext i16 %0 to i32741  ret i32 %conv742}743 744define i32 @ldrb_ri_negative255(ptr %p) {745; CHECK-T1-LABEL: ldrb_ri_negative255:746; CHECK-T1:       @ %bb.0: @ %entry747; CHECK-T1-NEXT:    subs r0, #255748; CHECK-T1-NEXT:    ldrb r0, [r0]749; CHECK-T1-NEXT:    bx lr750;751; CHECK-T2-LABEL: ldrb_ri_negative255:752; CHECK-T2:       @ %bb.0: @ %entry753; CHECK-T2-NEXT:    ldrb r0, [r0, #-255]754; CHECK-T2-NEXT:    bx lr755entry:756  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255757  %0 = load i8, ptr %add.ptr, align 1758  %conv = zext i8 %0 to i32759  ret i32 %conv760}761 762define i32 @ldrh_ri_negative255(ptr %p) {763; CHECK-T1-LABEL: ldrh_ri_negative255:764; CHECK-T1:       @ %bb.0: @ %entry765; CHECK-T1-NEXT:    subs r0, #255766; CHECK-T1-NEXT:    ldrh r0, [r0]767; CHECK-T1-NEXT:    bx lr768;769; CHECK-T2-LABEL: ldrh_ri_negative255:770; CHECK-T2:       @ %bb.0: @ %entry771; CHECK-T2-NEXT:    ldrh r0, [r0, #-255]772; CHECK-T2-NEXT:    bx lr773entry:774  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255775  %0 = load i16, ptr %add.ptr, align 2776  %conv = zext i16 %0 to i32777  ret i32 %conv778}779 780define i32 @ldr_ri_negative255(ptr %p) {781; CHECK-T1-LABEL: ldr_ri_negative255:782; CHECK-T1:       @ %bb.0: @ %entry783; CHECK-T1-NEXT:    subs r0, #255784; CHECK-T1-NEXT:    ldr r0, [r0]785; CHECK-T1-NEXT:    bx lr786;787; CHECK-T2-LABEL: ldr_ri_negative255:788; CHECK-T2:       @ %bb.0: @ %entry789; CHECK-T2-NEXT:    ldr r0, [r0, #-255]790; CHECK-T2-NEXT:    bx lr791entry:792  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255793  %0 = load i32, ptr %add.ptr, align 4794  ret i32 %0795}796 797define void @strb_ri_negative255(ptr %p, i32 %x) {798; CHECK-T1-LABEL: strb_ri_negative255:799; CHECK-T1:       @ %bb.0: @ %entry800; CHECK-T1-NEXT:    subs r0, #255801; CHECK-T1-NEXT:    strb r1, [r0]802; CHECK-T1-NEXT:    bx lr803;804; CHECK-T2-LABEL: strb_ri_negative255:805; CHECK-T2:       @ %bb.0: @ %entry806; CHECK-T2-NEXT:    strb r1, [r0, #-255]807; CHECK-T2-NEXT:    bx lr808entry:809  %conv = trunc i32 %x to i8810  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255811  store i8 %conv, ptr %add.ptr, align 1812  ret void813}814 815define void @strh_ri_negative255(ptr %p, i32 %x) {816; CHECK-T1-LABEL: strh_ri_negative255:817; CHECK-T1:       @ %bb.0: @ %entry818; CHECK-T1-NEXT:    subs r0, #255819; CHECK-T1-NEXT:    strh r1, [r0]820; CHECK-T1-NEXT:    bx lr821;822; CHECK-T2-LABEL: strh_ri_negative255:823; CHECK-T2:       @ %bb.0: @ %entry824; CHECK-T2-NEXT:    strh r1, [r0, #-255]825; CHECK-T2-NEXT:    bx lr826entry:827  %conv = trunc i32 %x to i16828  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255829  store i16 %conv, ptr %add.ptr, align 2830  ret void831}832 833define void @str_ri_negative255(ptr %p, i32 %x) {834; CHECK-T1-LABEL: str_ri_negative255:835; CHECK-T1:       @ %bb.0: @ %entry836; CHECK-T1-NEXT:    subs r0, #255837; CHECK-T1-NEXT:    str r1, [r0]838; CHECK-T1-NEXT:    bx lr839;840; CHECK-T2-LABEL: str_ri_negative255:841; CHECK-T2:       @ %bb.0: @ %entry842; CHECK-T2-NEXT:    str r1, [r0, #-255]843; CHECK-T2-NEXT:    bx lr844entry:845  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -255846  store i32 %x, ptr %add.ptr, align 4847  ret void848}849 850 851; Negative 256 offset852 853define i32 @ldrsb_ri_negative256(ptr %p) {854; CHECK-T1-LABEL: ldrsb_ri_negative256:855; CHECK-T1:       @ %bb.0: @ %entry856; CHECK-T1-NEXT:    movs r1, #255857; CHECK-T1-NEXT:    mvns r1, r1858; CHECK-T1-NEXT:    ldrsb r0, [r0, r1]859; CHECK-T1-NEXT:    bx lr860;861; CHECK-T2-LABEL: ldrsb_ri_negative256:862; CHECK-T2:       @ %bb.0: @ %entry863; CHECK-T2-NEXT:    mvn r1, #255864; CHECK-T2-NEXT:    ldrsb r0, [r0, r1]865; CHECK-T2-NEXT:    bx lr866entry:867  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256868  %0 = load i8, ptr %add.ptr, align 1869  %conv = sext i8 %0 to i32870  ret i32 %conv871}872 873define i32 @ldrsh_ri_negative256(ptr %p) {874; CHECK-T1-LABEL: ldrsh_ri_negative256:875; CHECK-T1:       @ %bb.0: @ %entry876; CHECK-T1-NEXT:    movs r1, #255877; CHECK-T1-NEXT:    mvns r1, r1878; CHECK-T1-NEXT:    ldrsh r0, [r0, r1]879; CHECK-T1-NEXT:    bx lr880;881; CHECK-T2-LABEL: ldrsh_ri_negative256:882; CHECK-T2:       @ %bb.0: @ %entry883; CHECK-T2-NEXT:    mvn r1, #255884; CHECK-T2-NEXT:    ldrsh r0, [r0, r1]885; CHECK-T2-NEXT:    bx lr886entry:887  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256888  %0 = load i16, ptr %add.ptr, align 2889  %conv = sext i16 %0 to i32890  ret i32 %conv891}892 893define i32 @ldrb_ri_negative256(ptr %p) {894; CHECK-T1-LABEL: ldrb_ri_negative256:895; CHECK-T1:       @ %bb.0: @ %entry896; CHECK-T1-NEXT:    movs r1, #255897; CHECK-T1-NEXT:    mvns r1, r1898; CHECK-T1-NEXT:    ldrb r0, [r0, r1]899; CHECK-T1-NEXT:    bx lr900;901; CHECK-T2-LABEL: ldrb_ri_negative256:902; CHECK-T2:       @ %bb.0: @ %entry903; CHECK-T2-NEXT:    mvn r1, #255904; CHECK-T2-NEXT:    ldrb r0, [r0, r1]905; CHECK-T2-NEXT:    bx lr906entry:907  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256908  %0 = load i8, ptr %add.ptr, align 1909  %conv = zext i8 %0 to i32910  ret i32 %conv911}912 913define i32 @ldrh_ri_negative256(ptr %p) {914; CHECK-T1-LABEL: ldrh_ri_negative256:915; CHECK-T1:       @ %bb.0: @ %entry916; CHECK-T1-NEXT:    movs r1, #255917; CHECK-T1-NEXT:    mvns r1, r1918; CHECK-T1-NEXT:    ldrh r0, [r0, r1]919; CHECK-T1-NEXT:    bx lr920;921; CHECK-T2-LABEL: ldrh_ri_negative256:922; CHECK-T2:       @ %bb.0: @ %entry923; CHECK-T2-NEXT:    mvn r1, #255924; CHECK-T2-NEXT:    ldrh r0, [r0, r1]925; CHECK-T2-NEXT:    bx lr926entry:927  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256928  %0 = load i16, ptr %add.ptr, align 2929  %conv = zext i16 %0 to i32930  ret i32 %conv931}932 933define i32 @ldr_ri_negative256(ptr %p) {934; CHECK-T1-LABEL: ldr_ri_negative256:935; CHECK-T1:       @ %bb.0: @ %entry936; CHECK-T1-NEXT:    movs r1, #255937; CHECK-T1-NEXT:    mvns r1, r1938; CHECK-T1-NEXT:    ldr r0, [r0, r1]939; CHECK-T1-NEXT:    bx lr940;941; CHECK-T2-LABEL: ldr_ri_negative256:942; CHECK-T2:       @ %bb.0: @ %entry943; CHECK-T2-NEXT:    mvn r1, #255944; CHECK-T2-NEXT:    ldr r0, [r0, r1]945; CHECK-T2-NEXT:    bx lr946entry:947  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256948  %0 = load i32, ptr %add.ptr, align 4949  ret i32 %0950}951 952define void @strb_ri_negative256(ptr %p, i32 %x) {953; CHECK-T1-LABEL: strb_ri_negative256:954; CHECK-T1:       @ %bb.0: @ %entry955; CHECK-T1-NEXT:    movs r2, #255956; CHECK-T1-NEXT:    mvns r2, r2957; CHECK-T1-NEXT:    strb r1, [r0, r2]958; CHECK-T1-NEXT:    bx lr959;960; CHECK-T2-LABEL: strb_ri_negative256:961; CHECK-T2:       @ %bb.0: @ %entry962; CHECK-T2-NEXT:    mvn r2, #255963; CHECK-T2-NEXT:    strb r1, [r0, r2]964; CHECK-T2-NEXT:    bx lr965entry:966  %conv = trunc i32 %x to i8967  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256968  store i8 %conv, ptr %add.ptr, align 1969  ret void970}971 972define void @strh_ri_negative256(ptr %p, i32 %x) {973; CHECK-T1-LABEL: strh_ri_negative256:974; CHECK-T1:       @ %bb.0: @ %entry975; CHECK-T1-NEXT:    movs r2, #255976; CHECK-T1-NEXT:    mvns r2, r2977; CHECK-T1-NEXT:    strh r1, [r0, r2]978; CHECK-T1-NEXT:    bx lr979;980; CHECK-T2-LABEL: strh_ri_negative256:981; CHECK-T2:       @ %bb.0: @ %entry982; CHECK-T2-NEXT:    mvn r2, #255983; CHECK-T2-NEXT:    strh r1, [r0, r2]984; CHECK-T2-NEXT:    bx lr985entry:986  %conv = trunc i32 %x to i16987  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -256988  store i16 %conv, ptr %add.ptr, align 2989  ret void990}991 992define void @str_ri_negative256(ptr %p, i32 %x) {993; CHECK-T1-LABEL: str_ri_negative256:994; CHECK-T1:       @ %bb.0: @ %entry995; CHECK-T1-NEXT:    movs r2, #255996; CHECK-T1-NEXT:    mvns r2, r2997; CHECK-T1-NEXT:    str r1, [r0, r2]998; CHECK-T1-NEXT:    bx lr999;1000; CHECK-T2-LABEL: str_ri_negative256:1001; CHECK-T2:       @ %bb.0: @ %entry1002; CHECK-T2-NEXT:    mvn r2, #2551003; CHECK-T2-NEXT:    str r1, [r0, r2]1004; CHECK-T2-NEXT:    bx lr1005entry:1006  %add.ptr = getelementptr inbounds i8, ptr %p, i32 -2561007  store i32 %x, ptr %add.ptr, align 41008  ret void1009}1010