1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s 2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck --check-prefix=SKX %s 3 4; CHECK-LABEL: trunc_16x32_to_16x8 5; CHECK: vpmovdb 6; CHECK: ret 7define <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) nounwind readnone { 8 %x = trunc <16 x i32> %i to <16 x i8> 9 ret <16 x i8> %x 10} 11 12; CHECK-LABEL: trunc_8x64_to_8x16 13; CHECK: vpmovqw 14; CHECK: ret 15define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) nounwind readnone { 16 %x = trunc <8 x i64> %i to <8 x i16> 17 ret <8 x i16> %x 18} 19 20 21; CHECK-LABEL: zext_16x8_to_16x32 22; CHECK: vpmovzxbd {{.*}}%zmm 23; CHECK: ret 24define <16 x i32> @zext_16x8_to_16x32(<16 x i8> %i) nounwind readnone { 25 %x = zext <16 x i8> %i to <16 x i32> 26 ret <16 x i32> %x 27} 28 29; CHECK-LABEL: sext_16x8_to_16x32 30; CHECK: vpmovsxbd {{.*}}%zmm 31; CHECK: ret 32define <16 x i32> @sext_16x8_to_16x32(<16 x i8> %i) nounwind readnone { 33 %x = sext <16 x i8> %i to <16 x i32> 34 ret <16 x i32> %x 35} 36 37 38; CHECK-LABEL: zext_16x16_to_16x32 39; CHECK: vpmovzxwd {{.*}}%zmm 40; CHECK: ret 41define <16 x i32> @zext_16x16_to_16x32(<16 x i16> %i) nounwind readnone { 42 %x = zext <16 x i16> %i to <16 x i32> 43 ret <16 x i32> %x 44} 45 46; CHECK-LABEL: zext_8x16_to_8x64 47; CHECK: vpmovzxwq 48; CHECK: ret 49define <8 x i64> @zext_8x16_to_8x64(<8 x i16> %i) nounwind readnone { 50 %x = zext <8 x i16> %i to <8 x i64> 51 ret <8 x i64> %x 52} 53 54;CHECK-LABEL: fptrunc_test 55;CHECK: vcvtpd2ps {{.*}}%zmm 56;CHECK: ret 57define <8 x float> @fptrunc_test(<8 x double> %a) nounwind readnone { 58 %b = fptrunc <8 x double> %a to <8 x float> 59 ret <8 x float> %b 60} 61 62;CHECK-LABEL: fpext_test 63;CHECK: vcvtps2pd {{.*}}%zmm 64;CHECK: ret 65define <8 x double> @fpext_test(<8 x float> %a) nounwind readnone { 66 %b = fpext <8 x float> %a to <8 x double> 67 ret <8 x double> %b 68} 69 70; CHECK-LABEL: zext_16i1_to_16xi32 71; CHECK: vpbroadcastd LCP{{.*}}(%rip), %zmm0 {%k1} {z} 72; CHECK: ret 73define <16 x i32> @zext_16i1_to_16xi32(i16 %b) { 74 %a = bitcast i16 %b to <16 x i1> 75 %c = zext <16 x i1> %a to <16 x i32> 76 ret <16 x i32> %c 77} 78 79; CHECK-LABEL: zext_8i1_to_8xi64 80; CHECK: vpbroadcastq LCP{{.*}}(%rip), %zmm0 {%k1} {z} 81; CHECK: ret 82define <8 x i64> @zext_8i1_to_8xi64(i8 %b) { 83 %a = bitcast i8 %b to <8 x i1> 84 %c = zext <8 x i1> %a to <8 x i64> 85 ret <8 x i64> %c 86} 87 88; CHECK-LABEL: trunc_16i8_to_16i1 89; CHECK: vpmovsxbd 90; CHECK: vpandd 91; CHECK: vptestmd 92; CHECK: ret 93define i16 @trunc_16i8_to_16i1(<16 x i8> %a) { 94 %mask_b = trunc <16 x i8>%a to <16 x i1> 95 %mask = bitcast <16 x i1> %mask_b to i16 96 ret i16 %mask 97} 98 99; CHECK-LABEL: trunc_16i32_to_16i1 100; CHECK: vpandd 101; CHECK: vptestmd 102; CHECK: ret 103define i16 @trunc_16i32_to_16i1(<16 x i32> %a) { 104 %mask_b = trunc <16 x i32>%a to <16 x i1> 105 %mask = bitcast <16 x i1> %mask_b to i16 106 ret i16 %mask 107} 108 109; CHECK-LABEL: trunc_8i16_to_8i1 110; CHECK: vpmovsxwq 111; CHECK: vpandq LCP{{.*}}(%rip){1to8} 112; CHECK: vptestmq 113; CHECK: ret 114define i8 @trunc_8i16_to_8i1(<8 x i16> %a) { 115 %mask_b = trunc <8 x i16>%a to <8 x i1> 116 %mask = bitcast <8 x i1> %mask_b to i8 117 ret i8 %mask 118} 119 120; CHECK-LABEL: sext_8i1_8i32 121; CHECK: vpbroadcastq LCP{{.*}}(%rip), %zmm0 {%k1} {z} 122; SKX: vpmovm2d 123; CHECK: ret 124define <8 x i32> @sext_8i1_8i32(<8 x i32> %a1, <8 x i32> %a2) nounwind { 125 %x = icmp slt <8 x i32> %a1, %a2 126 %x1 = xor <8 x i1>%x, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true> 127 %y = sext <8 x i1> %x1 to <8 x i32> 128 ret <8 x i32> %y 129} 130 131; CHECK-LABEL: trunc_v16i32_to_v16i16 132; CHECK: vpmovdw 133; CHECK: ret 134define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) { 135 %1 = trunc <16 x i32> %x to <16 x i16> 136 ret <16 x i16> %1 137} 138 139; CHECK-LABEL: trunc_i32_to_i1 140; CHECK: testb 141; CHECK: setne 142; CKECK: orl 143; CHECK: ret 144define i16 @trunc_i32_to_i1(i32 %a) { 145 %a_i = trunc i32 %a to i1 146 %maskv = insertelement <16 x i1> <i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i1 %a_i, i32 0 147 %res = bitcast <16 x i1> %maskv to i16 148 ret i16 %res 149} 150 151; CHECK-LABEL: sext_8i1_8i16 152; SKX: vpmovm2w 153; CHECK: ret 154define <8 x i16> @sext_8i1_8i16(<8 x i32> %a1, <8 x i32> %a2) nounwind { 155 %x = icmp slt <8 x i32> %a1, %a2 156 %y = sext <8 x i1> %x to <8 x i16> 157 ret <8 x i16> %y 158} 159 160; CHECK-LABEL: sext_16i1_16i32 161; SKX: vpmovm2d 162; CHECK: ret 163define <16 x i32> @sext_16i1_16i32(<16 x i32> %a1, <16 x i32> %a2) nounwind { 164 %x = icmp slt <16 x i32> %a1, %a2 165 %y = sext <16 x i1> %x to <16 x i32> 166 ret <16 x i32> %y 167} 168 169; CHECK-LABEL: sext_8i1_8i64 170; SKX: vpmovm2q 171; CHECK: ret 172define <8 x i64> @sext_8i1_8i64(<8 x i32> %a1, <8 x i32> %a2) nounwind { 173 %x = icmp slt <8 x i32> %a1, %a2 174 %y = sext <8 x i1> %x to <8 x i64> 175 ret <8 x i64> %y 176} 177