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