Home | History | Annotate | Download | only in SystemZ
      1 ; Test 32-bit floating-point comparison.  The tests assume a z10 implementation
      2 ; of select, using conditional branches rather than LOCGR.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \
      5 ; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s
      6 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 \
      7 ; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s
      8 
      9 declare float @foo()
     10 
     11 ; Check comparison with registers.
     12 define i64 @f1(i64 %a, i64 %b, float %f1, float %f2) {
     13 ; CHECK-LABEL: f1:
     14 ; CHECK: cebr %f0, %f2
     15 ; CHECK-SCALAR-NEXT: ber %r14
     16 ; CHECK-SCALAR: lgr %r2, %r3
     17 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     18 ; CHECK: br %r14
     19   %cond = fcmp oeq float %f1, %f2
     20   %res = select i1 %cond, i64 %a, i64 %b
     21   ret i64 %res
     22 }
     23 
     24 ; Check the low end of the CEB range.
     25 define i64 @f2(i64 %a, i64 %b, float %f1, float *%ptr) {
     26 ; CHECK-LABEL: f2:
     27 ; CHECK: ceb %f0, 0(%r4)
     28 ; CHECK-SCALAR-NEXT: ber %r14
     29 ; CHECK-SCALAR: lgr %r2, %r3
     30 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     31 ; CHECK: br %r14
     32   %f2 = load float, float *%ptr
     33   %cond = fcmp oeq float %f1, %f2
     34   %res = select i1 %cond, i64 %a, i64 %b
     35   ret i64 %res
     36 }
     37 
     38 ; Check the high end of the aligned CEB range.
     39 define i64 @f3(i64 %a, i64 %b, float %f1, float *%base) {
     40 ; CHECK-LABEL: f3:
     41 ; CHECK: ceb %f0, 4092(%r4)
     42 ; CHECK-SCALAR-NEXT: ber %r14
     43 ; CHECK-SCALAR: lgr %r2, %r3
     44 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     45 ; CHECK: br %r14
     46   %ptr = getelementptr float, float *%base, i64 1023
     47   %f2 = load float, float *%ptr
     48   %cond = fcmp oeq float %f1, %f2
     49   %res = select i1 %cond, i64 %a, i64 %b
     50   ret i64 %res
     51 }
     52 
     53 ; Check the next word up, which needs separate address logic.
     54 ; Other sequences besides this one would be OK.
     55 define i64 @f4(i64 %a, i64 %b, float %f1, float *%base) {
     56 ; CHECK-LABEL: f4:
     57 ; CHECK: aghi %r4, 4096
     58 ; CHECK: ceb %f0, 0(%r4)
     59 ; CHECK-SCALAR-NEXT: ber %r14
     60 ; CHECK-SCALAR: lgr %r2, %r3
     61 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     62 ; CHECK: br %r14
     63   %ptr = getelementptr float, float *%base, i64 1024
     64   %f2 = load float, float *%ptr
     65   %cond = fcmp oeq float %f1, %f2
     66   %res = select i1 %cond, i64 %a, i64 %b
     67   ret i64 %res
     68 }
     69 
     70 ; Check negative displacements, which also need separate address logic.
     71 define i64 @f5(i64 %a, i64 %b, float %f1, float *%base) {
     72 ; CHECK-LABEL: f5:
     73 ; CHECK: aghi %r4, -4
     74 ; CHECK: ceb %f0, 0(%r4)
     75 ; CHECK-SCALAR-NEXT: ber %r14
     76 ; CHECK-SCALAR: lgr %r2, %r3
     77 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     78 ; CHECK: br %r14
     79   %ptr = getelementptr float, float *%base, i64 -1
     80   %f2 = load float, float *%ptr
     81   %cond = fcmp oeq float %f1, %f2
     82   %res = select i1 %cond, i64 %a, i64 %b
     83   ret i64 %res
     84 }
     85 
     86 ; Check that CEB allows indices.
     87 define i64 @f6(i64 %a, i64 %b, float %f1, float *%base, i64 %index) {
     88 ; CHECK-LABEL: f6:
     89 ; CHECK: sllg %r1, %r5, 2
     90 ; CHECK: ceb %f0, 400(%r1,%r4)
     91 ; CHECK-SCALAR-NEXT: ber %r14
     92 ; CHECK-SCALAR: lgr %r2, %r3
     93 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
     94 ; CHECK: br %r14
     95   %ptr1 = getelementptr float, float *%base, i64 %index
     96   %ptr2 = getelementptr float, float *%ptr1, i64 100
     97   %f2 = load float, float *%ptr2
     98   %cond = fcmp oeq float %f1, %f2
     99   %res = select i1 %cond, i64 %a, i64 %b
    100   ret i64 %res
    101 }
    102 
    103 ; Check that comparisons of spilled values can use CEB rather than CEBR.
    104 define float @f7(float *%ptr0) {
    105 ; CHECK-LABEL: f7:
    106 ; CHECK: brasl %r14, foo@PLT
    107 ; CHECK-SCALAR: ceb {{%f[0-9]+}}, 16{{[04]}}(%r15)
    108 ; CHECK: br %r14
    109   %ptr1 = getelementptr float, float *%ptr0, i64 2
    110   %ptr2 = getelementptr float, float *%ptr0, i64 4
    111   %ptr3 = getelementptr float, float *%ptr0, i64 6
    112   %ptr4 = getelementptr float, float *%ptr0, i64 8
    113   %ptr5 = getelementptr float, float *%ptr0, i64 10
    114   %ptr6 = getelementptr float, float *%ptr0, i64 12
    115   %ptr7 = getelementptr float, float *%ptr0, i64 14
    116   %ptr8 = getelementptr float, float *%ptr0, i64 16
    117   %ptr9 = getelementptr float, float *%ptr0, i64 18
    118   %ptr10 = getelementptr float, float *%ptr0, i64 20
    119 
    120   %val0 = load float, float *%ptr0
    121   %val1 = load float, float *%ptr1
    122   %val2 = load float, float *%ptr2
    123   %val3 = load float, float *%ptr3
    124   %val4 = load float, float *%ptr4
    125   %val5 = load float, float *%ptr5
    126   %val6 = load float, float *%ptr6
    127   %val7 = load float, float *%ptr7
    128   %val8 = load float, float *%ptr8
    129   %val9 = load float, float *%ptr9
    130   %val10 = load float, float *%ptr10
    131 
    132   %ret = call float @foo()
    133 
    134   %cmp0 = fcmp olt float %ret, %val0
    135   %cmp1 = fcmp olt float %ret, %val1
    136   %cmp2 = fcmp olt float %ret, %val2
    137   %cmp3 = fcmp olt float %ret, %val3
    138   %cmp4 = fcmp olt float %ret, %val4
    139   %cmp5 = fcmp olt float %ret, %val5
    140   %cmp6 = fcmp olt float %ret, %val6
    141   %cmp7 = fcmp olt float %ret, %val7
    142   %cmp8 = fcmp olt float %ret, %val8
    143   %cmp9 = fcmp olt float %ret, %val9
    144   %cmp10 = fcmp olt float %ret, %val10
    145 
    146   %sel0 = select i1 %cmp0, float %ret, float 0.0
    147   %sel1 = select i1 %cmp1, float %sel0, float 1.0
    148   %sel2 = select i1 %cmp2, float %sel1, float 2.0
    149   %sel3 = select i1 %cmp3, float %sel2, float 3.0
    150   %sel4 = select i1 %cmp4, float %sel3, float 4.0
    151   %sel5 = select i1 %cmp5, float %sel4, float 5.0
    152   %sel6 = select i1 %cmp6, float %sel5, float 6.0
    153   %sel7 = select i1 %cmp7, float %sel6, float 7.0
    154   %sel8 = select i1 %cmp8, float %sel7, float 8.0
    155   %sel9 = select i1 %cmp9, float %sel8, float 9.0
    156   %sel10 = select i1 %cmp10, float %sel9, float 10.0
    157 
    158   ret float %sel10
    159 }
    160 
    161 ; Check comparison with zero.
    162 define i64 @f8(i64 %a, i64 %b, float %f) {
    163 ; CHECK-LABEL: f8:
    164 ; CHECK: ltebr %f0, %f0
    165 ; CHECK-SCALAR-NEXT: ber %r14
    166 ; CHECK-SCALAR: lgr %r2, %r3
    167 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
    168 ; CHECK: br %r14
    169   %cond = fcmp oeq float %f, 0.0
    170   %res = select i1 %cond, i64 %a, i64 %b
    171   ret i64 %res
    172 }
    173 
    174 ; Check the comparison can be reversed if that allows CEB to be used,
    175 ; first with oeq.
    176 define i64 @f9(i64 %a, i64 %b, float %f2, float *%ptr) {
    177 ; CHECK-LABEL: f9:
    178 ; CHECK: ceb %f0, 0(%r4)
    179 ; CHECK-SCALAR-NEXT: ber %r14
    180 ; CHECK-SCALAR: lgr %r2, %r3
    181 ; CHECK-VECTOR-NEXT: locgrne %r2, %r3
    182 ; CHECK: br %r14
    183   %f1 = load float, float *%ptr
    184   %cond = fcmp oeq float %f1, %f2
    185   %res = select i1 %cond, i64 %a, i64 %b
    186   ret i64 %res
    187 }
    188 
    189 ; ...then one.
    190 define i64 @f10(i64 %a, i64 %b, float %f2, float *%ptr) {
    191 ; CHECK-LABEL: f10:
    192 ; CHECK: ceb %f0, 0(%r4)
    193 ; CHECK-SCALAR-NEXT: blhr %r14
    194 ; CHECK-SCALAR: lgr %r2, %r3
    195 ; CHECK-VECTOR-NEXT: locgrnlh %r2, %r3
    196 ; CHECK: br %r14
    197   %f1 = load float, float *%ptr
    198   %cond = fcmp one float %f1, %f2
    199   %res = select i1 %cond, i64 %a, i64 %b
    200   ret i64 %res
    201 }
    202 
    203 ; ...then olt.
    204 define i64 @f11(i64 %a, i64 %b, float %f2, float *%ptr) {
    205 ; CHECK-LABEL: f11:
    206 ; CHECK: ceb %f0, 0(%r4)
    207 ; CHECK-SCALAR-NEXT: bhr %r14
    208 ; CHECK-SCALAR: lgr %r2, %r3
    209 ; CHECK-VECTOR-NEXT: locgrnh %r2, %r3
    210 ; CHECK: br %r14
    211   %f1 = load float, float *%ptr
    212   %cond = fcmp olt float %f1, %f2
    213   %res = select i1 %cond, i64 %a, i64 %b
    214   ret i64 %res
    215 }
    216 
    217 ; ...then ole.
    218 define i64 @f12(i64 %a, i64 %b, float %f2, float *%ptr) {
    219 ; CHECK-LABEL: f12:
    220 ; CHECK: ceb %f0, 0(%r4)
    221 ; CHECK-SCALAR-NEXT: bher %r14
    222 ; CHECK-SCALAR: lgr %r2, %r3
    223 ; CHECK-VECTOR-NEXT: locgrnhe %r2, %r3
    224 ; CHECK: br %r14
    225   %f1 = load float, float *%ptr
    226   %cond = fcmp ole float %f1, %f2
    227   %res = select i1 %cond, i64 %a, i64 %b
    228   ret i64 %res
    229 }
    230 
    231 ; ...then oge.
    232 define i64 @f13(i64 %a, i64 %b, float %f2, float *%ptr) {
    233 ; CHECK-LABEL: f13:
    234 ; CHECK: ceb %f0, 0(%r4)
    235 ; CHECK-SCALAR-NEXT: bler %r14
    236 ; CHECK-SCALAR: lgr %r2, %r3
    237 ; CHECK-VECTOR-NEXT: locgrnle %r2, %r3
    238 ; CHECK: br %r14
    239   %f1 = load float, float *%ptr
    240   %cond = fcmp oge float %f1, %f2
    241   %res = select i1 %cond, i64 %a, i64 %b
    242   ret i64 %res
    243 }
    244 
    245 ; ...then ogt.
    246 define i64 @f14(i64 %a, i64 %b, float %f2, float *%ptr) {
    247 ; CHECK-LABEL: f14:
    248 ; CHECK: ceb %f0, 0(%r4)
    249 ; CHECK-SCALAR-NEXT: blr %r14
    250 ; CHECK-SCALAR: lgr %r2, %r3
    251 ; CHECK-VECTOR-NEXT: locgrnl %r2, %r3
    252 ; CHECK: br %r14
    253   %f1 = load float, float *%ptr
    254   %cond = fcmp ogt float %f1, %f2
    255   %res = select i1 %cond, i64 %a, i64 %b
    256   ret i64 %res
    257 }
    258 
    259 ; ...then ueq.
    260 define i64 @f15(i64 %a, i64 %b, float %f2, float *%ptr) {
    261 ; CHECK-LABEL: f15:
    262 ; CHECK: ceb %f0, 0(%r4)
    263 ; CHECK-SCALAR-NEXT: bnlhr %r14
    264 ; CHECK-SCALAR: lgr %r2, %r3
    265 ; CHECK-VECTOR-NEXT: locgrlh %r2, %r3
    266 ; CHECK: br %r14
    267   %f1 = load float, float *%ptr
    268   %cond = fcmp ueq float %f1, %f2
    269   %res = select i1 %cond, i64 %a, i64 %b
    270   ret i64 %res
    271 }
    272 
    273 ; ...then une.
    274 define i64 @f16(i64 %a, i64 %b, float %f2, float *%ptr) {
    275 ; CHECK-LABEL: f16:
    276 ; CHECK: ceb %f0, 0(%r4)
    277 ; CHECK-SCALAR-NEXT: bner %r14
    278 ; CHECK-SCALAR: lgr %r2, %r3
    279 ; CHECK-VECTOR-NEXT: locgre %r2, %r3
    280 ; CHECK: br %r14
    281   %f1 = load float, float *%ptr
    282   %cond = fcmp une float %f1, %f2
    283   %res = select i1 %cond, i64 %a, i64 %b
    284   ret i64 %res
    285 }
    286 
    287 ; ...then ult.
    288 define i64 @f17(i64 %a, i64 %b, float %f2, float *%ptr) {
    289 ; CHECK-LABEL: f17:
    290 ; CHECK: ceb %f0, 0(%r4)
    291 ; CHECK-SCALAR-NEXT: bnler %r14
    292 ; CHECK-SCALAR: lgr %r2, %r3
    293 ; CHECK-VECTOR-NEXT: locgrle %r2, %r3
    294 ; CHECK: br %r14
    295   %f1 = load float, float *%ptr
    296   %cond = fcmp ult float %f1, %f2
    297   %res = select i1 %cond, i64 %a, i64 %b
    298   ret i64 %res
    299 }
    300 
    301 ; ...then ule.
    302 define i64 @f18(i64 %a, i64 %b, float %f2, float *%ptr) {
    303 ; CHECK-LABEL: f18:
    304 ; CHECK: ceb %f0, 0(%r4)
    305 ; CHECK-SCALAR-NEXT: bnlr %r14
    306 ; CHECK-SCALAR: lgr %r2, %r3
    307 ; CHECK-VECTOR-NEXT: locgrl %r2, %r3
    308 ; CHECK: br %r14
    309   %f1 = load float, float *%ptr
    310   %cond = fcmp ule float %f1, %f2
    311   %res = select i1 %cond, i64 %a, i64 %b
    312   ret i64 %res
    313 }
    314 
    315 ; ...then uge.
    316 define i64 @f19(i64 %a, i64 %b, float %f2, float *%ptr) {
    317 ; CHECK-LABEL: f19:
    318 ; CHECK: ceb %f0, 0(%r4)
    319 ; CHECK-SCALAR-NEXT: bnhr %r14
    320 ; CHECK-SCALAR: lgr %r2, %r3
    321 ; CHECK-VECTOR-NEXT: locgrh %r2, %r3
    322 ; CHECK: br %r14
    323   %f1 = load float, float *%ptr
    324   %cond = fcmp uge float %f1, %f2
    325   %res = select i1 %cond, i64 %a, i64 %b
    326   ret i64 %res
    327 }
    328 
    329 ; ...then ugt.
    330 define i64 @f20(i64 %a, i64 %b, float %f2, float *%ptr) {
    331 ; CHECK-LABEL: f20:
    332 ; CHECK: ceb %f0, 0(%r4)
    333 ; CHECK-SCALAR-NEXT: bnher %r14
    334 ; CHECK-SCALAR: lgr %r2, %r3
    335 ; CHECK-VECTOR-NEXT: locgrhe %r2, %r3
    336 ; CHECK: br %r14
    337   %f1 = load float, float *%ptr
    338   %cond = fcmp ugt float %f1, %f2
    339   %res = select i1 %cond, i64 %a, i64 %b
    340   ret i64 %res
    341 }
    342