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