Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -promote-elements -mattr=+avx | FileCheck %s
      2 
      3 ; AVX128 tests:
      4 
      5 ;CHECK: vsel_float
      6 ;CHECK: vblendvps
      7 ;CHECK: ret
      8 define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
      9   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
     10   ret <4 x float> %vsel
     11 }
     12 
     13 
     14 ;CHECK: vsel_i32
     15 ;CHECK: vblendvps
     16 ;CHECK: ret
     17 define <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
     18   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i32> %v1, <4 x i32> %v2
     19   ret <4 x i32> %vsel
     20 }
     21 
     22 
     23 ;CHECK: vsel_double
     24 ;CHECK: vblendvpd
     25 ;CHECK: ret
     26 define <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
     27   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
     28   ret <2 x double> %vsel
     29 }
     30 
     31 
     32 ;CHECK: vsel_i64
     33 ;CHECK: vblendvpd
     34 ;CHECK: ret
     35 define <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
     36   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
     37   ret <2 x i64> %vsel
     38 }
     39 
     40 
     41 ;CHECK: vsel_i8
     42 ;CHECK: vpblendvb
     43 ;CHECK: ret
     44 define <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
     45   %vsel = select <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <16 x i8> %v1, <16 x i8> %v2
     46   ret <16 x i8> %vsel
     47 }
     48 
     49 
     50 ; AVX256 tests:
     51 
     52 
     53 ;CHECK: vsel_float
     54 ;CHECK: vblendvps
     55 ;CHECK: ret
     56 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
     57   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x float> %v1, <8 x float> %v2
     58   ret <8 x float> %vsel
     59 }
     60 
     61 ;CHECK: vsel_i32
     62 ;CHECK: vblendvps
     63 ;CHECK: ret
     64 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
     65   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i32> %v1, <8 x i32> %v2
     66   ret <8 x i32> %vsel
     67 }
     68 
     69 ;CHECK: vsel_double
     70 ;CHECK: vblendvpd
     71 ;CHECK: ret
     72 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
     73   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x double> %v1, <8 x double> %v2
     74   ret <8 x double> %vsel
     75 }
     76 
     77 ;CHECK: vsel_i64
     78 ;CHECK: vblendvpd
     79 ;CHECK: ret
     80 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
     81   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i64> %v1, <8 x i64> %v2
     82   ret <8 x i64> %vsel
     83 }
     84 
     85 ;; TEST blend + compares
     86 ; CHECK: A
     87 define <2 x double> @A(<2 x double> %x, <2 x double> %y) {
     88   ; CHECK: vcmplepd
     89   ; CHECK: vblendvpd
     90   %max_is_x = fcmp oge <2 x double> %x, %y
     91   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
     92   ret <2 x double> %max
     93 }
     94 
     95 ; CHECK: B
     96 define <2 x double> @B(<2 x double> %x, <2 x double> %y) {
     97   ; CHECK: vcmpnlepd
     98   ; CHECK: vblendvpd
     99   %min_is_x = fcmp ult <2 x double> %x, %y
    100   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
    101   ret <2 x double> %min
    102 }
    103 
    104 
    105