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