1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2 3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F 4; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL 5 6define <4 x float> @fadd_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) { 7; AVX2-LABEL: fadd_v4f32: 8; AVX2: # %bb.0: 9; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 10; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 11; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 12; AVX2-NEXT: vaddps %xmm0, %xmm1, %xmm0 13; AVX2-NEXT: retq 14; 15; AVX512F-LABEL: fadd_v4f32: 16; AVX512F: # %bb.0: 17; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 18; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 19; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 20; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 21; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 22; AVX512F-NEXT: vaddps %xmm0, %xmm1, %xmm0 23; AVX512F-NEXT: vzeroupper 24; AVX512F-NEXT: retq 25; 26; AVX512VL-LABEL: fadd_v4f32: 27; AVX512VL: # %bb.0: 28; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 29; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 30; AVX512VL-NEXT: vaddps %xmm2, %xmm1, %xmm1 {%k1} 31; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 32; AVX512VL-NEXT: retq 33 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0> 34 %r = fadd <4 x float> %x, %s 35 ret <4 x float> %r 36} 37 38define <8 x float> @fadd_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) { 39; AVX2-LABEL: fadd_v8f32_commute: 40; AVX2: # %bb.0: 41; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 42; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 43; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 44; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0 45; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0 46; AVX2-NEXT: retq 47; 48; AVX512F-LABEL: fadd_v8f32_commute: 49; AVX512F: # %bb.0: 50; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 51; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 52; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 53; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 54; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 55; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 56; AVX512F-NEXT: vaddps %ymm1, %ymm0, %ymm0 57; AVX512F-NEXT: retq 58; 59; AVX512VL-LABEL: fadd_v8f32_commute: 60; AVX512VL: # %bb.0: 61; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 62; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 63; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 64; AVX512VL-NEXT: vaddps %ymm2, %ymm1, %ymm1 {%k1} 65; AVX512VL-NEXT: vmovaps %ymm1, %ymm0 66; AVX512VL-NEXT: retq 67 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0> 68 %r = fadd <8 x float> %s, %x 69 ret <8 x float> %r 70} 71 72define <16 x float> @fadd_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 73; AVX2-LABEL: fadd_v16f32_swap: 74; AVX2: # %bb.0: 75; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 76; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 77; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 78; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 79; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 80; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 81; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 82; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 83; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 84; AVX2-NEXT: vaddps %ymm3, %ymm1, %ymm0 85; AVX2-NEXT: vaddps %ymm4, %ymm2, %ymm1 86; AVX2-NEXT: retq 87; 88; AVX512-LABEL: fadd_v16f32_swap: 89; AVX512: # %bb.0: 90; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 91; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 92; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 93; AVX512-NEXT: vaddps %zmm2, %zmm1, %zmm0 94; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 95; AVX512-NEXT: retq 96 %s = select <16 x i1> %b, <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, <16 x float> %y 97 %r = fadd <16 x float> %x, %s 98 ret <16 x float> %r 99} 100 101define <16 x float> @fadd_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 102; AVX2-LABEL: fadd_v16f32_commute_swap: 103; AVX2: # %bb.0: 104; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 105; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 106; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 107; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 108; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 109; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 110; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 111; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 112; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 113; AVX2-NEXT: vaddps %ymm1, %ymm3, %ymm0 114; AVX2-NEXT: vaddps %ymm2, %ymm4, %ymm1 115; AVX2-NEXT: retq 116; 117; AVX512-LABEL: fadd_v16f32_commute_swap: 118; AVX512: # %bb.0: 119; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 120; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 121; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 122; AVX512-NEXT: vaddps %zmm2, %zmm1, %zmm0 123; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 124; AVX512-NEXT: retq 125 %s = select <16 x i1> %b, <16 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, <16 x float> %y 126 %r = fadd <16 x float> %s, %x 127 ret <16 x float> %r 128} 129 130define <4 x float> @fsub_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) { 131; AVX2-LABEL: fsub_v4f32: 132; AVX2: # %bb.0: 133; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 134; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 135; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 136; AVX2-NEXT: vsubps %xmm0, %xmm1, %xmm0 137; AVX2-NEXT: retq 138; 139; AVX512F-LABEL: fsub_v4f32: 140; AVX512F: # %bb.0: 141; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 142; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 143; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 144; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z} 145; AVX512F-NEXT: vsubps %xmm0, %xmm1, %xmm0 146; AVX512F-NEXT: vzeroupper 147; AVX512F-NEXT: retq 148; 149; AVX512VL-LABEL: fsub_v4f32: 150; AVX512VL: # %bb.0: 151; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 152; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 153; AVX512VL-NEXT: vsubps %xmm2, %xmm1, %xmm1 {%k1} 154; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 155; AVX512VL-NEXT: retq 156 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> zeroinitializer 157 %r = fsub <4 x float> %x, %s 158 ret <4 x float> %r 159} 160 161; negative test - fsub is not commutative; there is no identity constant for operand 0 162 163define <8 x float> @fsub_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) { 164; AVX2-LABEL: fsub_v8f32_commute: 165; AVX2: # %bb.0: 166; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 167; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 168; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 169; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 170; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0 171; AVX2-NEXT: retq 172; 173; AVX512F-LABEL: fsub_v8f32_commute: 174; AVX512F: # %bb.0: 175; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 176; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 177; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 178; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 179; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z} 180; AVX512F-NEXT: vsubps %ymm1, %ymm0, %ymm0 181; AVX512F-NEXT: retq 182; 183; AVX512VL-LABEL: fsub_v8f32_commute: 184; AVX512VL: # %bb.0: 185; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 186; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 187; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 188; AVX512VL-NEXT: vmovaps %ymm2, %ymm0 {%k1} {z} 189; AVX512VL-NEXT: vsubps %ymm1, %ymm0, %ymm0 190; AVX512VL-NEXT: retq 191 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer 192 %r = fsub <8 x float> %s, %x 193 ret <8 x float> %r 194} 195 196define <16 x float> @fsub_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 197; AVX2-LABEL: fsub_v16f32_swap: 198; AVX2: # %bb.0: 199; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 200; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 201; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 202; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 203; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 204; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 205; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 206; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 207; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 208; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 209; AVX2-NEXT: vsubps %ymm0, %ymm1, %ymm0 210; AVX2-NEXT: vsubps %ymm4, %ymm2, %ymm1 211; AVX2-NEXT: retq 212; 213; AVX512-LABEL: fsub_v16f32_swap: 214; AVX512: # %bb.0: 215; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 216; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 217; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 218; AVX512-NEXT: vsubps %zmm2, %zmm1, %zmm0 219; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 220; AVX512-NEXT: retq 221 %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y 222 %r = fsub <16 x float> %x, %s 223 ret <16 x float> %r 224} 225 226; negative test - fsub is not commutative; there is no identity constant for operand 0 227 228define <16 x float> @fsub_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 229; AVX2-LABEL: fsub_v16f32_commute_swap: 230; AVX2: # %bb.0: 231; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 232; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 233; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 234; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 235; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 236; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 237; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 238; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 239; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 240; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 241; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0 242; AVX2-NEXT: vsubps %ymm2, %ymm4, %ymm1 243; AVX2-NEXT: retq 244; 245; AVX512-LABEL: fsub_v16f32_commute_swap: 246; AVX512: # %bb.0: 247; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 248; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 249; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 250; AVX512-NEXT: vmovaps %zmm2, %zmm0 {%k1} {z} 251; AVX512-NEXT: vsubps %zmm1, %zmm0, %zmm0 252; AVX512-NEXT: retq 253 %s = select <16 x i1> %b, <16 x float> zeroinitializer, <16 x float> %y 254 %r = fsub <16 x float> %s, %x 255 ret <16 x float> %r 256} 257 258define <4 x float> @fmul_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) { 259; AVX2-LABEL: fmul_v4f32: 260; AVX2: # %bb.0: 261; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 262; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 263; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 264; AVX2-NEXT: vmulps %xmm0, %xmm1, %xmm0 265; AVX2-NEXT: retq 266; 267; AVX512F-LABEL: fmul_v4f32: 268; AVX512F: # %bb.0: 269; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 270; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 271; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 272; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 273; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 274; AVX512F-NEXT: vmulps %xmm0, %xmm1, %xmm0 275; AVX512F-NEXT: vzeroupper 276; AVX512F-NEXT: retq 277; 278; AVX512VL-LABEL: fmul_v4f32: 279; AVX512VL: # %bb.0: 280; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 281; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 282; AVX512VL-NEXT: vmulps %xmm2, %xmm1, %xmm1 {%k1} 283; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 284; AVX512VL-NEXT: retq 285 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0> 286 %r = fmul <4 x float> %x, %s 287 ret <4 x float> %r 288} 289 290define <8 x float> @fmul_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) { 291; AVX2-LABEL: fmul_v8f32_commute: 292; AVX2: # %bb.0: 293; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 294; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 295; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 296; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0 297; AVX2-NEXT: vmulps %ymm1, %ymm0, %ymm0 298; AVX2-NEXT: retq 299; 300; AVX512F-LABEL: fmul_v8f32_commute: 301; AVX512F: # %bb.0: 302; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 303; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 304; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 305; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 306; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 307; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 308; AVX512F-NEXT: vmulps %ymm1, %ymm0, %ymm0 309; AVX512F-NEXT: retq 310; 311; AVX512VL-LABEL: fmul_v8f32_commute: 312; AVX512VL: # %bb.0: 313; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 314; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 315; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 316; AVX512VL-NEXT: vmulps %ymm2, %ymm1, %ymm1 {%k1} 317; AVX512VL-NEXT: vmovaps %ymm1, %ymm0 318; AVX512VL-NEXT: retq 319 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0> 320 %r = fmul <8 x float> %s, %x 321 ret <8 x float> %r 322} 323 324define <16 x float> @fmul_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 325; AVX2-LABEL: fmul_v16f32_swap: 326; AVX2: # %bb.0: 327; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 328; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 329; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 330; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 331; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 332; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 333; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 334; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 335; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 336; AVX2-NEXT: vmulps %ymm3, %ymm1, %ymm0 337; AVX2-NEXT: vmulps %ymm4, %ymm2, %ymm1 338; AVX2-NEXT: retq 339; 340; AVX512-LABEL: fmul_v16f32_swap: 341; AVX512: # %bb.0: 342; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 343; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 344; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 345; AVX512-NEXT: vmulps %zmm2, %zmm1, %zmm0 346; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 347; AVX512-NEXT: retq 348 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y 349 %r = fmul <16 x float> %x, %s 350 ret <16 x float> %r 351} 352 353define <16 x float> @fmul_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 354; AVX2-LABEL: fmul_v16f32_commute_swap: 355; AVX2: # %bb.0: 356; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 357; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 358; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 359; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 360; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 361; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 362; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 363; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 364; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 365; AVX2-NEXT: vmulps %ymm1, %ymm3, %ymm0 366; AVX2-NEXT: vmulps %ymm2, %ymm4, %ymm1 367; AVX2-NEXT: retq 368; 369; AVX512-LABEL: fmul_v16f32_commute_swap: 370; AVX512: # %bb.0: 371; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 372; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 373; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 374; AVX512-NEXT: vmulps %zmm2, %zmm1, %zmm0 375; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 376; AVX512-NEXT: retq 377 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y 378 %r = fmul <16 x float> %s, %x 379 ret <16 x float> %r 380} 381 382define <4 x float> @fdiv_v4f32(<4 x i1> %b, <4 x float> noundef %x, <4 x float> noundef %y) { 383; AVX2-LABEL: fdiv_v4f32: 384; AVX2: # %bb.0: 385; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 386; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 387; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 388; AVX2-NEXT: vdivps %xmm0, %xmm1, %xmm0 389; AVX2-NEXT: retq 390; 391; AVX512F-LABEL: fdiv_v4f32: 392; AVX512F: # %bb.0: 393; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 394; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 395; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 396; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 397; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 398; AVX512F-NEXT: vdivps %xmm0, %xmm1, %xmm0 399; AVX512F-NEXT: vzeroupper 400; AVX512F-NEXT: retq 401; 402; AVX512VL-LABEL: fdiv_v4f32: 403; AVX512VL: # %bb.0: 404; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 405; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 406; AVX512VL-NEXT: vdivps %xmm2, %xmm1, %xmm1 {%k1} 407; AVX512VL-NEXT: vmovaps %xmm1, %xmm0 408; AVX512VL-NEXT: retq 409 %s = select <4 x i1> %b, <4 x float> %y, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0> 410 %r = fdiv <4 x float> %x, %s 411 ret <4 x float> %r 412} 413 414define <8 x float> @fdiv_v8f32_commute(<8 x i1> %b, <8 x float> noundef %x, <8 x float> noundef %y) { 415; AVX2-LABEL: fdiv_v8f32_commute: 416; AVX2: # %bb.0: 417; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 418; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 419; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 420; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0 421; AVX2-NEXT: vdivps %ymm1, %ymm0, %ymm0 422; AVX2-NEXT: retq 423; 424; AVX512F-LABEL: fdiv_v8f32_commute: 425; AVX512F: # %bb.0: 426; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 427; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 428; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 429; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 430; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 431; AVX512F-NEXT: vmovaps %zmm2, %zmm0 {%k1} 432; AVX512F-NEXT: vdivps %ymm1, %ymm0, %ymm0 433; AVX512F-NEXT: retq 434; 435; AVX512VL-LABEL: fdiv_v8f32_commute: 436; AVX512VL: # %bb.0: 437; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 438; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 439; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 440; AVX512VL-NEXT: vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 441; AVX512VL-NEXT: vmovaps %ymm2, %ymm0 {%k1} 442; AVX512VL-NEXT: vdivps %ymm1, %ymm0, %ymm0 443; AVX512VL-NEXT: retq 444 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0> 445 %r = fdiv <8 x float> %s, %x 446 ret <8 x float> %r 447} 448 449define <16 x float> @fdiv_v16f32_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 450; AVX2-LABEL: fdiv_v16f32_swap: 451; AVX2: # %bb.0: 452; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 453; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 454; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 455; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 456; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 457; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 458; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 459; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 460; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 461; AVX2-NEXT: vdivps %ymm3, %ymm1, %ymm0 462; AVX2-NEXT: vdivps %ymm4, %ymm2, %ymm1 463; AVX2-NEXT: retq 464; 465; AVX512-LABEL: fdiv_v16f32_swap: 466; AVX512: # %bb.0: 467; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 468; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 469; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 470; AVX512-NEXT: vdivps %zmm2, %zmm1, %zmm0 471; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1} 472; AVX512-NEXT: retq 473 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y 474 %r = fdiv <16 x float> %x, %s 475 ret <16 x float> %r 476} 477 478define <16 x float> @fdiv_v16f32_commute_swap(<16 x i1> %b, <16 x float> noundef %x, <16 x float> noundef %y) { 479; AVX2-LABEL: fdiv_v16f32_commute_swap: 480; AVX2: # %bb.0: 481; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 482; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 483; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 484; AVX2-NEXT: vbroadcastss {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 485; AVX2-NEXT: vblendvps %ymm5, %ymm6, %ymm3, %ymm3 486; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 487; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 488; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 489; AVX2-NEXT: vblendvps %ymm0, %ymm6, %ymm4, %ymm4 490; AVX2-NEXT: vdivps %ymm1, %ymm3, %ymm0 491; AVX2-NEXT: vdivps %ymm2, %ymm4, %ymm1 492; AVX2-NEXT: retq 493; 494; AVX512-LABEL: fdiv_v16f32_commute_swap: 495; AVX512: # %bb.0: 496; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 497; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 498; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 499; AVX512-NEXT: vbroadcastss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2 {%k1} 500; AVX512-NEXT: vdivps %zmm1, %zmm2, %zmm0 501; AVX512-NEXT: retq 502 %s = select <16 x i1> %b, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, <16 x float> %y 503 %r = fdiv <16 x float> %s, %x 504 ret <16 x float> %r 505} 506 507define <8 x float> @fadd_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) { 508; AVX2-LABEL: fadd_v8f32_cast_cond: 509; AVX2: # %bb.0: 510; AVX2-NEXT: vmovd %edi, %xmm2 511; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 512; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 513; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 514; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 515; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 516; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1 517; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0 518; AVX2-NEXT: retq 519; 520; AVX512F-LABEL: fadd_v8f32_cast_cond: 521; AVX512F: # %bb.0: 522; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 523; AVX512F-NEXT: kmovw %edi, %k1 524; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 525; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1} 526; AVX512F-NEXT: vaddps %ymm2, %ymm0, %ymm0 527; AVX512F-NEXT: retq 528; 529; AVX512VL-LABEL: fadd_v8f32_cast_cond: 530; AVX512VL: # %bb.0: 531; AVX512VL-NEXT: kmovw %edi, %k1 532; AVX512VL-NEXT: vaddps %ymm1, %ymm0, %ymm0 {%k1} 533; AVX512VL-NEXT: retq 534 %b = bitcast i8 %pb to <8 x i1> 535 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0> 536 %r = fadd <8 x float> %x, %s 537 ret <8 x float> %r 538} 539 540define <8 x double> @fadd_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) { 541; AVX2-LABEL: fadd_v8f64_cast_cond: 542; AVX2: # %bb.0: 543; AVX2-NEXT: vmovd %edi, %xmm4 544; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 545; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 546; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 547; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 548; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0] 549; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3 550; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 551; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 552; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 553; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2 554; AVX2-NEXT: vaddpd %ymm2, %ymm0, %ymm0 555; AVX2-NEXT: vaddpd %ymm3, %ymm1, %ymm1 556; AVX2-NEXT: retq 557; 558; AVX512-LABEL: fadd_v8f64_cast_cond: 559; AVX512: # %bb.0: 560; AVX512-NEXT: kmovw %edi, %k1 561; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0 {%k1} 562; AVX512-NEXT: retq 563 %b = bitcast i8 %pb to <8 x i1> 564 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0, double -0.0> 565 %r = fadd <8 x double> %x, %s 566 ret <8 x double> %r 567} 568 569define <8 x float> @fsub_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) { 570; AVX2-LABEL: fsub_v8f32_cast_cond: 571; AVX2: # %bb.0: 572; AVX2-NEXT: vmovd %edi, %xmm2 573; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 574; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 575; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 576; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 577; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 578; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm0 579; AVX2-NEXT: retq 580; 581; AVX512F-LABEL: fsub_v8f32_cast_cond: 582; AVX512F: # %bb.0: 583; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 584; AVX512F-NEXT: kmovw %edi, %k1 585; AVX512F-NEXT: vmovaps %zmm1, %zmm1 {%k1} {z} 586; AVX512F-NEXT: vsubps %ymm1, %ymm0, %ymm0 587; AVX512F-NEXT: retq 588; 589; AVX512VL-LABEL: fsub_v8f32_cast_cond: 590; AVX512VL: # %bb.0: 591; AVX512VL-NEXT: kmovw %edi, %k1 592; AVX512VL-NEXT: vsubps %ymm1, %ymm0, %ymm0 {%k1} 593; AVX512VL-NEXT: retq 594 %b = bitcast i8 %pb to <8 x i1> 595 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> zeroinitializer 596 %r = fsub <8 x float> %x, %s 597 ret <8 x float> %r 598} 599 600define <8 x double> @fsub_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) { 601; AVX2-LABEL: fsub_v8f64_cast_cond: 602; AVX2: # %bb.0: 603; AVX2-NEXT: vmovd %edi, %xmm4 604; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 605; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 606; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 607; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 608; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 609; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 610; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 611; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 612; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 613; AVX2-NEXT: vsubpd %ymm2, %ymm0, %ymm0 614; AVX2-NEXT: vsubpd %ymm3, %ymm1, %ymm1 615; AVX2-NEXT: retq 616; 617; AVX512-LABEL: fsub_v8f64_cast_cond: 618; AVX512: # %bb.0: 619; AVX512-NEXT: kmovw %edi, %k1 620; AVX512-NEXT: vsubpd %zmm1, %zmm0, %zmm0 {%k1} 621; AVX512-NEXT: retq 622 %b = bitcast i8 %pb to <8 x i1> 623 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> zeroinitializer 624 %r = fsub <8 x double> %x, %s 625 ret <8 x double> %r 626} 627 628define <8 x float> @fmul_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) { 629; AVX2-LABEL: fmul_v8f32_cast_cond: 630; AVX2: # %bb.0: 631; AVX2-NEXT: vmovd %edi, %xmm2 632; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 633; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 634; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 635; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 636; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 637; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1 638; AVX2-NEXT: vmulps %ymm1, %ymm0, %ymm0 639; AVX2-NEXT: retq 640; 641; AVX512F-LABEL: fmul_v8f32_cast_cond: 642; AVX512F: # %bb.0: 643; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 644; AVX512F-NEXT: kmovw %edi, %k1 645; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 646; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1} 647; AVX512F-NEXT: vmulps %ymm2, %ymm0, %ymm0 648; AVX512F-NEXT: retq 649; 650; AVX512VL-LABEL: fmul_v8f32_cast_cond: 651; AVX512VL: # %bb.0: 652; AVX512VL-NEXT: kmovw %edi, %k1 653; AVX512VL-NEXT: vmulps %ymm1, %ymm0, %ymm0 {%k1} 654; AVX512VL-NEXT: retq 655 %b = bitcast i8 %pb to <8 x i1> 656 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0> 657 %r = fmul <8 x float> %x, %s 658 ret <8 x float> %r 659} 660 661define <8 x double> @fmul_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) { 662; AVX2-LABEL: fmul_v8f64_cast_cond: 663; AVX2: # %bb.0: 664; AVX2-NEXT: vmovd %edi, %xmm4 665; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 666; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 667; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 668; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 669; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 670; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3 671; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 672; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 673; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 674; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2 675; AVX2-NEXT: vmulpd %ymm2, %ymm0, %ymm0 676; AVX2-NEXT: vmulpd %ymm3, %ymm1, %ymm1 677; AVX2-NEXT: retq 678; 679; AVX512-LABEL: fmul_v8f64_cast_cond: 680; AVX512: # %bb.0: 681; AVX512-NEXT: kmovw %edi, %k1 682; AVX512-NEXT: vmulpd %zmm1, %zmm0, %zmm0 {%k1} 683; AVX512-NEXT: retq 684 %b = bitcast i8 %pb to <8 x i1> 685 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0> 686 %r = fmul <8 x double> %x, %s 687 ret <8 x double> %r 688} 689 690define <8 x float> @fdiv_v8f32_cast_cond(i8 noundef zeroext %pb, <8 x float> noundef %x, <8 x float> noundef %y) { 691; AVX2-LABEL: fdiv_v8f32_cast_cond: 692; AVX2: # %bb.0: 693; AVX2-NEXT: vmovd %edi, %xmm2 694; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 695; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 696; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 697; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 698; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 699; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1 700; AVX2-NEXT: vdivps %ymm1, %ymm0, %ymm0 701; AVX2-NEXT: retq 702; 703; AVX512F-LABEL: fdiv_v8f32_cast_cond: 704; AVX512F: # %bb.0: 705; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 706; AVX512F-NEXT: kmovw %edi, %k1 707; AVX512F-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0] 708; AVX512F-NEXT: vmovaps %zmm1, %zmm2 {%k1} 709; AVX512F-NEXT: vdivps %ymm2, %ymm0, %ymm0 710; AVX512F-NEXT: retq 711; 712; AVX512VL-LABEL: fdiv_v8f32_cast_cond: 713; AVX512VL: # %bb.0: 714; AVX512VL-NEXT: kmovw %edi, %k1 715; AVX512VL-NEXT: vdivps %ymm1, %ymm0, %ymm0 {%k1} 716; AVX512VL-NEXT: retq 717 %b = bitcast i8 %pb to <8 x i1> 718 %s = select <8 x i1> %b, <8 x float> %y, <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0> 719 %r = fdiv <8 x float> %x, %s 720 ret <8 x float> %r 721} 722 723define <8 x double> @fdiv_v8f64_cast_cond(i8 noundef zeroext %pb, <8 x double> noundef %x, <8 x double> noundef %y) { 724; AVX2-LABEL: fdiv_v8f64_cast_cond: 725; AVX2: # %bb.0: 726; AVX2-NEXT: vmovd %edi, %xmm4 727; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 728; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 729; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 730; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 731; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 732; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3 733; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 734; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 735; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 736; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2 737; AVX2-NEXT: vdivpd %ymm2, %ymm0, %ymm0 738; AVX2-NEXT: vdivpd %ymm3, %ymm1, %ymm1 739; AVX2-NEXT: retq 740; 741; AVX512-LABEL: fdiv_v8f64_cast_cond: 742; AVX512: # %bb.0: 743; AVX512-NEXT: kmovw %edi, %k1 744; AVX512-NEXT: vdivpd %zmm1, %zmm0, %zmm0 {%k1} 745; AVX512-NEXT: retq 746 %b = bitcast i8 %pb to <8 x i1> 747 %s = select <8 x i1> %b, <8 x double> %y, <8 x double> <double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0, double 1.0> 748 %r = fdiv <8 x double> %x, %s 749 ret <8 x double> %r 750} 751 752define <4 x i32> @add_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 753; AVX2-LABEL: add_v4i32: 754; AVX2: # %bb.0: 755; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 756; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 757; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 758; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm0 759; AVX2-NEXT: retq 760; 761; AVX512F-LABEL: add_v4i32: 762; AVX512F: # %bb.0: 763; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 764; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 765; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 766; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 767; AVX512F-NEXT: vpaddd %xmm0, %xmm1, %xmm0 768; AVX512F-NEXT: vzeroupper 769; AVX512F-NEXT: retq 770; 771; AVX512VL-LABEL: add_v4i32: 772; AVX512VL: # %bb.0: 773; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 774; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 775; AVX512VL-NEXT: vmovdqa32 %xmm2, %xmm0 {%k1} {z} 776; AVX512VL-NEXT: vpaddd %xmm0, %xmm1, %xmm0 777; AVX512VL-NEXT: retq 778 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer 779 %r = add <4 x i32> %x, %s 780 ret <4 x i32> %r 781} 782 783define <8 x i32> @add_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 784; AVX2-LABEL: add_v8i32_commute: 785; AVX2: # %bb.0: 786; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 787; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 788; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 789; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 790; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 791; AVX2-NEXT: retq 792; 793; AVX512F-LABEL: add_v8i32_commute: 794; AVX512F: # %bb.0: 795; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 796; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 797; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 798; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 799; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 800; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0 801; AVX512F-NEXT: retq 802; 803; AVX512VL-LABEL: add_v8i32_commute: 804; AVX512VL: # %bb.0: 805; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 806; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 807; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 808; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z} 809; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm0 810; AVX512VL-NEXT: retq 811 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 812 %r = add <8 x i32> %s, %x 813 ret <8 x i32> %r 814} 815 816define <8 x i32> @add_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 817; AVX2-LABEL: add_v8i32_cast_cond: 818; AVX2: # %bb.0: 819; AVX2-NEXT: vmovd %edi, %xmm2 820; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 821; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 822; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 823; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 824; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 825; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 826; AVX2-NEXT: retq 827; 828; AVX512F-LABEL: add_v8i32_cast_cond: 829; AVX512F: # %bb.0: 830; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 831; AVX512F-NEXT: kmovw %edi, %k1 832; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z} 833; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0 834; AVX512F-NEXT: retq 835; 836; AVX512VL-LABEL: add_v8i32_cast_cond: 837; AVX512VL: # %bb.0: 838; AVX512VL-NEXT: kmovw %edi, %k1 839; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z} 840; AVX512VL-NEXT: vpaddd %ymm1, %ymm0, %ymm0 841; AVX512VL-NEXT: retq 842 %b = bitcast i8 %pb to <8 x i1> 843 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 844 %r = add <8 x i32> %x, %s 845 ret <8 x i32> %r 846} 847 848define <8 x i64> @add_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 849; AVX2-LABEL: add_v8i64_cast_cond: 850; AVX2: # %bb.0: 851; AVX2-NEXT: vmovd %edi, %xmm4 852; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 853; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 854; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 855; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 856; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 857; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 858; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 859; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 860; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 861; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 862; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 863; AVX2-NEXT: retq 864; 865; AVX512-LABEL: add_v8i64_cast_cond: 866; AVX512: # %bb.0: 867; AVX512-NEXT: kmovw %edi, %k1 868; AVX512-NEXT: vmovdqa64 %zmm1, %zmm1 {%k1} {z} 869; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 870; AVX512-NEXT: retq 871 %b = bitcast i8 %pb to <8 x i1> 872 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer 873 %r = add <8 x i64> %x, %s 874 ret <8 x i64> %r 875} 876 877define <4 x i32> @sub_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 878; AVX2-LABEL: sub_v4i32: 879; AVX2: # %bb.0: 880; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 881; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 882; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 883; AVX2-NEXT: vpsubd %xmm0, %xmm1, %xmm0 884; AVX2-NEXT: retq 885; 886; AVX512F-LABEL: sub_v4i32: 887; AVX512F: # %bb.0: 888; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 889; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 890; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 891; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 892; AVX512F-NEXT: vpsubd %xmm0, %xmm1, %xmm0 893; AVX512F-NEXT: vzeroupper 894; AVX512F-NEXT: retq 895; 896; AVX512VL-LABEL: sub_v4i32: 897; AVX512VL: # %bb.0: 898; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 899; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 900; AVX512VL-NEXT: vpsubd %xmm2, %xmm1, %xmm1 {%k1} 901; AVX512VL-NEXT: vmovdqa %xmm1, %xmm0 902; AVX512VL-NEXT: retq 903 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer 904 %r = sub <4 x i32> %x, %s 905 ret <4 x i32> %r 906} 907 908; negative test - sub is not commutative; there is no identity constant for operand 0 909 910define <8 x i32> @sub_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 911; AVX2-LABEL: sub_v8i32_commute: 912; AVX2: # %bb.0: 913; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 914; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 915; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 916; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 917; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 918; AVX2-NEXT: retq 919; 920; AVX512F-LABEL: sub_v8i32_commute: 921; AVX512F: # %bb.0: 922; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 923; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 924; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 925; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 926; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 927; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm0 928; AVX512F-NEXT: retq 929; 930; AVX512VL-LABEL: sub_v8i32_commute: 931; AVX512VL: # %bb.0: 932; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 933; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 934; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 935; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z} 936; AVX512VL-NEXT: vpsubd %ymm1, %ymm0, %ymm0 937; AVX512VL-NEXT: retq 938 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 939 %r = sub <8 x i32> %s, %x 940 ret <8 x i32> %r 941} 942 943define <16 x i32> @sub_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 944; AVX2-LABEL: sub_v16i32_swap: 945; AVX2: # %bb.0: 946; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 947; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 948; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 949; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 950; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 951; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 952; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 953; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 954; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 955; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 956; AVX2-NEXT: vpsubd %ymm0, %ymm1, %ymm0 957; AVX2-NEXT: vpsubd %ymm4, %ymm2, %ymm1 958; AVX2-NEXT: retq 959; 960; AVX512-LABEL: sub_v16i32_swap: 961; AVX512: # %bb.0: 962; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 963; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 964; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1 965; AVX512-NEXT: vpsubd %zmm2, %zmm1, %zmm0 966; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1} 967; AVX512-NEXT: retq 968 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 969 %r = sub <16 x i32> %x, %s 970 ret <16 x i32> %r 971} 972 973; negative test - sub is not commutative; there is no identity constant for operand 0 974 975define <16 x i32> @sub_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 976; AVX2-LABEL: sub_v16i32_commute_swap: 977; AVX2: # %bb.0: 978; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 979; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 980; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 981; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 982; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 983; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 984; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 985; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 986; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 987; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 988; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 989; AVX2-NEXT: vpsubd %ymm2, %ymm4, %ymm1 990; AVX2-NEXT: retq 991; 992; AVX512-LABEL: sub_v16i32_commute_swap: 993; AVX512: # %bb.0: 994; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 995; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 996; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 997; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 998; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm0 999; AVX512-NEXT: retq 1000 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1001 %r = sub <16 x i32> %s, %x 1002 ret <16 x i32> %r 1003} 1004 1005define <8 x i32> @sub_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1006; AVX2-LABEL: sub_v8i32_cast_cond: 1007; AVX2: # %bb.0: 1008; AVX2-NEXT: vmovd %edi, %xmm2 1009; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1010; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 1011; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 1012; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 1013; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 1014; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1015; AVX2-NEXT: retq 1016; 1017; AVX512F-LABEL: sub_v8i32_cast_cond: 1018; AVX512F: # %bb.0: 1019; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1020; AVX512F-NEXT: kmovw %edi, %k1 1021; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z} 1022; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1023; AVX512F-NEXT: retq 1024; 1025; AVX512VL-LABEL: sub_v8i32_cast_cond: 1026; AVX512VL: # %bb.0: 1027; AVX512VL-NEXT: kmovw %edi, %k1 1028; AVX512VL-NEXT: vpsubd %ymm1, %ymm0, %ymm0 {%k1} 1029; AVX512VL-NEXT: retq 1030 %b = bitcast i8 %pb to <8 x i1> 1031 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1032 %r = sub <8 x i32> %x, %s 1033 ret <8 x i32> %r 1034} 1035 1036define <8 x i64> @sub_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 1037; AVX2-LABEL: sub_v8i64_cast_cond: 1038; AVX2: # %bb.0: 1039; AVX2-NEXT: vmovd %edi, %xmm4 1040; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 1041; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 1042; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 1043; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 1044; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 1045; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 1046; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 1047; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 1048; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 1049; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 1050; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm1 1051; AVX2-NEXT: retq 1052; 1053; AVX512-LABEL: sub_v8i64_cast_cond: 1054; AVX512: # %bb.0: 1055; AVX512-NEXT: kmovw %edi, %k1 1056; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm0 {%k1} 1057; AVX512-NEXT: retq 1058 %b = bitcast i8 %pb to <8 x i1> 1059 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer 1060 %r = sub <8 x i64> %x, %s 1061 ret <8 x i64> %r 1062} 1063 1064define <4 x i32> @mul_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 1065; AVX2-LABEL: mul_v4i32: 1066; AVX2: # %bb.0: 1067; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 1068; AVX2-NEXT: vbroadcastss {{.*#+}} xmm3 = [1,1,1,1] 1069; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0 1070; AVX2-NEXT: vpmulld %xmm0, %xmm1, %xmm0 1071; AVX2-NEXT: retq 1072; 1073; AVX512F-LABEL: mul_v4i32: 1074; AVX512F: # %bb.0: 1075; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 1076; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 1077; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 1078; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1] 1079; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} 1080; AVX512F-NEXT: vpmulld %xmm0, %xmm1, %xmm0 1081; AVX512F-NEXT: vzeroupper 1082; AVX512F-NEXT: retq 1083; 1084; AVX512VL-LABEL: mul_v4i32: 1085; AVX512VL: # %bb.0: 1086; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 1087; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 1088; AVX512VL-NEXT: vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1] 1089; AVX512VL-NEXT: vmovdqa32 %xmm2, %xmm0 {%k1} 1090; AVX512VL-NEXT: vpmulld %xmm0, %xmm1, %xmm0 1091; AVX512VL-NEXT: retq 1092 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 1093 %r = mul <4 x i32> %x, %s 1094 ret <4 x i32> %r 1095} 1096 1097define <8 x i32> @mul_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1098; AVX2-LABEL: mul_v8i32_commute: 1099; AVX2: # %bb.0: 1100; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1101; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1102; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1] 1103; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm3, %ymm0 1104; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1105; AVX2-NEXT: retq 1106; 1107; AVX512F-LABEL: mul_v8i32_commute: 1108; AVX512F: # %bb.0: 1109; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 1110; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 1111; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 1112; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 1113; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1] 1114; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} 1115; AVX512F-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1116; AVX512F-NEXT: retq 1117; 1118; AVX512VL-LABEL: mul_v8i32_commute: 1119; AVX512VL: # %bb.0: 1120; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 1121; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 1122; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 1123; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1] 1124; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} 1125; AVX512VL-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1126; AVX512VL-NEXT: retq 1127 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 1128 %r = mul <8 x i32> %s, %x 1129 ret <8 x i32> %r 1130} 1131 1132define <8 x i32> @mul_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1133; AVX2-LABEL: mul_v8i32_cast_cond: 1134; AVX2: # %bb.0: 1135; AVX2-NEXT: vmovd %edi, %xmm2 1136; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1137; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 1138; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 1139; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 1140; AVX2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1] 1141; AVX2-NEXT: vblendvps %ymm2, %ymm1, %ymm3, %ymm1 1142; AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0 1143; AVX2-NEXT: retq 1144; 1145; AVX512F-LABEL: mul_v8i32_cast_cond: 1146; AVX512F: # %bb.0: 1147; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1148; AVX512F-NEXT: kmovw %edi, %k1 1149; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1] 1150; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm2 {%k1} 1151; AVX512F-NEXT: vpmulld %ymm2, %ymm0, %ymm0 1152; AVX512F-NEXT: retq 1153; 1154; AVX512VL-LABEL: mul_v8i32_cast_cond: 1155; AVX512VL: # %bb.0: 1156; AVX512VL-NEXT: kmovw %edi, %k1 1157; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1] 1158; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm2 {%k1} 1159; AVX512VL-NEXT: vpmulld %ymm2, %ymm0, %ymm0 1160; AVX512VL-NEXT: retq 1161 %b = bitcast i8 %pb to <8 x i1> 1162 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 1163 %r = mul <8 x i32> %x, %s 1164 ret <8 x i32> %r 1165} 1166 1167define <8 x i64> @mul_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 1168; AVX2-LABEL: mul_v8i64_cast_cond: 1169; AVX2: # %bb.0: 1170; AVX2-NEXT: vmovd %edi, %xmm4 1171; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 1172; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 1173; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 1174; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 1175; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [1,1,1,1] 1176; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm6, %ymm3 1177; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 1178; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 1179; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 1180; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2 1181; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm4 1182; AVX2-NEXT: vpmuludq %ymm2, %ymm4, %ymm4 1183; AVX2-NEXT: vpsrlq $32, %ymm2, %ymm5 1184; AVX2-NEXT: vpmuludq %ymm5, %ymm0, %ymm5 1185; AVX2-NEXT: vpaddq %ymm4, %ymm5, %ymm4 1186; AVX2-NEXT: vpsllq $32, %ymm4, %ymm4 1187; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm0 1188; AVX2-NEXT: vpaddq %ymm4, %ymm0, %ymm0 1189; AVX2-NEXT: vpsrlq $32, %ymm1, %ymm2 1190; AVX2-NEXT: vpmuludq %ymm3, %ymm2, %ymm2 1191; AVX2-NEXT: vpsrlq $32, %ymm3, %ymm4 1192; AVX2-NEXT: vpmuludq %ymm4, %ymm1, %ymm4 1193; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm2 1194; AVX2-NEXT: vpsllq $32, %ymm2, %ymm2 1195; AVX2-NEXT: vpmuludq %ymm3, %ymm1, %ymm1 1196; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 1197; AVX2-NEXT: retq 1198; 1199; AVX512-LABEL: mul_v8i64_cast_cond: 1200; AVX512: # %bb.0: 1201; AVX512-NEXT: kmovw %edi, %k1 1202; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [1,1,1,1,1,1,1,1] 1203; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2 {%k1} 1204; AVX512-NEXT: vpsrlq $32, %zmm0, %zmm1 1205; AVX512-NEXT: vpmuludq %zmm2, %zmm1, %zmm1 1206; AVX512-NEXT: vpsrlq $32, %zmm2, %zmm3 1207; AVX512-NEXT: vpmuludq %zmm3, %zmm0, %zmm3 1208; AVX512-NEXT: vpaddq %zmm1, %zmm3, %zmm1 1209; AVX512-NEXT: vpsllq $32, %zmm1, %zmm1 1210; AVX512-NEXT: vpmuludq %zmm2, %zmm0, %zmm0 1211; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 1212; AVX512-NEXT: retq 1213 %b = bitcast i8 %pb to <8 x i1> 1214 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 1215 %r = mul <8 x i64> %x, %s 1216 ret <8 x i64> %r 1217} 1218 1219define <4 x i32> @shl_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 1220; AVX2-LABEL: shl_v4i32: 1221; AVX2: # %bb.0: 1222; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 1223; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 1224; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 1225; AVX2-NEXT: vpsllvd %xmm0, %xmm1, %xmm0 1226; AVX2-NEXT: retq 1227; 1228; AVX512F-LABEL: shl_v4i32: 1229; AVX512F: # %bb.0: 1230; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 1231; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 1232; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 1233; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1234; AVX512F-NEXT: vpsllvd %xmm0, %xmm1, %xmm0 1235; AVX512F-NEXT: vzeroupper 1236; AVX512F-NEXT: retq 1237; 1238; AVX512VL-LABEL: shl_v4i32: 1239; AVX512VL: # %bb.0: 1240; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 1241; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 1242; AVX512VL-NEXT: vmovdqa32 %xmm2, %xmm0 {%k1} {z} 1243; AVX512VL-NEXT: vpsllvd %xmm0, %xmm1, %xmm0 1244; AVX512VL-NEXT: retq 1245 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer 1246 %r = shl <4 x i32> %x, %s 1247 ret <4 x i32> %r 1248} 1249 1250; negative test - shl is not commutative; there is no identity constant for operand 0 1251 1252define <8 x i32> @shl_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1253; AVX2-LABEL: shl_v8i32_commute: 1254; AVX2: # %bb.0: 1255; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1256; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1257; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1258; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 1259; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1260; AVX2-NEXT: retq 1261; 1262; AVX512F-LABEL: shl_v8i32_commute: 1263; AVX512F: # %bb.0: 1264; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 1265; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 1266; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 1267; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 1268; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1269; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1270; AVX512F-NEXT: retq 1271; 1272; AVX512VL-LABEL: shl_v8i32_commute: 1273; AVX512VL: # %bb.0: 1274; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 1275; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 1276; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 1277; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z} 1278; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1279; AVX512VL-NEXT: retq 1280 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1281 %r = shl <8 x i32> %s, %x 1282 ret <8 x i32> %r 1283} 1284 1285define <16 x i32> @shl_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1286; AVX2-LABEL: shl_v16i32_swap: 1287; AVX2: # %bb.0: 1288; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1289; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1290; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1291; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1292; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1293; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1294; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1295; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1296; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1297; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1298; AVX2-NEXT: vpsllvd %ymm0, %ymm1, %ymm0 1299; AVX2-NEXT: vpsllvd %ymm4, %ymm2, %ymm1 1300; AVX2-NEXT: retq 1301; 1302; AVX512-LABEL: shl_v16i32_swap: 1303; AVX512: # %bb.0: 1304; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1305; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1306; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1307; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1308; AVX512-NEXT: vpsllvd %zmm0, %zmm1, %zmm0 1309; AVX512-NEXT: retq 1310 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1311 %r = shl <16 x i32> %x, %s 1312 ret <16 x i32> %r 1313} 1314 1315; negative test - shl is not commutative; there is no identity constant for operand 0 1316 1317define <16 x i32> @shl_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1318; AVX2-LABEL: shl_v16i32_commute_swap: 1319; AVX2: # %bb.0: 1320; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1321; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1322; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1323; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1324; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1325; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1326; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1327; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1328; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1329; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1330; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1331; AVX2-NEXT: vpsllvd %ymm2, %ymm4, %ymm1 1332; AVX2-NEXT: retq 1333; 1334; AVX512-LABEL: shl_v16i32_commute_swap: 1335; AVX512: # %bb.0: 1336; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1337; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1338; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1339; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1340; AVX512-NEXT: vpsllvd %zmm1, %zmm0, %zmm0 1341; AVX512-NEXT: retq 1342 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1343 %r = shl <16 x i32> %s, %x 1344 ret <16 x i32> %r 1345} 1346 1347define <8 x i32> @shl_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1348; AVX2-LABEL: shl_v8i32_cast_cond: 1349; AVX2: # %bb.0: 1350; AVX2-NEXT: vmovd %edi, %xmm2 1351; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1352; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 1353; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 1354; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 1355; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 1356; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1357; AVX2-NEXT: retq 1358; 1359; AVX512F-LABEL: shl_v8i32_cast_cond: 1360; AVX512F: # %bb.0: 1361; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1362; AVX512F-NEXT: kmovw %edi, %k1 1363; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z} 1364; AVX512F-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1365; AVX512F-NEXT: retq 1366; 1367; AVX512VL-LABEL: shl_v8i32_cast_cond: 1368; AVX512VL: # %bb.0: 1369; AVX512VL-NEXT: kmovw %edi, %k1 1370; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z} 1371; AVX512VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0 1372; AVX512VL-NEXT: retq 1373 %b = bitcast i8 %pb to <8 x i1> 1374 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1375 %r = shl <8 x i32> %x, %s 1376 ret <8 x i32> %r 1377} 1378 1379define <8 x i64> @shl_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 1380; AVX2-LABEL: shl_v8i64_cast_cond: 1381; AVX2: # %bb.0: 1382; AVX2-NEXT: vmovd %edi, %xmm4 1383; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 1384; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 1385; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 1386; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 1387; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 1388; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 1389; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 1390; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 1391; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 1392; AVX2-NEXT: vpsllvq %ymm2, %ymm0, %ymm0 1393; AVX2-NEXT: vpsllvq %ymm3, %ymm1, %ymm1 1394; AVX2-NEXT: retq 1395; 1396; AVX512-LABEL: shl_v8i64_cast_cond: 1397; AVX512: # %bb.0: 1398; AVX512-NEXT: kmovw %edi, %k1 1399; AVX512-NEXT: vmovdqa64 %zmm1, %zmm1 {%k1} {z} 1400; AVX512-NEXT: vpsllvq %zmm1, %zmm0, %zmm0 1401; AVX512-NEXT: retq 1402 %b = bitcast i8 %pb to <8 x i1> 1403 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer 1404 %r = shl <8 x i64> %x, %s 1405 ret <8 x i64> %r 1406} 1407 1408define <4 x i32> @lshr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 1409; AVX2-LABEL: lshr_v4i32: 1410; AVX2: # %bb.0: 1411; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 1412; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 1413; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 1414; AVX2-NEXT: vpsrlvd %xmm0, %xmm1, %xmm0 1415; AVX2-NEXT: retq 1416; 1417; AVX512F-LABEL: lshr_v4i32: 1418; AVX512F: # %bb.0: 1419; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 1420; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 1421; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 1422; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1423; AVX512F-NEXT: vpsrlvd %xmm0, %xmm1, %xmm0 1424; AVX512F-NEXT: vzeroupper 1425; AVX512F-NEXT: retq 1426; 1427; AVX512VL-LABEL: lshr_v4i32: 1428; AVX512VL: # %bb.0: 1429; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 1430; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 1431; AVX512VL-NEXT: vmovdqa32 %xmm2, %xmm0 {%k1} {z} 1432; AVX512VL-NEXT: vpsrlvd %xmm0, %xmm1, %xmm0 1433; AVX512VL-NEXT: retq 1434 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer 1435 %r = lshr <4 x i32> %x, %s 1436 ret <4 x i32> %r 1437} 1438 1439; negative test - lshr is not commutative; there is no identity constant for operand 0 1440 1441define <8 x i32> @lshr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1442; AVX2-LABEL: lshr_v8i32_commute: 1443; AVX2: # %bb.0: 1444; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1445; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1446; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1447; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 1448; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1449; AVX2-NEXT: retq 1450; 1451; AVX512F-LABEL: lshr_v8i32_commute: 1452; AVX512F: # %bb.0: 1453; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 1454; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 1455; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 1456; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 1457; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1458; AVX512F-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1459; AVX512F-NEXT: retq 1460; 1461; AVX512VL-LABEL: lshr_v8i32_commute: 1462; AVX512VL: # %bb.0: 1463; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 1464; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 1465; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 1466; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z} 1467; AVX512VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1468; AVX512VL-NEXT: retq 1469 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1470 %r = lshr <8 x i32> %s, %x 1471 ret <8 x i32> %r 1472} 1473 1474define <16 x i32> @lshr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1475; AVX2-LABEL: lshr_v16i32_swap: 1476; AVX2: # %bb.0: 1477; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1478; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1479; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1480; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1481; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1482; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1483; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1484; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1485; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1486; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1487; AVX2-NEXT: vpsrlvd %ymm0, %ymm1, %ymm0 1488; AVX2-NEXT: vpsrlvd %ymm4, %ymm2, %ymm1 1489; AVX2-NEXT: retq 1490; 1491; AVX512-LABEL: lshr_v16i32_swap: 1492; AVX512: # %bb.0: 1493; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1494; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1495; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1496; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1497; AVX512-NEXT: vpsrlvd %zmm0, %zmm1, %zmm0 1498; AVX512-NEXT: retq 1499 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1500 %r = lshr <16 x i32> %x, %s 1501 ret <16 x i32> %r 1502} 1503 1504; negative test - lshr is not commutative; there is no identity constant for operand 0 1505 1506define <16 x i32> @lshr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1507; AVX2-LABEL: lshr_v16i32_commute_swap: 1508; AVX2: # %bb.0: 1509; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1510; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1511; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1512; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1513; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1514; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1515; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1516; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1517; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1518; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1519; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1520; AVX2-NEXT: vpsrlvd %ymm2, %ymm4, %ymm1 1521; AVX2-NEXT: retq 1522; 1523; AVX512-LABEL: lshr_v16i32_commute_swap: 1524; AVX512: # %bb.0: 1525; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1526; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1527; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1528; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1529; AVX512-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0 1530; AVX512-NEXT: retq 1531 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1532 %r = lshr <16 x i32> %s, %x 1533 ret <16 x i32> %r 1534} 1535 1536define <8 x i32> @lshr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1537; AVX2-LABEL: lshr_v8i32_cast_cond: 1538; AVX2: # %bb.0: 1539; AVX2-NEXT: vmovd %edi, %xmm2 1540; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1541; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 1542; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 1543; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 1544; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 1545; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1546; AVX2-NEXT: retq 1547; 1548; AVX512F-LABEL: lshr_v8i32_cast_cond: 1549; AVX512F: # %bb.0: 1550; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1551; AVX512F-NEXT: kmovw %edi, %k1 1552; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z} 1553; AVX512F-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1554; AVX512F-NEXT: retq 1555; 1556; AVX512VL-LABEL: lshr_v8i32_cast_cond: 1557; AVX512VL: # %bb.0: 1558; AVX512VL-NEXT: kmovw %edi, %k1 1559; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z} 1560; AVX512VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0 1561; AVX512VL-NEXT: retq 1562 %b = bitcast i8 %pb to <8 x i1> 1563 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1564 %r = lshr <8 x i32> %x, %s 1565 ret <8 x i32> %r 1566} 1567 1568define <8 x i64> @lshr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 1569; AVX2-LABEL: lshr_v8i64_cast_cond: 1570; AVX2: # %bb.0: 1571; AVX2-NEXT: vmovd %edi, %xmm4 1572; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 1573; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 1574; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 1575; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 1576; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 1577; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 1578; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 1579; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 1580; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 1581; AVX2-NEXT: vpsrlvq %ymm2, %ymm0, %ymm0 1582; AVX2-NEXT: vpsrlvq %ymm3, %ymm1, %ymm1 1583; AVX2-NEXT: retq 1584; 1585; AVX512-LABEL: lshr_v8i64_cast_cond: 1586; AVX512: # %bb.0: 1587; AVX512-NEXT: kmovw %edi, %k1 1588; AVX512-NEXT: vmovdqa64 %zmm1, %zmm1 {%k1} {z} 1589; AVX512-NEXT: vpsrlvq %zmm1, %zmm0, %zmm0 1590; AVX512-NEXT: retq 1591 %b = bitcast i8 %pb to <8 x i1> 1592 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer 1593 %r = lshr <8 x i64> %x, %s 1594 ret <8 x i64> %r 1595} 1596 1597define <4 x i32> @ashr_v4i32(<4 x i1> %b, <4 x i32> noundef %x, <4 x i32> noundef %y) { 1598; AVX2-LABEL: ashr_v4i32: 1599; AVX2: # %bb.0: 1600; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 1601; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 1602; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 1603; AVX2-NEXT: vpsravd %xmm0, %xmm1, %xmm0 1604; AVX2-NEXT: retq 1605; 1606; AVX512F-LABEL: ashr_v4i32: 1607; AVX512F: # %bb.0: 1608; AVX512F-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2 1609; AVX512F-NEXT: vpslld $31, %xmm0, %xmm0 1610; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 1611; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1612; AVX512F-NEXT: vpsravd %xmm0, %xmm1, %xmm0 1613; AVX512F-NEXT: vzeroupper 1614; AVX512F-NEXT: retq 1615; 1616; AVX512VL-LABEL: ashr_v4i32: 1617; AVX512VL: # %bb.0: 1618; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0 1619; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k1 1620; AVX512VL-NEXT: vmovdqa32 %xmm2, %xmm0 {%k1} {z} 1621; AVX512VL-NEXT: vpsravd %xmm0, %xmm1, %xmm0 1622; AVX512VL-NEXT: retq 1623 %s = select <4 x i1> %b, <4 x i32> %y, <4 x i32> zeroinitializer 1624 %r = ashr <4 x i32> %x, %s 1625 ret <4 x i32> %r 1626} 1627 1628; negative test - ashr is not commutative; there is no identity constant for operand 0 1629 1630define <8 x i32> @ashr_v8i32_commute(<8 x i1> %b, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1631; AVX2-LABEL: ashr_v8i32_commute: 1632; AVX2: # %bb.0: 1633; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1634; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1635; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1636; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 1637; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1638; AVX2-NEXT: retq 1639; 1640; AVX512F-LABEL: ashr_v8i32_commute: 1641; AVX512F: # %bb.0: 1642; AVX512F-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2 1643; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 1644; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 1645; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k1 1646; AVX512F-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1647; AVX512F-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1648; AVX512F-NEXT: retq 1649; 1650; AVX512VL-LABEL: ashr_v8i32_commute: 1651; AVX512VL: # %bb.0: 1652; AVX512VL-NEXT: vpmovsxwd %xmm0, %ymm0 1653; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 1654; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k1 1655; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm0 {%k1} {z} 1656; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1657; AVX512VL-NEXT: retq 1658 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1659 %r = ashr <8 x i32> %s, %x 1660 ret <8 x i32> %r 1661} 1662 1663define <16 x i32> @ashr_v16i32_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1664; AVX2-LABEL: ashr_v16i32_swap: 1665; AVX2: # %bb.0: 1666; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1667; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1668; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1669; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1670; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1671; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1672; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1673; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1674; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1675; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1676; AVX2-NEXT: vpsravd %ymm0, %ymm1, %ymm0 1677; AVX2-NEXT: vpsravd %ymm4, %ymm2, %ymm1 1678; AVX2-NEXT: retq 1679; 1680; AVX512-LABEL: ashr_v16i32_swap: 1681; AVX512: # %bb.0: 1682; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1683; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1684; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1685; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1686; AVX512-NEXT: vpsravd %zmm0, %zmm1, %zmm0 1687; AVX512-NEXT: retq 1688 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1689 %r = ashr <16 x i32> %x, %s 1690 ret <16 x i32> %r 1691} 1692 1693; negative test - ashr is not commutative; there is no identity constant for operand 0 1694 1695define <16 x i32> @ashr_v16i32_commute_swap(<16 x i1> %b, <16 x i32> noundef %x, <16 x i32> noundef %y) { 1696; AVX2-LABEL: ashr_v16i32_commute_swap: 1697; AVX2: # %bb.0: 1698; AVX2-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 1699; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero 1700; AVX2-NEXT: vpslld $31, %ymm5, %ymm5 1701; AVX2-NEXT: vpsrad $31, %ymm5, %ymm5 1702; AVX2-NEXT: vpandn %ymm4, %ymm5, %ymm4 1703; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1704; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1705; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 1706; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0 1707; AVX2-NEXT: vpandn %ymm3, %ymm0, %ymm0 1708; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1709; AVX2-NEXT: vpsravd %ymm2, %ymm4, %ymm1 1710; AVX2-NEXT: retq 1711; 1712; AVX512-LABEL: ashr_v16i32_commute_swap: 1713; AVX512: # %bb.0: 1714; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0 1715; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 1716; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k1 1717; AVX512-NEXT: vmovdqa32 %zmm2, %zmm0 {%k1} {z} 1718; AVX512-NEXT: vpsravd %zmm1, %zmm0, %zmm0 1719; AVX512-NEXT: retq 1720 %s = select <16 x i1> %b, <16 x i32> zeroinitializer, <16 x i32> %y 1721 %r = ashr <16 x i32> %s, %x 1722 ret <16 x i32> %r 1723} 1724 1725define <8 x i32> @ashr_v8i32_cast_cond(i8 noundef zeroext %pb, <8 x i32> noundef %x, <8 x i32> noundef %y) { 1726; AVX2-LABEL: ashr_v8i32_cast_cond: 1727; AVX2: # %bb.0: 1728; AVX2-NEXT: vmovd %edi, %xmm2 1729; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1730; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,4,8,16,32,64,128] 1731; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2 1732; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 1733; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 1734; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1735; AVX2-NEXT: retq 1736; 1737; AVX512F-LABEL: ashr_v8i32_cast_cond: 1738; AVX512F: # %bb.0: 1739; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1740; AVX512F-NEXT: kmovw %edi, %k1 1741; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm1 {%k1} {z} 1742; AVX512F-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1743; AVX512F-NEXT: retq 1744; 1745; AVX512VL-LABEL: ashr_v8i32_cast_cond: 1746; AVX512VL: # %bb.0: 1747; AVX512VL-NEXT: kmovw %edi, %k1 1748; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z} 1749; AVX512VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0 1750; AVX512VL-NEXT: retq 1751 %b = bitcast i8 %pb to <8 x i1> 1752 %s = select <8 x i1> %b, <8 x i32> %y, <8 x i32> zeroinitializer 1753 %r = ashr <8 x i32> %x, %s 1754 ret <8 x i32> %r 1755} 1756 1757define <8 x i64> @ashr_v8i64_cast_cond(i8 noundef zeroext %pb, <8 x i64> noundef %x, <8 x i64> noundef %y) { 1758; AVX2-LABEL: ashr_v8i64_cast_cond: 1759; AVX2: # %bb.0: 1760; AVX2-NEXT: vmovd %edi, %xmm4 1761; AVX2-NEXT: vpbroadcastb %xmm4, %ymm4 1762; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,32,64,128] 1763; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm6 1764; AVX2-NEXT: vpcmpeqq %ymm5, %ymm6, %ymm5 1765; AVX2-NEXT: vpand %ymm3, %ymm5, %ymm3 1766; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [1,2,4,8] 1767; AVX2-NEXT: vpand %ymm5, %ymm4, %ymm4 1768; AVX2-NEXT: vpcmpeqq %ymm5, %ymm4, %ymm4 1769; AVX2-NEXT: vpand %ymm2, %ymm4, %ymm2 1770; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1771; AVX2-NEXT: vpsrlvq %ymm2, %ymm4, %ymm5 1772; AVX2-NEXT: vpsrlvq %ymm2, %ymm0, %ymm0 1773; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm0 1774; AVX2-NEXT: vpsubq %ymm5, %ymm0, %ymm0 1775; AVX2-NEXT: vpsrlvq %ymm3, %ymm4, %ymm2 1776; AVX2-NEXT: vpsrlvq %ymm3, %ymm1, %ymm1 1777; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 1778; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1 1779; AVX2-NEXT: retq 1780; 1781; AVX512-LABEL: ashr_v8i64_cast_cond: 1782; AVX512: # %bb.0: 1783; AVX512-NEXT: kmovw %edi, %k1 1784; AVX512-NEXT: vmovdqa64 %zmm1, %zmm1 {%k1} {z} 1785; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm0 1786; AVX512-NEXT: retq 1787 %b = bitcast i8 %pb to <8 x i1> 1788 %s = select <8 x i1> %b, <8 x i64> %y, <8 x i64> zeroinitializer 1789 %r = ashr <8 x i64> %x, %s 1790 ret <8 x i64> %r 1791} 1792