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: movl %edi, %eax 8; CHECK-NEXT: notl %eax 9; CHECK-NEXT: retq 10 %m0 = bitcast i32 %x to <32 x i1> 11 %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 12 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 %ret = bitcast <32 x i1> %m1 to i32 16 ret i32 %ret 17} 18 19define i64 @mask64(i64 %x) { 20; CHECK-LABEL: mask64: 21; CHECK: ## %bb.0: 22; CHECK-NEXT: movq %rdi, %rax 23; CHECK-NEXT: notq %rax 24; CHECK-NEXT: retq 25 %m0 = bitcast i64 %x to <64 x i1> 26 %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 27 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 28 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 %ret = bitcast <64 x i1> %m1 to i64 35 ret i64 %ret 36} 37 38define void @mask32_mem(i32* %ptr) { 39; CHECK-LABEL: mask32_mem: 40; CHECK: ## %bb.0: 41; CHECK-NEXT: kmovd (%rdi), %k0 42; CHECK-NEXT: knotd %k0, %k0 43; CHECK-NEXT: kmovd %k0, (%rdi) 44; CHECK-NEXT: retq 45 %x = load i32, i32* %ptr, align 4 46 %m0 = bitcast i32 %x to <32 x i1> 47 %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 48 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 49 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 %ret = bitcast <32 x i1> %m1 to i32 52 store i32 %ret, i32* %ptr, align 4 53 ret void 54} 55 56define void @mask64_mem(i64* %ptr) { 57; CHECK-LABEL: mask64_mem: 58; CHECK: ## %bb.0: 59; CHECK-NEXT: kmovq (%rdi), %k0 60; CHECK-NEXT: knotq %k0, %k0 61; CHECK-NEXT: kmovq %k0, (%rdi) 62; CHECK-NEXT: retq 63 %x = load i64, i64* %ptr, align 4 64 %m0 = bitcast i64 %x to <64 x i1> 65 %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 66 i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, 67 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 %ret = bitcast <64 x i1> %m1 to i64 74 store i64 %ret, i64* %ptr, align 4 75 ret void 76} 77 78define i32 @mand32(i32 %x, i32 %y) { 79; CHECK-LABEL: mand32: 80; CHECK: ## %bb.0: 81; CHECK-NEXT: movl %edi, %eax 82; CHECK-NEXT: movl %edi, %ecx 83; CHECK-NEXT: andl %esi, %ecx 84; CHECK-NEXT: xorl %esi, %eax 85; CHECK-NEXT: orl %ecx, %eax 86; CHECK-NEXT: retq 87 %ma = bitcast i32 %x to <32 x i1> 88 %mb = bitcast i32 %y to <32 x i1> 89 %mc = and <32 x i1> %ma, %mb 90 %md = xor <32 x i1> %ma, %mb 91 %me = or <32 x i1> %mc, %md 92 %ret = bitcast <32 x i1> %me to i32 93 ret i32 %ret 94} 95 96define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) { 97; CHECK-LABEL: mand32_mem: 98; CHECK: ## %bb.0: 99; CHECK-NEXT: kmovd (%rdi), %k0 100; CHECK-NEXT: kmovd (%rsi), %k1 101; CHECK-NEXT: kandd %k1, %k0, %k2 102; CHECK-NEXT: kxord %k1, %k0, %k0 103; CHECK-NEXT: kord %k0, %k2, %k0 104; CHECK-NEXT: kmovd %k0, %eax 105; CHECK-NEXT: retq 106 %ma = load <32 x i1>, <32 x i1>* %x 107 %mb = load <32 x i1>, <32 x i1>* %y 108 %mc = and <32 x i1> %ma, %mb 109 %md = xor <32 x i1> %ma, %mb 110 %me = or <32 x i1> %mc, %md 111 %ret = bitcast <32 x i1> %me to i32 112 ret i32 %ret 113} 114 115define i64 @mand64(i64 %x, i64 %y) { 116; CHECK-LABEL: mand64: 117; CHECK: ## %bb.0: 118; CHECK-NEXT: movq %rdi, %rax 119; CHECK-NEXT: movq %rdi, %rcx 120; CHECK-NEXT: andq %rsi, %rcx 121; CHECK-NEXT: xorq %rsi, %rax 122; CHECK-NEXT: orq %rcx, %rax 123; CHECK-NEXT: retq 124 %ma = bitcast i64 %x to <64 x i1> 125 %mb = bitcast i64 %y to <64 x i1> 126 %mc = and <64 x i1> %ma, %mb 127 %md = xor <64 x i1> %ma, %mb 128 %me = or <64 x i1> %mc, %md 129 %ret = bitcast <64 x i1> %me to i64 130 ret i64 %ret 131} 132 133define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) { 134; CHECK-LABEL: mand64_mem: 135; CHECK: ## %bb.0: 136; CHECK-NEXT: kmovq (%rdi), %k0 137; CHECK-NEXT: kmovq (%rsi), %k1 138; CHECK-NEXT: kandq %k1, %k0, %k2 139; CHECK-NEXT: kxorq %k1, %k0, %k0 140; CHECK-NEXT: korq %k0, %k2, %k0 141; CHECK-NEXT: kmovq %k0, %rax 142; CHECK-NEXT: retq 143 %ma = load <64 x i1>, <64 x i1>* %x 144 %mb = load <64 x i1>, <64 x i1>* %y 145 %mc = and <64 x i1> %ma, %mb 146 %md = xor <64 x i1> %ma, %mb 147 %me = or <64 x i1> %mc, %md 148 %ret = bitcast <64 x i1> %me to i64 149 ret i64 %ret 150} 151 152define i32 @test_v32i1_add(i32 %x, i32 %y) { 153; CHECK-LABEL: test_v32i1_add: 154; CHECK: ## %bb.0: 155; CHECK-NEXT: kmovd %edi, %k0 156; CHECK-NEXT: kmovd %esi, %k1 157; CHECK-NEXT: kxord %k1, %k0, %k0 158; CHECK-NEXT: kmovd %k0, %eax 159; CHECK-NEXT: retq 160 %m0 = bitcast i32 %x to <32 x i1> 161 %m1 = bitcast i32 %y to <32 x i1> 162 %m2 = add <32 x i1> %m0, %m1 163 %ret = bitcast <32 x i1> %m2 to i32 164 ret i32 %ret 165} 166 167define i32 @test_v32i1_sub(i32 %x, i32 %y) { 168; CHECK-LABEL: test_v32i1_sub: 169; CHECK: ## %bb.0: 170; CHECK-NEXT: kmovd %edi, %k0 171; CHECK-NEXT: kmovd %esi, %k1 172; CHECK-NEXT: kxord %k1, %k0, %k0 173; CHECK-NEXT: kmovd %k0, %eax 174; CHECK-NEXT: retq 175 %m0 = bitcast i32 %x to <32 x i1> 176 %m1 = bitcast i32 %y to <32 x i1> 177 %m2 = sub <32 x i1> %m0, %m1 178 %ret = bitcast <32 x i1> %m2 to i32 179 ret i32 %ret 180} 181 182define i32 @test_v32i1_mul(i32 %x, i32 %y) { 183; CHECK-LABEL: test_v32i1_mul: 184; CHECK: ## %bb.0: 185; CHECK-NEXT: kmovd %edi, %k0 186; CHECK-NEXT: kmovd %esi, %k1 187; CHECK-NEXT: kandd %k1, %k0, %k0 188; CHECK-NEXT: kmovd %k0, %eax 189; CHECK-NEXT: retq 190 %m0 = bitcast i32 %x to <32 x i1> 191 %m1 = bitcast i32 %y to <32 x i1> 192 %m2 = mul <32 x i1> %m0, %m1 193 %ret = bitcast <32 x i1> %m2 to i32 194 ret i32 %ret 195} 196 197define i64 @test_v64i1_add(i64 %x, i64 %y) { 198; CHECK-LABEL: test_v64i1_add: 199; CHECK: ## %bb.0: 200; CHECK-NEXT: kmovq %rdi, %k0 201; CHECK-NEXT: kmovq %rsi, %k1 202; CHECK-NEXT: kxorq %k1, %k0, %k0 203; CHECK-NEXT: kmovq %k0, %rax 204; CHECK-NEXT: retq 205 %m0 = bitcast i64 %x to <64 x i1> 206 %m1 = bitcast i64 %y to <64 x i1> 207 %m2 = add <64 x i1> %m0, %m1 208 %ret = bitcast <64 x i1> %m2 to i64 209 ret i64 %ret 210} 211 212define i64 @test_v64i1_sub(i64 %x, i64 %y) { 213; CHECK-LABEL: test_v64i1_sub: 214; CHECK: ## %bb.0: 215; CHECK-NEXT: kmovq %rdi, %k0 216; CHECK-NEXT: kmovq %rsi, %k1 217; CHECK-NEXT: kxorq %k1, %k0, %k0 218; CHECK-NEXT: kmovq %k0, %rax 219; CHECK-NEXT: retq 220 %m0 = bitcast i64 %x to <64 x i1> 221 %m1 = bitcast i64 %y to <64 x i1> 222 %m2 = sub <64 x i1> %m0, %m1 223 %ret = bitcast <64 x i1> %m2 to i64 224 ret i64 %ret 225} 226 227define i64 @test_v64i1_mul(i64 %x, i64 %y) { 228; CHECK-LABEL: test_v64i1_mul: 229; CHECK: ## %bb.0: 230; CHECK-NEXT: kmovq %rdi, %k0 231; CHECK-NEXT: kmovq %rsi, %k1 232; CHECK-NEXT: kandq %k1, %k0, %k0 233; CHECK-NEXT: kmovq %k0, %rax 234; CHECK-NEXT: retq 235 %m0 = bitcast i64 %x to <64 x i1> 236 %m1 = bitcast i64 %y to <64 x i1> 237 %m2 = mul <64 x i1> %m0, %m1 238 %ret = bitcast <64 x i1> %m2 to i64 239 ret i64 %ret 240} 241 242define <32 x i1> @bitcast_f32_to_v32i1(float %x) { 243; CHECK-LABEL: bitcast_f32_to_v32i1: 244; CHECK: ## %bb.0: 245; CHECK-NEXT: vmovd %xmm0, %eax 246; CHECK-NEXT: kmovd %eax, %k0 247; CHECK-NEXT: vpmovm2b %k0, %ymm0 248; CHECK-NEXT: retq 249 %a = bitcast float %x to <32 x i1> 250 ret <32 x i1> %a 251} 252 253define <64 x i1> @bitcast_f64_to_v64i1(double %x) { 254; CHECK-LABEL: bitcast_f64_to_v64i1: 255; CHECK: ## %bb.0: 256; CHECK-NEXT: vmovq %xmm0, %rax 257; CHECK-NEXT: kmovq %rax, %k0 258; CHECK-NEXT: vpmovm2b %k0, %zmm0 259; CHECK-NEXT: retq 260 %a = bitcast double %x to <64 x i1> 261 ret <64 x i1> %a 262} 263 264define float @bitcast_v32i1_to_f32(<32 x i1> %x) { 265; CHECK-LABEL: bitcast_v32i1_to_f32: 266; CHECK: ## %bb.0: 267; CHECK-NEXT: vpsllw $7, %ymm0, %ymm0 268; CHECK-NEXT: vpmovmskb %ymm0, %eax 269; CHECK-NEXT: vmovd %eax, %xmm0 270; CHECK-NEXT: vzeroupper 271; CHECK-NEXT: retq 272 %a = bitcast <32 x i1> %x to float 273 ret float %a 274} 275 276define double @bitcast_v64i1_to_f64(<64 x i1> %x) { 277; CHECK-LABEL: bitcast_v64i1_to_f64: 278; CHECK: ## %bb.0: 279; CHECK-NEXT: vpsllw $7, %zmm0, %zmm0 280; CHECK-NEXT: vpmovb2m %zmm0, %k0 281; CHECK-NEXT: kmovq %k0, %rax 282; CHECK-NEXT: vmovq %rax, %xmm0 283; CHECK-NEXT: vzeroupper 284; CHECK-NEXT: retq 285 %a = bitcast <64 x i1> %x to double 286 ret double %a 287} 288 289