1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=ALL --check-prefix=KNL 3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=ALL --check-prefix=SKX 4 5 6define <16 x i32> @vpandd(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp { 7; ALL-LABEL: vpandd: 8; ALL: ## %bb.0: ## %entry 9; ALL-NEXT: vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 10; ALL-NEXT: vpandd %zmm1, %zmm0, %zmm0 11; ALL-NEXT: retq 12entry: 13 ; Force the execution domain with an add. 14 %a2 = add <16 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, 15 i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2> 16 %x = and <16 x i32> %a2, %b 17 ret <16 x i32> %x 18} 19 20define <16 x i32> @vpandnd(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp { 21; ALL-LABEL: vpandnd: 22; ALL: ## %bb.0: ## %entry 23; ALL-NEXT: vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 24; ALL-NEXT: vpandnd %zmm0, %zmm1, %zmm0 25; ALL-NEXT: retq 26entry: 27 ; Force the execution domain with an add. 28 %a2 = add <16 x i32> %a, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, 29 i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> 30 %b2 = xor <16 x i32> %b, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, 31 i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 32 %x = and <16 x i32> %a2, %b2 33 ret <16 x i32> %x 34} 35 36define <16 x i32> @vpord(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp { 37; ALL-LABEL: vpord: 38; ALL: ## %bb.0: ## %entry 39; ALL-NEXT: vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 40; ALL-NEXT: vpord %zmm1, %zmm0, %zmm0 41; ALL-NEXT: retq 42entry: 43 ; Force the execution domain with an add. 44 %a2 = add <16 x i32> %a, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, 45 i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4> 46 %x = or <16 x i32> %a2, %b 47 ret <16 x i32> %x 48} 49 50define <16 x i32> @vpxord(<16 x i32> %a, <16 x i32> %b) nounwind uwtable readnone ssp { 51; ALL-LABEL: vpxord: 52; ALL: ## %bb.0: ## %entry 53; ALL-NEXT: vpaddd {{.*}}(%rip){1to16}, %zmm0, %zmm0 54; ALL-NEXT: vpxord %zmm1, %zmm0, %zmm0 55; ALL-NEXT: retq 56entry: 57 ; Force the execution domain with an add. 58 %a2 = add <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, 59 i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 60 %x = xor <16 x i32> %a2, %b 61 ret <16 x i32> %x 62} 63 64define <8 x i64> @vpandq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp { 65; ALL-LABEL: vpandq: 66; ALL: ## %bb.0: ## %entry 67; ALL-NEXT: vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0 68; ALL-NEXT: vpandq %zmm1, %zmm0, %zmm0 69; ALL-NEXT: retq 70entry: 71 ; Force the execution domain with an add. 72 %a2 = add <8 x i64> %a, <i64 6, i64 6, i64 6, i64 6, i64 6, i64 6, i64 6, i64 6> 73 %x = and <8 x i64> %a2, %b 74 ret <8 x i64> %x 75} 76 77define <8 x i64> @vpandnq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp { 78; ALL-LABEL: vpandnq: 79; ALL: ## %bb.0: ## %entry 80; ALL-NEXT: vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0 81; ALL-NEXT: vpandnq %zmm0, %zmm1, %zmm0 82; ALL-NEXT: retq 83entry: 84 ; Force the execution domain with an add. 85 %a2 = add <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7> 86 %b2 = xor <8 x i64> %b, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1> 87 %x = and <8 x i64> %a2, %b2 88 ret <8 x i64> %x 89} 90 91define <8 x i64> @vporq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp { 92; ALL-LABEL: vporq: 93; ALL: ## %bb.0: ## %entry 94; ALL-NEXT: vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0 95; ALL-NEXT: vporq %zmm1, %zmm0, %zmm0 96; ALL-NEXT: retq 97entry: 98 ; Force the execution domain with an add. 99 %a2 = add <8 x i64> %a, <i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8, i64 8> 100 %x = or <8 x i64> %a2, %b 101 ret <8 x i64> %x 102} 103 104define <8 x i64> @vpxorq(<8 x i64> %a, <8 x i64> %b) nounwind uwtable readnone ssp { 105; ALL-LABEL: vpxorq: 106; ALL: ## %bb.0: ## %entry 107; ALL-NEXT: vpaddq {{.*}}(%rip){1to8}, %zmm0, %zmm0 108; ALL-NEXT: vpxorq %zmm1, %zmm0, %zmm0 109; ALL-NEXT: retq 110entry: 111 ; Force the execution domain with an add. 112 %a2 = add <8 x i64> %a, <i64 9, i64 9, i64 9, i64 9, i64 9, i64 9, i64 9, i64 9> 113 %x = xor <8 x i64> %a2, %b 114 ret <8 x i64> %x 115} 116 117 118define <8 x i64> @orq_broadcast(<8 x i64> %a) nounwind { 119; KNL-LABEL: orq_broadcast: 120; KNL: ## %bb.0: 121; KNL-NEXT: vporq {{.*}}(%rip){1to8}, %zmm0, %zmm0 122; KNL-NEXT: retq 123; 124; SKX-LABEL: orq_broadcast: 125; SKX: ## %bb.0: 126; SKX-NEXT: vorpd {{.*}}(%rip){1to8}, %zmm0, %zmm0 127; SKX-NEXT: retq 128 %b = or <8 x i64> %a, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2> 129 ret <8 x i64> %b 130} 131 132define <16 x i32> @andd512fold(<16 x i32> %y, <16 x i32>* %x) { 133; KNL-LABEL: andd512fold: 134; KNL: ## %bb.0: ## %entry 135; KNL-NEXT: vpandd (%rdi), %zmm0, %zmm0 136; KNL-NEXT: retq 137; 138; SKX-LABEL: andd512fold: 139; SKX: ## %bb.0: ## %entry 140; SKX-NEXT: vandps (%rdi), %zmm0, %zmm0 141; SKX-NEXT: retq 142entry: 143 %a = load <16 x i32>, <16 x i32>* %x, align 4 144 %b = and <16 x i32> %y, %a 145 ret <16 x i32> %b 146} 147 148define <8 x i64> @andqbrst(<8 x i64> %p1, i64* %ap) { 149; KNL-LABEL: andqbrst: 150; KNL: ## %bb.0: ## %entry 151; KNL-NEXT: vpandq (%rdi){1to8}, %zmm0, %zmm0 152; KNL-NEXT: retq 153; 154; SKX-LABEL: andqbrst: 155; SKX: ## %bb.0: ## %entry 156; SKX-NEXT: vandpd (%rdi){1to8}, %zmm0, %zmm0 157; SKX-NEXT: retq 158entry: 159 %a = load i64, i64* %ap, align 8 160 %b = insertelement <8 x i64> undef, i64 %a, i32 0 161 %c = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer 162 %d = and <8 x i64> %p1, %c 163 ret <8 x i64>%d 164} 165 166define <64 x i8> @and_v64i8(<64 x i8> %a, <64 x i8> %b) { 167; KNL-LABEL: and_v64i8: 168; KNL: ## %bb.0: 169; KNL-NEXT: vpandq %zmm1, %zmm0, %zmm0 170; KNL-NEXT: retq 171; 172; SKX-LABEL: and_v64i8: 173; SKX: ## %bb.0: 174; SKX-NEXT: vandps %zmm1, %zmm0, %zmm0 175; SKX-NEXT: retq 176 %res = and <64 x i8> %a, %b 177 ret <64 x i8> %res 178} 179 180define <64 x i8> @andn_v64i8(<64 x i8> %a, <64 x i8> %b) { 181; KNL-LABEL: andn_v64i8: 182; KNL: ## %bb.0: 183; KNL-NEXT: vpandnq %zmm0, %zmm1, %zmm0 184; KNL-NEXT: retq 185; 186; SKX-LABEL: andn_v64i8: 187; SKX: ## %bb.0: 188; SKX-NEXT: vandnps %zmm0, %zmm1, %zmm0 189; SKX-NEXT: retq 190 %b2 = xor <64 x i8> %b, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 191 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 192 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 193 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 194 %res = and <64 x i8> %a, %b2 195 ret <64 x i8> %res 196} 197 198define <64 x i8> @or_v64i8(<64 x i8> %a, <64 x i8> %b) { 199; KNL-LABEL: or_v64i8: 200; KNL: ## %bb.0: 201; KNL-NEXT: vporq %zmm1, %zmm0, %zmm0 202; KNL-NEXT: retq 203; 204; SKX-LABEL: or_v64i8: 205; SKX: ## %bb.0: 206; SKX-NEXT: vorps %zmm1, %zmm0, %zmm0 207; SKX-NEXT: retq 208 %res = or <64 x i8> %a, %b 209 ret <64 x i8> %res 210} 211 212define <64 x i8> @xor_v64i8(<64 x i8> %a, <64 x i8> %b) { 213; KNL-LABEL: xor_v64i8: 214; KNL: ## %bb.0: 215; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm0 216; KNL-NEXT: retq 217; 218; SKX-LABEL: xor_v64i8: 219; SKX: ## %bb.0: 220; SKX-NEXT: vxorps %zmm1, %zmm0, %zmm0 221; SKX-NEXT: retq 222 %res = xor <64 x i8> %a, %b 223 ret <64 x i8> %res 224} 225 226define <32 x i16> @and_v32i16(<32 x i16> %a, <32 x i16> %b) { 227; KNL-LABEL: and_v32i16: 228; KNL: ## %bb.0: 229; KNL-NEXT: vpandq %zmm1, %zmm0, %zmm0 230; KNL-NEXT: retq 231; 232; SKX-LABEL: and_v32i16: 233; SKX: ## %bb.0: 234; SKX-NEXT: vandps %zmm1, %zmm0, %zmm0 235; SKX-NEXT: retq 236 %res = and <32 x i16> %a, %b 237 ret <32 x i16> %res 238} 239 240define <32 x i16> @andn_v32i16(<32 x i16> %a, <32 x i16> %b) { 241; KNL-LABEL: andn_v32i16: 242; KNL: ## %bb.0: 243; KNL-NEXT: vpandnq %zmm0, %zmm1, %zmm0 244; KNL-NEXT: retq 245; 246; SKX-LABEL: andn_v32i16: 247; SKX: ## %bb.0: 248; SKX-NEXT: vandnps %zmm0, %zmm1, %zmm0 249; SKX-NEXT: retq 250 %b2 = xor <32 x i16> %b, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, 251 i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 252 %res = and <32 x i16> %a, %b2 253 ret <32 x i16> %res 254} 255 256define <32 x i16> @or_v32i16(<32 x i16> %a, <32 x i16> %b) { 257; KNL-LABEL: or_v32i16: 258; KNL: ## %bb.0: 259; KNL-NEXT: vporq %zmm1, %zmm0, %zmm0 260; KNL-NEXT: retq 261; 262; SKX-LABEL: or_v32i16: 263; SKX: ## %bb.0: 264; SKX-NEXT: vorps %zmm1, %zmm0, %zmm0 265; SKX-NEXT: retq 266 %res = or <32 x i16> %a, %b 267 ret <32 x i16> %res 268} 269 270define <32 x i16> @xor_v32i16(<32 x i16> %a, <32 x i16> %b) { 271; KNL-LABEL: xor_v32i16: 272; KNL: ## %bb.0: 273; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm0 274; KNL-NEXT: retq 275; 276; SKX-LABEL: xor_v32i16: 277; SKX: ## %bb.0: 278; SKX-NEXT: vxorps %zmm1, %zmm0, %zmm0 279; SKX-NEXT: retq 280 %res = xor <32 x i16> %a, %b 281 ret <32 x i16> %res 282} 283 284define <16 x float> @masked_and_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) { 285; KNL-LABEL: masked_and_v16f32: 286; KNL: ## %bb.0: 287; KNL-NEXT: kmovw %edi, %k1 288; KNL-NEXT: vpandd %zmm1, %zmm0, %zmm2 {%k1} 289; KNL-NEXT: vaddps %zmm2, %zmm3, %zmm0 290; KNL-NEXT: retq 291; 292; SKX-LABEL: masked_and_v16f32: 293; SKX: ## %bb.0: 294; SKX-NEXT: kmovd %edi, %k1 295; SKX-NEXT: vandps %zmm1, %zmm0, %zmm2 {%k1} 296; SKX-NEXT: vaddps %zmm2, %zmm3, %zmm0 297; SKX-NEXT: retq 298 %a1 = bitcast <16 x float> %a to <16 x i32> 299 %b1 = bitcast <16 x float> %b to <16 x i32> 300 %passThru1 = bitcast <16 x float> %passThru to <16 x i32> 301 %mask1 = bitcast i16 %mask to <16 x i1> 302 %op = and <16 x i32> %a1, %b1 303 %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1 304 %cast = bitcast <16 x i32> %select to <16 x float> 305 %add = fadd <16 x float> %c, %cast 306 ret <16 x float> %add 307} 308 309define <16 x float> @masked_or_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) { 310; KNL-LABEL: masked_or_v16f32: 311; KNL: ## %bb.0: 312; KNL-NEXT: kmovw %edi, %k1 313; KNL-NEXT: vpandd %zmm1, %zmm0, %zmm2 {%k1} 314; KNL-NEXT: vaddps %zmm2, %zmm3, %zmm0 315; KNL-NEXT: retq 316; 317; SKX-LABEL: masked_or_v16f32: 318; SKX: ## %bb.0: 319; SKX-NEXT: kmovd %edi, %k1 320; SKX-NEXT: vandps %zmm1, %zmm0, %zmm2 {%k1} 321; SKX-NEXT: vaddps %zmm2, %zmm3, %zmm0 322; SKX-NEXT: retq 323 %a1 = bitcast <16 x float> %a to <16 x i32> 324 %b1 = bitcast <16 x float> %b to <16 x i32> 325 %passThru1 = bitcast <16 x float> %passThru to <16 x i32> 326 %mask1 = bitcast i16 %mask to <16 x i1> 327 %op = and <16 x i32> %a1, %b1 328 %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1 329 %cast = bitcast <16 x i32> %select to <16 x float> 330 %add = fadd <16 x float> %c, %cast 331 ret <16 x float> %add 332} 333 334define <16 x float> @masked_xor_v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %passThru, i16 %mask, <16 x float> %c) { 335; KNL-LABEL: masked_xor_v16f32: 336; KNL: ## %bb.0: 337; KNL-NEXT: kmovw %edi, %k1 338; KNL-NEXT: vpandd %zmm1, %zmm0, %zmm2 {%k1} 339; KNL-NEXT: vaddps %zmm2, %zmm3, %zmm0 340; KNL-NEXT: retq 341; 342; SKX-LABEL: masked_xor_v16f32: 343; SKX: ## %bb.0: 344; SKX-NEXT: kmovd %edi, %k1 345; SKX-NEXT: vandps %zmm1, %zmm0, %zmm2 {%k1} 346; SKX-NEXT: vaddps %zmm2, %zmm3, %zmm0 347; SKX-NEXT: retq 348 %a1 = bitcast <16 x float> %a to <16 x i32> 349 %b1 = bitcast <16 x float> %b to <16 x i32> 350 %passThru1 = bitcast <16 x float> %passThru to <16 x i32> 351 %mask1 = bitcast i16 %mask to <16 x i1> 352 %op = and <16 x i32> %a1, %b1 353 %select = select <16 x i1> %mask1, <16 x i32> %op, <16 x i32> %passThru1 354 %cast = bitcast <16 x i32> %select to <16 x float> 355 %add = fadd <16 x float> %c, %cast 356 ret <16 x float> %add 357} 358 359define <8 x double> @masked_and_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) { 360; KNL-LABEL: masked_and_v8f64: 361; KNL: ## %bb.0: 362; KNL-NEXT: kmovw %edi, %k1 363; KNL-NEXT: vpandq %zmm1, %zmm0, %zmm2 {%k1} 364; KNL-NEXT: vaddpd %zmm2, %zmm3, %zmm0 365; KNL-NEXT: retq 366; 367; SKX-LABEL: masked_and_v8f64: 368; SKX: ## %bb.0: 369; SKX-NEXT: kmovd %edi, %k1 370; SKX-NEXT: vandpd %zmm1, %zmm0, %zmm2 {%k1} 371; SKX-NEXT: vaddpd %zmm2, %zmm3, %zmm0 372; SKX-NEXT: retq 373 %a1 = bitcast <8 x double> %a to <8 x i64> 374 %b1 = bitcast <8 x double> %b to <8 x i64> 375 %passThru1 = bitcast <8 x double> %passThru to <8 x i64> 376 %mask1 = bitcast i8 %mask to <8 x i1> 377 %op = and <8 x i64> %a1, %b1 378 %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1 379 %cast = bitcast <8 x i64> %select to <8 x double> 380 %add = fadd <8 x double> %c, %cast 381 ret <8 x double> %add 382} 383 384define <8 x double> @masked_or_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) { 385; KNL-LABEL: masked_or_v8f64: 386; KNL: ## %bb.0: 387; KNL-NEXT: kmovw %edi, %k1 388; KNL-NEXT: vpandq %zmm1, %zmm0, %zmm2 {%k1} 389; KNL-NEXT: vaddpd %zmm2, %zmm3, %zmm0 390; KNL-NEXT: retq 391; 392; SKX-LABEL: masked_or_v8f64: 393; SKX: ## %bb.0: 394; SKX-NEXT: kmovd %edi, %k1 395; SKX-NEXT: vandpd %zmm1, %zmm0, %zmm2 {%k1} 396; SKX-NEXT: vaddpd %zmm2, %zmm3, %zmm0 397; SKX-NEXT: retq 398 %a1 = bitcast <8 x double> %a to <8 x i64> 399 %b1 = bitcast <8 x double> %b to <8 x i64> 400 %passThru1 = bitcast <8 x double> %passThru to <8 x i64> 401 %mask1 = bitcast i8 %mask to <8 x i1> 402 %op = and <8 x i64> %a1, %b1 403 %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1 404 %cast = bitcast <8 x i64> %select to <8 x double> 405 %add = fadd <8 x double> %c, %cast 406 ret <8 x double> %add 407} 408 409define <8 x double> @masked_xor_v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %passThru, i8 %mask, <8 x double> %c) { 410; KNL-LABEL: masked_xor_v8f64: 411; KNL: ## %bb.0: 412; KNL-NEXT: kmovw %edi, %k1 413; KNL-NEXT: vpandq %zmm1, %zmm0, %zmm2 {%k1} 414; KNL-NEXT: vaddpd %zmm2, %zmm3, %zmm0 415; KNL-NEXT: retq 416; 417; SKX-LABEL: masked_xor_v8f64: 418; SKX: ## %bb.0: 419; SKX-NEXT: kmovd %edi, %k1 420; SKX-NEXT: vandpd %zmm1, %zmm0, %zmm2 {%k1} 421; SKX-NEXT: vaddpd %zmm2, %zmm3, %zmm0 422; SKX-NEXT: retq 423 %a1 = bitcast <8 x double> %a to <8 x i64> 424 %b1 = bitcast <8 x double> %b to <8 x i64> 425 %passThru1 = bitcast <8 x double> %passThru to <8 x i64> 426 %mask1 = bitcast i8 %mask to <8 x i1> 427 %op = and <8 x i64> %a1, %b1 428 %select = select <8 x i1> %mask1, <8 x i64> %op, <8 x i64> %passThru1 429 %cast = bitcast <8 x i64> %select to <8 x double> 430 %add = fadd <8 x double> %c, %cast 431 ret <8 x double> %add 432} 433 434define <8 x i64> @test_mm512_mask_and_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) { 435; KNL-LABEL: test_mm512_mask_and_epi32: 436; KNL: ## %bb.0: ## %entry 437; KNL-NEXT: kmovw %edi, %k1 438; KNL-NEXT: vpandd %zmm2, %zmm1, %zmm0 {%k1} 439; KNL-NEXT: retq 440; 441; SKX-LABEL: test_mm512_mask_and_epi32: 442; SKX: ## %bb.0: ## %entry 443; SKX-NEXT: kmovd %edi, %k1 444; SKX-NEXT: vandps %zmm2, %zmm1, %zmm0 {%k1} 445; SKX-NEXT: retq 446entry: 447 %and1.i.i = and <8 x i64> %__a, %__b 448 %0 = bitcast <8 x i64> %and1.i.i to <16 x i32> 449 %1 = bitcast <8 x i64> %__src to <16 x i32> 450 %2 = bitcast i16 %__k to <16 x i1> 451 %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1 452 %4 = bitcast <16 x i32> %3 to <8 x i64> 453 ret <8 x i64> %4 454} 455 456define <8 x i64> @test_mm512_mask_or_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) { 457; KNL-LABEL: test_mm512_mask_or_epi32: 458; KNL: ## %bb.0: ## %entry 459; KNL-NEXT: kmovw %edi, %k1 460; KNL-NEXT: vpord %zmm2, %zmm1, %zmm0 {%k1} 461; KNL-NEXT: retq 462; 463; SKX-LABEL: test_mm512_mask_or_epi32: 464; SKX: ## %bb.0: ## %entry 465; SKX-NEXT: kmovd %edi, %k1 466; SKX-NEXT: vorps %zmm2, %zmm1, %zmm0 {%k1} 467; SKX-NEXT: retq 468entry: 469 %or1.i.i = or <8 x i64> %__a, %__b 470 %0 = bitcast <8 x i64> %or1.i.i to <16 x i32> 471 %1 = bitcast <8 x i64> %__src to <16 x i32> 472 %2 = bitcast i16 %__k to <16 x i1> 473 %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1 474 %4 = bitcast <16 x i32> %3 to <8 x i64> 475 ret <8 x i64> %4 476} 477 478define <8 x i64> @test_mm512_mask_xor_epi32(<8 x i64> %__src, i16 zeroext %__k, <8 x i64> %__a, <8 x i64> %__b) { 479; KNL-LABEL: test_mm512_mask_xor_epi32: 480; KNL: ## %bb.0: ## %entry 481; KNL-NEXT: kmovw %edi, %k1 482; KNL-NEXT: vpxord %zmm2, %zmm1, %zmm0 {%k1} 483; KNL-NEXT: retq 484; 485; SKX-LABEL: test_mm512_mask_xor_epi32: 486; SKX: ## %bb.0: ## %entry 487; SKX-NEXT: kmovd %edi, %k1 488; SKX-NEXT: vxorps %zmm2, %zmm1, %zmm0 {%k1} 489; SKX-NEXT: retq 490entry: 491 %xor1.i.i = xor <8 x i64> %__a, %__b 492 %0 = bitcast <8 x i64> %xor1.i.i to <16 x i32> 493 %1 = bitcast <8 x i64> %__src to <16 x i32> 494 %2 = bitcast i16 %__k to <16 x i1> 495 %3 = select <16 x i1> %2, <16 x i32> %0, <16 x i32> %1 496 %4 = bitcast <16 x i32> %3 to <8 x i64> 497 ret <8 x i64> %4 498} 499 500define <8 x double> @test_mm512_mask_xor_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 501; KNL-LABEL: test_mm512_mask_xor_pd: 502; KNL: ## %bb.0: ## %entry 503; KNL-NEXT: kmovw %edi, %k1 504; KNL-NEXT: vpxorq %zmm2, %zmm1, %zmm0 {%k1} 505; KNL-NEXT: retq 506; 507; SKX-LABEL: test_mm512_mask_xor_pd: 508; SKX: ## %bb.0: ## %entry 509; SKX-NEXT: kmovd %edi, %k1 510; SKX-NEXT: vxorpd %zmm2, %zmm1, %zmm0 {%k1} 511; SKX-NEXT: retq 512entry: 513 %0 = bitcast <8 x double> %__A to <8 x i64> 514 %1 = bitcast <8 x double> %__B to <8 x i64> 515 %xor.i.i = xor <8 x i64> %0, %1 516 %2 = bitcast <8 x i64> %xor.i.i to <8 x double> 517 %3 = bitcast i8 %__U to <8 x i1> 518 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W 519 ret <8 x double> %4 520} 521 522define <8 x double> @test_mm512_maskz_xor_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 523; KNL-LABEL: test_mm512_maskz_xor_pd: 524; KNL: ## %bb.0: ## %entry 525; KNL-NEXT: kmovw %edi, %k1 526; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm0 {%k1} {z} 527; KNL-NEXT: retq 528; 529; SKX-LABEL: test_mm512_maskz_xor_pd: 530; SKX: ## %bb.0: ## %entry 531; SKX-NEXT: kmovd %edi, %k1 532; SKX-NEXT: vxorpd %zmm1, %zmm0, %zmm0 {%k1} {z} 533; SKX-NEXT: retq 534entry: 535 %0 = bitcast <8 x double> %__A to <8 x i64> 536 %1 = bitcast <8 x double> %__B to <8 x i64> 537 %xor.i.i = xor <8 x i64> %0, %1 538 %2 = bitcast <8 x i64> %xor.i.i to <8 x double> 539 %3 = bitcast i8 %__U to <8 x i1> 540 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer 541 ret <8 x double> %4 542} 543 544define <16 x float> @test_mm512_mask_xor_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 545; KNL-LABEL: test_mm512_mask_xor_ps: 546; KNL: ## %bb.0: ## %entry 547; KNL-NEXT: kmovw %edi, %k1 548; KNL-NEXT: vpxord %zmm2, %zmm1, %zmm0 {%k1} 549; KNL-NEXT: retq 550; 551; SKX-LABEL: test_mm512_mask_xor_ps: 552; SKX: ## %bb.0: ## %entry 553; SKX-NEXT: kmovd %edi, %k1 554; SKX-NEXT: vxorps %zmm2, %zmm1, %zmm0 {%k1} 555; SKX-NEXT: retq 556entry: 557 %0 = bitcast <16 x float> %__A to <16 x i32> 558 %1 = bitcast <16 x float> %__B to <16 x i32> 559 %xor.i.i = xor <16 x i32> %0, %1 560 %2 = bitcast <16 x i32> %xor.i.i to <16 x float> 561 %3 = bitcast i16 %__U to <16 x i1> 562 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W 563 ret <16 x float> %4 564} 565 566define <16 x float> @test_mm512_maskz_xor_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 567; KNL-LABEL: test_mm512_maskz_xor_ps: 568; KNL: ## %bb.0: ## %entry 569; KNL-NEXT: kmovw %edi, %k1 570; KNL-NEXT: vpxord %zmm1, %zmm0, %zmm0 {%k1} {z} 571; KNL-NEXT: retq 572; 573; SKX-LABEL: test_mm512_maskz_xor_ps: 574; SKX: ## %bb.0: ## %entry 575; SKX-NEXT: kmovd %edi, %k1 576; SKX-NEXT: vxorps %zmm1, %zmm0, %zmm0 {%k1} {z} 577; SKX-NEXT: retq 578entry: 579 %0 = bitcast <16 x float> %__A to <16 x i32> 580 %1 = bitcast <16 x float> %__B to <16 x i32> 581 %xor.i.i = xor <16 x i32> %0, %1 582 %2 = bitcast <16 x i32> %xor.i.i to <16 x float> 583 %3 = bitcast i16 %__U to <16 x i1> 584 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer 585 ret <16 x float> %4 586} 587 588define <8 x double> @test_mm512_mask_or_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 589; KNL-LABEL: test_mm512_mask_or_pd: 590; KNL: ## %bb.0: ## %entry 591; KNL-NEXT: kmovw %edi, %k1 592; KNL-NEXT: vporq %zmm1, %zmm2, %zmm0 {%k1} 593; KNL-NEXT: retq 594; 595; SKX-LABEL: test_mm512_mask_or_pd: 596; SKX: ## %bb.0: ## %entry 597; SKX-NEXT: kmovd %edi, %k1 598; SKX-NEXT: vorpd %zmm1, %zmm2, %zmm0 {%k1} 599; SKX-NEXT: retq 600entry: 601 %0 = bitcast <8 x double> %__A to <8 x i64> 602 %1 = bitcast <8 x double> %__B to <8 x i64> 603 %or.i.i = or <8 x i64> %1, %0 604 %2 = bitcast <8 x i64> %or.i.i to <8 x double> 605 %3 = bitcast i8 %__U to <8 x i1> 606 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W 607 ret <8 x double> %4 608} 609 610define <8 x double> @test_mm512_maskz_or_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 611; KNL-LABEL: test_mm512_maskz_or_pd: 612; KNL: ## %bb.0: ## %entry 613; KNL-NEXT: kmovw %edi, %k1 614; KNL-NEXT: vporq %zmm0, %zmm1, %zmm0 {%k1} {z} 615; KNL-NEXT: retq 616; 617; SKX-LABEL: test_mm512_maskz_or_pd: 618; SKX: ## %bb.0: ## %entry 619; SKX-NEXT: kmovd %edi, %k1 620; SKX-NEXT: vorpd %zmm0, %zmm1, %zmm0 {%k1} {z} 621; SKX-NEXT: retq 622entry: 623 %0 = bitcast <8 x double> %__A to <8 x i64> 624 %1 = bitcast <8 x double> %__B to <8 x i64> 625 %or.i.i = or <8 x i64> %1, %0 626 %2 = bitcast <8 x i64> %or.i.i to <8 x double> 627 %3 = bitcast i8 %__U to <8 x i1> 628 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer 629 ret <8 x double> %4 630} 631 632define <16 x float> @test_mm512_mask_or_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 633; KNL-LABEL: test_mm512_mask_or_ps: 634; KNL: ## %bb.0: ## %entry 635; KNL-NEXT: kmovw %edi, %k1 636; KNL-NEXT: vpord %zmm1, %zmm2, %zmm0 {%k1} 637; KNL-NEXT: retq 638; 639; SKX-LABEL: test_mm512_mask_or_ps: 640; SKX: ## %bb.0: ## %entry 641; SKX-NEXT: kmovd %edi, %k1 642; SKX-NEXT: vorps %zmm1, %zmm2, %zmm0 {%k1} 643; SKX-NEXT: retq 644entry: 645 %0 = bitcast <16 x float> %__A to <16 x i32> 646 %1 = bitcast <16 x float> %__B to <16 x i32> 647 %or.i.i = or <16 x i32> %1, %0 648 %2 = bitcast <16 x i32> %or.i.i to <16 x float> 649 %3 = bitcast i16 %__U to <16 x i1> 650 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W 651 ret <16 x float> %4 652} 653 654define <16 x float> @test_mm512_maskz_or_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 655; KNL-LABEL: test_mm512_maskz_or_ps: 656; KNL: ## %bb.0: ## %entry 657; KNL-NEXT: kmovw %edi, %k1 658; KNL-NEXT: vpord %zmm0, %zmm1, %zmm0 {%k1} {z} 659; KNL-NEXT: retq 660; 661; SKX-LABEL: test_mm512_maskz_or_ps: 662; SKX: ## %bb.0: ## %entry 663; SKX-NEXT: kmovd %edi, %k1 664; SKX-NEXT: vorps %zmm0, %zmm1, %zmm0 {%k1} {z} 665; SKX-NEXT: retq 666entry: 667 %0 = bitcast <16 x float> %__A to <16 x i32> 668 %1 = bitcast <16 x float> %__B to <16 x i32> 669 %or.i.i = or <16 x i32> %1, %0 670 %2 = bitcast <16 x i32> %or.i.i to <16 x float> 671 %3 = bitcast i16 %__U to <16 x i1> 672 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer 673 ret <16 x float> %4 674} 675 676define <8 x double> @test_mm512_mask_and_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 677; KNL-LABEL: test_mm512_mask_and_pd: 678; KNL: ## %bb.0: ## %entry 679; KNL-NEXT: kmovw %edi, %k1 680; KNL-NEXT: vpandq %zmm1, %zmm2, %zmm0 {%k1} 681; KNL-NEXT: retq 682; 683; SKX-LABEL: test_mm512_mask_and_pd: 684; SKX: ## %bb.0: ## %entry 685; SKX-NEXT: kmovd %edi, %k1 686; SKX-NEXT: vandpd %zmm1, %zmm2, %zmm0 {%k1} 687; SKX-NEXT: retq 688entry: 689 %0 = bitcast <8 x double> %__A to <8 x i64> 690 %1 = bitcast <8 x double> %__B to <8 x i64> 691 %and.i.i = and <8 x i64> %1, %0 692 %2 = bitcast <8 x i64> %and.i.i to <8 x double> 693 %3 = bitcast i8 %__U to <8 x i1> 694 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W 695 ret <8 x double> %4 696} 697 698define <8 x double> @test_mm512_maskz_and_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 699; KNL-LABEL: test_mm512_maskz_and_pd: 700; KNL: ## %bb.0: ## %entry 701; KNL-NEXT: kmovw %edi, %k1 702; KNL-NEXT: vpandq %zmm0, %zmm1, %zmm0 {%k1} {z} 703; KNL-NEXT: retq 704; 705; SKX-LABEL: test_mm512_maskz_and_pd: 706; SKX: ## %bb.0: ## %entry 707; SKX-NEXT: kmovd %edi, %k1 708; SKX-NEXT: vandpd %zmm0, %zmm1, %zmm0 {%k1} {z} 709; SKX-NEXT: retq 710entry: 711 %0 = bitcast <8 x double> %__A to <8 x i64> 712 %1 = bitcast <8 x double> %__B to <8 x i64> 713 %and.i.i = and <8 x i64> %1, %0 714 %2 = bitcast <8 x i64> %and.i.i to <8 x double> 715 %3 = bitcast i8 %__U to <8 x i1> 716 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer 717 ret <8 x double> %4 718} 719 720define <16 x float> @test_mm512_mask_and_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 721; KNL-LABEL: test_mm512_mask_and_ps: 722; KNL: ## %bb.0: ## %entry 723; KNL-NEXT: kmovw %edi, %k1 724; KNL-NEXT: vpandd %zmm1, %zmm2, %zmm0 {%k1} 725; KNL-NEXT: retq 726; 727; SKX-LABEL: test_mm512_mask_and_ps: 728; SKX: ## %bb.0: ## %entry 729; SKX-NEXT: kmovd %edi, %k1 730; SKX-NEXT: vandps %zmm1, %zmm2, %zmm0 {%k1} 731; SKX-NEXT: retq 732entry: 733 %0 = bitcast <16 x float> %__A to <16 x i32> 734 %1 = bitcast <16 x float> %__B to <16 x i32> 735 %and.i.i = and <16 x i32> %1, %0 736 %2 = bitcast <16 x i32> %and.i.i to <16 x float> 737 %3 = bitcast i16 %__U to <16 x i1> 738 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W 739 ret <16 x float> %4 740} 741 742define <16 x float> @test_mm512_maskz_and_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 743; KNL-LABEL: test_mm512_maskz_and_ps: 744; KNL: ## %bb.0: ## %entry 745; KNL-NEXT: kmovw %edi, %k1 746; KNL-NEXT: vpandd %zmm0, %zmm1, %zmm0 {%k1} {z} 747; KNL-NEXT: retq 748; 749; SKX-LABEL: test_mm512_maskz_and_ps: 750; SKX: ## %bb.0: ## %entry 751; SKX-NEXT: kmovd %edi, %k1 752; SKX-NEXT: vandps %zmm0, %zmm1, %zmm0 {%k1} {z} 753; SKX-NEXT: retq 754entry: 755 %0 = bitcast <16 x float> %__A to <16 x i32> 756 %1 = bitcast <16 x float> %__B to <16 x i32> 757 %and.i.i = and <16 x i32> %1, %0 758 %2 = bitcast <16 x i32> %and.i.i to <16 x float> 759 %3 = bitcast i16 %__U to <16 x i1> 760 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer 761 ret <16 x float> %4 762} 763 764define <8 x double> @test_mm512_mask_andnot_pd(<8 x double> %__W, i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 765; KNL-LABEL: test_mm512_mask_andnot_pd: 766; KNL: ## %bb.0: ## %entry 767; KNL-NEXT: kmovw %edi, %k1 768; KNL-NEXT: vpandnq %zmm2, %zmm1, %zmm0 {%k1} 769; KNL-NEXT: retq 770; 771; SKX-LABEL: test_mm512_mask_andnot_pd: 772; SKX: ## %bb.0: ## %entry 773; SKX-NEXT: kmovd %edi, %k1 774; SKX-NEXT: vandnpd %zmm2, %zmm1, %zmm0 {%k1} 775; SKX-NEXT: retq 776entry: 777 %0 = bitcast <8 x double> %__A to <8 x i64> 778 %neg.i.i = xor <8 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1> 779 %1 = bitcast <8 x double> %__B to <8 x i64> 780 %and.i.i = and <8 x i64> %1, %neg.i.i 781 %2 = bitcast <8 x i64> %and.i.i to <8 x double> 782 %3 = bitcast i8 %__U to <8 x i1> 783 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> %__W 784 ret <8 x double> %4 785} 786 787define <8 x double> @test_mm512_maskz_andnot_pd(i8 zeroext %__U, <8 x double> %__A, <8 x double> %__B) { 788; KNL-LABEL: test_mm512_maskz_andnot_pd: 789; KNL: ## %bb.0: ## %entry 790; KNL-NEXT: kmovw %edi, %k1 791; KNL-NEXT: vpandnq %zmm1, %zmm0, %zmm0 {%k1} {z} 792; KNL-NEXT: retq 793; 794; SKX-LABEL: test_mm512_maskz_andnot_pd: 795; SKX: ## %bb.0: ## %entry 796; SKX-NEXT: kmovd %edi, %k1 797; SKX-NEXT: vandnpd %zmm1, %zmm0, %zmm0 {%k1} {z} 798; SKX-NEXT: retq 799entry: 800 %0 = bitcast <8 x double> %__A to <8 x i64> 801 %neg.i.i = xor <8 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1> 802 %1 = bitcast <8 x double> %__B to <8 x i64> 803 %and.i.i = and <8 x i64> %1, %neg.i.i 804 %2 = bitcast <8 x i64> %and.i.i to <8 x double> 805 %3 = bitcast i8 %__U to <8 x i1> 806 %4 = select <8 x i1> %3, <8 x double> %2, <8 x double> zeroinitializer 807 ret <8 x double> %4 808} 809 810define <16 x float> @test_mm512_mask_andnot_ps(<16 x float> %__W, i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 811; KNL-LABEL: test_mm512_mask_andnot_ps: 812; KNL: ## %bb.0: ## %entry 813; KNL-NEXT: kmovw %edi, %k1 814; KNL-NEXT: vpandnd %zmm2, %zmm1, %zmm0 {%k1} 815; KNL-NEXT: retq 816; 817; SKX-LABEL: test_mm512_mask_andnot_ps: 818; SKX: ## %bb.0: ## %entry 819; SKX-NEXT: kmovd %edi, %k1 820; SKX-NEXT: vandnps %zmm2, %zmm1, %zmm0 {%k1} 821; SKX-NEXT: retq 822entry: 823 %0 = bitcast <16 x float> %__A to <16 x i32> 824 %neg.i.i = xor <16 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 825 %1 = bitcast <16 x float> %__B to <16 x i32> 826 %and.i.i = and <16 x i32> %1, %neg.i.i 827 %2 = bitcast <16 x i32> %and.i.i to <16 x float> 828 %3 = bitcast i16 %__U to <16 x i1> 829 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> %__W 830 ret <16 x float> %4 831} 832 833define <16 x float> @test_mm512_maskz_andnot_ps(i16 zeroext %__U, <16 x float> %__A, <16 x float> %__B) { 834; KNL-LABEL: test_mm512_maskz_andnot_ps: 835; KNL: ## %bb.0: ## %entry 836; KNL-NEXT: kmovw %edi, %k1 837; KNL-NEXT: vpandnd %zmm1, %zmm0, %zmm0 {%k1} {z} 838; KNL-NEXT: retq 839; 840; SKX-LABEL: test_mm512_maskz_andnot_ps: 841; SKX: ## %bb.0: ## %entry 842; SKX-NEXT: kmovd %edi, %k1 843; SKX-NEXT: vandnps %zmm1, %zmm0, %zmm0 {%k1} {z} 844; SKX-NEXT: retq 845entry: 846 %0 = bitcast <16 x float> %__A to <16 x i32> 847 %neg.i.i = xor <16 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 848 %1 = bitcast <16 x float> %__B to <16 x i32> 849 %and.i.i = and <16 x i32> %1, %neg.i.i 850 %2 = bitcast <16 x i32> %and.i.i to <16 x float> 851 %3 = bitcast i16 %__U to <16 x i1> 852 %4 = select <16 x i1> %3, <16 x float> %2, <16 x float> zeroinitializer 853 ret <16 x float> %4 854} 855 856define <16 x i32> @ternlog_and_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) { 857; ALL-LABEL: ternlog_and_andn: 858; ALL: ## %bb.0: 859; ALL-NEXT: vpternlogd $8, %zmm1, %zmm2, %zmm0 860; ALL-NEXT: retq 861 %a = xor <16 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 862 %b = and <16 x i32> %y, %a 863 %c = and <16 x i32> %b, %z 864 ret <16 x i32> %c 865} 866 867define <16 x i32> @ternlog_or_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) { 868; ALL-LABEL: ternlog_or_andn: 869; ALL: ## %bb.0: 870; ALL-NEXT: vpternlogd $206, %zmm1, %zmm2, %zmm0 871; ALL-NEXT: retq 872 %a = xor <16 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 873 %b = and <16 x i32> %y, %a 874 %c = or <16 x i32> %b, %z 875 ret <16 x i32> %c 876} 877 878define <16 x i32> @ternlog_xor_andn(<16 x i32> %x, <16 x i32> %y, <16 x i32> %z) { 879; ALL-LABEL: ternlog_xor_andn: 880; ALL: ## %bb.0: 881; ALL-NEXT: vpternlogd $198, %zmm1, %zmm2, %zmm0 882; ALL-NEXT: retq 883 %a = xor <16 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 884 %b = and <16 x i32> %y, %a 885 %c = xor <16 x i32> %b, %z 886 ret <16 x i32> %c 887} 888 889define <16 x i32> @ternlog_or_and_mask(<16 x i32> %x, <16 x i32> %y) { 890; KNL-LABEL: ternlog_or_and_mask: 891; KNL: ## %bb.0: 892; KNL-NEXT: vpandq {{.*}}(%rip), %zmm0, %zmm0 893; KNL-NEXT: vpord %zmm1, %zmm0, %zmm0 894; KNL-NEXT: retq 895; 896; SKX-LABEL: ternlog_or_and_mask: 897; SKX: ## %bb.0: 898; SKX-NEXT: vandps {{.*}}(%rip), %zmm0, %zmm0 899; SKX-NEXT: vorps %zmm1, %zmm0, %zmm0 900; SKX-NEXT: retq 901 %a = and <16 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 902 %b = or <16 x i32> %a, %y 903 ret <16 x i32> %b 904} 905 906define <8 x i64> @ternlog_xor_and_mask(<8 x i64> %x, <8 x i64> %y) { 907; KNL-LABEL: ternlog_xor_and_mask: 908; KNL: ## %bb.0: 909; KNL-NEXT: vpandd {{.*}}(%rip), %zmm0, %zmm0 910; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm0 911; KNL-NEXT: retq 912; 913; SKX-LABEL: ternlog_xor_and_mask: 914; SKX: ## %bb.0: 915; SKX-NEXT: vandps {{.*}}(%rip), %zmm0, %zmm0 916; SKX-NEXT: vxorps %zmm1, %zmm0, %zmm0 917; SKX-NEXT: retq 918 %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 919 %b = xor <8 x i64> %a, %y 920 ret <8 x i64> %b 921} 922