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 4define 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 20define 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 40define 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 58define 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 80define 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 98define 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 117define 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 135define 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