@@ -364,6 +364,28 @@ define <8 x i32> @andn_disguised_i8_elts(<8 x i32> %x, <8 x i32> %y, <8 x i32> %
364
364
ret <8 x i32 > %add1
365
365
}
366
366
367
+ define <8 x i32 > @andn_variable_mask_operand (<8 x i32 > %x , <8 x i32 > %y , <8 x i32 > %z ) {
368
+ ; AVX1-LABEL: andn_variable_mask_operand:
369
+ ; AVX1: # %bb.0:
370
+ ; AVX1-NEXT: vandnps %ymm2, %ymm0, %ymm0
371
+ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
372
+ ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
373
+ ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
374
+ ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
375
+ ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
376
+ ; AVX1-NEXT: retq
377
+ ;
378
+ ; INT256-LABEL: andn_variable_mask_operand:
379
+ ; INT256: # %bb.0:
380
+ ; INT256-NEXT: vpandn %ymm2, %ymm0, %ymm0
381
+ ; INT256-NEXT: vpaddd %ymm1, %ymm0, %ymm0
382
+ ; INT256-NEXT: retq
383
+ %and = and <8 x i32 > %x , %z
384
+ %xor = xor <8 x i32 > %and , %z ; demanded bits will make this a 'not'
385
+ %add = add <8 x i32 > %xor , %y
386
+ ret <8 x i32 > %add
387
+ }
388
+
367
389
define <8 x i32 > @or_disguised_i8_elts (<8 x i32 > %x , <8 x i32 > %y , <8 x i32 > %z ) {
368
390
; AVX1-LABEL: or_disguised_i8_elts:
369
391
; AVX1: # %bb.0:
0 commit comments