1 ; Test 64-bit signed 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: cgijl %r2, 0 9 ; CHECK: ldr %f0, %f2 10 ; CHECK: br %r14 11 %cond = icmp slt 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 comparisons with 1. 18 define double @f2(double %a, double %b, i64 %i1) { 19 ; CHECK-LABEL: f2: 20 ; CHECK: cgijle %r2, 0 21 ; CHECK: ldr %f0, %f2 22 ; CHECK: br %r14 23 %cond = icmp slt i64 %i1, 1 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 CGIJ range. 30 define double @f3(double %a, double %b, i64 %i1) { 31 ; CHECK-LABEL: f3: 32 ; CHECK: cgijl %r2, 127 33 ; CHECK: ldr %f0, %f2 34 ; CHECK: br %r14 35 %cond = icmp slt i64 %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 CGHI instead. 42 define double @f4(double %a, double %b, i64 %i1) { 43 ; CHECK-LABEL: f4: 44 ; CHECK: cghi %r2, 128 45 ; CHECK-NEXT: jl 46 ; CHECK: ldr %f0, %f2 47 ; CHECK: br %r14 48 %cond = icmp slt i64 %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 CGHI range. 55 define double @f5(double %a, double %b, i64 %i1) { 56 ; CHECK-LABEL: f5: 57 ; CHECK: cghi %r2, 32767 58 ; CHECK-NEXT: jl 59 ; CHECK: ldr %f0, %f2 60 ; CHECK: br %r14 61 %cond = icmp slt i64 %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 CGFI. 68 define double @f6(double %a, double %b, i64 %i1) { 69 ; CHECK-LABEL: f6: 70 ; CHECK: cgfi %r2, 32768 71 ; CHECK-NEXT: jl 72 ; CHECK: ldr %f0, %f2 73 ; CHECK: br %r14 74 %cond = icmp slt i64 %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 CGFI range. 81 define double @f7(double %a, double %b, i64 %i1) { 82 ; CHECK-LABEL: f7: 83 ; CHECK: cgfi %r2, 2147483647 84 ; CHECK-NEXT: jl 85 ; CHECK: ldr %f0, %f2 86 ; CHECK: br %r14 87 %cond = icmp slt i64 %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 must use register comparison. 94 define double @f8(double %a, double %b, i64 %i1) { 95 ; CHECK-LABEL: f8: 96 ; CHECK: cgrjl 97 ; CHECK: ldr %f0, %f2 98 ; CHECK: br %r14 99 %cond = icmp slt i64 %i1, 2147483648 100 %tmp = select i1 %cond, double %a, double %b 101 %res = fadd double %tmp, 1.0 102 ret double %res 103 } 104 105 ; Check the high end of the negative CGIJ range. 106 define double @f9(double %a, double %b, i64 %i1) { 107 ; CHECK-LABEL: f9: 108 ; CHECK: cgijl %r2, -1 109 ; CHECK: ldr %f0, %f2 110 ; CHECK: br %r14 111 %cond = icmp slt i64 %i1, -1 112 %tmp = select i1 %cond, double %a, double %b 113 %res = fadd double %tmp, 1.0 114 ret double %res 115 } 116 117 ; Check the low end of the CGIJ range. 118 define double @f10(double %a, double %b, i64 %i1) { 119 ; CHECK-LABEL: f10: 120 ; CHECK: cgijl %r2, -128 121 ; CHECK: ldr %f0, %f2 122 ; CHECK: br %r14 123 %cond = icmp slt i64 %i1, -128 124 %tmp = select i1 %cond, double %a, double %b 125 %res = fadd double %tmp, 1.0 126 ret double %res 127 } 128 129 ; Check the next value down, which must use CGHI instead. 130 define double @f11(double %a, double %b, i64 %i1) { 131 ; CHECK-LABEL: f11: 132 ; CHECK: cghi %r2, -129 133 ; CHECK-NEXT: jl 134 ; CHECK: ldr %f0, %f2 135 ; CHECK: br %r14 136 %cond = icmp slt i64 %i1, -129 137 %tmp = select i1 %cond, double %a, double %b 138 %res = fadd double %tmp, 1.0 139 ret double %res 140 } 141 142 ; Check the low end of the CGHI range. 143 define double @f12(double %a, double %b, i64 %i1) { 144 ; CHECK-LABEL: f12: 145 ; CHECK: cghi %r2, -32768 146 ; CHECK-NEXT: jl 147 ; CHECK: ldr %f0, %f2 148 ; CHECK: br %r14 149 %cond = icmp slt i64 %i1, -32768 150 %tmp = select i1 %cond, double %a, double %b 151 %res = fadd double %tmp, 1.0 152 ret double %res 153 } 154 155 ; Check the next value down, which must use CGFI instead. 156 define double @f13(double %a, double %b, i64 %i1) { 157 ; CHECK-LABEL: f13: 158 ; CHECK: cgfi %r2, -32769 159 ; CHECK-NEXT: jl 160 ; CHECK: ldr %f0, %f2 161 ; CHECK: br %r14 162 %cond = icmp slt i64 %i1, -32769 163 %tmp = select i1 %cond, double %a, double %b 164 %res = fadd double %tmp, 1.0 165 ret double %res 166 } 167 168 ; Check the low end of the CGFI range. 169 define double @f14(double %a, double %b, i64 %i1) { 170 ; CHECK-LABEL: f14: 171 ; CHECK: cgfi %r2, -2147483648 172 ; CHECK-NEXT: jl 173 ; CHECK: ldr %f0, %f2 174 ; CHECK: br %r14 175 %cond = icmp slt i64 %i1, -2147483648 176 %tmp = select i1 %cond, double %a, double %b 177 %res = fadd double %tmp, 1.0 178 ret double %res 179 } 180 181 ; Check the next value down, which must use register comparison. 182 define double @f15(double %a, double %b, i64 %i1) { 183 ; CHECK-LABEL: f15: 184 ; CHECK: cgrjl 185 ; CHECK: ldr %f0, %f2 186 ; CHECK: br %r14 187 %cond = icmp slt i64 %i1, -2147483649 188 %tmp = select i1 %cond, double %a, double %b 189 %res = fadd double %tmp, 1.0 190 ret double %res 191 } 192