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 8define <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 17define <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 26define <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 35define <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 44define <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 56define <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 64define <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 72define <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 80define <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 87define <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 96define <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