1 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL --check-prefix=CHECK 2 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX --check-prefix=CHECK 3 4 ; CHECK-LABEL: mask16 5 ; CHECK: kmovw 6 ; CHECK-NEXT: knotw 7 ; CHECK-NEXT: kmovw 8 define i16 @mask16(i16 %x) { 9 %m0 = bitcast i16 %x to <16 x i1> 10 %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 11 %ret = bitcast <16 x i1> %m1 to i16 12 ret i16 %ret 13 } 14 15 ; CHECK-LABEL: mask8 16 ; KNL: kmovw 17 ; KNL-NEXT: knotw 18 ; KNL-NEXT: kmovw 19 ; SKX: kmovb 20 ; SKX-NEXT: knotb 21 ; SKX-NEXT: kmovb 22 23 define i8 @mask8(i8 %x) { 24 %m0 = bitcast i8 %x to <8 x i1> 25 %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 26 %ret = bitcast <8 x i1> %m1 to i8 27 ret i8 %ret 28 } 29 30 ; CHECK-LABEL: mask16_mem 31 ; CHECK: kmovw ([[ARG1:%rdi|%rcx]]), %k{{[0-7]}} 32 ; CHECK-NEXT: knotw 33 ; CHECK-NEXT: kmovw %k{{[0-7]}}, ([[ARG1]]) 34 ; CHECK: ret 35 36 define void @mask16_mem(i16* %ptr) { 37 %x = load i16, i16* %ptr, align 4 38 %m0 = bitcast i16 %x to <16 x i1> 39 %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 40 %ret = bitcast <16 x i1> %m1 to i16 41 store i16 %ret, i16* %ptr, align 4 42 ret void 43 } 44 45 ; CHECK-LABEL: mask8_mem 46 ; KNL: kmovw ([[ARG1]]), %k{{[0-7]}} 47 ; KNL-NEXT: knotw 48 ; KNL-NEXT: kmovw %k{{[0-7]}}, ([[ARG1]]) 49 ; SKX: kmovb ([[ARG1]]), %k{{[0-7]}} 50 ; SKX-NEXT: knotb 51 ; SKX-NEXT: kmovb %k{{[0-7]}}, ([[ARG1]]) 52 53 define void @mask8_mem(i8* %ptr) { 54 %x = load i8, i8* %ptr, align 4 55 %m0 = bitcast i8 %x to <8 x i1> 56 %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 57 %ret = bitcast <8 x i1> %m1 to i8 58 store i8 %ret, i8* %ptr, align 4 59 ret void 60 } 61 62 ; CHECK-LABEL: mand16 63 ; CHECK: kandw 64 ; CHECK: kxorw 65 ; CHECK: korw 66 define i16 @mand16(i16 %x, i16 %y) { 67 %ma = bitcast i16 %x to <16 x i1> 68 %mb = bitcast i16 %y to <16 x i1> 69 %mc = and <16 x i1> %ma, %mb 70 %md = xor <16 x i1> %ma, %mb 71 %me = or <16 x i1> %mc, %md 72 %ret = bitcast <16 x i1> %me to i16 73 ret i16 %ret 74 } 75 76 ; CHECK-LABEL: shuf_test1 77 ; CHECK: kshiftrw $8 78 define i8 @shuf_test1(i16 %v) nounwind { 79 %v1 = bitcast i16 %v to <16 x i1> 80 %mask = shufflevector <16 x i1> %v1, <16 x i1> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 81 %mask1 = bitcast <8 x i1> %mask to i8 82 ret i8 %mask1 83 } 84 85 ; CHECK-LABEL: zext_test1 86 ; CHECK: kshiftlw 87 ; CHECK: kshiftrw 88 ; CHECK: kmovw 89 90 define i32 @zext_test1(<16 x i32> %a, <16 x i32> %b) { 91 %cmp_res = icmp ugt <16 x i32> %a, %b 92 %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5 93 %res = zext i1 %cmp_res.i1 to i32 94 ret i32 %res 95 } 96 97 ; CHECK-LABEL: zext_test2 98 ; CHECK: kshiftlw 99 ; CHECK: kshiftrw 100 ; CHECK: kmovw 101 102 define i16 @zext_test2(<16 x i32> %a, <16 x i32> %b) { 103 %cmp_res = icmp ugt <16 x i32> %a, %b 104 %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5 105 %res = zext i1 %cmp_res.i1 to i16 106 ret i16 %res 107 } 108 109 ; CHECK-LABEL: zext_test3 110 ; CHECK: kshiftlw 111 ; CHECK: kshiftrw 112 ; CHECK: kmovw 113 114 define i8 @zext_test3(<16 x i32> %a, <16 x i32> %b) { 115 %cmp_res = icmp ugt <16 x i32> %a, %b 116 %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5 117 %res = zext i1 %cmp_res.i1 to i8 118 ret i8 %res 119 } 120 121 ; CHECK-LABEL: conv1 122 ; KNL: kmovw %k0, %eax 123 ; KNL: movb %al, (%rdi) 124 ; SKX: kmovb %k0, (%rdi) 125 define i8 @conv1(<8 x i1>* %R) { 126 entry: 127 store <8 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %R 128 129 %maskPtr = alloca <8 x i1> 130 store <8 x i1> <i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %maskPtr 131 %mask = load <8 x i1>, <8 x i1>* %maskPtr 132 %mask_convert = bitcast <8 x i1> %mask to i8 133 ret i8 %mask_convert 134 }