Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic < %s | FileCheck %s
      3 
      4 define i32 @test_eq_1(<4 x i32> %A, <4 x i32> %B) {
      5 ; CHECK-LABEL: test_eq_1:
      6 ; CHECK:       # %bb.0:
      7 ; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
      8 ; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
      9 ; CHECK-NEXT:    pxor %xmm1, %xmm0
     10 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
     11 ; CHECK-NEXT:    movd %xmm0, %eax
     12 ; CHECK-NEXT:    retq
     13   %cmp = icmp slt <4 x i32> %A, %B
     14   %sext = sext <4 x i1> %cmp to <4 x i32>
     15   %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
     16   %t0 = extractelement <4 x i1> %cmp1, i32 1
     17   %t1 = sext i1 %t0 to i32
     18   ret i32 %t1
     19 }
     20 
     21 define i32 @test_ne_1(<4 x i32> %A, <4 x i32> %B) {
     22 ; CHECK-LABEL: test_ne_1:
     23 ; CHECK:       # %bb.0:
     24 ; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
     25 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
     26 ; CHECK-NEXT:    movd %xmm0, %eax
     27 ; CHECK-NEXT:    retq
     28   %cmp = icmp slt <4 x i32> %A, %B
     29   %sext = sext <4 x i1> %cmp to <4 x i32>
     30   %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
     31   %t0 = extractelement <4 x i1> %cmp1, i32 1
     32   %t1 = sext i1 %t0 to i32
     33   ret i32 %t1
     34 }
     35 
     36 define i32 @test_le_1(<4 x i32> %A, <4 x i32> %B) {
     37 ; CHECK-LABEL: test_le_1:
     38 ; CHECK:       # %bb.0:
     39 ; CHECK-NEXT:    movl $-1, %eax
     40 ; CHECK-NEXT:    retq
     41   %cmp = icmp slt <4 x i32> %A, %B
     42   %sext = sext <4 x i1> %cmp to <4 x i32>
     43   %cmp1 = icmp sle <4 x i32> %sext, zeroinitializer
     44   %t0 = extractelement <4 x i1> %cmp1, i32 1
     45   %t1 = sext i1 %t0 to i32
     46   ret i32 %t1
     47 }
     48 
     49 define i32 @test_ge_1(<4 x i32> %A, <4 x i32> %B) {
     50 ; CHECK-LABEL: test_ge_1:
     51 ; CHECK:       # %bb.0:
     52 ; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
     53 ; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
     54 ; CHECK-NEXT:    pxor %xmm1, %xmm0
     55 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
     56 ; CHECK-NEXT:    movd %xmm0, %eax
     57 ; CHECK-NEXT:    retq
     58   %cmp = icmp slt <4 x i32> %A, %B
     59   %sext = sext <4 x i1> %cmp to <4 x i32>
     60   %cmp1 = icmp sge <4 x i32> %sext, zeroinitializer
     61   %t0 = extractelement <4 x i1> %cmp1, i32 1
     62   %t1 = sext i1 %t0 to i32
     63   ret i32 %t1
     64 }
     65 
     66 define i32 @test_lt_1(<4 x i32> %A, <4 x i32> %B) {
     67 ; CHECK-LABEL: test_lt_1:
     68 ; CHECK:       # %bb.0:
     69 ; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
     70 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
     71 ; CHECK-NEXT:    movd %xmm0, %eax
     72 ; CHECK-NEXT:    retq
     73   %cmp = icmp slt <4 x i32> %A, %B
     74   %sext = sext <4 x i1> %cmp to <4 x i32>
     75   %cmp1 = icmp slt <4 x i32> %sext, zeroinitializer
     76   %t0 = extractelement <4 x i1> %cmp, i32 1
     77   %t1 = sext i1 %t0 to i32
     78   ret i32 %t1
     79 }
     80 
     81 define i32 @test_gt_1(<4 x i32> %A, <4 x i32> %B) {
     82 ; CHECK-LABEL: test_gt_1:
     83 ; CHECK:       # %bb.0:
     84 ; CHECK-NEXT:    xorl %eax, %eax
     85 ; CHECK-NEXT:    retq
     86   %cmp = icmp slt <4 x i32> %A, %B
     87   %sext = sext <4 x i1> %cmp to <4 x i32>
     88   %cmp1 = icmp sgt <4 x i32> %sext, zeroinitializer
     89   %t0 = extractelement <4 x i1> %cmp1, i32 1
     90   %t1 = sext i1 %t0 to i32
     91   ret i32 %t1
     92 }
     93 
     94 define i32 @test_eq_2(<4 x i32> %A, <4 x i32> %B) {
     95 ; CHECK-LABEL: test_eq_2:
     96 ; CHECK:       # %bb.0:
     97 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
     98 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
     99 ; CHECK-NEXT:    pxor %xmm0, %xmm1
    100 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    101 ; CHECK-NEXT:    movd %xmm0, %eax
    102 ; CHECK-NEXT:    retq
    103   %cmp = icmp slt <4 x i32> %B, %A
    104   %sext = sext <4 x i1> %cmp to <4 x i32>
    105   %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
    106   %t0 = extractelement <4 x i1> %cmp1, i32 1
    107   %t1 = sext i1 %t0 to i32
    108   ret i32 %t1
    109 }
    110 
    111 define i32 @test_ne_2(<4 x i32> %A, <4 x i32> %B) {
    112 ; CHECK-LABEL: test_ne_2:
    113 ; CHECK:       # %bb.0:
    114 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
    115 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
    116 ; CHECK-NEXT:    movd %xmm0, %eax
    117 ; CHECK-NEXT:    retq
    118   %cmp = icmp slt <4 x i32> %B, %A
    119   %sext = sext <4 x i1> %cmp to <4 x i32>
    120   %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
    121   %t0 = extractelement <4 x i1> %cmp1, i32 1
    122   %t1 = sext i1 %t0 to i32
    123   ret i32 %t1
    124 }
    125 
    126 define i32 @test_le_2(<4 x i32> %A, <4 x i32> %B) {
    127 ; CHECK-LABEL: test_le_2:
    128 ; CHECK:       # %bb.0:
    129 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
    130 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
    131 ; CHECK-NEXT:    pxor %xmm0, %xmm1
    132 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    133 ; CHECK-NEXT:    movd %xmm0, %eax
    134 ; CHECK-NEXT:    retq
    135   %cmp = icmp slt <4 x i32> %B, %A
    136   %sext = sext <4 x i1> %cmp to <4 x i32>
    137   %cmp1 = icmp sle <4 x i32> zeroinitializer, %sext
    138   %t0 = extractelement <4 x i1> %cmp1, i32 1
    139   %t1 = sext i1 %t0 to i32
    140   ret i32 %t1
    141 }
    142 
    143 define i32 @test_ge_2(<4 x i32> %A, <4 x i32> %B) {
    144 ; CHECK-LABEL: test_ge_2:
    145 ; CHECK:       # %bb.0:
    146 ; CHECK-NEXT:    movl $-1, %eax
    147 ; CHECK-NEXT:    retq
    148   %cmp = icmp slt <4 x i32> %B, %A
    149   %sext = sext <4 x i1> %cmp to <4 x i32>
    150   %cmp1 = icmp sge <4 x i32> zeroinitializer, %sext
    151   %t0 = extractelement <4 x i1> %cmp1, i32 1
    152   %t1 = sext i1 %t0 to i32
    153   ret i32 %t1
    154 }
    155 
    156 define i32 @test_lt_2(<4 x i32> %A, <4 x i32> %B) {
    157 ; CHECK-LABEL: test_lt_2:
    158 ; CHECK:       # %bb.0:
    159 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
    160 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
    161 ; CHECK-NEXT:    movd %xmm0, %eax
    162 ; CHECK-NEXT:    retq
    163   %cmp = icmp slt <4 x i32> %B, %A
    164   %sext = sext <4 x i1> %cmp to <4 x i32>
    165   %cmp1 = icmp slt <4 x i32> zeroinitializer, %sext
    166   %t0 = extractelement <4 x i1> %cmp, i32 1
    167   %t1 = sext i1 %t0 to i32
    168   ret i32 %t1
    169 }
    170 
    171 define i32 @test_gt_2(<4 x i32> %A, <4 x i32> %B) {
    172 ; CHECK-LABEL: test_gt_2:
    173 ; CHECK:       # %bb.0:
    174 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
    175 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
    176 ; CHECK-NEXT:    movd %xmm0, %eax
    177 ; CHECK-NEXT:    retq
    178   %cmp = icmp slt <4 x i32> %B, %A
    179   %sext = sext <4 x i1> %cmp to <4 x i32>
    180   %cmp1 = icmp sgt <4 x i32> zeroinitializer, %sext
    181   %t0 = extractelement <4 x i1> %cmp1, i32 1
    182   %t1 = sext i1 %t0 to i32
    183   ret i32 %t1
    184 }
    185 
    186 ; (and (setne X, 0), (setne X, -1)) --> (setuge (add X, 1), 2)
    187 ; Don't combine with i1 - out of range constant
    188 define void @test_i1_uge(i1 *%A2) {
    189 ; CHECK-LABEL: test_i1_uge:
    190 ; CHECK:       # %bb.0:
    191 ; CHECK-NEXT:    movb (%rdi), %al
    192 ; CHECK-NEXT:    movl %eax, %ecx
    193 ; CHECK-NEXT:    xorb $1, %cl
    194 ; CHECK-NEXT:    andb %cl, %al
    195 ; CHECK-NEXT:    movzbl %al, %eax
    196 ; CHECK-NEXT:    andl $1, %eax
    197 ; CHECK-NEXT:    negq %rax
    198 ; CHECK-NEXT:    andb $1, %cl
    199 ; CHECK-NEXT:    movb %cl, (%rdi,%rax)
    200 ; CHECK-NEXT:    retq
    201   %L5 = load i1, i1* %A2
    202   %C3 = icmp ne i1 %L5, true
    203   %C8 = icmp eq i1 %L5, false
    204   %C9 = icmp ugt i1 %C3, %C8
    205   %G3 = getelementptr i1, i1* %A2, i1 %C9
    206   store i1 %C3, i1* %G3
    207   ret void
    208 }
    209 
    210