Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
      2 
      3 ; CHECK: vandpd
      4 define <4 x double> @andpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
      5 entry:
      6   %0 = bitcast <4 x double> %x to <4 x i64>
      7   %1 = bitcast <4 x double> %y to <4 x i64>
      8   %and.i = and <4 x i64> %0, %1
      9   %2 = bitcast <4 x i64> %and.i to <4 x double>
     10   ret <4 x double> %2
     11 }
     12 
     13 ; CHECK: vandpd LCP{{.*}}(%rip)
     14 define <4 x double> @andpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
     15 entry:
     16   %0 = bitcast <4 x double> %y to <4 x i64>
     17   %and.i = and <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
     18   %1 = bitcast <4 x i64> %and.i to <4 x double>
     19   ret <4 x double> %1
     20 }
     21 
     22 ; CHECK: vandps
     23 define <8 x float> @andps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
     24 entry:
     25   %0 = bitcast <8 x float> %x to <8 x i32>
     26   %1 = bitcast <8 x float> %y to <8 x i32>
     27   %and.i = and <8 x i32> %0, %1
     28   %2 = bitcast <8 x i32> %and.i to <8 x float>
     29   ret <8 x float> %2
     30 }
     31 
     32 ; CHECK: vandps LCP{{.*}}(%rip)
     33 define <8 x float> @andps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
     34 entry:
     35   %0 = bitcast <8 x float> %y to <8 x i32>
     36   %and.i = and <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
     37   %1 = bitcast <8 x i32> %and.i to <8 x float>
     38   ret <8 x float> %1
     39 }
     40 
     41 ; CHECK: vxorpd
     42 define <4 x double> @xorpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
     43 entry:
     44   %0 = bitcast <4 x double> %x to <4 x i64>
     45   %1 = bitcast <4 x double> %y to <4 x i64>
     46   %xor.i = xor <4 x i64> %0, %1
     47   %2 = bitcast <4 x i64> %xor.i to <4 x double>
     48   ret <4 x double> %2
     49 }
     50 
     51 ; CHECK: vxorpd LCP{{.*}}(%rip)
     52 define <4 x double> @xorpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
     53 entry:
     54   %0 = bitcast <4 x double> %y to <4 x i64>
     55   %xor.i = xor <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
     56   %1 = bitcast <4 x i64> %xor.i to <4 x double>
     57   ret <4 x double> %1
     58 }
     59 
     60 ; CHECK: vxorps
     61 define <8 x float> @xorps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
     62 entry:
     63   %0 = bitcast <8 x float> %x to <8 x i32>
     64   %1 = bitcast <8 x float> %y to <8 x i32>
     65   %xor.i = xor <8 x i32> %0, %1
     66   %2 = bitcast <8 x i32> %xor.i to <8 x float>
     67   ret <8 x float> %2
     68 }
     69 
     70 ; CHECK: vxorps LCP{{.*}}(%rip)
     71 define <8 x float> @xorps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
     72 entry:
     73   %0 = bitcast <8 x float> %y to <8 x i32>
     74   %xor.i = xor <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
     75   %1 = bitcast <8 x i32> %xor.i to <8 x float>
     76   ret <8 x float> %1
     77 }
     78 
     79 ; CHECK: vorpd
     80 define <4 x double> @orpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
     81 entry:
     82   %0 = bitcast <4 x double> %x to <4 x i64>
     83   %1 = bitcast <4 x double> %y to <4 x i64>
     84   %or.i = or <4 x i64> %0, %1
     85   %2 = bitcast <4 x i64> %or.i to <4 x double>
     86   ret <4 x double> %2
     87 }
     88 
     89 ; CHECK: vorpd LCP{{.*}}(%rip)
     90 define <4 x double> @orpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {
     91 entry:
     92   %0 = bitcast <4 x double> %y to <4 x i64>
     93   %or.i = or <4 x i64> %0, <i64 4616752568008179712, i64 4614838538166547251, i64 4612361558371493478, i64 4608083138725491507>
     94   %1 = bitcast <4 x i64> %or.i to <4 x double>
     95   ret <4 x double> %1
     96 }
     97 
     98 ; CHECK: vorps
     99 define <8 x float> @orps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
    100 entry:
    101   %0 = bitcast <8 x float> %x to <8 x i32>
    102   %1 = bitcast <8 x float> %y to <8 x i32>
    103   %or.i = or <8 x i32> %0, %1
    104   %2 = bitcast <8 x i32> %or.i to <8 x float>
    105   ret <8 x float> %2
    106 }
    107 
    108 ; CHECK: vorps LCP{{.*}}(%rip)
    109 define <8 x float> @orps256fold(<8 x float> %y) nounwind uwtable readnone ssp {
    110 entry:
    111   %0 = bitcast <8 x float> %y to <8 x i32>
    112   %or.i = or <8 x i32> %0, <i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938, i32 1083179008, i32 1079613850, i32 1075000115, i32 1067030938>
    113   %1 = bitcast <8 x i32> %or.i to <8 x float>
    114   ret <8 x float> %1
    115 }
    116 
    117 ; CHECK: vandnpd
    118 define <4 x double> @andnotpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
    119 entry:
    120   %0 = bitcast <4 x double> %x to <4 x i64>
    121   %neg.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
    122   %1 = bitcast <4 x double> %y to <4 x i64>
    123   %and.i = and <4 x i64> %1, %neg.i
    124   %2 = bitcast <4 x i64> %and.i to <4 x double>
    125   ret <4 x double> %2
    126 }
    127 
    128 ; CHECK: vandnpd (%
    129 define <4 x double> @andnotpd256fold(<4 x double> %y, <4 x double>* nocapture %x) nounwind uwtable readonly ssp {
    130 entry:
    131   %tmp2 = load <4 x double>* %x, align 32
    132   %0 = bitcast <4 x double> %y to <4 x i64>
    133   %neg.i = xor <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
    134   %1 = bitcast <4 x double> %tmp2 to <4 x i64>
    135   %and.i = and <4 x i64> %1, %neg.i
    136   %2 = bitcast <4 x i64> %and.i to <4 x double>
    137   ret <4 x double> %2
    138 }
    139 
    140 ; CHECK: vandnps
    141 define <8 x float> @andnotps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {
    142 entry:
    143   %0 = bitcast <8 x float> %x to <8 x i32>
    144   %neg.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
    145   %1 = bitcast <8 x float> %y to <8 x i32>
    146   %and.i = and <8 x i32> %1, %neg.i
    147   %2 = bitcast <8 x i32> %and.i to <8 x float>
    148   ret <8 x float> %2
    149 }
    150 
    151 ; CHECK: vandnps (%
    152 define <8 x float> @andnotps256fold(<8 x float> %y, <8 x float>* nocapture %x) nounwind uwtable readonly ssp {
    153 entry:
    154   %tmp2 = load <8 x float>* %x, align 32
    155   %0 = bitcast <8 x float> %y to <8 x i32>
    156   %neg.i = xor <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
    157   %1 = bitcast <8 x float> %tmp2 to <8 x i32>
    158   %and.i = and <8 x i32> %1, %neg.i
    159   %2 = bitcast <8 x i32> %and.i to <8 x float>
    160   ret <8 x float> %2
    161 }
    162 
    163 ;;; Test that basic 2 x i64 logic use the integer version on AVX
    164 
    165 ; CHECK: vpandn  %xmm
    166 define <2 x i64> @vpandn(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
    167 entry:
    168   %y = xor <2 x i64> %a, <i64 -1, i64 -1>
    169   %x = and <2 x i64> %a, %y
    170   ret <2 x i64> %x
    171 }
    172 
    173 ; CHECK: vpand %xmm
    174 define <2 x i64> @vpand(<2 x i64> %a, <2 x i64> %b) nounwind uwtable readnone ssp {
    175 entry:
    176   %x = and <2 x i64> %a, %b
    177   ret <2 x i64> %x
    178 }
    179 
    180