Home | History | Annotate | Download | only in SystemZ
      1 ; Test SETCC with an i64 result for every floating-point condition.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
      4 
      5 ; Test CC in { 0 }
      6 define i64 @f1(float %a, float %b) {
      7 ; CHECK-LABEL: f1:
      8 ; CHECK: ipm [[REG:%r[0-5]]]
      9 ; CHECK-NEXT: afi [[REG]], -268435456
     10 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     11 ; CHECK: br %r14
     12   %cond = fcmp oeq float %a, %b
     13   %res = zext i1 %cond to i64
     14   ret i64 %res
     15 }
     16 
     17 ; Test CC in { 1 }
     18 define i64 @f2(float %a, float %b) {
     19 ; CHECK-LABEL: f2:
     20 ; CHECK: ipm [[REG:%r[0-5]]]
     21 ; CHECK-NEXT: xilf [[REG]], 268435456
     22 ; CHECK-NEXT: afi [[REG]], -268435456
     23 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     24 ; CHECK: br %r14
     25   %cond = fcmp olt float %a, %b
     26   %res = zext i1 %cond to i64
     27   ret i64 %res
     28 }
     29 
     30 ; Test CC in { 0, 1 }
     31 define i64 @f3(float %a, float %b) {
     32 ; CHECK-LABEL: f3:
     33 ; CHECK: ipm [[REG:%r[0-5]]]
     34 ; CHECK-NEXT: afi [[REG]], -536870912
     35 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     36 ; CHECK: br %r14
     37   %cond = fcmp ole float %a, %b
     38   %res = zext i1 %cond to i64
     39   ret i64 %res
     40 }
     41 
     42 ; Test CC in { 2 }
     43 define i64 @f4(float %a, float %b) {
     44 ; CHECK-LABEL: f4:
     45 ; CHECK: ipm [[REG:%r[0-5]]]
     46 ; CHECK-NEXT: xilf [[REG]], 268435456
     47 ; CHECK-NEXT: afi [[REG]], 1342177280
     48 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     49 ; CHECK: br %r14
     50   %cond = fcmp ogt float %a, %b
     51   %res = zext i1 %cond to i64
     52   ret i64 %res
     53 }
     54 
     55 ; Test CC in { 0, 2 }
     56 define i64 @f5(float %a, float %b) {
     57 ; CHECK-LABEL: f5:
     58 ; CHECK: ipm [[REG:%r[0-5]]]
     59 ; CHECK-NEXT: xilf [[REG]], 4294967295
     60 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36
     61 ; CHECK: br %r14
     62   %cond = fcmp oge float %a, %b
     63   %res = zext i1 %cond to i64
     64   ret i64 %res
     65 }
     66 
     67 ; Test CC in { 1, 2 }
     68 define i64 @f6(float %a, float %b) {
     69 ; CHECK-LABEL: f6:
     70 ; CHECK: ipm [[REG:%r[0-5]]]
     71 ; CHECK-NEXT: afi [[REG]], 268435456
     72 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35
     73 ; CHECK: br %r14
     74   %cond = fcmp one float %a, %b
     75   %res = zext i1 %cond to i64
     76   ret i64 %res
     77 }
     78 
     79 ; Test CC in { 0, 1, 2 }
     80 define i64 @f7(float %a, float %b) {
     81 ; CHECK-LABEL: f7:
     82 ; CHECK: ipm [[REG:%r[0-5]]]
     83 ; CHECK-NEXT: afi [[REG]], -805306368
     84 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     85 ; CHECK: br %r14
     86   %cond = fcmp ord float %a, %b
     87   %res = zext i1 %cond to i64
     88   ret i64 %res
     89 }
     90 
     91 ; Test CC in { 3 }
     92 define i64 @f8(float %a, float %b) {
     93 ; CHECK-LABEL: f8:
     94 ; CHECK: ipm [[REG:%r[0-5]]]
     95 ; CHECK-NEXT: afi [[REG]], 1342177280
     96 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
     97 ; CHECK: br %r14
     98   %cond = fcmp uno float %a, %b
     99   %res = zext i1 %cond to i64
    100   ret i64 %res
    101 }
    102 
    103 ; Test CC in { 0, 3 }
    104 define i64 @f9(float %a, float %b) {
    105 ; CHECK-LABEL: f9:
    106 ; CHECK: ipm [[REG:%r[0-5]]]
    107 ; CHECK-NEXT: afi [[REG]], -268435456
    108 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35
    109 ; CHECK: br %r14
    110   %cond = fcmp ueq float %a, %b
    111   %res = zext i1 %cond to i64
    112   ret i64 %res
    113 }
    114 
    115 ; Test CC in { 1, 3 }
    116 define i64 @f10(float %a, float %b) {
    117 ; CHECK-LABEL: f10:
    118 ; CHECK: ipm [[REG:%r[0-5]]]
    119 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 36
    120 ; CHECK: br %r14
    121   %cond = fcmp ult float %a, %b
    122   %res = zext i1 %cond to i64
    123   ret i64 %res
    124 }
    125 
    126 ; Test CC in { 0, 1, 3 }
    127 define i64 @f11(float %a, float %b) {
    128 ; CHECK-LABEL: f11:
    129 ; CHECK: ipm [[REG:%r[0-5]]]
    130 ; CHECK-NEXT: xilf [[REG]], 268435456
    131 ; CHECK-NEXT: afi [[REG]], -805306368
    132 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
    133 ; CHECK: br %r14
    134   %cond = fcmp ule float %a, %b
    135   %res = zext i1 %cond to i64
    136   ret i64 %res
    137 }
    138 
    139 ; Test CC in { 2, 3 }
    140 define i64 @f12(float %a, float %b) {
    141 ; CHECK-LABEL: f12:
    142 ; CHECK: ipm [[REG:%r[0-5]]]
    143 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 35
    144 ; CHECK: br %r14
    145   %cond = fcmp ugt float %a, %b
    146   %res = zext i1 %cond to i64
    147   ret i64 %res
    148 }
    149 
    150 ; Test CC in { 0, 2, 3 }
    151 define i64 @f13(float %a, float %b) {
    152 ; CHECK-LABEL: f13:
    153 ; CHECK: ipm [[REG:%r[0-5]]]
    154 ; CHECK-NEXT: xilf [[REG]], 268435456
    155 ; CHECK-NEXT: afi [[REG]], 1879048192
    156 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
    157 ; CHECK: br %r14
    158   %cond = fcmp uge float %a, %b
    159   %res = zext i1 %cond to i64
    160   ret i64 %res
    161 }
    162 
    163 ; Test CC in { 1, 2, 3 }
    164 define i64 @f14(float %a, float %b) {
    165 ; CHECK-LABEL: f14:
    166 ; CHECK: ipm [[REG:%r[0-5]]]
    167 ; CHECK-NEXT: afi [[REG]], 1879048192
    168 ; CHECK-NEXT: risbg %r2, [[REG]], 63, 191, 33
    169 ; CHECK: br %r14
    170   %cond = fcmp une float %a, %b
    171   %res = zext i1 %cond to i64
    172   ret i64 %res
    173 }
    174