Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc -mtriple=thumbv6m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1
      2 ; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2
      3 
      4 
      5 ; Register offset
      6 
      7 ; CHECK-LABEL: ldrsb_rr
      8 ; CHECK:    ldrsb   r0, [r0, r1]
      9 define i32 @ldrsb_rr(i8* %p, i32 %n) {
     10 entry:
     11   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
     12   %0 = load i8, i8* %arrayidx, align 1
     13   %conv = sext i8 %0 to i32
     14   ret i32 %conv
     15 }
     16 
     17 ; CHECK-LABEL: ldrsh_rr
     18 ; CHECK-T1: lsls    r1, r1, #1
     19 ; CHECK-T1: ldrsh   r0, [r0, r1]
     20 ; CHECK-T2: ldrsh.w r0, [r0, r1, lsl #1]
     21 define i32 @ldrsh_rr(i16* %p, i32 %n) {
     22 entry:
     23   %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
     24   %0 = load i16, i16* %arrayidx, align 2
     25   %conv = sext i16 %0 to i32
     26   ret i32 %conv
     27 }
     28 
     29 ; CHECK-LABEL: ldrb_rr
     30 ; CHECK:    ldrb r0, [r0, r1]
     31 define i32 @ldrb_rr(i8* %p, i32 %n) {
     32 entry:
     33   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
     34   %0 = load i8, i8* %arrayidx, align 1
     35   %conv = zext i8 %0 to i32
     36   ret i32 %conv
     37 }
     38 
     39 ; CHECK-LABEL: ldrh_rr
     40 ; CHECK-T1: lsls    r1, r1, #1
     41 ; CHECK-T1: ldrh    r0, [r0, r1]
     42 ; CHECK-T2: ldrh.w  r0, [r0, r1, lsl #1]
     43 define i32 @ldrh_rr(i16* %p, i32 %n) {
     44 entry:
     45   %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
     46   %0 = load i16, i16* %arrayidx, align 2
     47   %conv = zext i16 %0 to i32
     48   ret i32 %conv
     49 }
     50 
     51 ; CHECK-LABEL: ldr_rr
     52 ; CHECK-T1: lsls    r1, r1, #2
     53 ; CHECK-T1: ldr     r0, [r0, r1]
     54 ; CHECK-T2: ldr.w   r0, [r0, r1, lsl #2]
     55 define i32 @ldr_rr(i32* %p, i32 %n) {
     56 entry:
     57   %arrayidx = getelementptr inbounds i32, i32* %p, i32 %n
     58   %0 = load i32, i32* %arrayidx, align 4
     59   ret i32 %0
     60 }
     61 
     62 ; CHECK-LABEL: strb_rr
     63 ; CHECK:    strb    r2, [r0, r1]
     64 define void @strb_rr(i8* %p, i32 %n, i32 %x) {
     65 entry:
     66   %conv = trunc i32 %x to i8
     67   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
     68   store i8 %conv, i8* %arrayidx, align 1
     69   ret void
     70 }
     71 
     72 ; CHECK-LABEL: strh_rr
     73 ; CHECK-T1: lsls    r1, r1, #1
     74 ; CHECK-T1: strh    r2, [r0, r1]
     75 ; CHECK-T2: strh.w  r2, [r0, r1, lsl #1]
     76 define void @strh_rr(i16* %p, i32 %n, i32 %x) {
     77 entry:
     78   %conv = trunc i32 %x to i16
     79   %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
     80   store i16 %conv, i16* %arrayidx, align 2
     81   ret void
     82 }
     83 
     84 ; CHECK-LABEL: str_rr
     85 ; CHECK-T1: lsls    r1, r1, #2
     86 ; CHECK-T1: str     r2, [r0, r1]
     87 ; CHECK-T2: str.w   r2, [r0, r1, lsl #2]
     88 define void @str_rr(i32* %p, i32 %n, i32 %x) {
     89 entry:
     90   %arrayidx = getelementptr inbounds i32, i32* %p, i32 %n
     91   store i32 %x, i32* %arrayidx, align 4
     92   ret void
     93 }
     94 
     95 
     96 ; Immediate offset of zero
     97 
     98 ; CHECK-LABEL: ldrsb_ri_zero
     99 ; CHECK-T1: ldrb    r0, [r0]
    100 ; CHECK-T1: sxtb    r0, r0
    101 ; CHECK-T2: ldrsb.w r0, [r0]
    102 define i32 @ldrsb_ri_zero(i8* %p) {
    103 entry:
    104   %0 = load i8, i8* %p, align 1
    105   %conv = sext i8 %0 to i32
    106   ret i32 %conv
    107 }
    108 
    109 ; CHECK-LABEL: ldrsh_ri_zero
    110 ; CHECK-T1: ldrh    r0, [r0]
    111 ; CHECK-T1: sxth    r0, r0
    112 ; CHECK-T2: ldrsh.w r0, [r0]
    113 define i32 @ldrsh_ri_zero(i16* %p) {
    114 entry:
    115   %0 = load i16, i16* %p, align 2
    116   %conv = sext i16 %0 to i32
    117   ret i32 %conv
    118 }
    119 
    120 ; CHECK-LABEL: ldrb_ri_zero
    121 ; CHECK:    ldrb    r0, [r0]
    122 define i32 @ldrb_ri_zero(i8* %p) {
    123 entry:
    124   %0 = load i8, i8* %p, align 1
    125   %conv = zext i8 %0 to i32
    126   ret i32 %conv
    127 }
    128 
    129 ; CHECK-LABEL: ldrh_ri_zero
    130 ; CHECK:    ldrh    r0, [r0]
    131 define i32 @ldrh_ri_zero(i16* %p) {
    132 entry:
    133   %0 = load i16, i16* %p, align 2
    134   %conv = zext i16 %0 to i32
    135   ret i32 %conv
    136 }
    137 
    138 ; CHECK-LABEL: ldr_ri_zero
    139 ; CHECK:    ldr     r0, [r0]
    140 define i32 @ldr_ri_zero(i32* %p) {
    141 entry:
    142   %0 = load i32, i32* %p, align 4
    143   ret i32 %0
    144 }
    145 
    146 ; CHECK-LABEL: strb_ri_zero
    147 ; CHECK:    strb    r1, [r0]
    148 define void @strb_ri_zero(i8* %p, i32 %x) {
    149 entry:
    150   %conv = trunc i32 %x to i8
    151   store i8 %conv, i8* %p, align 1
    152   ret void
    153 }
    154 
    155 ; CHECK-LABEL: strh_ri_zero
    156 ; CHECK:    strh    r1, [r0]
    157 define void @strh_ri_zero(i16* %p, i32 %x) {
    158 entry:
    159   %conv = trunc i32 %x to i16
    160   store i16 %conv, i16* %p, align 2
    161   ret void
    162 }
    163 
    164 ; CHECK-LABEL: str_ri_zero
    165 ; CHECK:    str     r1, [r0]
    166 define void @str_ri_zero(i32* %p, i32 %x) {
    167 entry:
    168   store i32 %x, i32* %p, align 4
    169   ret void
    170 }
    171 
    172 
    173 ; Maximum Thumb-1 immediate offset
    174 
    175 ; CHECK-LABEL: ldrsb_ri_t1_max
    176 ; CHECK-T1: movs    r1, #31
    177 ; CHECK-T1: ldrsb   r0, [r0, r1]
    178 ; CHECK-T2: ldrsb.w r0, [r0, #31]
    179 define i32 @ldrsb_ri_t1_max(i8* %p) {
    180 entry:
    181   %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
    182   %0 = load i8, i8* %arrayidx, align 1
    183   %conv = sext i8 %0 to i32
    184   ret i32 %conv
    185 }
    186 
    187 ; CHECK-LABEL: ldrsh_ri_t1_max
    188 ; CHECK-T1: movs    r1, #62
    189 ; CHECK-T1: ldrsh   r0, [r0, r1]
    190 ; CHECK-T2: ldrsh.w r0, [r0, #62]
    191 define i32 @ldrsh_ri_t1_max(i16* %p) {
    192 entry:
    193   %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
    194   %0 = load i16, i16* %arrayidx, align 2
    195   %conv = sext i16 %0 to i32
    196   ret i32 %conv
    197 }
    198 
    199 ; CHECK-LABEL: ldrb_ri_t1_max
    200 ; CHECK:    ldrb    r0, [r0, #31]
    201 define i32 @ldrb_ri_t1_max(i8* %p) {
    202 entry:
    203   %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
    204   %0 = load i8, i8* %arrayidx, align 1
    205   %conv = zext i8 %0 to i32
    206   ret i32 %conv
    207 }
    208 
    209 ; CHECK-LABEL: ldrh_ri_t1_max
    210 ; CHECK:    ldrh    r0, [r0, #62]
    211 define i32 @ldrh_ri_t1_max(i16* %p) {
    212 entry:
    213   %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
    214   %0 = load i16, i16* %arrayidx, align 2
    215   %conv = zext i16 %0 to i32
    216   ret i32 %conv
    217 }
    218 
    219 ; CHECK-LABEL: ldr_ri_t1_max
    220 ; CHECK:    ldr     r0, [r0, #124]
    221 define i32 @ldr_ri_t1_max(i32* %p) {
    222 entry:
    223   %arrayidx = getelementptr inbounds i32, i32* %p, i32 31
    224   %0 = load i32, i32* %arrayidx, align 4
    225   ret i32 %0
    226 }
    227 
    228 ; CHECK-LABEL: strb_ri_t1_max
    229 ; CHECK:    strb    r1, [r0, #31]
    230 define void @strb_ri_t1_max(i8* %p, i32 %x) {
    231 entry:
    232   %conv = trunc i32 %x to i8
    233   %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
    234   store i8 %conv, i8* %arrayidx, align 1
    235   ret void
    236 }
    237 
    238 ; CHECK-LABEL: strh_ri_t1_max
    239 ; CHECK:    strh    r1, [r0, #62]
    240 define void @strh_ri_t1_max(i16* %p, i32 %x) {
    241 entry:
    242   %conv = trunc i32 %x to i16
    243   %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
    244   store i16 %conv, i16* %arrayidx, align 2
    245   ret void
    246 }
    247 
    248 ; CHECK-LABEL: str_ri_t1_max
    249 ; CHECK:    str     r1, [r0, #124]
    250 define void @str_ri_t1_max(i32* %p, i32 %x) {
    251 entry:
    252   %arrayidx = getelementptr inbounds i32, i32* %p, i32 31
    253   store i32 %x, i32* %arrayidx, align 4
    254   ret void
    255 }
    256 
    257 
    258 ; One past maximum Thumb-1 immediate offset
    259 
    260 ; CHECK-LABEL: ldrsb_ri_t1_too_big
    261 ; CHECK-T1: movs    r1, #32
    262 ; CHECK-T1: ldrsb   r0, [r0, r1]
    263 ; CHECK-T2: ldrsb.w r0, [r0, #32]
    264 define i32 @ldrsb_ri_t1_too_big(i8* %p) {
    265 entry:
    266   %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
    267   %0 = load i8, i8* %arrayidx, align 1
    268   %conv = sext i8 %0 to i32
    269   ret i32 %conv
    270 }
    271 
    272 ; CHECK-LABEL: ldrsh_ri_t1_too_big
    273 ; CHECK-T1: movs    r1, #64
    274 ; CHECK-T1: ldrsh   r0, [r0, r1]
    275 ; CHECK-T2: ldrsh.w r0, [r0, #64]
    276 define i32 @ldrsh_ri_t1_too_big(i16* %p) {
    277 entry:
    278   %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
    279   %0 = load i16, i16* %arrayidx, align 2
    280   %conv = sext i16 %0 to i32
    281   ret i32 %conv
    282 }
    283 
    284 ; CHECK-LABEL: ldrb_ri_t1_too_big
    285 ; CHECK-T1: movs    r1, #32
    286 ; CHECK-T1: ldrb    r0, [r0, r1]
    287 ; CHECK-T2: ldrb.w  r0, [r0, #32]
    288 define i32 @ldrb_ri_t1_too_big(i8* %p) {
    289 entry:
    290   %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
    291   %0 = load i8, i8* %arrayidx, align 1
    292   %conv = zext i8 %0 to i32
    293   ret i32 %conv
    294 }
    295 
    296 ; CHECK-LABEL: ldrh_ri_t1_too_big
    297 ; CHECK-T1: movs    r1, #64
    298 ; CHECK-T1: ldrh    r0, [r0, r1]
    299 ; CHECK-T2: ldrh.w  r0, [r0, #64]
    300 define i32 @ldrh_ri_t1_too_big(i16* %p) {
    301 entry:
    302   %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
    303   %0 = load i16, i16* %arrayidx, align 2
    304   %conv = zext i16 %0 to i32
    305   ret i32 %conv
    306 }
    307 
    308 ; CHECK-LABEL: ldr_ri_t1_too_big
    309 ; CHECK-T1: movs    r1, #128
    310 ; CHECK-T1: ldr     r0, [r0, r1]
    311 ; CHECK-T2: ldr.w   r0, [r0, #128]
    312 define i32 @ldr_ri_t1_too_big(i32* %p) {
    313 entry:
    314   %arrayidx = getelementptr inbounds i32, i32* %p, i32 32
    315   %0 = load i32, i32* %arrayidx, align 4
    316   ret i32 %0
    317 }
    318 
    319 ; CHECK-LABEL: strb_ri_t1_too_big
    320 ; CHECK-T1: movs    r2, #32
    321 ; CHECK-T1: strb    r1, [r0, r2]
    322 ; CHECK-T2: strb.w  r1, [r0, #32]
    323 define void @strb_ri_t1_too_big(i8* %p, i32 %x) {
    324 entry:
    325   %conv = trunc i32 %x to i8
    326   %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
    327   store i8 %conv, i8* %arrayidx, align 1
    328   ret void
    329 }
    330 
    331 ; CHECK-LABEL: strh_ri_t1_too_big
    332 ; CHECK-T1: movs    r2, #64
    333 ; CHECK-T1: strh    r1, [r0, r2]
    334 ; CHECK-T2: strh.w  r1, [r0, #64]
    335 define void @strh_ri_t1_too_big(i16* %p, i32 %x) {
    336 entry:
    337   %conv = trunc i32 %x to i16
    338   %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
    339   store i16 %conv, i16* %arrayidx, align 2
    340   ret void
    341 }
    342 
    343 ; CHECK-LABEL: str_ri_t1_too_big
    344 ; CHECK-T1: movs    r2, #128
    345 ; CHECK-T1: str     r1, [r0, r2]
    346 ; CHECK-T2: str.w   r1, [r0, #128]
    347 define void @str_ri_t1_too_big(i32* %p, i32 %x) {
    348 entry:
    349   %arrayidx = getelementptr inbounds i32, i32* %p, i32 32
    350   store i32 %x, i32* %arrayidx, align 4
    351   ret void
    352 }
    353 
    354 
    355 ; Maximum Thumb-2 immediate offset
    356 
    357 ; CHECK-LABEL: ldrsb_ri_t2_max
    358 ; CHECK-T1: ldr     r1, .LCP
    359 ; CHECK-T1: ldrsb   r0, [r0, r1]
    360 ; CHECK-T2: ldrsb.w r0, [r0, #4095]
    361 define i32 @ldrsb_ri_t2_max(i8* %p) {
    362 entry:
    363   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    364   %0 = load i8, i8* %add.ptr, align 1
    365   %conv = sext i8 %0 to i32
    366   ret i32 %conv
    367 }
    368 
    369 ; CHECK-LABEL: ldrsh_ri_t2_max
    370 ; CHECK-T1: ldr     r1, .LCP
    371 ; CHECK-T1: ldrsh   r0, [r0, r1]
    372 ; CHECK-T2: ldrsh.w r0, [r0, #4095]
    373 define i32 @ldrsh_ri_t2_max(i8* %p) {
    374 entry:
    375   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    376   %0 = bitcast i8* %add.ptr to i16*
    377   %1 = load i16, i16* %0, align 2
    378   %conv = sext i16 %1 to i32
    379   ret i32 %conv
    380 }
    381 
    382 ; CHECK-LABEL: ldrb_ri_t2_max
    383 ; CHECK-T1: ldr     r1, .LCP
    384 ; CHECK-T1: ldrb    r0, [r0, r1]
    385 ; CHECK-T2: ldrb.w  r0, [r0, #4095]
    386 define i32 @ldrb_ri_t2_max(i8* %p) {
    387 entry:
    388   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    389   %0 = load i8, i8* %add.ptr, align 1
    390   %conv = zext i8 %0 to i32
    391   ret i32 %conv
    392 }
    393 
    394 ; CHECK-LABEL: ldrh_ri_t2_max
    395 ; CHECK-T1: ldr     r1, .LCP
    396 ; CHECK-T1: ldrh    r0, [r0, r1]
    397 ; CHECK-T2: ldrh.w  r0, [r0, #4095]
    398 define i32 @ldrh_ri_t2_max(i8* %p) {
    399 entry:
    400   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    401   %0 = bitcast i8* %add.ptr to i16*
    402   %1 = load i16, i16* %0, align 2
    403   %conv = zext i16 %1 to i32
    404   ret i32 %conv
    405 }
    406 
    407 ; CHECK-LABEL: ldr_ri_t2_max
    408 ; CHECK-T1: ldr     r1, .LCP
    409 ; CHECK-T1: ldr     r0, [r0, r1]
    410 ; CHECK-T2: ldr.w   r0, [r0, #4095]
    411 define i32 @ldr_ri_t2_max(i8* %p) {
    412 entry:
    413   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    414   %0 = bitcast i8* %add.ptr to i32*
    415   %1 = load i32, i32* %0, align 4
    416   ret i32 %1
    417 }
    418 
    419 ; CHECK-LABEL: strb_ri_t2_max
    420 ; CHECK-T1: ldr     r2, .LCP
    421 ; CHECK-T1: strb    r1, [r0, r2]
    422 ; CHECK-T2: strb.w  r1, [r0, #4095]
    423 define void @strb_ri_t2_max(i8* %p, i32 %x) {
    424 entry:
    425   %conv = trunc i32 %x to i8
    426   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    427   store i8 %conv, i8* %add.ptr, align 1
    428   ret void
    429 }
    430 
    431 ; CHECK-LABEL: strh_ri_t2_max
    432 ; CHECK-T1: ldr     r2, .LCP
    433 ; CHECK-T1: strh    r1, [r0, r2]
    434 ; CHECK-T2: strh.w  r1, [r0, #4095]
    435 define void @strh_ri_t2_max(i8* %p, i32 %x) {
    436 entry:
    437   %conv = trunc i32 %x to i16
    438   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    439   %0 = bitcast i8* %add.ptr to i16*
    440   store i16 %conv, i16* %0, align 2
    441   ret void
    442 }
    443 
    444 ; CHECK-LABEL: str_ri_t2_max
    445 ; CHECK-T1: ldr     r2, .LCP
    446 ; CHECK-T1: str     r1, [r0, r2]
    447 ; CHECK-T2: str.w   r1, [r0, #4095]
    448 define void @str_ri_t2_max(i8* %p, i32 %x) {
    449 entry:
    450   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
    451   %0 = bitcast i8* %add.ptr to i32*
    452   store i32 %x, i32* %0, align 4
    453   ret void
    454 }
    455 
    456 
    457 ; One past maximum Thumb-2 immediate offset
    458 
    459 ; CHECK-LABEL: ldrsb_ri_t2_too_big
    460 ; CHECK-T1: movs    r1, #1
    461 ; CHECK-T1: lsls    r1, r1, #12
    462 ; CHECK-T2: mov.w   r1, #4096
    463 ; CHECK:    ldrsb   r0, [r0, r1]
    464 define i32 @ldrsb_ri_t2_too_big(i8* %p) {
    465 entry:
    466   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    467   %0 = load i8, i8* %add.ptr, align 1
    468   %conv = sext i8 %0 to i32
    469   ret i32 %conv
    470 }
    471 
    472 ; CHECK-LABEL: ldrsh_ri_t2_too_big
    473 ; CHECK-T1: movs    r1, #1
    474 ; CHECK-T1: lsls    r1, r1, #12
    475 ; CHECK-T2: mov.w   r1, #4096
    476 ; CHECK:    ldrsh   r0, [r0, r1]
    477 define i32 @ldrsh_ri_t2_too_big(i8* %p) {
    478 entry:
    479   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    480   %0 = bitcast i8* %add.ptr to i16*
    481   %1 = load i16, i16* %0, align 2
    482   %conv = sext i16 %1 to i32
    483   ret i32 %conv
    484 }
    485 
    486 ; CHECK-LABEL: ldrb_ri_t2_too_big
    487 ; CHECK-T1: movs    r1, #1
    488 ; CHECK-T1: lsls    r1, r1, #12
    489 ; CHECK-T2: mov.w   r1, #4096
    490 ; CHECK:    ldrb    r0, [r0, r1]
    491 define i32 @ldrb_ri_t2_too_big(i8* %p) {
    492 entry:
    493   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    494   %0 = load i8, i8* %add.ptr, align 1
    495   %conv = zext i8 %0 to i32
    496   ret i32 %conv
    497 }
    498 
    499 ; CHECK-LABEL: ldrh_ri_t2_too_big
    500 ; CHECK-T1: movs    r1, #1
    501 ; CHECK-T1: lsls    r1, r1, #12
    502 ; CHECK-T2: mov.w   r1, #4096
    503 ; CHECK:    ldrh    r0, [r0, r1]
    504 define i32 @ldrh_ri_t2_too_big(i8* %p) {
    505 entry:
    506   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    507   %0 = bitcast i8* %add.ptr to i16*
    508   %1 = load i16, i16* %0, align 2
    509   %conv = zext i16 %1 to i32
    510   ret i32 %conv
    511 }
    512 
    513 ; CHECK-LABEL: ldr_ri_t2_too_big
    514 ; CHECK-T1: movs    r1, #1
    515 ; CHECK-T1: lsls    r1, r1, #12
    516 ; CHECK-T2: mov.w   r1, #4096
    517 ; CHECK:    ldr     r0, [r0, r1]
    518 define i32 @ldr_ri_t2_too_big(i8* %p) {
    519 entry:
    520   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    521   %0 = bitcast i8* %add.ptr to i32*
    522   %1 = load i32, i32* %0, align 4
    523   ret i32 %1
    524 }
    525 
    526 ; CHECK-LABEL: strb_ri_t2_too_big
    527 ; CHECK-T1: movs    r2, #1
    528 ; CHECK-T1: lsls    r2, r2, #12
    529 ; CHECK-T2: mov.w   r2, #4096
    530 ; CHECK:    strb    r1, [r0, r2]
    531 define void @strb_ri_t2_too_big(i8* %p, i32 %x) {
    532 entry:
    533   %conv = trunc i32 %x to i8
    534   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    535   store i8 %conv, i8* %add.ptr, align 1
    536   ret void
    537 }
    538 
    539 ; CHECK-LABEL: strh_ri_t2_too_big
    540 ; CHECK-T1: movs    r2, #1
    541 ; CHECK-T1: lsls    r2, r2, #12
    542 ; CHECK-T2: mov.w   r2, #4096
    543 ; CHECK:    strh    r1, [r0, r2]
    544 define void @strh_ri_t2_too_big(i8* %p, i32 %x) {
    545 entry:
    546   %conv = trunc i32 %x to i16
    547   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    548   %0 = bitcast i8* %add.ptr to i16*
    549   store i16 %conv, i16* %0, align 2
    550   ret void
    551 }
    552 
    553 ; CHECK-LABEL: str_ri_t2_too_big
    554 ; CHECK-T1: movs    r2, #1
    555 ; CHECK-T1: lsls    r2, r2, #12
    556 ; CHECK-T2: mov.w   r2, #4096
    557 ; CHECK:    str     r1, [r0, r2]
    558 define void @str_ri_t2_too_big(i8* %p, i32 %x) {
    559 entry:
    560   %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
    561   %0 = bitcast i8* %add.ptr to i32*
    562   store i32 %x, i32* %0, align 4
    563   ret void
    564 }
    565