1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s 3 4 ; If positive... 5 6 define i32 @zext_ifpos(i32 %x) { 7 ; CHECK-LABEL: zext_ifpos: 8 ; CHECK: # %bb.0: 9 ; CHECK-NEXT: notl %edi 10 ; CHECK-NEXT: shrl $31, %edi 11 ; CHECK-NEXT: movl %edi, %eax 12 ; CHECK-NEXT: retq 13 %c = icmp sgt i32 %x, -1 14 %e = zext i1 %c to i32 15 ret i32 %e 16 } 17 18 define i32 @add_zext_ifpos(i32 %x) { 19 ; CHECK-LABEL: add_zext_ifpos: 20 ; CHECK: # %bb.0: 21 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 22 ; CHECK-NEXT: sarl $31, %edi 23 ; CHECK-NEXT: leal 42(%rdi), %eax 24 ; CHECK-NEXT: retq 25 %c = icmp sgt i32 %x, -1 26 %e = zext i1 %c to i32 27 %r = add i32 %e, 41 28 ret i32 %r 29 } 30 31 define <4 x i32> @add_zext_ifpos_vec_splat(<4 x i32> %x) { 32 ; CHECK-LABEL: add_zext_ifpos_vec_splat: 33 ; CHECK: # %bb.0: 34 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 35 ; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 36 ; CHECK-NEXT: psrld $31, %xmm0 37 ; CHECK-NEXT: por {{.*}}(%rip), %xmm0 38 ; CHECK-NEXT: retq 39 %c = icmp sgt <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> 40 %e = zext <4 x i1> %c to <4 x i32> 41 %r = add <4 x i32> %e, <i32 42, i32 42, i32 42, i32 42> 42 ret <4 x i32> %r 43 } 44 45 define i32 @sel_ifpos_tval_bigger(i32 %x) { 46 ; CHECK-LABEL: sel_ifpos_tval_bigger: 47 ; CHECK: # %bb.0: 48 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 49 ; CHECK-NEXT: sarl $31, %edi 50 ; CHECK-NEXT: leal 42(%rdi), %eax 51 ; CHECK-NEXT: retq 52 %c = icmp sgt i32 %x, -1 53 %r = select i1 %c, i32 42, i32 41 54 ret i32 %r 55 } 56 57 define i32 @sext_ifpos(i32 %x) { 58 ; CHECK-LABEL: sext_ifpos: 59 ; CHECK: # %bb.0: 60 ; CHECK-NEXT: notl %edi 61 ; CHECK-NEXT: sarl $31, %edi 62 ; CHECK-NEXT: movl %edi, %eax 63 ; CHECK-NEXT: retq 64 %c = icmp sgt i32 %x, -1 65 %e = sext i1 %c to i32 66 ret i32 %e 67 } 68 69 define i32 @add_sext_ifpos(i32 %x) { 70 ; CHECK-LABEL: add_sext_ifpos: 71 ; CHECK: # %bb.0: 72 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 73 ; CHECK-NEXT: shrl $31, %edi 74 ; CHECK-NEXT: leal 41(%rdi), %eax 75 ; CHECK-NEXT: retq 76 %c = icmp sgt i32 %x, -1 77 %e = sext i1 %c to i32 78 %r = add i32 %e, 42 79 ret i32 %r 80 } 81 82 define <4 x i32> @add_sext_ifpos_vec_splat(<4 x i32> %x) { 83 ; CHECK-LABEL: add_sext_ifpos_vec_splat: 84 ; CHECK: # %bb.0: 85 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 86 ; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 87 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 88 ; CHECK-NEXT: retq 89 %c = icmp sgt <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> 90 %e = sext <4 x i1> %c to <4 x i32> 91 %r = add <4 x i32> %e, <i32 42, i32 42, i32 42, i32 42> 92 ret <4 x i32> %r 93 } 94 95 define i32 @sel_ifpos_fval_bigger(i32 %x) { 96 ; CHECK-LABEL: sel_ifpos_fval_bigger: 97 ; CHECK: # %bb.0: 98 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 99 ; CHECK-NEXT: shrl $31, %edi 100 ; CHECK-NEXT: leal 41(%rdi), %eax 101 ; CHECK-NEXT: retq 102 %c = icmp sgt i32 %x, -1 103 %r = select i1 %c, i32 41, i32 42 104 ret i32 %r 105 } 106 107 ; If negative... 108 109 define i32 @zext_ifneg(i32 %x) { 110 ; CHECK-LABEL: zext_ifneg: 111 ; CHECK: # %bb.0: 112 ; CHECK-NEXT: shrl $31, %edi 113 ; CHECK-NEXT: movl %edi, %eax 114 ; CHECK-NEXT: retq 115 %c = icmp slt i32 %x, 0 116 %r = zext i1 %c to i32 117 ret i32 %r 118 } 119 120 define i32 @add_zext_ifneg(i32 %x) { 121 ; CHECK-LABEL: add_zext_ifneg: 122 ; CHECK: # %bb.0: 123 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 124 ; CHECK-NEXT: shrl $31, %edi 125 ; CHECK-NEXT: leal 41(%rdi), %eax 126 ; CHECK-NEXT: retq 127 %c = icmp slt i32 %x, 0 128 %e = zext i1 %c to i32 129 %r = add i32 %e, 41 130 ret i32 %r 131 } 132 133 define i32 @sel_ifneg_tval_bigger(i32 %x) { 134 ; CHECK-LABEL: sel_ifneg_tval_bigger: 135 ; CHECK: # %bb.0: 136 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 137 ; CHECK-NEXT: shrl $31, %edi 138 ; CHECK-NEXT: leal 41(%rdi), %eax 139 ; CHECK-NEXT: retq 140 %c = icmp slt i32 %x, 0 141 %r = select i1 %c, i32 42, i32 41 142 ret i32 %r 143 } 144 145 define i32 @sext_ifneg(i32 %x) { 146 ; CHECK-LABEL: sext_ifneg: 147 ; CHECK: # %bb.0: 148 ; CHECK-NEXT: sarl $31, %edi 149 ; CHECK-NEXT: movl %edi, %eax 150 ; CHECK-NEXT: retq 151 %c = icmp slt i32 %x, 0 152 %r = sext i1 %c to i32 153 ret i32 %r 154 } 155 156 define i32 @add_sext_ifneg(i32 %x) { 157 ; CHECK-LABEL: add_sext_ifneg: 158 ; CHECK: # %bb.0: 159 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 160 ; CHECK-NEXT: sarl $31, %edi 161 ; CHECK-NEXT: leal 42(%rdi), %eax 162 ; CHECK-NEXT: retq 163 %c = icmp slt i32 %x, 0 164 %e = sext i1 %c to i32 165 %r = add i32 %e, 42 166 ret i32 %r 167 } 168 169 define i32 @sel_ifneg_fval_bigger(i32 %x) { 170 ; CHECK-LABEL: sel_ifneg_fval_bigger: 171 ; CHECK: # %bb.0: 172 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 173 ; CHECK-NEXT: sarl $31, %edi 174 ; CHECK-NEXT: leal 42(%rdi), %eax 175 ; CHECK-NEXT: retq 176 %c = icmp slt i32 %x, 0 177 %r = select i1 %c, i32 41, i32 42 178 ret i32 %r 179 } 180 181 define i32 @add_lshr_not(i32 %x) { 182 ; CHECK-LABEL: add_lshr_not: 183 ; CHECK: # %bb.0: 184 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 185 ; CHECK-NEXT: sarl $31, %edi 186 ; CHECK-NEXT: leal 42(%rdi), %eax 187 ; CHECK-NEXT: retq 188 %not = xor i32 %x, -1 189 %sh = lshr i32 %not, 31 190 %r = add i32 %sh, 41 191 ret i32 %r 192 } 193 194 define <4 x i32> @add_lshr_not_vec_splat(<4 x i32> %x) { 195 ; CHECK-LABEL: add_lshr_not_vec_splat: 196 ; CHECK: # %bb.0: 197 ; CHECK-NEXT: psrad $31, %xmm0 198 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 199 ; CHECK-NEXT: retq 200 %c = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> 201 %e = lshr <4 x i32> %c, <i32 31, i32 31, i32 31, i32 31> 202 %r = add <4 x i32> %e, <i32 42, i32 42, i32 42, i32 42> 203 ret <4 x i32> %r 204 } 205 206 define i32 @sub_lshr_not(i32 %x) { 207 ; CHECK-LABEL: sub_lshr_not: 208 ; CHECK: # %bb.0: 209 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 210 ; CHECK-NEXT: shrl $31, %edi 211 ; CHECK-NEXT: leal 42(%rdi), %eax 212 ; CHECK-NEXT: retq 213 %not = xor i32 %x, -1 214 %sh = lshr i32 %not, 31 215 %r = sub i32 43, %sh 216 ret i32 %r 217 } 218 219 define <4 x i32> @sub_lshr_not_vec_splat(<4 x i32> %x) { 220 ; CHECK-LABEL: sub_lshr_not_vec_splat: 221 ; CHECK: # %bb.0: 222 ; CHECK-NEXT: psrld $31, %xmm0 223 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 224 ; CHECK-NEXT: retq 225 %c = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> 226 %e = lshr <4 x i32> %c, <i32 31, i32 31, i32 31, i32 31> 227 %r = sub <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %e 228 ret <4 x i32> %r 229 } 230 231 define i32 @sub_lshr(i32 %x, i32 %y) { 232 ; CHECK-LABEL: sub_lshr: 233 ; CHECK: # %bb.0: 234 ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi 235 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 236 ; CHECK-NEXT: sarl $31, %edi 237 ; CHECK-NEXT: leal (%rdi,%rsi), %eax 238 ; CHECK-NEXT: retq 239 %sh = lshr i32 %x, 31 240 %r = sub i32 %y, %sh 241 ret i32 %r 242 } 243 244 define <4 x i32> @sub_lshr_vec(<4 x i32> %x, <4 x i32> %y) { 245 ; CHECK-LABEL: sub_lshr_vec: 246 ; CHECK: # %bb.0: 247 ; CHECK-NEXT: psrad $31, %xmm0 248 ; CHECK-NEXT: paddd %xmm1, %xmm0 249 ; CHECK-NEXT: retq 250 %sh = lshr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31> 251 %r = sub <4 x i32> %y, %sh 252 ret <4 x i32> %r 253 } 254 255 define i32 @sub_const_op_lshr(i32 %x) { 256 ; CHECK-LABEL: sub_const_op_lshr: 257 ; CHECK: # %bb.0: 258 ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 259 ; CHECK-NEXT: sarl $31, %edi 260 ; CHECK-NEXT: leal 43(%rdi), %eax 261 ; CHECK-NEXT: retq 262 %sh = lshr i32 %x, 31 263 %r = sub i32 43, %sh 264 ret i32 %r 265 } 266 267 define <4 x i32> @sub_const_op_lshr_vec(<4 x i32> %x) { 268 ; CHECK-LABEL: sub_const_op_lshr_vec: 269 ; CHECK: # %bb.0: 270 ; CHECK-NEXT: psrad $31, %xmm0 271 ; CHECK-NEXT: paddd {{.*}}(%rip), %xmm0 272 ; CHECK-NEXT: retq 273 %sh = lshr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31> 274 %r = sub <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %sh 275 ret <4 x i32> %r 276 } 277 278