1 ; Test 64-bit inequality comparisons in which the second operand is a 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, i64 %i1) { 7 ; CHECK-LABEL: f1: 8 ; CHECK: cgijlh %r2, 0 9 ; CHECK: ldr %f0, %f2 10 ; CHECK: br %r14 11 %cond = icmp ne i64 %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 the high end of the CGIJ range. 18 define double @f2(double %a, double %b, i64 %i1) { 19 ; CHECK-LABEL: f2: 20 ; CHECK: cgijlh %r2, 127 21 ; CHECK: ldr %f0, %f2 22 ; CHECK: br %r14 23 %cond = icmp ne i64 %i1, 127 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 next value up, which must use CGHI instead. 30 define double @f3(double %a, double %b, i64 %i1) { 31 ; CHECK-LABEL: f3: 32 ; CHECK: cghi %r2, 128 33 ; CHECK-NEXT: jlh 34 ; CHECK: ldr %f0, %f2 35 ; CHECK: br %r14 36 %cond = icmp ne i64 %i1, 128 37 %tmp = select i1 %cond, double %a, double %b 38 %res = fadd double %tmp, 1.0 39 ret double %res 40 } 41 42 ; Check the high end of the CGHI range. 43 define double @f4(double %a, double %b, i64 %i1) { 44 ; CHECK-LABEL: f4: 45 ; CHECK: cghi %r2, 32767 46 ; CHECK-NEXT: jlh 47 ; CHECK: ldr %f0, %f2 48 ; CHECK: br %r14 49 %cond = icmp ne i64 %i1, 32767 50 %tmp = select i1 %cond, double %a, double %b 51 %res = fadd double %tmp, 1.0 52 ret double %res 53 } 54 55 ; Check the next value up, which must use CGFI. 56 define double @f5(double %a, double %b, i64 %i1) { 57 ; CHECK-LABEL: f5: 58 ; CHECK: cgfi %r2, 32768 59 ; CHECK-NEXT: jlh 60 ; CHECK: ldr %f0, %f2 61 ; CHECK: br %r14 62 %cond = icmp ne i64 %i1, 32768 63 %tmp = select i1 %cond, double %a, double %b 64 %res = fadd double %tmp, 1.0 65 ret double %res 66 } 67 68 ; Check the high end of the CGFI range. 69 define double @f6(double %a, double %b, i64 %i1) { 70 ; CHECK-LABEL: f6: 71 ; CHECK: cgfi %r2, 2147483647 72 ; CHECK-NEXT: jlh 73 ; CHECK: ldr %f0, %f2 74 ; CHECK: br %r14 75 %cond = icmp ne i64 %i1, 2147483647 76 %tmp = select i1 %cond, double %a, double %b 77 %res = fadd double %tmp, 1.0 78 ret double %res 79 } 80 81 ; Check the next value up, which should use CLGFI instead. 82 define double @f7(double %a, double %b, i64 %i1) { 83 ; CHECK-LABEL: f7: 84 ; CHECK: clgfi %r2, 2147483648 85 ; CHECK-NEXT: jlh 86 ; CHECK: ldr %f0, %f2 87 ; CHECK: br %r14 88 %cond = icmp ne i64 %i1, 2147483648 89 %tmp = select i1 %cond, double %a, double %b 90 %res = fadd double %tmp, 1.0 91 ret double %res 92 } 93 94 ; Check the high end of the CLGFI range. 95 define double @f8(double %a, double %b, i64 %i1) { 96 ; CHECK-LABEL: f8: 97 ; CHECK: clgfi %r2, 4294967295 98 ; CHECK-NEXT: jlh 99 ; CHECK: ldr %f0, %f2 100 ; CHECK: br %r14 101 %cond = icmp ne i64 %i1, 4294967295 102 %tmp = select i1 %cond, double %a, double %b 103 %res = fadd double %tmp, 1.0 104 ret double %res 105 } 106 107 ; Check the next value up, which must use a register comparison. 108 define double @f9(double %a, double %b, i64 %i1) { 109 ; CHECK-LABEL: f9: 110 ; CHECK: cgrjlh %r2, 111 ; CHECK: ldr %f0, %f2 112 ; CHECK: br %r14 113 %cond = icmp ne i64 %i1, 4294967296 114 %tmp = select i1 %cond, double %a, double %b 115 %res = fadd double %tmp, 1.0 116 ret double %res 117 } 118 119 ; Check the high end of the negative CGIJ range. 120 define double @f10(double %a, double %b, i64 %i1) { 121 ; CHECK-LABEL: f10: 122 ; CHECK: cgijlh %r2, -1 123 ; CHECK: ldr %f0, %f2 124 ; CHECK: br %r14 125 %cond = icmp ne i64 %i1, -1 126 %tmp = select i1 %cond, double %a, double %b 127 %res = fadd double %tmp, 1.0 128 ret double %res 129 } 130 131 ; Check the low end of the CGIJ range. 132 define double @f11(double %a, double %b, i64 %i1) { 133 ; CHECK-LABEL: f11: 134 ; CHECK: cgijlh %r2, -128 135 ; CHECK: ldr %f0, %f2 136 ; CHECK: br %r14 137 %cond = icmp ne i64 %i1, -128 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 next value down, which must use CGHI instead. 144 define double @f12(double %a, double %b, i64 %i1) { 145 ; CHECK-LABEL: f12: 146 ; CHECK: cghi %r2, -129 147 ; CHECK-NEXT: jlh 148 ; CHECK: ldr %f0, %f2 149 ; CHECK: br %r14 150 %cond = icmp ne i64 %i1, -129 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 low end of the CGHI range. 157 define double @f13(double %a, double %b, i64 %i1) { 158 ; CHECK-LABEL: f13: 159 ; CHECK: cghi %r2, -32768 160 ; CHECK-NEXT: jlh 161 ; CHECK: ldr %f0, %f2 162 ; CHECK: br %r14 163 %cond = icmp ne i64 %i1, -32768 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 next value down, which must use CGFI instead. 170 define double @f14(double %a, double %b, i64 %i1) { 171 ; CHECK-LABEL: f14: 172 ; CHECK: cgfi %r2, -32769 173 ; CHECK-NEXT: jlh 174 ; CHECK: ldr %f0, %f2 175 ; CHECK: br %r14 176 %cond = icmp ne i64 %i1, -32769 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 low end of the CGFI range. 183 define double @f15(double %a, double %b, i64 %i1) { 184 ; CHECK-LABEL: f15: 185 ; CHECK: cgfi %r2, -2147483648 186 ; CHECK-NEXT: jlh 187 ; CHECK: ldr %f0, %f2 188 ; CHECK: br %r14 189 %cond = icmp ne i64 %i1, -2147483648 190 %tmp = select i1 %cond, double %a, double %b 191 %res = fadd double %tmp, 1.0 192 ret double %res 193 } 194 195 ; Check the next value down, which must use register comparison. 196 define double @f16(double %a, double %b, i64 %i1) { 197 ; CHECK-LABEL: f16: 198 ; CHECK: cgrjlh 199 ; CHECK: ldr %f0, %f2 200 ; CHECK: br %r14 201 %cond = icmp ne i64 %i1, -2147483649 202 %tmp = select i1 %cond, double %a, double %b 203 %res = fadd double %tmp, 1.0 204 ret double %res 205 } 206