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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%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 {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 122; KNL-NEXT: retq 123; 124; SKX-LABEL: orq_broadcast: 125; SKX: ## %bb.0: 126; SKX-NEXT: vorpd {{\.?LCPI[0-9]+_[0-9]+}}(%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, ptr %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>, ptr %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, ptr %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, ptr %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; ALL-LABEL: ternlog_or_and_mask: 891; ALL: ## %bb.0: 892; ALL-NEXT: vpternlogd $236, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0 893; ALL-NEXT: retq 894 %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> 895 %b = or <16 x i32> %a, %y 896 ret <16 x i32> %b 897} 898 899define <8 x i64> @ternlog_xor_and_mask(<8 x i64> %x, <8 x i64> %y) { 900; ALL-LABEL: ternlog_xor_and_mask: 901; ALL: ## %bb.0: 902; ALL-NEXT: vpternlogq $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm0 903; ALL-NEXT: retq 904 %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 905 %b = xor <8 x i64> %a, %y 906 ret <8 x i64> %b 907} 908 909define <16 x i32> @ternlog_maskz_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) { 910; ALL-LABEL: ternlog_maskz_or_and_mask: 911; ALL: ## %bb.0: 912; ALL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm3 913; ALL-NEXT: vpsrad $31, %zmm2, %zmm0 914; ALL-NEXT: vpternlogd $224, %zmm1, %zmm3, %zmm0 915; ALL-NEXT: retq 916 %m = icmp slt <16 x i32> %mask, zeroinitializer 917 %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> 918 %b = or <16 x i32> %a, %y 919 %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> zeroinitializer 920 ret <16 x i32> %c 921} 922 923define <8 x i64> @ternlog_maskz_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) { 924; ALL-LABEL: ternlog_maskz_xor_and_mask: 925; ALL: ## %bb.0: 926; ALL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm3 927; ALL-NEXT: vpsraq $63, %zmm2, %zmm0 928; ALL-NEXT: vpternlogq $96, %zmm1, %zmm3, %zmm0 929; ALL-NEXT: retq 930 %m = icmp slt <8 x i64> %mask, zeroinitializer 931 %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 932 %b = xor <8 x i64> %a, %y 933 %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> zeroinitializer 934 ret <8 x i64> %c 935} 936 937define <16 x i32> @ternlog_maskx_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) { 938; KNL-LABEL: ternlog_maskx_or_and_mask: 939; KNL: ## %bb.0: 940; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 941; KNL-NEXT: vpcmpgtd %zmm2, %zmm3, %k1 942; KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm2 943; KNL-NEXT: vpord %zmm1, %zmm2, %zmm0 {%k1} 944; KNL-NEXT: retq 945; 946; SKX-LABEL: ternlog_maskx_or_and_mask: 947; SKX: ## %bb.0: 948; SKX-NEXT: vpmovd2m %zmm2, %k1 949; SKX-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm2 950; SKX-NEXT: vorps %zmm1, %zmm2, %zmm0 {%k1} 951; SKX-NEXT: retq 952 %m = icmp slt <16 x i32> %mask, zeroinitializer 953 %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> 954 %b = or <16 x i32> %a, %y 955 %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> %x 956 ret <16 x i32> %c 957} 958 959define <16 x i32> @ternlog_masky_or_and_mask(<16 x i32> %x, <16 x i32> %y, <16 x i32> %mask) { 960; KNL-LABEL: ternlog_masky_or_and_mask: 961; KNL: ## %bb.0: 962; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 963; KNL-NEXT: vpcmpgtd %zmm2, %zmm3, %k1 964; KNL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 965; KNL-NEXT: vpord %zmm1, %zmm0, %zmm1 {%k1} 966; KNL-NEXT: vmovdqa64 %zmm1, %zmm0 967; KNL-NEXT: retq 968; 969; SKX-LABEL: ternlog_masky_or_and_mask: 970; SKX: ## %bb.0: 971; SKX-NEXT: vpmovd2m %zmm2, %k1 972; SKX-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 973; SKX-NEXT: vorps %zmm1, %zmm0, %zmm1 {%k1} 974; SKX-NEXT: vmovaps %zmm1, %zmm0 975; SKX-NEXT: retq 976 %m = icmp slt <16 x i32> %mask, zeroinitializer 977 %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> 978 %b = or <16 x i32> %a, %y 979 %c = select <16 x i1> %m, <16 x i32> %b, <16 x i32> %y 980 ret <16 x i32> %c 981} 982 983define <8 x i64> @ternlog_maskx_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) { 984; KNL-LABEL: ternlog_maskx_xor_and_mask: 985; KNL: ## %bb.0: 986; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 987; KNL-NEXT: vpcmpgtq %zmm2, %zmm3, %k1 988; KNL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm2 989; KNL-NEXT: vpxorq %zmm1, %zmm2, %zmm0 {%k1} 990; KNL-NEXT: retq 991; 992; SKX-LABEL: ternlog_maskx_xor_and_mask: 993; SKX: ## %bb.0: 994; SKX-NEXT: vpmovq2m %zmm2, %k1 995; SKX-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm2 996; SKX-NEXT: vxorpd %zmm1, %zmm2, %zmm0 {%k1} 997; SKX-NEXT: retq 998 %m = icmp slt <8 x i64> %mask, zeroinitializer 999 %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 1000 %b = xor <8 x i64> %a, %y 1001 %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> %x 1002 ret <8 x i64> %c 1003} 1004 1005define <8 x i64> @ternlog_masky_xor_and_mask(<8 x i64> %x, <8 x i64> %y, <8 x i64> %mask) { 1006; KNL-LABEL: ternlog_masky_xor_and_mask: 1007; KNL: ## %bb.0: 1008; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3 1009; KNL-NEXT: vpcmpgtq %zmm2, %zmm3, %k1 1010; KNL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1011; KNL-NEXT: vpxorq %zmm1, %zmm0, %zmm1 {%k1} 1012; KNL-NEXT: vmovdqa64 %zmm1, %zmm0 1013; KNL-NEXT: retq 1014; 1015; SKX-LABEL: ternlog_masky_xor_and_mask: 1016; SKX: ## %bb.0: 1017; SKX-NEXT: vpmovq2m %zmm2, %k1 1018; SKX-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1019; SKX-NEXT: vxorpd %zmm1, %zmm0, %zmm1 {%k1} 1020; SKX-NEXT: vmovapd %zmm1, %zmm0 1021; SKX-NEXT: retq 1022 %m = icmp slt <8 x i64> %mask, zeroinitializer 1023 %a = and <8 x i64> %x, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 1024 %b = xor <8 x i64> %a, %y 1025 %c = select <8 x i1> %m, <8 x i64> %b, <8 x i64> %y 1026 ret <8 x i64> %c 1027} 1028