1 ; Test 32-bit signed comparison in which the second operand is constant. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 ; Check comparisons with 0. 6 define double @f1(double %a, double %b, i32 %i1) { 7 ; CHECK-LABEL: f1: 8 ; CHECK: cijl %r2, 0 9 ; CHECK: ldr %f0, %f2 10 ; CHECK: br %r14 11 %cond = icmp slt i32 %i1, 0 12 %tmp = select i1 %cond, double %a, double %b 13 %res = fadd double %tmp, 1.0 14 ret double %res 15 } 16 17 ; Check comparisons with 2. 18 define double @f2(double %a, double %b, i32 %i1) { 19 ; CHECK-LABEL: f2: 20 ; CHECK: cijl %r2, 2 21 ; CHECK: ldr %f0, %f2 22 ; CHECK: br %r14 23 %cond = icmp slt i32 %i1, 2 24 %tmp = select i1 %cond, double %a, double %b 25 %res = fadd double %tmp, 1.0 26 ret double %res 27 } 28 29 ; Check the high end of the CIJ range. 30 define double @f3(double %a, double %b, i32 %i1) { 31 ; CHECK-LABEL: f3: 32 ; CHECK: cijl %r2, 127 33 ; CHECK: ldr %f0, %f2 34 ; CHECK: br %r14 35 %cond = icmp slt i32 %i1, 127 36 %tmp = select i1 %cond, double %a, double %b 37 %res = fadd double %tmp, 1.0 38 ret double %res 39 } 40 41 ; Check the next value up, which must use CHI instead. 42 define double @f4(double %a, double %b, i32 %i1) { 43 ; CHECK-LABEL: f4: 44 ; CHECK: chi %r2, 128 45 ; CHECK-NEXT: jl 46 ; CHECK: ldr %f0, %f2 47 ; CHECK: br %r14 48 %cond = icmp slt i32 %i1, 128 49 %tmp = select i1 %cond, double %a, double %b 50 %res = fadd double %tmp, 1.0 51 ret double %res 52 } 53 54 ; Check the high end of the CHI range. 55 define double @f5(double %a, double %b, i32 %i1) { 56 ; CHECK-LABEL: f5: 57 ; CHECK: chi %r2, 32767 58 ; CHECK-NEXT: jl 59 ; CHECK: ldr %f0, %f2 60 ; CHECK: br %r14 61 %cond = icmp slt i32 %i1, 32767 62 %tmp = select i1 %cond, double %a, double %b 63 %res = fadd double %tmp, 1.0 64 ret double %res 65 } 66 67 ; Check the next value up, which must use CFI. 68 define double @f6(double %a, double %b, i32 %i1) { 69 ; CHECK-LABEL: f6: 70 ; CHECK: cfi %r2, 32768 71 ; CHECK-NEXT: jl 72 ; CHECK: ldr %f0, %f2 73 ; CHECK: br %r14 74 %cond = icmp slt i32 %i1, 32768 75 %tmp = select i1 %cond, double %a, double %b 76 %res = fadd double %tmp, 1.0 77 ret double %res 78 } 79 80 ; Check the high end of the signed 32-bit range. 81 define double @f7(double %a, double %b, i32 %i1) { 82 ; CHECK-LABEL: f7: 83 ; CHECK: cfi %r2, 2147483647 84 ; CHECK-NEXT: je 85 ; CHECK: ldr %f0, %f2 86 ; CHECK: br %r14 87 %cond = icmp eq i32 %i1, 2147483647 88 %tmp = select i1 %cond, double %a, double %b 89 %res = fadd double %tmp, 1.0 90 ret double %res 91 } 92 93 ; Check the next value up, which should be treated as a negative value. 94 define double @f8(double %a, double %b, i32 %i1) { 95 ; CHECK-LABEL: f8: 96 ; CHECK: cfi %r2, -2147483648 97 ; CHECK-NEXT: je 98 ; CHECK: ldr %f0, %f2 99 ; CHECK: br %r14 100 %cond = icmp eq i32 %i1, 2147483648 101 %tmp = select i1 %cond, double %a, double %b 102 %res = fadd double %tmp, 1.0 103 ret double %res 104 } 105 106 ; Check the high end of the negative CIJ range. 107 define double @f9(double %a, double %b, i32 %i1) { 108 ; CHECK-LABEL: f9: 109 ; CHECK: cijl %r2, -1 110 ; CHECK: ldr %f0, %f2 111 ; CHECK: br %r14 112 %cond = icmp slt i32 %i1, -1 113 %tmp = select i1 %cond, double %a, double %b 114 %res = fadd double %tmp, 1.0 115 ret double %res 116 } 117 118 ; Check the low end of the CIJ range. 119 define double @f10(double %a, double %b, i32 %i1) { 120 ; CHECK-LABEL: f10: 121 ; CHECK: cijl %r2, -128 122 ; CHECK: ldr %f0, %f2 123 ; CHECK: br %r14 124 %cond = icmp slt i32 %i1, -128 125 %tmp = select i1 %cond, double %a, double %b 126 %res = fadd double %tmp, 1.0 127 ret double %res 128 } 129 130 ; Check the next value down, which must use CHI instead. 131 define double @f11(double %a, double %b, i32 %i1) { 132 ; CHECK-LABEL: f11: 133 ; CHECK: chi %r2, -129 134 ; CHECK-NEXT: jl 135 ; CHECK: ldr %f0, %f2 136 ; CHECK: br %r14 137 %cond = icmp slt i32 %i1, -129 138 %tmp = select i1 %cond, double %a, double %b 139 %res = fadd double %tmp, 1.0 140 ret double %res 141 } 142 143 ; Check the low end of the CHI range. 144 define double @f12(double %a, double %b, i32 %i1) { 145 ; CHECK-LABEL: f12: 146 ; CHECK: chi %r2, -32768 147 ; CHECK-NEXT: jl 148 ; CHECK: ldr %f0, %f2 149 ; CHECK: br %r14 150 %cond = icmp slt i32 %i1, -32768 151 %tmp = select i1 %cond, double %a, double %b 152 %res = fadd double %tmp, 1.0 153 ret double %res 154 } 155 156 ; Check the next value down, which must use CFI instead. 157 define double @f13(double %a, double %b, i32 %i1) { 158 ; CHECK-LABEL: f13: 159 ; CHECK: cfi %r2, -32769 160 ; CHECK-NEXT: jl 161 ; CHECK: ldr %f0, %f2 162 ; CHECK: br %r14 163 %cond = icmp slt i32 %i1, -32769 164 %tmp = select i1 %cond, double %a, double %b 165 %res = fadd double %tmp, 1.0 166 ret double %res 167 } 168 169 ; Check the low end of the signed 32-bit range. 170 define double @f14(double %a, double %b, i32 %i1) { 171 ; CHECK-LABEL: f14: 172 ; CHECK: cfi %r2, -2147483648 173 ; CHECK-NEXT: je 174 ; CHECK: ldr %f0, %f2 175 ; CHECK: br %r14 176 %cond = icmp eq i32 %i1, -2147483648 177 %tmp = select i1 %cond, double %a, double %b 178 %res = fadd double %tmp, 1.0 179 ret double %res 180 } 181 182 ; Check the next value down, which should be treated as a positive value. 183 define double @f15(double %a, double %b, i32 %i1) { 184 ; CHECK-LABEL: f15: 185 ; CHECK: cfi %r2, 2147483647 186 ; CHECK-NEXT: je 187 ; CHECK: ldr %f0, %f2 188 ; CHECK: br %r14 189 %cond = icmp eq i32 %i1, -2147483649 190 %tmp = select i1 %cond, double %a, double %b 191 %res = fadd double %tmp, 1.0 192 ret double %res 193 } 194 195 ; Check that < 1 becomes <= 0. 196 define double @f16(double %a, double %b, i32 %i1) { 197 ; CHECK-LABEL: f16: 198 ; CHECK: cijle %r2, 0 199 ; CHECK: ldr %f0, %f2 200 ; CHECK: br %r14 201 %cond = icmp slt i32 %i1, 1 202 %tmp = select i1 %cond, double %a, double %b 203 %res = fadd double %tmp, 1.0 204 ret double %res 205 } 206 207 ; Check that >= 1 becomes > 0. 208 define double @f17(double %a, double %b, i32 %i1) { 209 ; CHECK-LABEL: f17: 210 ; CHECK: cijh %r2, 0 211 ; CHECK: ldr %f0, %f2 212 ; CHECK: br %r14 213 %cond = icmp sge i32 %i1, 1 214 %tmp = select i1 %cond, double %a, double %b 215 %res = fadd double %tmp, 1.0 216 ret double %res 217 } 218 219 ; Check that > -1 becomes >= 0. 220 define double @f18(double %a, double %b, i32 %i1) { 221 ; CHECK-LABEL: f18: 222 ; CHECK: cijhe %r2, 0 223 ; CHECK: ldr %f0, %f2 224 ; CHECK: br %r14 225 %cond = icmp sgt i32 %i1, -1 226 %tmp = select i1 %cond, double %a, double %b 227 %res = fadd double %tmp, 1.0 228 ret double %res 229 } 230 231 ; Check that <= -1 becomes < 0. 232 define double @f19(double %a, double %b, i32 %i1) { 233 ; CHECK-LABEL: f19: 234 ; CHECK: cijl %r2, 0 235 ; CHECK: ldr %f0, %f2 236 ; CHECK: br %r14 237 %cond = icmp sle i32 %i1, -1 238 %tmp = select i1 %cond, double %a, double %b 239 %res = fadd double %tmp, 1.0 240 ret double %res 241 } 242