Home | History | Annotate | Download | only in SystemZ
      1 ; Test sequences that can use RISBG with a zeroed first operand.
      2 ; The tests here assume that RISBLG isn't available.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
      5 
      6 ; Test an extraction of bit 0 from a right-shifted value.
      7 define i32 @f1(i32 %foo) {
      8 ; CHECK-LABEL: f1:
      9 ; CHECK: risbg %r2, %r2, 63, 191, 54
     10 ; CHECK: br %r14
     11   %shr = lshr i32 %foo, 10
     12   %and = and i32 %shr, 1
     13   ret i32 %and
     14 }
     15 
     16 ; ...and again with i64.
     17 define i64 @f2(i64 %foo) {
     18 ; CHECK-LABEL: f2:
     19 ; CHECK: risbg %r2, %r2, 63, 191, 54
     20 ; CHECK: br %r14
     21   %shr = lshr i64 %foo, 10
     22   %and = and i64 %shr, 1
     23   ret i64 %and
     24 }
     25 
     26 ; Test an extraction of other bits from a right-shifted value.
     27 define i32 @f3(i32 %foo) {
     28 ; CHECK-LABEL: f3:
     29 ; CHECK: risbg %r2, %r2, 60, 189, 42
     30 ; CHECK: br %r14
     31   %shr = lshr i32 %foo, 22
     32   %and = and i32 %shr, 12
     33   ret i32 %and
     34 }
     35 
     36 ; ...and again with i64.
     37 define i64 @f4(i64 %foo) {
     38 ; CHECK-LABEL: f4:
     39 ; CHECK: risbg %r2, %r2, 60, 189, 42
     40 ; CHECK: br %r14
     41   %shr = lshr i64 %foo, 22
     42   %and = and i64 %shr, 12
     43   ret i64 %and
     44 }
     45 
     46 ; Test an extraction of most bits from a right-shifted value.
     47 ; The range should be reduced to exclude the zeroed high bits.
     48 define i32 @f5(i32 %foo) {
     49 ; CHECK-LABEL: f5:
     50 ; CHECK: risbg %r2, %r2, 34, 188, 62
     51 ; CHECK: br %r14
     52   %shr = lshr i32 %foo, 2
     53   %and = and i32 %shr, -8
     54   ret i32 %and
     55 }
     56 
     57 ; ...and again with i64.
     58 define i64 @f6(i64 %foo) {
     59 ; CHECK-LABEL: f6:
     60 ; CHECK: risbg %r2, %r2, 2, 188, 62
     61 ; CHECK: br %r14
     62   %shr = lshr i64 %foo, 2
     63   %and = and i64 %shr, -8
     64   ret i64 %and
     65 }
     66 
     67 ; Try the next value up (mask ....1111001).  This needs a separate shift
     68 ; and mask.
     69 define i32 @f7(i32 %foo) {
     70 ; CHECK-LABEL: f7:
     71 ; CHECK: srl %r2, 2
     72 ; CHECK: nill %r2, 65529
     73 ; CHECK: br %r14
     74   %shr = lshr i32 %foo, 2
     75   %and = and i32 %shr, -7
     76   ret i32 %and
     77 }
     78 
     79 ; ...and again with i64.
     80 define i64 @f8(i64 %foo) {
     81 ; CHECK-LABEL: f8:
     82 ; CHECK: srlg %r2, %r2, 2
     83 ; CHECK: nill %r2, 65529
     84 ; CHECK: br %r14
     85   %shr = lshr i64 %foo, 2
     86   %and = and i64 %shr, -7
     87   ret i64 %and
     88 }
     89 
     90 ; Test an extraction of bits from a left-shifted value.  The range should
     91 ; be reduced to exclude the zeroed low bits.
     92 define i32 @f9(i32 %foo) {
     93 ; CHECK-LABEL: f9:
     94 ; CHECK: risbg %r2, %r2, 56, 189, 2
     95 ; CHECK: br %r14
     96   %shr = shl i32 %foo, 2
     97   %and = and i32 %shr, 255
     98   ret i32 %and
     99 }
    100 
    101 ; ...and again with i64.
    102 define i64 @f10(i64 %foo) {
    103 ; CHECK-LABEL: f10:
    104 ; CHECK: risbg %r2, %r2, 56, 189, 2
    105 ; CHECK: br %r14
    106   %shr = shl i64 %foo, 2
    107   %and = and i64 %shr, 255
    108   ret i64 %and
    109 }
    110 
    111 ; Try a wrap-around mask (mask ....111100001111).  This needs a separate shift
    112 ; and mask.
    113 define i32 @f11(i32 %foo) {
    114 ; CHECK-LABEL: f11:
    115 ; CHECK: sll %r2, 2
    116 ; CHECK: nill %r2, 65295
    117 ; CHECK: br %r14
    118   %shr = shl i32 %foo, 2
    119   %and = and i32 %shr, -241
    120   ret i32 %and
    121 }
    122 
    123 ; ...and again with i64.
    124 define i64 @f12(i64 %foo) {
    125 ; CHECK-LABEL: f12:
    126 ; CHECK: sllg %r2, %r2, 2
    127 ; CHECK: nill %r2, 65295
    128 ; CHECK: br %r14
    129   %shr = shl i64 %foo, 2
    130   %and = and i64 %shr, -241
    131   ret i64 %and
    132 }
    133 
    134 ; Test an extraction from a rotated value, no mask wraparound.
    135 ; This is equivalent to the lshr case, because the bits from the
    136 ; shl are not used.
    137 define i32 @f13(i32 %foo) {
    138 ; CHECK-LABEL: f13:
    139 ; CHECK: risbg %r2, %r2, 56, 188, 46
    140 ; CHECK: br %r14
    141   %parta = shl i32 %foo, 14
    142   %partb = lshr i32 %foo, 18
    143   %rotl = or i32 %parta, %partb
    144   %and = and i32 %rotl, 248
    145   ret i32 %and
    146 }
    147 
    148 ; ...and again with i64.
    149 define i64 @f14(i64 %foo) {
    150 ; CHECK-LABEL: f14:
    151 ; CHECK: risbg %r2, %r2, 56, 188, 14
    152 ; CHECK: br %r14
    153   %parta = shl i64 %foo, 14
    154   %partb = lshr i64 %foo, 50
    155   %rotl = or i64 %parta, %partb
    156   %and = and i64 %rotl, 248
    157   ret i64 %and
    158 }
    159 
    160 ; Try a case in which only the bits from the shl are used.
    161 define i32 @f15(i32 %foo) {
    162 ; CHECK-LABEL: f15:
    163 ; CHECK: risbg %r2, %r2, 47, 177, 14
    164 ; CHECK: br %r14
    165   %parta = shl i32 %foo, 14
    166   %partb = lshr i32 %foo, 18
    167   %rotl = or i32 %parta, %partb
    168   %and = and i32 %rotl, 114688
    169   ret i32 %and
    170 }
    171 
    172 ; ...and again with i64.
    173 define i64 @f16(i64 %foo) {
    174 ; CHECK-LABEL: f16:
    175 ; CHECK: risbg %r2, %r2, 47, 177, 14
    176 ; CHECK: br %r14
    177   %parta = shl i64 %foo, 14
    178   %partb = lshr i64 %foo, 50
    179   %rotl = or i64 %parta, %partb
    180   %and = and i64 %rotl, 114688
    181   ret i64 %and
    182 }
    183 
    184 ; Test a 32-bit rotate in which both parts of the OR are needed.
    185 ; This needs a separate shift and mask.
    186 define i32 @f17(i32 %foo) {
    187 ; CHECK-LABEL: f17:
    188 ; CHECK: rll %r2, %r2, 4
    189 ; CHECK: nilf %r2, 126
    190 ; CHECK: br %r14
    191   %parta = shl i32 %foo, 4
    192   %partb = lshr i32 %foo, 28
    193   %rotl = or i32 %parta, %partb
    194   %and = and i32 %rotl, 126
    195   ret i32 %and
    196 }
    197 
    198 ; ...and for i64, where RISBG should do the rotate too.
    199 define i64 @f18(i64 %foo) {
    200 ; CHECK-LABEL: f18:
    201 ; CHECK: risbg %r2, %r2, 57, 190, 4
    202 ; CHECK: br %r14
    203   %parta = shl i64 %foo, 4
    204   %partb = lshr i64 %foo, 60
    205   %rotl = or i64 %parta, %partb
    206   %and = and i64 %rotl, 126
    207   ret i64 %and
    208 }
    209 
    210 ; Test an arithmetic shift right in which some of the sign bits are kept.
    211 ; This needs a separate shift and mask.
    212 define i32 @f19(i32 %foo) {
    213 ; CHECK-LABEL: f19:
    214 ; CHECK: sra %r2, 28
    215 ; CHECK: nilf %r2, 30
    216 ; CHECK: br %r14
    217   %shr = ashr i32 %foo, 28
    218   %and = and i32 %shr, 30
    219   ret i32 %and
    220 }
    221 
    222 ; ...and again with i64.  In this case RISBG is the best way of doing the AND.
    223 define i64 @f20(i64 %foo) {
    224 ; CHECK-LABEL: f20:
    225 ; CHECK: srag [[REG:%r[0-5]]], %r2, 60
    226 ; CHECK: risbg %r2, [[REG]], 59, 190, 0
    227 ; CHECK: br %r14
    228   %shr = ashr i64 %foo, 60
    229   %and = and i64 %shr, 30
    230   ret i64 %and
    231 }
    232 
    233 ; Now try an arithmetic right shift in which the sign bits aren't needed.
    234 ; Introduce a second use of %shr so that the ashr doesn't decompose to
    235 ; an lshr.
    236 ; NOTE: the extra move to %r2 should not be needed (temporary FAIL)
    237 define i32 @f21(i32 %foo, i32 *%dest) {
    238 ; CHECK-LABEL: f21:
    239 ; CHECK: risbg %r0, %r2, 60, 190, 36
    240 ; CHECK: lr %r2, %r0
    241 ; CHECK: br %r14
    242   %shr = ashr i32 %foo, 28
    243   store i32 %shr, i32 *%dest
    244   %and = and i32 %shr, 14
    245   ret i32 %and
    246 }
    247 
    248 ; ...and again with i64.
    249 define i64 @f22(i64 %foo, i64 *%dest) {
    250 ; CHECK-LABEL: f22:
    251 ; CHECK: risbg %r2, %r2, 60, 190, 4
    252 ; CHECK: br %r14
    253   %shr = ashr i64 %foo, 60
    254   store i64 %shr, i64 *%dest
    255   %and = and i64 %shr, 14
    256   ret i64 %and
    257 }
    258 
    259 ; Check that we use RISBG for shifted values even if the AND is a
    260 ; natural zero extension.
    261 define i64 @f23(i64 %foo) {
    262 ; CHECK-LABEL: f23:
    263 ; CHECK: risbg %r2, %r2, 56, 191, 62
    264 ; CHECK: br %r14
    265   %shr = lshr i64 %foo, 2
    266   %and = and i64 %shr, 255
    267   ret i64 %and
    268 }
    269 
    270 ; Test a case where the AND comes before a rotate.  This needs a separate
    271 ; mask and rotate.
    272 define i32 @f24(i32 %foo) {
    273 ; CHECK-LABEL: f24:
    274 ; CHECK: nilf %r2, 254
    275 ; CHECK: rll %r2, %r2, 29
    276 ; CHECK: br %r14
    277   %and = and i32 %foo, 254
    278   %parta = lshr i32 %and, 3
    279   %partb = shl i32 %and, 29
    280   %rotl = or i32 %parta, %partb
    281   ret i32 %rotl
    282 }
    283 
    284 ; ...and again with i64, where a single RISBG is enough.
    285 define i64 @f25(i64 %foo) {
    286 ; CHECK-LABEL: f25:
    287 ; CHECK: risbg %r2, %r2, 57, 187, 3
    288 ; CHECK: br %r14
    289   %and = and i64 %foo, 14
    290   %parta = shl i64 %and, 3
    291   %partb = lshr i64 %and, 61
    292   %rotl = or i64 %parta, %partb
    293   ret i64 %rotl
    294 }
    295 
    296 ; Test a wrap-around case in which the AND comes before a rotate.
    297 ; This again needs a separate mask and rotate.
    298 define i32 @f26(i32 %foo) {
    299 ; CHECK-LABEL: f26:
    300 ; CHECK: rll %r2, %r2, 5
    301 ; CHECK: br %r14
    302   %and = and i32 %foo, -49
    303   %parta = shl i32 %and, 5
    304   %partb = lshr i32 %and, 27
    305   %rotl = or i32 %parta, %partb
    306   ret i32 %rotl
    307 }
    308 
    309 ; ...and again with i64, where a single RISBG is OK.
    310 define i64 @f27(i64 %foo) {
    311 ; CHECK-LABEL: f27:
    312 ; CHECK: risbg %r2, %r2, 55, 180, 5
    313 ; CHECK: br %r14
    314   %and = and i64 %foo, -49
    315   %parta = shl i64 %and, 5
    316   %partb = lshr i64 %and, 59
    317   %rotl = or i64 %parta, %partb
    318   ret i64 %rotl
    319 }
    320 
    321 ; Test a case where the AND comes before a shift left.
    322 define i32 @f28(i32 %foo) {
    323 ; CHECK-LABEL: f28:
    324 ; CHECK: risbg %r2, %r2, 32, 173, 17
    325 ; CHECK: br %r14
    326   %and = and i32 %foo, 32766
    327   %shl = shl i32 %and, 17
    328   ret i32 %shl
    329 }
    330 
    331 ; ...and again with i64.
    332 define i64 @f29(i64 %foo) {
    333 ; CHECK-LABEL: f29:
    334 ; CHECK: risbg %r2, %r2, 0, 141, 49
    335 ; CHECK: br %r14
    336   %and = and i64 %foo, 32766
    337   %shl = shl i64 %and, 49
    338   ret i64 %shl
    339 }
    340 
    341 ; Test the next shift up from f28, in which the mask should get shortened.
    342 define i32 @f30(i32 %foo) {
    343 ; CHECK-LABEL: f30:
    344 ; CHECK: risbg %r2, %r2, 32, 172, 18
    345 ; CHECK: br %r14
    346   %and = and i32 %foo, 32766
    347   %shl = shl i32 %and, 18
    348   ret i32 %shl
    349 }
    350 
    351 ; ...and again with i64.
    352 define i64 @f31(i64 %foo) {
    353 ; CHECK-LABEL: f31:
    354 ; CHECK: risbg %r2, %r2, 0, 140, 50
    355 ; CHECK: br %r14
    356   %and = and i64 %foo, 32766
    357   %shl = shl i64 %and, 50
    358   ret i64 %shl
    359 }
    360 
    361 ; Test a wrap-around case in which the shift left comes after the AND.
    362 ; We can't use RISBG for the shift in that case.
    363 define i32 @f32(i32 %foo) {
    364 ; CHECK-LABEL: f32:
    365 ; CHECK: sll %r2
    366 ; CHECK: br %r14
    367   %and = and i32 %foo, -7
    368   %shl = shl i32 %and, 10
    369   ret i32 %shl
    370 }
    371 
    372 ; ...and again with i64.
    373 define i64 @f33(i64 %foo) {
    374 ; CHECK-LABEL: f33:
    375 ; CHECK: sllg %r2
    376 ; CHECK: br %r14
    377   %and = and i64 %foo, -7
    378   %shl = shl i64 %and, 10
    379   ret i64 %shl
    380 }
    381 
    382 ; Test a case where the AND comes before a shift right.
    383 define i32 @f34(i32 %foo) {
    384 ; CHECK-LABEL: f34:
    385 ; CHECK: risbg %r2, %r2, 57, 191, 55
    386 ; CHECK: br %r14
    387   %and = and i32 %foo, 65535
    388   %shl = lshr i32 %and, 9
    389   ret i32 %shl
    390 }
    391 
    392 ; ...and again with i64.
    393 define i64 @f35(i64 %foo) {
    394 ; CHECK-LABEL: f35:
    395 ; CHECK: risbg %r2, %r2, 57, 191, 55
    396 ; CHECK: br %r14
    397   %and = and i64 %foo, 65535
    398   %shl = lshr i64 %and, 9
    399   ret i64 %shl
    400 }
    401 
    402 ; Test a wrap-around case where the AND comes before a shift right.
    403 ; We can't use RISBG for the shift in that case.
    404 define i32 @f36(i32 %foo) {
    405 ; CHECK-LABEL: f36:
    406 ; CHECK: srl %r2
    407 ; CHECK: br %r14
    408   %and = and i32 %foo, -25
    409   %shl = lshr i32 %and, 1
    410   ret i32 %shl
    411 }
    412 
    413 ; ...and again with i64.
    414 define i64 @f37(i64 %foo) {
    415 ; CHECK-LABEL: f37:
    416 ; CHECK: srlg %r2
    417 ; CHECK: br %r14
    418   %and = and i64 %foo, -25
    419   %shl = lshr i64 %and, 1
    420   ret i64 %shl
    421 }
    422 
    423 ; Test a combination involving a large ASHR and a shift left.  We can't
    424 ; use RISBG there.
    425 define i64 @f38(i64 %foo) {
    426 ; CHECK-LABEL: f38:
    427 ; CHECK: srag {{%r[0-5]}}
    428 ; CHECK: sllg {{%r[0-5]}}
    429 ; CHECK: br %r14
    430   %ashr = ashr i64 %foo, 32
    431   %shl = shl i64 %ashr, 5
    432   ret i64 %shl
    433 }
    434 
    435 ; Try a similar thing in which no shifted sign bits are kept.
    436 define i64 @f39(i64 %foo, i64 *%dest) {
    437 ; CHECK-LABEL: f39:
    438 ; CHECK: srag [[REG:%r[01345]]], %r2, 35
    439 ; CHECK: risbg %r2, %r2, 33, 189, 31
    440 ; CHECK: br %r14
    441   %ashr = ashr i64 %foo, 35
    442   store i64 %ashr, i64 *%dest
    443   %shl = shl i64 %ashr, 2
    444   %and = and i64 %shl, 2147483647
    445   ret i64 %and
    446 }
    447 
    448 ; ...and again with the next highest shift value, where one sign bit is kept.
    449 define i64 @f40(i64 %foo, i64 *%dest) {
    450 ; CHECK-LABEL: f40:
    451 ; CHECK: srag [[REG:%r[01345]]], %r2, 36
    452 ; CHECK: risbg %r2, [[REG]], 33, 189, 2
    453 ; CHECK: br %r14
    454   %ashr = ashr i64 %foo, 36
    455   store i64 %ashr, i64 *%dest
    456   %shl = shl i64 %ashr, 2
    457   %and = and i64 %shl, 2147483647
    458   ret i64 %and
    459 }
    460 
    461 ; Check a case where the result is zero-extended.
    462 define i64 @f41(i32 %a) {
    463 ; CHECK-LABEL: f41
    464 ; CHECK: risbg %r2, %r2, 36, 191, 62
    465 ; CHECK: br %r14
    466   %shl = shl i32 %a, 2
    467   %shr = lshr i32 %shl, 4
    468   %ext = zext i32 %shr to i64
    469   ret i64 %ext
    470 }
    471 
    472 ; In this case the sign extension is converted to a pair of 32-bit shifts,
    473 ; which is then extended to 64 bits.  We previously used the wrong bit size
    474 ; when testing whether the shifted-in bits of the shift right were significant.
    475 define i64 @f42(i1 %x) {
    476 ; CHECK-LABEL: f42:
    477 ; CHECK: nilf  %r2, 1
    478 ; CHECK: lcr %r0, %r2
    479 ; CHECK: llgcr %r2, %r0
    480 ; CHECK: br %r14
    481   %ext = sext i1 %x to i8
    482   %ext2 = zext i8 %ext to i64
    483   ret i64 %ext2
    484 }
    485 
    486 ; Check that we get the case where a 64-bit shift is used by a 32-bit and.
    487 define signext i32 @f43(i64 %x) {
    488 ; CHECK-LABEL: f43:
    489 ; CHECK: risbg [[REG:%r[0-5]]], %r2, 32, 189, 52
    490 ; CHECK: lgfr %r2, [[REG]]
    491   %shr3 = lshr i64 %x, 12
    492   %shr3.tr = trunc i64 %shr3 to i32
    493   %conv = and i32 %shr3.tr, -4
    494   ret i32 %conv
    495 }
    496 
    497 ; Check that we don't get the case where the 32-bit and mask is not contiguous
    498 define signext i32 @f44(i64 %x) {
    499 ; CHECK-LABEL: f44:
    500 ; CHECK: srlg [[REG:%r[0-5]]], %r2, 12
    501   %shr4 = lshr i64 %x, 12
    502   %conv = trunc i64 %shr4 to i32
    503   %and = and i32 %conv, 10
    504   ret i32 %and
    505 }
    506