Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -S | FileCheck %s
      2 
      3 define <2 x i64> @cmp_slt_v2i64(<2 x i64> %a, <2 x i64> %b) {
      4 ; CHECK-LABEL: @cmp_slt_v2i64
      5 ; CHECK-NEXT: %1 = icmp slt <2 x i64> %a, %b
      6 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
      7 ; CHECK-NEXT: ret <2 x i64> %2
      8   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomltq(<2 x i64> %a, <2 x i64> %b)
      9   ret <2 x i64> %1
     10 }
     11 
     12 define <2 x i64> @cmp_ult_v2i64(<2 x i64> %a, <2 x i64> %b) {
     13 ; CHECK-LABEL: @cmp_ult_v2i64
     14 ; CHECK-NEXT: %1 = icmp ult <2 x i64> %a, %b
     15 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
     16 ; CHECK-NEXT: ret <2 x i64> %2
     17   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomltuq(<2 x i64> %a, <2 x i64> %b)
     18   ret <2 x i64> %1
     19 }
     20 
     21 define <2 x i64> @cmp_sle_v2i64(<2 x i64> %a, <2 x i64> %b) {
     22 ; CHECK-LABEL: @cmp_sle_v2i64
     23 ; CHECK-NEXT: %1 = icmp sle <2 x i64> %a, %b
     24 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
     25 ; CHECK-NEXT: ret <2 x i64> %2
     26   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomleq(<2 x i64> %a, <2 x i64> %b)
     27   ret <2 x i64> %1
     28 }
     29 
     30 define <2 x i64> @cmp_ule_v2i64(<2 x i64> %a, <2 x i64> %b) {
     31 ; CHECK-LABEL: @cmp_ule_v2i64
     32 ; CHECK-NEXT: %1 = icmp ule <2 x i64> %a, %b
     33 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
     34 ; CHECK-NEXT: ret <2 x i64> %2
     35   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomleuq(<2 x i64> %a, <2 x i64> %b)
     36   ret <2 x i64> %1
     37 }
     38 
     39 define <4 x i32> @cmp_sgt_v4i32(<4 x i32> %a, <4 x i32> %b) {
     40 ; CHECK-LABEL: @cmp_sgt_v4i32
     41 ; CHECK-NEXT: %1 = icmp sgt <4 x i32> %a, %b
     42 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
     43 ; CHECK-NEXT: ret <4 x i32> %2
     44   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgtd(<4 x i32> %a, <4 x i32> %b)
     45   ret <4 x i32> %1
     46 }
     47 
     48 define <4 x i32> @cmp_ugt_v4i32(<4 x i32> %a, <4 x i32> %b) {
     49 ; CHECK-LABEL: @cmp_ugt_v4i32
     50 ; CHECK-NEXT: %1 = icmp ugt <4 x i32> %a, %b
     51 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
     52 ; CHECK-NEXT: ret <4 x i32> %2
     53   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgtud(<4 x i32> %a, <4 x i32> %b)
     54   ret <4 x i32> %1
     55 }
     56 
     57 define <4 x i32> @cmp_sge_v4i32(<4 x i32> %a, <4 x i32> %b) {
     58 ; CHECK-LABEL: @cmp_sge_v4i32
     59 ; CHECK-NEXT: %1 = icmp sge <4 x i32> %a, %b
     60 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
     61 ; CHECK-NEXT: ret <4 x i32> %2
     62   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomged(<4 x i32> %a, <4 x i32> %b)
     63   ret <4 x i32> %1
     64 }
     65 
     66 define <4 x i32> @cmp_uge_v4i32(<4 x i32> %a, <4 x i32> %b) {
     67 ; CHECK-LABEL: @cmp_uge_v4i32
     68 ; CHECK-NEXT: %1 = icmp uge <4 x i32> %a, %b
     69 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
     70 ; CHECK-NEXT: ret <4 x i32> %2
     71   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgeud(<4 x i32> %a, <4 x i32> %b)
     72   ret <4 x i32> %1
     73 }
     74 
     75 define <8 x i16> @cmp_seq_v8i16(<8 x i16> %a, <8 x i16> %b) {
     76 ; CHECK-LABEL: @cmp_seq_v8i16
     77 ; CHECK-NEXT: %1 = icmp eq <8 x i16> %a, %b
     78 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
     79 ; CHECK-NEXT: ret <8 x i16> %2
     80   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomeqw(<8 x i16> %a, <8 x i16> %b)
     81   ret <8 x i16> %1
     82 }
     83 
     84 define <8 x i16> @cmp_ueq_v8i16(<8 x i16> %a, <8 x i16> %b) {
     85 ; CHECK-LABEL: @cmp_ueq_v8i16
     86 ; CHECK-NEXT: %1 = icmp eq <8 x i16> %a, %b
     87 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
     88 ; CHECK-NEXT: ret <8 x i16> %2
     89   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomequw(<8 x i16> %a, <8 x i16> %b)
     90   ret <8 x i16> %1
     91 }
     92 
     93 define <8 x i16> @cmp_sne_v8i16(<8 x i16> %a, <8 x i16> %b) {
     94 ; CHECK-LABEL: @cmp_sne_v8i16
     95 ; CHECK-NEXT: %1 = icmp ne <8 x i16> %a, %b
     96 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
     97 ; CHECK-NEXT: ret <8 x i16> %2
     98   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomnew(<8 x i16> %a, <8 x i16> %b)
     99   ret <8 x i16> %1
    100 }
    101 
    102 define <8 x i16> @cmp_une_v8i16(<8 x i16> %a, <8 x i16> %b) {
    103 ; CHECK-LABEL: @cmp_une_v8i16
    104 ; CHECK-NEXT: %1 = icmp ne <8 x i16> %a, %b
    105 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
    106 ; CHECK-NEXT: ret <8 x i16> %2
    107   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomneuw(<8 x i16> %a, <8 x i16> %b)
    108   ret <8 x i16> %1
    109 }
    110 
    111 define <16 x i8> @cmp_strue_v16i8(<16 x i8> %a, <16 x i8> %b) {
    112 ; CHECK-LABEL: @cmp_strue_v16i8
    113 ; CHECK-NEXT: ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
    114   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomtrueb(<16 x i8> %a, <16 x i8> %b)
    115   ret <16 x i8> %1
    116 }
    117 
    118 define <16 x i8> @cmp_utrue_v16i8(<16 x i8> %a, <16 x i8> %b) {
    119 ; CHECK-LABEL: @cmp_utrue_v16i8
    120 ; CHECK-NEXT: ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
    121   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomtrueub(<16 x i8> %a, <16 x i8> %b)
    122   ret <16 x i8> %1
    123 }
    124 
    125 define <16 x i8> @cmp_sfalse_v16i8(<16 x i8> %a, <16 x i8> %b) {
    126 ; CHECK-LABEL: @cmp_sfalse_v16i8
    127 ; CHECK-NEXT: ret <16 x i8> zeroinitializer
    128   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomfalseb(<16 x i8> %a, <16 x i8> %b)
    129   ret <16 x i8> %1
    130 }
    131 
    132 define <16 x i8> @cmp_ufalse_v16i8(<16 x i8> %a, <16 x i8> %b) {
    133 ; CHECK-LABEL: @cmp_ufalse_v16i8
    134 ; CHECK-NEXT: ret <16 x i8> zeroinitializer
    135   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomfalseub(<16 x i8> %a, <16 x i8> %b)
    136   ret <16 x i8> %1
    137 }
    138 
    139 declare <16 x i8> @llvm.x86.xop.vpcomltb(<16 x i8>, <16 x i8>) nounwind readnone
    140 declare <8 x i16> @llvm.x86.xop.vpcomltw(<8 x i16>, <8 x i16>) nounwind readnone
    141 declare <4 x i32> @llvm.x86.xop.vpcomltd(<4 x i32>, <4 x i32>) nounwind readnone
    142 declare <2 x i64> @llvm.x86.xop.vpcomltq(<2 x i64>, <2 x i64>) nounwind readnone
    143 declare <16 x i8> @llvm.x86.xop.vpcomltub(<16 x i8>, <16 x i8>) nounwind readnone
    144 declare <8 x i16> @llvm.x86.xop.vpcomltuw(<8 x i16>, <8 x i16>) nounwind readnone
    145 declare <4 x i32> @llvm.x86.xop.vpcomltud(<4 x i32>, <4 x i32>) nounwind readnone
    146 declare <2 x i64> @llvm.x86.xop.vpcomltuq(<2 x i64>, <2 x i64>) nounwind readnone
    147 
    148 declare <16 x i8> @llvm.x86.xop.vpcomleb(<16 x i8>, <16 x i8>) nounwind readnone
    149 declare <8 x i16> @llvm.x86.xop.vpcomlew(<8 x i16>, <8 x i16>) nounwind readnone
    150 declare <4 x i32> @llvm.x86.xop.vpcomled(<4 x i32>, <4 x i32>) nounwind readnone
    151 declare <2 x i64> @llvm.x86.xop.vpcomleq(<2 x i64>, <2 x i64>) nounwind readnone
    152 declare <16 x i8> @llvm.x86.xop.vpcomleub(<16 x i8>, <16 x i8>) nounwind readnone
    153 declare <8 x i16> @llvm.x86.xop.vpcomleuw(<8 x i16>, <8 x i16>) nounwind readnone
    154 declare <4 x i32> @llvm.x86.xop.vpcomleud(<4 x i32>, <4 x i32>) nounwind readnone
    155 declare <2 x i64> @llvm.x86.xop.vpcomleuq(<2 x i64>, <2 x i64>) nounwind readnone
    156 
    157 declare <16 x i8> @llvm.x86.xop.vpcomgtb(<16 x i8>, <16 x i8>) nounwind readnone
    158 declare <8 x i16> @llvm.x86.xop.vpcomgtw(<8 x i16>, <8 x i16>) nounwind readnone
    159 declare <4 x i32> @llvm.x86.xop.vpcomgtd(<4 x i32>, <4 x i32>) nounwind readnone
    160 declare <2 x i64> @llvm.x86.xop.vpcomgtq(<2 x i64>, <2 x i64>) nounwind readnone
    161 declare <16 x i8> @llvm.x86.xop.vpcomgtub(<16 x i8>, <16 x i8>) nounwind readnone
    162 declare <8 x i16> @llvm.x86.xop.vpcomgtuw(<8 x i16>, <8 x i16>) nounwind readnone
    163 declare <4 x i32> @llvm.x86.xop.vpcomgtud(<4 x i32>, <4 x i32>) nounwind readnone
    164 declare <2 x i64> @llvm.x86.xop.vpcomgtuq(<2 x i64>, <2 x i64>) nounwind readnone
    165 
    166 declare <16 x i8> @llvm.x86.xop.vpcomgeb(<16 x i8>, <16 x i8>) nounwind readnone
    167 declare <8 x i16> @llvm.x86.xop.vpcomgew(<8 x i16>, <8 x i16>) nounwind readnone
    168 declare <4 x i32> @llvm.x86.xop.vpcomged(<4 x i32>, <4 x i32>) nounwind readnone
    169 declare <2 x i64> @llvm.x86.xop.vpcomgeq(<2 x i64>, <2 x i64>) nounwind readnone
    170 declare <16 x i8> @llvm.x86.xop.vpcomgeub(<16 x i8>, <16 x i8>) nounwind readnone
    171 declare <8 x i16> @llvm.x86.xop.vpcomgeuw(<8 x i16>, <8 x i16>) nounwind readnone
    172 declare <4 x i32> @llvm.x86.xop.vpcomgeud(<4 x i32>, <4 x i32>) nounwind readnone
    173 declare <2 x i64> @llvm.x86.xop.vpcomgeuq(<2 x i64>, <2 x i64>) nounwind readnone
    174 
    175 declare <16 x i8> @llvm.x86.xop.vpcomeqb(<16 x i8>, <16 x i8>) nounwind readnone
    176 declare <8 x i16> @llvm.x86.xop.vpcomeqw(<8 x i16>, <8 x i16>) nounwind readnone
    177 declare <4 x i32> @llvm.x86.xop.vpcomeqd(<4 x i32>, <4 x i32>) nounwind readnone
    178 declare <2 x i64> @llvm.x86.xop.vpcomeqq(<2 x i64>, <2 x i64>) nounwind readnone
    179 declare <16 x i8> @llvm.x86.xop.vpcomequb(<16 x i8>, <16 x i8>) nounwind readnone
    180 declare <8 x i16> @llvm.x86.xop.vpcomequw(<8 x i16>, <8 x i16>) nounwind readnone
    181 declare <4 x i32> @llvm.x86.xop.vpcomequd(<4 x i32>, <4 x i32>) nounwind readnone
    182 declare <2 x i64> @llvm.x86.xop.vpcomequq(<2 x i64>, <2 x i64>) nounwind readnone
    183 
    184 declare <16 x i8> @llvm.x86.xop.vpcomneb(<16 x i8>, <16 x i8>) nounwind readnone
    185 declare <8 x i16> @llvm.x86.xop.vpcomnew(<8 x i16>, <8 x i16>) nounwind readnone
    186 declare <4 x i32> @llvm.x86.xop.vpcomned(<4 x i32>, <4 x i32>) nounwind readnone
    187 declare <2 x i64> @llvm.x86.xop.vpcomneq(<2 x i64>, <2 x i64>) nounwind readnone
    188 declare <16 x i8> @llvm.x86.xop.vpcomneub(<16 x i8>, <16 x i8>) nounwind readnone
    189 declare <8 x i16> @llvm.x86.xop.vpcomneuw(<8 x i16>, <8 x i16>) nounwind readnone
    190 declare <4 x i32> @llvm.x86.xop.vpcomneud(<4 x i32>, <4 x i32>) nounwind readnone
    191 declare <2 x i64> @llvm.x86.xop.vpcomneuq(<2 x i64>, <2 x i64>) nounwind readnone
    192 
    193 declare <16 x i8> @llvm.x86.xop.vpcomfalseb(<16 x i8>, <16 x i8>) nounwind readnone
    194 declare <8 x i16> @llvm.x86.xop.vpcomfalsew(<8 x i16>, <8 x i16>) nounwind readnone
    195 declare <4 x i32> @llvm.x86.xop.vpcomfalsed(<4 x i32>, <4 x i32>) nounwind readnone
    196 declare <2 x i64> @llvm.x86.xop.vpcomfalseq(<2 x i64>, <2 x i64>) nounwind readnone
    197 declare <16 x i8> @llvm.x86.xop.vpcomfalseub(<16 x i8>, <16 x i8>) nounwind readnone
    198 declare <8 x i16> @llvm.x86.xop.vpcomfalseuw(<8 x i16>, <8 x i16>) nounwind readnone
    199 declare <4 x i32> @llvm.x86.xop.vpcomfalseud(<4 x i32>, <4 x i32>) nounwind readnone
    200 declare <2 x i64> @llvm.x86.xop.vpcomfalseuq(<2 x i64>, <2 x i64>) nounwind readnone
    201 
    202 declare <16 x i8> @llvm.x86.xop.vpcomtrueb(<16 x i8>, <16 x i8>) nounwind readnone
    203 declare <4 x i32> @llvm.x86.xop.vpcomtrued(<4 x i32>, <4 x i32>) nounwind readnone
    204 declare <2 x i64> @llvm.x86.xop.vpcomtrueq(<2 x i64>, <2 x i64>) nounwind readnone
    205 declare <8 x i16> @llvm.x86.xop.vpcomtruew(<8 x i16>, <8 x i16>) nounwind readnone
    206 declare <16 x i8> @llvm.x86.xop.vpcomtrueub(<16 x i8>, <16 x i8>) nounwind readnone
    207 declare <8 x i16> @llvm.x86.xop.vpcomtrueuw(<8 x i16>, <8 x i16>) nounwind readnone
    208 declare <4 x i32> @llvm.x86.xop.vpcomtrueud(<4 x i32>, <4 x i32>) nounwind readnone
    209 declare <2 x i64> @llvm.x86.xop.vpcomtrueuq(<2 x i64>, <2 x i64>) nounwind readnone
    210