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