1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW 11 12 ; 13 ; Equal 14 ; 15 16 define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 17 ; SSE2-LABEL: eq_v2i64: 18 ; SSE2: # BB#0: 19 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 20 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 21 ; SSE2-NEXT: pand %xmm1, %xmm0 22 ; SSE2-NEXT: retq 23 ; 24 ; SSE41-LABEL: eq_v2i64: 25 ; SSE41: # BB#0: 26 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0 27 ; SSE41-NEXT: retq 28 ; 29 ; SSE42-LABEL: eq_v2i64: 30 ; SSE42: # BB#0: 31 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0 32 ; SSE42-NEXT: retq 33 ; 34 ; AVX-LABEL: eq_v2i64: 35 ; AVX: # BB#0: 36 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 37 ; AVX-NEXT: retq 38 ; 39 ; XOP-LABEL: eq_v2i64: 40 ; XOP: # BB#0: 41 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0 42 ; XOP-NEXT: retq 43 %1 = icmp eq <2 x i64> %a, %b 44 %2 = sext <2 x i1> %1 to <2 x i64> 45 ret <2 x i64> %2 46 } 47 48 define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 49 ; SSE-LABEL: eq_v4i32: 50 ; SSE: # BB#0: 51 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0 52 ; SSE-NEXT: retq 53 ; 54 ; AVX-LABEL: eq_v4i32: 55 ; AVX: # BB#0: 56 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 57 ; AVX-NEXT: retq 58 ; 59 ; XOP-LABEL: eq_v4i32: 60 ; XOP: # BB#0: 61 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0 62 ; XOP-NEXT: retq 63 %1 = icmp eq <4 x i32> %a, %b 64 %2 = sext <4 x i1> %1 to <4 x i32> 65 ret <4 x i32> %2 66 } 67 68 define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 69 ; SSE-LABEL: eq_v8i16: 70 ; SSE: # BB#0: 71 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0 72 ; SSE-NEXT: retq 73 ; 74 ; AVX-LABEL: eq_v8i16: 75 ; AVX: # BB#0: 76 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 77 ; AVX-NEXT: retq 78 ; 79 ; XOP-LABEL: eq_v8i16: 80 ; XOP: # BB#0: 81 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0 82 ; XOP-NEXT: retq 83 %1 = icmp eq <8 x i16> %a, %b 84 %2 = sext <8 x i1> %1 to <8 x i16> 85 ret <8 x i16> %2 86 } 87 88 define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 89 ; SSE-LABEL: eq_v16i8: 90 ; SSE: # BB#0: 91 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0 92 ; SSE-NEXT: retq 93 ; 94 ; AVX-LABEL: eq_v16i8: 95 ; AVX: # BB#0: 96 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 97 ; AVX-NEXT: retq 98 ; 99 ; XOP-LABEL: eq_v16i8: 100 ; XOP: # BB#0: 101 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0 102 ; XOP-NEXT: retq 103 %1 = icmp eq <16 x i8> %a, %b 104 %2 = sext <16 x i1> %1 to <16 x i8> 105 ret <16 x i8> %2 106 } 107 108 ; 109 ; Not Equal 110 ; 111 112 define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 113 ; SSE2-LABEL: ne_v2i64: 114 ; SSE2: # BB#0: 115 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 116 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 117 ; SSE2-NEXT: pand %xmm1, %xmm0 118 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 119 ; SSE2-NEXT: pxor %xmm1, %xmm0 120 ; SSE2-NEXT: retq 121 ; 122 ; SSE41-LABEL: ne_v2i64: 123 ; SSE41: # BB#0: 124 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0 125 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 126 ; SSE41-NEXT: pxor %xmm1, %xmm0 127 ; SSE41-NEXT: retq 128 ; 129 ; SSE42-LABEL: ne_v2i64: 130 ; SSE42: # BB#0: 131 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0 132 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 133 ; SSE42-NEXT: pxor %xmm1, %xmm0 134 ; SSE42-NEXT: retq 135 ; 136 ; AVX-LABEL: ne_v2i64: 137 ; AVX: # BB#0: 138 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 139 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 140 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 141 ; AVX-NEXT: retq 142 ; 143 ; XOP-LABEL: ne_v2i64: 144 ; XOP: # BB#0: 145 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0 146 ; XOP-NEXT: retq 147 %1 = icmp ne <2 x i64> %a, %b 148 %2 = sext <2 x i1> %1 to <2 x i64> 149 ret <2 x i64> %2 150 } 151 152 define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 153 ; SSE-LABEL: ne_v4i32: 154 ; SSE: # BB#0: 155 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0 156 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 157 ; SSE-NEXT: pxor %xmm1, %xmm0 158 ; SSE-NEXT: retq 159 ; 160 ; AVX-LABEL: ne_v4i32: 161 ; AVX: # BB#0: 162 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 163 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 164 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 165 ; AVX-NEXT: retq 166 ; 167 ; XOP-LABEL: ne_v4i32: 168 ; XOP: # BB#0: 169 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0 170 ; XOP-NEXT: retq 171 %1 = icmp ne <4 x i32> %a, %b 172 %2 = sext <4 x i1> %1 to <4 x i32> 173 ret <4 x i32> %2 174 } 175 176 define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 177 ; SSE-LABEL: ne_v8i16: 178 ; SSE: # BB#0: 179 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0 180 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 181 ; SSE-NEXT: pxor %xmm1, %xmm0 182 ; SSE-NEXT: retq 183 ; 184 ; AVX-LABEL: ne_v8i16: 185 ; AVX: # BB#0: 186 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 187 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 188 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 189 ; AVX-NEXT: retq 190 ; 191 ; XOP-LABEL: ne_v8i16: 192 ; XOP: # BB#0: 193 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0 194 ; XOP-NEXT: retq 195 %1 = icmp ne <8 x i16> %a, %b 196 %2 = sext <8 x i1> %1 to <8 x i16> 197 ret <8 x i16> %2 198 } 199 200 define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 201 ; SSE-LABEL: ne_v16i8: 202 ; SSE: # BB#0: 203 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0 204 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 205 ; SSE-NEXT: pxor %xmm1, %xmm0 206 ; SSE-NEXT: retq 207 ; 208 ; AVX-LABEL: ne_v16i8: 209 ; AVX: # BB#0: 210 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 211 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 212 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 213 ; AVX-NEXT: retq 214 ; 215 ; XOP-LABEL: ne_v16i8: 216 ; XOP: # BB#0: 217 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0 218 ; XOP-NEXT: retq 219 %1 = icmp ne <16 x i8> %a, %b 220 %2 = sext <16 x i1> %1 to <16 x i8> 221 ret <16 x i8> %2 222 } 223 224 ; 225 ; Greater Than Or Equal 226 ; 227 228 define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 229 ; SSE2-LABEL: ge_v2i64: 230 ; SSE2: # BB#0: 231 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 232 ; SSE2-NEXT: pxor %xmm2, %xmm0 233 ; SSE2-NEXT: pxor %xmm2, %xmm1 234 ; SSE2-NEXT: movdqa %xmm1, %xmm2 235 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 236 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 237 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 238 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 239 ; SSE2-NEXT: pand %xmm3, %xmm0 240 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 241 ; SSE2-NEXT: por %xmm0, %xmm1 242 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 243 ; SSE2-NEXT: pxor %xmm1, %xmm0 244 ; SSE2-NEXT: retq 245 ; 246 ; SSE41-LABEL: ge_v2i64: 247 ; SSE41: # BB#0: 248 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 249 ; SSE41-NEXT: pxor %xmm2, %xmm0 250 ; SSE41-NEXT: pxor %xmm2, %xmm1 251 ; SSE41-NEXT: movdqa %xmm1, %xmm2 252 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 253 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 254 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 255 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 256 ; SSE41-NEXT: pand %xmm3, %xmm0 257 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 258 ; SSE41-NEXT: por %xmm0, %xmm1 259 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 260 ; SSE41-NEXT: pxor %xmm1, %xmm0 261 ; SSE41-NEXT: retq 262 ; 263 ; SSE42-LABEL: ge_v2i64: 264 ; SSE42: # BB#0: 265 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm1 266 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0 267 ; SSE42-NEXT: pxor %xmm1, %xmm0 268 ; SSE42-NEXT: retq 269 ; 270 ; AVX-LABEL: ge_v2i64: 271 ; AVX: # BB#0: 272 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 273 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 274 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 275 ; AVX-NEXT: retq 276 ; 277 ; XOP-LABEL: ge_v2i64: 278 ; XOP: # BB#0: 279 ; XOP-NEXT: vpcomgeq %xmm1, %xmm0, %xmm0 280 ; XOP-NEXT: retq 281 %1 = icmp sge <2 x i64> %a, %b 282 %2 = sext <2 x i1> %1 to <2 x i64> 283 ret <2 x i64> %2 284 } 285 286 define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 287 ; SSE-LABEL: ge_v4i32: 288 ; SSE: # BB#0: 289 ; SSE-NEXT: pcmpgtd %xmm0, %xmm1 290 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0 291 ; SSE-NEXT: pxor %xmm1, %xmm0 292 ; SSE-NEXT: retq 293 ; 294 ; AVX-LABEL: ge_v4i32: 295 ; AVX: # BB#0: 296 ; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 297 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 298 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 299 ; AVX-NEXT: retq 300 ; 301 ; XOP-LABEL: ge_v4i32: 302 ; XOP: # BB#0: 303 ; XOP-NEXT: vpcomged %xmm1, %xmm0, %xmm0 304 ; XOP-NEXT: retq 305 %1 = icmp sge <4 x i32> %a, %b 306 %2 = sext <4 x i1> %1 to <4 x i32> 307 ret <4 x i32> %2 308 } 309 310 define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 311 ; SSE-LABEL: ge_v8i16: 312 ; SSE: # BB#0: 313 ; SSE-NEXT: pcmpgtw %xmm0, %xmm1 314 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0 315 ; SSE-NEXT: pxor %xmm1, %xmm0 316 ; SSE-NEXT: retq 317 ; 318 ; AVX-LABEL: ge_v8i16: 319 ; AVX: # BB#0: 320 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 321 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 322 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 323 ; AVX-NEXT: retq 324 ; 325 ; XOP-LABEL: ge_v8i16: 326 ; XOP: # BB#0: 327 ; XOP-NEXT: vpcomgew %xmm1, %xmm0, %xmm0 328 ; XOP-NEXT: retq 329 %1 = icmp sge <8 x i16> %a, %b 330 %2 = sext <8 x i1> %1 to <8 x i16> 331 ret <8 x i16> %2 332 } 333 334 define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 335 ; SSE-LABEL: ge_v16i8: 336 ; SSE: # BB#0: 337 ; SSE-NEXT: pcmpgtb %xmm0, %xmm1 338 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0 339 ; SSE-NEXT: pxor %xmm1, %xmm0 340 ; SSE-NEXT: retq 341 ; 342 ; AVX-LABEL: ge_v16i8: 343 ; AVX: # BB#0: 344 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 345 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 346 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 347 ; AVX-NEXT: retq 348 ; 349 ; XOP-LABEL: ge_v16i8: 350 ; XOP: # BB#0: 351 ; XOP-NEXT: vpcomgeb %xmm1, %xmm0, %xmm0 352 ; XOP-NEXT: retq 353 %1 = icmp sge <16 x i8> %a, %b 354 %2 = sext <16 x i1> %1 to <16 x i8> 355 ret <16 x i8> %2 356 } 357 358 ; 359 ; Greater Than 360 ; 361 362 define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 363 ; SSE2-LABEL: gt_v2i64: 364 ; SSE2: # BB#0: 365 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 366 ; SSE2-NEXT: pxor %xmm2, %xmm1 367 ; SSE2-NEXT: pxor %xmm2, %xmm0 368 ; SSE2-NEXT: movdqa %xmm0, %xmm2 369 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 370 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 371 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 372 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 373 ; SSE2-NEXT: pand %xmm3, %xmm1 374 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 375 ; SSE2-NEXT: por %xmm1, %xmm0 376 ; SSE2-NEXT: retq 377 ; 378 ; SSE41-LABEL: gt_v2i64: 379 ; SSE41: # BB#0: 380 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 381 ; SSE41-NEXT: pxor %xmm2, %xmm1 382 ; SSE41-NEXT: pxor %xmm2, %xmm0 383 ; SSE41-NEXT: movdqa %xmm0, %xmm2 384 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 385 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 386 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 387 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 388 ; SSE41-NEXT: pand %xmm3, %xmm1 389 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 390 ; SSE41-NEXT: por %xmm1, %xmm0 391 ; SSE41-NEXT: retq 392 ; 393 ; SSE42-LABEL: gt_v2i64: 394 ; SSE42: # BB#0: 395 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 396 ; SSE42-NEXT: retq 397 ; 398 ; AVX-LABEL: gt_v2i64: 399 ; AVX: # BB#0: 400 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 401 ; AVX-NEXT: retq 402 ; 403 ; XOP-LABEL: gt_v2i64: 404 ; XOP: # BB#0: 405 ; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm0 406 ; XOP-NEXT: retq 407 %1 = icmp sgt <2 x i64> %a, %b 408 %2 = sext <2 x i1> %1 to <2 x i64> 409 ret <2 x i64> %2 410 } 411 412 define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 413 ; SSE-LABEL: gt_v4i32: 414 ; SSE: # BB#0: 415 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0 416 ; SSE-NEXT: retq 417 ; 418 ; AVX-LABEL: gt_v4i32: 419 ; AVX: # BB#0: 420 ; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 421 ; AVX-NEXT: retq 422 ; 423 ; XOP-LABEL: gt_v4i32: 424 ; XOP: # BB#0: 425 ; XOP-NEXT: vpcomgtd %xmm1, %xmm0, %xmm0 426 ; XOP-NEXT: retq 427 %1 = icmp sgt <4 x i32> %a, %b 428 %2 = sext <4 x i1> %1 to <4 x i32> 429 ret <4 x i32> %2 430 } 431 432 define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 433 ; SSE-LABEL: gt_v8i16: 434 ; SSE: # BB#0: 435 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0 436 ; SSE-NEXT: retq 437 ; 438 ; AVX-LABEL: gt_v8i16: 439 ; AVX: # BB#0: 440 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 441 ; AVX-NEXT: retq 442 ; 443 ; XOP-LABEL: gt_v8i16: 444 ; XOP: # BB#0: 445 ; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm0 446 ; XOP-NEXT: retq 447 %1 = icmp sgt <8 x i16> %a, %b 448 %2 = sext <8 x i1> %1 to <8 x i16> 449 ret <8 x i16> %2 450 } 451 452 define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 453 ; SSE-LABEL: gt_v16i8: 454 ; SSE: # BB#0: 455 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0 456 ; SSE-NEXT: retq 457 ; 458 ; AVX-LABEL: gt_v16i8: 459 ; AVX: # BB#0: 460 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 461 ; AVX-NEXT: retq 462 ; 463 ; XOP-LABEL: gt_v16i8: 464 ; XOP: # BB#0: 465 ; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm0 466 ; XOP-NEXT: retq 467 %1 = icmp sgt <16 x i8> %a, %b 468 %2 = sext <16 x i1> %1 to <16 x i8> 469 ret <16 x i8> %2 470 } 471 472 ; 473 ; Less Than Or Equal 474 ; 475 476 define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 477 ; SSE2-LABEL: le_v2i64: 478 ; SSE2: # BB#0: 479 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 480 ; SSE2-NEXT: pxor %xmm2, %xmm1 481 ; SSE2-NEXT: pxor %xmm2, %xmm0 482 ; SSE2-NEXT: movdqa %xmm0, %xmm2 483 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 484 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 485 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 486 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 487 ; SSE2-NEXT: pand %xmm3, %xmm0 488 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 489 ; SSE2-NEXT: por %xmm0, %xmm1 490 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 491 ; SSE2-NEXT: pxor %xmm1, %xmm0 492 ; SSE2-NEXT: retq 493 ; 494 ; SSE41-LABEL: le_v2i64: 495 ; SSE41: # BB#0: 496 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 497 ; SSE41-NEXT: pxor %xmm2, %xmm1 498 ; SSE41-NEXT: pxor %xmm2, %xmm0 499 ; SSE41-NEXT: movdqa %xmm0, %xmm2 500 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 501 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 502 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 503 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 504 ; SSE41-NEXT: pand %xmm3, %xmm0 505 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 506 ; SSE41-NEXT: por %xmm0, %xmm1 507 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 508 ; SSE41-NEXT: pxor %xmm1, %xmm0 509 ; SSE41-NEXT: retq 510 ; 511 ; SSE42-LABEL: le_v2i64: 512 ; SSE42: # BB#0: 513 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 514 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 515 ; SSE42-NEXT: pxor %xmm1, %xmm0 516 ; SSE42-NEXT: retq 517 ; 518 ; AVX-LABEL: le_v2i64: 519 ; AVX: # BB#0: 520 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 521 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 522 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 523 ; AVX-NEXT: retq 524 ; 525 ; XOP-LABEL: le_v2i64: 526 ; XOP: # BB#0: 527 ; XOP-NEXT: vpcomleq %xmm1, %xmm0, %xmm0 528 ; XOP-NEXT: retq 529 %1 = icmp sle <2 x i64> %a, %b 530 %2 = sext <2 x i1> %1 to <2 x i64> 531 ret <2 x i64> %2 532 } 533 534 define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 535 ; SSE-LABEL: le_v4i32: 536 ; SSE: # BB#0: 537 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0 538 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 539 ; SSE-NEXT: pxor %xmm1, %xmm0 540 ; SSE-NEXT: retq 541 ; 542 ; AVX-LABEL: le_v4i32: 543 ; AVX: # BB#0: 544 ; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 545 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 546 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 547 ; AVX-NEXT: retq 548 ; 549 ; XOP-LABEL: le_v4i32: 550 ; XOP: # BB#0: 551 ; XOP-NEXT: vpcomled %xmm1, %xmm0, %xmm0 552 ; XOP-NEXT: retq 553 %1 = icmp sle <4 x i32> %a, %b 554 %2 = sext <4 x i1> %1 to <4 x i32> 555 ret <4 x i32> %2 556 } 557 558 define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 559 ; SSE-LABEL: le_v8i16: 560 ; SSE: # BB#0: 561 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0 562 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 563 ; SSE-NEXT: pxor %xmm1, %xmm0 564 ; SSE-NEXT: retq 565 ; 566 ; AVX-LABEL: le_v8i16: 567 ; AVX: # BB#0: 568 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 569 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 570 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 571 ; AVX-NEXT: retq 572 ; 573 ; XOP-LABEL: le_v8i16: 574 ; XOP: # BB#0: 575 ; XOP-NEXT: vpcomlew %xmm1, %xmm0, %xmm0 576 ; XOP-NEXT: retq 577 %1 = icmp sle <8 x i16> %a, %b 578 %2 = sext <8 x i1> %1 to <8 x i16> 579 ret <8 x i16> %2 580 } 581 582 define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 583 ; SSE-LABEL: le_v16i8: 584 ; SSE: # BB#0: 585 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0 586 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1 587 ; SSE-NEXT: pxor %xmm1, %xmm0 588 ; SSE-NEXT: retq 589 ; 590 ; AVX-LABEL: le_v16i8: 591 ; AVX: # BB#0: 592 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 593 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 594 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 595 ; AVX-NEXT: retq 596 ; 597 ; XOP-LABEL: le_v16i8: 598 ; XOP: # BB#0: 599 ; XOP-NEXT: vpcomleb %xmm1, %xmm0, %xmm0 600 ; XOP-NEXT: retq 601 %1 = icmp sle <16 x i8> %a, %b 602 %2 = sext <16 x i1> %1 to <16 x i8> 603 ret <16 x i8> %2 604 } 605 606 ; 607 ; Less Than 608 ; 609 610 define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 611 ; SSE2-LABEL: lt_v2i64: 612 ; SSE2: # BB#0: 613 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 614 ; SSE2-NEXT: pxor %xmm2, %xmm0 615 ; SSE2-NEXT: pxor %xmm2, %xmm1 616 ; SSE2-NEXT: movdqa %xmm1, %xmm2 617 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 618 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 619 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 620 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 621 ; SSE2-NEXT: pand %xmm3, %xmm1 622 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 623 ; SSE2-NEXT: por %xmm1, %xmm0 624 ; SSE2-NEXT: retq 625 ; 626 ; SSE41-LABEL: lt_v2i64: 627 ; SSE41: # BB#0: 628 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 629 ; SSE41-NEXT: pxor %xmm2, %xmm0 630 ; SSE41-NEXT: pxor %xmm2, %xmm1 631 ; SSE41-NEXT: movdqa %xmm1, %xmm2 632 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 633 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 634 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 635 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 636 ; SSE41-NEXT: pand %xmm3, %xmm1 637 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 638 ; SSE41-NEXT: por %xmm1, %xmm0 639 ; SSE41-NEXT: retq 640 ; 641 ; SSE42-LABEL: lt_v2i64: 642 ; SSE42: # BB#0: 643 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm1 644 ; SSE42-NEXT: movdqa %xmm1, %xmm0 645 ; SSE42-NEXT: retq 646 ; 647 ; AVX-LABEL: lt_v2i64: 648 ; AVX: # BB#0: 649 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 650 ; AVX-NEXT: retq 651 ; 652 ; XOP-LABEL: lt_v2i64: 653 ; XOP: # BB#0: 654 ; XOP-NEXT: vpcomltq %xmm1, %xmm0, %xmm0 655 ; XOP-NEXT: retq 656 %1 = icmp slt <2 x i64> %a, %b 657 %2 = sext <2 x i1> %1 to <2 x i64> 658 ret <2 x i64> %2 659 } 660 661 define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 662 ; SSE-LABEL: lt_v4i32: 663 ; SSE: # BB#0: 664 ; SSE-NEXT: pcmpgtd %xmm0, %xmm1 665 ; SSE-NEXT: movdqa %xmm1, %xmm0 666 ; SSE-NEXT: retq 667 ; 668 ; AVX-LABEL: lt_v4i32: 669 ; AVX: # BB#0: 670 ; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 671 ; AVX-NEXT: retq 672 ; 673 ; XOP-LABEL: lt_v4i32: 674 ; XOP: # BB#0: 675 ; XOP-NEXT: vpcomltd %xmm1, %xmm0, %xmm0 676 ; XOP-NEXT: retq 677 %1 = icmp slt <4 x i32> %a, %b 678 %2 = sext <4 x i1> %1 to <4 x i32> 679 ret <4 x i32> %2 680 } 681 682 define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 683 ; SSE-LABEL: lt_v8i16: 684 ; SSE: # BB#0: 685 ; SSE-NEXT: pcmpgtw %xmm0, %xmm1 686 ; SSE-NEXT: movdqa %xmm1, %xmm0 687 ; SSE-NEXT: retq 688 ; 689 ; AVX-LABEL: lt_v8i16: 690 ; AVX: # BB#0: 691 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 692 ; AVX-NEXT: retq 693 ; 694 ; XOP-LABEL: lt_v8i16: 695 ; XOP: # BB#0: 696 ; XOP-NEXT: vpcomltw %xmm1, %xmm0, %xmm0 697 ; XOP-NEXT: retq 698 %1 = icmp slt <8 x i16> %a, %b 699 %2 = sext <8 x i1> %1 to <8 x i16> 700 ret <8 x i16> %2 701 } 702 703 define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 704 ; SSE-LABEL: lt_v16i8: 705 ; SSE: # BB#0: 706 ; SSE-NEXT: pcmpgtb %xmm0, %xmm1 707 ; SSE-NEXT: movdqa %xmm1, %xmm0 708 ; SSE-NEXT: retq 709 ; 710 ; AVX-LABEL: lt_v16i8: 711 ; AVX: # BB#0: 712 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 713 ; AVX-NEXT: retq 714 ; 715 ; XOP-LABEL: lt_v16i8: 716 ; XOP: # BB#0: 717 ; XOP-NEXT: vpcomltb %xmm1, %xmm0, %xmm0 718 ; XOP-NEXT: retq 719 %1 = icmp slt <16 x i8> %a, %b 720 %2 = sext <16 x i1> %1 to <16 x i8> 721 ret <16 x i8> %2 722 } 723