1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s 3 4 define i32 @mask32(i32 %x) { 5 ; CHECK-LABEL: mask32: 6 ; CHECK: ## BB#0: 7 ; CHECK-NEXT: kmovd %edi, %k0 8 ; CHECK-NEXT: knotd %k0, %k0 9 ; CHECK-NEXT: kmovd %k0, %eax 10 ; CHECK-NEXT: retq 11 %m0 = bitcast i32 %x to <32 x i1> 12 %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 13 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 14 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 15 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 16 %ret = bitcast <32 x i1> %m1 to i32 17 ret i32 %ret 18 } 19 20 define i64 @mask64(i64 %x) { 21 ; CHECK-LABEL: mask64: 22 ; CHECK: ## BB#0: 23 ; CHECK-NEXT: kmovq %rdi, %k0 24 ; CHECK-NEXT: knotq %k0, %k0 25 ; CHECK-NEXT: kmovq %k0, %rax 26 ; CHECK-NEXT: retq 27 %m0 = bitcast i64 %x to <64 x i1> 28 %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 29 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 30 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 31 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 32 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 33 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 34 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 35 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 36 %ret = bitcast <64 x i1> %m1 to i64 37 ret i64 %ret 38 } 39 40 define void @mask32_mem(i32* %ptr) { 41 ; CHECK-LABEL: mask32_mem: 42 ; CHECK: ## BB#0: 43 ; CHECK-NEXT: kmovd (%rdi), %k0 44 ; CHECK-NEXT: knotd %k0, %k0 45 ; CHECK-NEXT: kmovd %k0, (%rdi) 46 ; CHECK-NEXT: retq 47 %x = load i32, i32* %ptr, align 4 48 %m0 = bitcast i32 %x to <32 x i1> 49 %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 50 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 51 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 52 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 53 %ret = bitcast <32 x i1> %m1 to i32 54 store i32 %ret, i32* %ptr, align 4 55 ret void 56 } 57 58 define void @mask64_mem(i64* %ptr) { 59 ; CHECK-LABEL: mask64_mem: 60 ; CHECK: ## BB#0: 61 ; CHECK-NEXT: kmovq (%rdi), %k0 62 ; CHECK-NEXT: knotq %k0, %k0 63 ; CHECK-NEXT: kmovq %k0, (%rdi) 64 ; CHECK-NEXT: retq 65 %x = load i64, i64* %ptr, align 4 66 %m0 = bitcast i64 %x to <64 x i1> 67 %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 68 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 69 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 70 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 71 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 72 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 73 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 74 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1> 75 %ret = bitcast <64 x i1> %m1 to i64 76 store i64 %ret, i64* %ptr, align 4 77 ret void 78 } 79 80 define i32 @mand32(i32 %x, i32 %y) { 81 ; CHECK-LABEL: mand32: 82 ; CHECK: ## BB#0: 83 ; CHECK-NEXT: movl %edi, %eax 84 ; CHECK-NEXT: andl %esi, %eax 85 ; CHECK-NEXT: xorl %esi, %edi 86 ; CHECK-NEXT: orl %eax, %edi 87 ; CHECK-NEXT: movl %edi, %eax 88 ; CHECK-NEXT: retq 89 %ma = bitcast i32 %x to <32 x i1> 90 %mb = bitcast i32 %y to <32 x i1> 91 %mc = and <32 x i1> %ma, %mb 92 %md = xor <32 x i1> %ma, %mb 93 %me = or <32 x i1> %mc, %md 94 %ret = bitcast <32 x i1> %me to i32 95 ret i32 %ret 96 } 97 98 define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) { 99 ; CHECK-LABEL: mand32_mem: 100 ; CHECK: ## BB#0: 101 ; CHECK-NEXT: kmovd (%rdi), %k0 102 ; CHECK-NEXT: kmovd (%rsi), %k1 103 ; CHECK-NEXT: kandd %k1, %k0, %k2 104 ; CHECK-NEXT: kxord %k1, %k0, %k0 105 ; CHECK-NEXT: kord %k0, %k2, %k0 106 ; CHECK-NEXT: kmovd %k0, %eax 107 ; CHECK-NEXT: retq 108 %ma = load <32 x i1>, <32 x i1>* %x 109 %mb = load <32 x i1>, <32 x i1>* %y 110 %mc = and <32 x i1> %ma, %mb 111 %md = xor <32 x i1> %ma, %mb 112 %me = or <32 x i1> %mc, %md 113 %ret = bitcast <32 x i1> %me to i32 114 ret i32 %ret 115 } 116 117 define i64 @mand64(i64 %x, i64 %y) { 118 ; CHECK-LABEL: mand64: 119 ; CHECK: ## BB#0: 120 ; CHECK-NEXT: movq %rdi, %rax 121 ; CHECK-NEXT: andq %rsi, %rax 122 ; CHECK-NEXT: xorq %rsi, %rdi 123 ; CHECK-NEXT: orq %rax, %rdi 124 ; CHECK-NEXT: movq %rdi, %rax 125 ; CHECK-NEXT: retq 126 %ma = bitcast i64 %x to <64 x i1> 127 %mb = bitcast i64 %y to <64 x i1> 128 %mc = and <64 x i1> %ma, %mb 129 %md = xor <64 x i1> %ma, %mb 130 %me = or <64 x i1> %mc, %md 131 %ret = bitcast <64 x i1> %me to i64 132 ret i64 %ret 133 } 134 135 define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) { 136 ; CHECK-LABEL: mand64_mem: 137 ; CHECK: ## BB#0: 138 ; CHECK-NEXT: kmovq (%rdi), %k0 139 ; CHECK-NEXT: kmovq (%rsi), %k1 140 ; CHECK-NEXT: kandq %k1, %k0, %k2 141 ; CHECK-NEXT: kxorq %k1, %k0, %k0 142 ; CHECK-NEXT: korq %k0, %k2, %k0 143 ; CHECK-NEXT: kmovq %k0, %rax 144 ; CHECK-NEXT: retq 145 %ma = load <64 x i1>, <64 x i1>* %x 146 %mb = load <64 x i1>, <64 x i1>* %y 147 %mc = and <64 x i1> %ma, %mb 148 %md = xor <64 x i1> %ma, %mb 149 %me = or <64 x i1> %mc, %md 150 %ret = bitcast <64 x i1> %me to i64 151 ret i64 %ret 152 } 153