Home | History | Annotate | Download | only in X86
      1 ; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic < %s | FileCheck %s
      2 
      3 define i32 @test_eq_1(<4 x i32> %A, <4 x i32> %B) {
      4 ; CHECK-LABEL: test_eq_1:
      5 ; CHECK: pcmpgtd %xmm0, %xmm1
      6 ; CHECK-NEXT: pxor {{.*}}(%rip), %xmm1
      7 ; CHECK: retq
      8 entry:
      9   %cmp = icmp slt <4 x i32> %A, %B
     10   %sext = sext <4 x i1> %cmp to <4 x i32>
     11   %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
     12   %0 = extractelement <4 x i1> %cmp1, i32 1
     13   %1 = sext i1 %0 to i32
     14   ret i32 %1
     15 }
     16 
     17 define i32 @test_ne_1(<4 x i32> %A, <4 x i32> %B) {
     18 ; CHECK-LABEL: test_ne_1:
     19 ; CHECK: pcmpgtd %xmm0, %xmm1
     20 ; CHECK-NOT: pxor
     21 ; CHECK: retq
     22 entry:
     23   %cmp = icmp slt <4 x i32> %A, %B
     24   %sext = sext <4 x i1> %cmp to <4 x i32>
     25   %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
     26   %0 = extractelement <4 x i1> %cmp1, i32 1
     27   %1 = sext i1 %0 to i32
     28   ret i32 %1
     29 }
     30 
     31 define i32 @test_le_1(<4 x i32> %A, <4 x i32> %B) {
     32 ; CHECK-LABEL: test_le_1:
     33 ; CHECK: movl $-1, %eax
     34 ; CHECK-NEXT: retq
     35 entry:
     36   %cmp = icmp slt <4 x i32> %A, %B
     37   %sext = sext <4 x i1> %cmp to <4 x i32>
     38   %cmp1 = icmp sle <4 x i32> %sext, zeroinitializer
     39   %0 = extractelement <4 x i1> %cmp1, i32 1
     40   %1 = sext i1 %0 to i32
     41   ret i32 %1
     42 }
     43 
     44 define i32 @test_ge_1(<4 x i32> %A, <4 x i32> %B) {
     45 ; CHECK-LABEL: test_ge_1:
     46 ; CHECK: pcmpgtd %xmm0, %xmm1
     47 ; CHECK: pxor {{.*}}(%rip), %xmm1
     48 ; CHECK: retq
     49 entry:
     50   %cmp = icmp slt <4 x i32> %A, %B
     51   %sext = sext <4 x i1> %cmp to <4 x i32>
     52   %cmp1 = icmp sge <4 x i32> %sext, zeroinitializer
     53   %0 = extractelement <4 x i1> %cmp1, i32 1
     54   %1 = sext i1 %0 to i32
     55   ret i32 %1
     56 }
     57 
     58 define i32 @test_lt_1(<4 x i32> %A, <4 x i32> %B) {
     59 ; CHECK-LABEL: test_lt_1:
     60 ; CHECK: pcmpgtd %xmm0, %xmm1
     61 ; CHECK-NOT: pxor
     62 ; CHECK: retq
     63 entry:
     64   %cmp = icmp slt <4 x i32> %A, %B
     65   %sext = sext <4 x i1> %cmp to <4 x i32>
     66   %cmp1 = icmp slt <4 x i32> %sext, zeroinitializer
     67   %0 = extractelement <4 x i1> %cmp, i32 1
     68   %1 = sext i1 %0 to i32
     69   ret i32 %1
     70 }
     71 
     72 define i32 @test_gt_1(<4 x i32> %A, <4 x i32> %B) {
     73 ; CHECK-LABEL: test_gt_1:
     74 ; CHECK: xorl %eax, %eax
     75 ; CHECK: retq
     76 entry:
     77   %cmp = icmp slt <4 x i32> %A, %B
     78   %sext = sext <4 x i1> %cmp to <4 x i32>
     79   %cmp1 = icmp sgt <4 x i32> %sext, zeroinitializer
     80   %0 = extractelement <4 x i1> %cmp1, i32 1
     81   %1 = sext i1 %0 to i32
     82   ret i32 %1
     83 }
     84 
     85 define i32 @test_eq_2(<4 x i32> %A, <4 x i32> %B) {
     86 ; CHECK-LABEL: test_eq_2:
     87 ; CHECK: pcmpgtd %xmm1, %xmm0
     88 ; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0
     89 ; CHECK: retq
     90 entry:
     91   %cmp = icmp slt <4 x i32> %B, %A
     92   %sext = sext <4 x i1> %cmp to <4 x i32>
     93   %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
     94   %0 = extractelement <4 x i1> %cmp1, i32 1
     95   %1 = sext i1 %0 to i32
     96   ret i32 %1
     97 }
     98 
     99 define i32 @test_ne_2(<4 x i32> %A, <4 x i32> %B) {
    100 ; CHECK-LABEL: test_ne_2:
    101 ; CHECK: pcmpgtd %xmm1, %xmm0
    102 ; CHECK-NOT: pxor
    103 ; CHECK: retq
    104 entry:
    105   %cmp = icmp slt <4 x i32> %B, %A
    106   %sext = sext <4 x i1> %cmp to <4 x i32>
    107   %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
    108   %0 = extractelement <4 x i1> %cmp1, i32 1
    109   %1 = sext i1 %0 to i32
    110   ret i32 %1
    111 }
    112 
    113 define i32 @test_le_2(<4 x i32> %A, <4 x i32> %B) {
    114 ; CHECK-LABEL: test_le_2:
    115 ; CHECK: pcmpgtd %xmm1, %xmm0
    116 ; CHECK: pxor {{.*}}(%rip), %xmm0
    117 ; CHECK: retq
    118 entry:
    119   %cmp = icmp slt <4 x i32> %B, %A
    120   %sext = sext <4 x i1> %cmp to <4 x i32>
    121   %cmp1 = icmp sle <4 x i32> zeroinitializer, %sext
    122   %0 = extractelement <4 x i1> %cmp1, i32 1
    123   %1 = sext i1 %0 to i32
    124   ret i32 %1
    125 }
    126 
    127 define i32 @test_ge_2(<4 x i32> %A, <4 x i32> %B) {
    128 ; CHECK-LABEL: test_ge_2:
    129 ; CHECK: movl $-1, %eax
    130 ; CHECK: retq
    131 entry:
    132   %cmp = icmp slt <4 x i32> %B, %A
    133   %sext = sext <4 x i1> %cmp to <4 x i32>
    134   %cmp1 = icmp sge <4 x i32> zeroinitializer, %sext
    135   %0 = extractelement <4 x i1> %cmp1, i32 1
    136   %1 = sext i1 %0 to i32
    137   ret i32 %1
    138 }
    139 
    140 define i32 @test_lt_2(<4 x i32> %A, <4 x i32> %B) {
    141 ; CHECK-LABEL: test_lt_2:
    142 ; CHECK: pcmpgtd %xmm1, %xmm0
    143 ; CHECK-NOT: pxor
    144 ; CHECK: retq
    145 entry:
    146   %cmp = icmp slt <4 x i32> %B, %A
    147   %sext = sext <4 x i1> %cmp to <4 x i32>
    148   %cmp1 = icmp slt <4 x i32> zeroinitializer, %sext
    149   %0 = extractelement <4 x i1> %cmp, i32 1
    150   %1 = sext i1 %0 to i32
    151   ret i32 %1
    152 }
    153 
    154 define i32 @test_gt_2(<4 x i32> %A, <4 x i32> %B) {
    155 ; CHECK-LABEL: test_gt_2:
    156 ; CHECK: pcmpgtd %xmm1, %xmm0
    157 ; CHECK-NOT: pxor
    158 ; CHECK: retq
    159 entry:
    160   %cmp = icmp slt <4 x i32> %B, %A
    161   %sext = sext <4 x i1> %cmp to <4 x i32>
    162   %cmp1 = icmp sgt <4 x i32> zeroinitializer, %sext
    163   %0 = extractelement <4 x i1> %cmp1, i32 1
    164   %1 = sext i1 %0 to i32
    165   ret i32 %1
    166 }
    167