1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE4 4; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1 5; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2 6; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX,AVX512 7 8; 9; 128-bit vectors 10; 11 12define <16 x i8> @test_fixed_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind { 13; SSE-LABEL: test_fixed_v16i8: 14; SSE: # %bb.0: 15; SSE-NEXT: movdqa %xmm0, %xmm2 16; SSE-NEXT: pand %xmm1, %xmm2 17; SSE-NEXT: pxor %xmm1, %xmm0 18; SSE-NEXT: psrlw $1, %xmm0 19; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 20; SSE-NEXT: paddb %xmm2, %xmm0 21; SSE-NEXT: retq 22; 23; AVX1-LABEL: test_fixed_v16i8: 24; AVX1: # %bb.0: 25; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2 26; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 27; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 28; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 29; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm0 30; AVX1-NEXT: retq 31; 32; AVX2-LABEL: test_fixed_v16i8: 33; AVX2: # %bb.0: 34; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2 35; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 36; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0 37; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 38; AVX2-NEXT: vpaddb %xmm0, %xmm2, %xmm0 39; AVX2-NEXT: retq 40; 41; AVX512-LABEL: test_fixed_v16i8: 42; AVX512: # %bb.0: 43; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2 44; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0 45; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm0 46; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 47; AVX512-NEXT: vpaddb %xmm0, %xmm2, %xmm0 48; AVX512-NEXT: retq 49 %and = and <16 x i8> %a0, %a1 50 %xor = xor <16 x i8> %a0, %a1 51 %shift = lshr <16 x i8> %xor, <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> 52 %res = add <16 x i8> %and, %shift 53 ret <16 x i8> %res 54} 55 56define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind { 57; SSE-LABEL: test_ext_v16i8: 58; SSE: # %bb.0: 59; SSE-NEXT: movdqa %xmm0, %xmm2 60; SSE-NEXT: pand %xmm1, %xmm2 61; SSE-NEXT: pxor %xmm1, %xmm0 62; SSE-NEXT: psrlw $1, %xmm0 63; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 64; SSE-NEXT: paddb %xmm2, %xmm0 65; SSE-NEXT: retq 66; 67; AVX1-LABEL: test_ext_v16i8: 68; AVX1: # %bb.0: 69; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2 70; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 71; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 72; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 73; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm0 74; AVX1-NEXT: retq 75; 76; AVX2-LABEL: test_ext_v16i8: 77; AVX2: # %bb.0: 78; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2 79; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 80; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0 81; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 82; AVX2-NEXT: vpaddb %xmm0, %xmm2, %xmm0 83; AVX2-NEXT: retq 84; 85; AVX512-LABEL: test_ext_v16i8: 86; AVX512: # %bb.0: 87; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2 88; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0 89; AVX512-NEXT: vpsrlw $1, %xmm0, %xmm0 90; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 91; AVX512-NEXT: vpaddb %xmm0, %xmm2, %xmm0 92; AVX512-NEXT: retq 93 %x0 = zext <16 x i8> %a0 to <16 x i16> 94 %x1 = zext <16 x i8> %a1 to <16 x i16> 95 %sum = add <16 x i16> %x0, %x1 96 %shift = lshr <16 x i16> %sum, <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> 97 %res = trunc <16 x i16> %shift to <16 x i8> 98 ret <16 x i8> %res 99} 100 101define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind { 102; SSE-LABEL: test_fixed_v8i16: 103; SSE: # %bb.0: 104; SSE-NEXT: movdqa %xmm0, %xmm2 105; SSE-NEXT: pand %xmm1, %xmm2 106; SSE-NEXT: pxor %xmm1, %xmm0 107; SSE-NEXT: psrlw $1, %xmm0 108; SSE-NEXT: paddw %xmm2, %xmm0 109; SSE-NEXT: retq 110; 111; AVX-LABEL: test_fixed_v8i16: 112; AVX: # %bb.0: 113; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 114; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 115; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 116; AVX-NEXT: vpaddw %xmm0, %xmm2, %xmm0 117; AVX-NEXT: retq 118 %and = and <8 x i16> %a0, %a1 119 %xor = xor <8 x i16> %a1, %a0 120 %shift = lshr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 121 %res = add <8 x i16> %and, %shift 122 ret <8 x i16> %res 123} 124 125define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind { 126; SSE-LABEL: test_ext_v8i16: 127; SSE: # %bb.0: 128; SSE-NEXT: movdqa %xmm0, %xmm2 129; SSE-NEXT: pand %xmm1, %xmm2 130; SSE-NEXT: pxor %xmm1, %xmm0 131; SSE-NEXT: psrlw $1, %xmm0 132; SSE-NEXT: paddw %xmm2, %xmm0 133; SSE-NEXT: retq 134; 135; AVX-LABEL: test_ext_v8i16: 136; AVX: # %bb.0: 137; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 138; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 139; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 140; AVX-NEXT: vpaddw %xmm0, %xmm2, %xmm0 141; AVX-NEXT: retq 142 %x0 = zext <8 x i16> %a0 to <8 x i32> 143 %x1 = zext <8 x i16> %a1 to <8 x i32> 144 %sum = add <8 x i32> %x0, %x1 145 %shift = lshr <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 146 %res = trunc <8 x i32> %shift to <8 x i16> 147 ret <8 x i16> %res 148} 149 150define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 151; SSE-LABEL: test_fixed_v4i32: 152; SSE: # %bb.0: 153; SSE-NEXT: movdqa %xmm0, %xmm2 154; SSE-NEXT: pand %xmm1, %xmm2 155; SSE-NEXT: pxor %xmm1, %xmm0 156; SSE-NEXT: psrld $1, %xmm0 157; SSE-NEXT: paddd %xmm2, %xmm0 158; SSE-NEXT: retq 159; 160; AVX-LABEL: test_fixed_v4i32: 161; AVX: # %bb.0: 162; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 163; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 164; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 165; AVX-NEXT: vpaddd %xmm0, %xmm2, %xmm0 166; AVX-NEXT: retq 167 %and = and <4 x i32> %a0, %a1 168 %xor = xor <4 x i32> %a1, %a0 169 %shift = lshr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1> 170 %res = add <4 x i32> %and, %shift 171 ret <4 x i32> %res 172} 173 174define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 175; SSE-LABEL: test_ext_v4i32: 176; SSE: # %bb.0: 177; SSE-NEXT: movdqa %xmm0, %xmm2 178; SSE-NEXT: pand %xmm1, %xmm2 179; SSE-NEXT: pxor %xmm1, %xmm0 180; SSE-NEXT: psrld $1, %xmm0 181; SSE-NEXT: paddd %xmm2, %xmm0 182; SSE-NEXT: retq 183; 184; AVX-LABEL: test_ext_v4i32: 185; AVX: # %bb.0: 186; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 187; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 188; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 189; AVX-NEXT: vpaddd %xmm0, %xmm2, %xmm0 190; AVX-NEXT: retq 191 %x0 = zext <4 x i32> %a0 to <4 x i64> 192 %x1 = zext <4 x i32> %a1 to <4 x i64> 193 %sum = add <4 x i64> %x0, %x1 194 %shift = lshr <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1> 195 %res = trunc <4 x i64> %shift to <4 x i32> 196 ret <4 x i32> %res 197} 198 199define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 200; SSE-LABEL: test_fixed_v2i64: 201; SSE: # %bb.0: 202; SSE-NEXT: movdqa %xmm0, %xmm2 203; SSE-NEXT: pand %xmm1, %xmm2 204; SSE-NEXT: pxor %xmm1, %xmm0 205; SSE-NEXT: psrlq $1, %xmm0 206; SSE-NEXT: paddq %xmm2, %xmm0 207; SSE-NEXT: retq 208; 209; AVX-LABEL: test_fixed_v2i64: 210; AVX: # %bb.0: 211; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 212; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 213; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 214; AVX-NEXT: vpaddq %xmm0, %xmm2, %xmm0 215; AVX-NEXT: retq 216 %and = and <2 x i64> %a0, %a1 217 %xor = xor <2 x i64> %a1, %a0 218 %shift = lshr <2 x i64> %xor, <i64 1, i64 1> 219 %res = add <2 x i64> %and, %shift 220 ret <2 x i64> %res 221} 222 223define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 224; SSE-LABEL: test_ext_v2i64: 225; SSE: # %bb.0: 226; SSE-NEXT: movdqa %xmm0, %xmm2 227; SSE-NEXT: pand %xmm1, %xmm2 228; SSE-NEXT: pxor %xmm1, %xmm0 229; SSE-NEXT: psrlq $1, %xmm0 230; SSE-NEXT: paddq %xmm2, %xmm0 231; SSE-NEXT: retq 232; 233; AVX-LABEL: test_ext_v2i64: 234; AVX: # %bb.0: 235; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 236; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 237; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 238; AVX-NEXT: vpaddq %xmm0, %xmm2, %xmm0 239; AVX-NEXT: retq 240 %x0 = zext <2 x i64> %a0 to <2 x i128> 241 %x1 = zext <2 x i64> %a1 to <2 x i128> 242 %sum = add <2 x i128> %x0, %x1 243 %shift = lshr <2 x i128> %sum, <i128 1, i128 1> 244 %res = trunc <2 x i128> %shift to <2 x i64> 245 ret <2 x i64> %res 246} 247 248; 249; 256-bit vectors 250; 251 252define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 253; SSE-LABEL: test_fixed_v32i8: 254; SSE: # %bb.0: 255; SSE-NEXT: movdqa %xmm0, %xmm4 256; SSE-NEXT: pand %xmm2, %xmm4 257; SSE-NEXT: pxor %xmm2, %xmm0 258; SSE-NEXT: psrlw $1, %xmm0 259; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 260; SSE-NEXT: pand %xmm2, %xmm0 261; SSE-NEXT: paddb %xmm4, %xmm0 262; SSE-NEXT: movdqa %xmm1, %xmm4 263; SSE-NEXT: pand %xmm3, %xmm4 264; SSE-NEXT: pxor %xmm3, %xmm1 265; SSE-NEXT: psrlw $1, %xmm1 266; SSE-NEXT: pand %xmm2, %xmm1 267; SSE-NEXT: paddb %xmm4, %xmm1 268; SSE-NEXT: retq 269; 270; AVX1-LABEL: test_fixed_v32i8: 271; AVX1: # %bb.0: 272; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2 273; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 274; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3 275; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 276; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 277; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 278; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 279; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 280; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 281; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 282; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 283; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 284; AVX1-NEXT: retq 285; 286; AVX2-LABEL: test_fixed_v32i8: 287; AVX2: # %bb.0: 288; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 289; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 290; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 291; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 292; AVX2-NEXT: vpaddb %ymm0, %ymm2, %ymm0 293; AVX2-NEXT: retq 294; 295; AVX512-LABEL: test_fixed_v32i8: 296; AVX512: # %bb.0: 297; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 298; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 299; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm0 300; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 301; AVX512-NEXT: vpaddb %ymm0, %ymm2, %ymm0 302; AVX512-NEXT: retq 303 %and = and <32 x i8> %a0, %a1 304 %xor = xor <32 x i8> %a0, %a1 305 %shift = lshr <32 x i8> %xor, <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, 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> 306 %res = add <32 x i8> %and, %shift 307 ret <32 x i8> %res 308} 309 310define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 311; SSE-LABEL: test_ext_v32i8: 312; SSE: # %bb.0: 313; SSE-NEXT: movdqa %xmm0, %xmm4 314; SSE-NEXT: pand %xmm2, %xmm4 315; SSE-NEXT: pxor %xmm2, %xmm0 316; SSE-NEXT: psrlw $1, %xmm0 317; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 318; SSE-NEXT: pand %xmm2, %xmm0 319; SSE-NEXT: paddb %xmm4, %xmm0 320; SSE-NEXT: movdqa %xmm1, %xmm4 321; SSE-NEXT: pand %xmm3, %xmm4 322; SSE-NEXT: pxor %xmm3, %xmm1 323; SSE-NEXT: psrlw $1, %xmm1 324; SSE-NEXT: pand %xmm2, %xmm1 325; SSE-NEXT: paddb %xmm4, %xmm1 326; SSE-NEXT: retq 327; 328; AVX1-LABEL: test_ext_v32i8: 329; AVX1: # %bb.0: 330; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2 331; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 332; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3 333; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 334; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 335; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0 336; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 337; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 338; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 339; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 340; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 341; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 342; AVX1-NEXT: retq 343; 344; AVX2-LABEL: test_ext_v32i8: 345; AVX2: # %bb.0: 346; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 347; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 348; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 349; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 350; AVX2-NEXT: vpaddb %ymm0, %ymm2, %ymm0 351; AVX2-NEXT: retq 352; 353; AVX512-LABEL: test_ext_v32i8: 354; AVX512: # %bb.0: 355; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 356; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 357; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm0 358; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 359; AVX512-NEXT: vpaddb %ymm0, %ymm2, %ymm0 360; AVX512-NEXT: retq 361 %x0 = zext <32 x i8> %a0 to <32 x i16> 362 %x1 = zext <32 x i8> %a1 to <32 x i16> 363 %sum = add <32 x i16> %x0, %x1 364 %shift = lshr <32 x i16> %sum, <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, 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> 365 %res = trunc <32 x i16> %shift to <32 x i8> 366 ret <32 x i8> %res 367} 368 369define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 370; SSE-LABEL: test_fixed_v16i16: 371; SSE: # %bb.0: 372; SSE-NEXT: movdqa %xmm0, %xmm4 373; SSE-NEXT: pand %xmm2, %xmm4 374; SSE-NEXT: pxor %xmm2, %xmm0 375; SSE-NEXT: psrlw $1, %xmm0 376; SSE-NEXT: paddw %xmm4, %xmm0 377; SSE-NEXT: movdqa %xmm1, %xmm2 378; SSE-NEXT: pand %xmm3, %xmm2 379; SSE-NEXT: pxor %xmm3, %xmm1 380; SSE-NEXT: psrlw $1, %xmm1 381; SSE-NEXT: paddw %xmm2, %xmm1 382; SSE-NEXT: retq 383; 384; AVX1-LABEL: test_fixed_v16i16: 385; AVX1: # %bb.0: 386; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 387; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 388; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 389; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 390; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1 391; AVX1-NEXT: vpaddw %xmm1, %xmm3, %xmm1 392; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 393; AVX1-NEXT: vpaddw %xmm0, %xmm2, %xmm0 394; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 395; AVX1-NEXT: retq 396; 397; AVX2-LABEL: test_fixed_v16i16: 398; AVX2: # %bb.0: 399; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 400; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 401; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 402; AVX2-NEXT: vpaddw %ymm0, %ymm2, %ymm0 403; AVX2-NEXT: retq 404; 405; AVX512-LABEL: test_fixed_v16i16: 406; AVX512: # %bb.0: 407; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 408; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 409; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm0 410; AVX512-NEXT: vpaddw %ymm0, %ymm2, %ymm0 411; AVX512-NEXT: retq 412 %and = and <16 x i16> %a0, %a1 413 %xor = xor <16 x i16> %a1, %a0 414 %shift = lshr <16 x i16> %xor, <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> 415 %res = add <16 x i16> %and, %shift 416 ret <16 x i16> %res 417} 418 419define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 420; SSE-LABEL: test_ext_v16i16: 421; SSE: # %bb.0: 422; SSE-NEXT: movdqa %xmm0, %xmm4 423; SSE-NEXT: pand %xmm2, %xmm4 424; SSE-NEXT: pxor %xmm2, %xmm0 425; SSE-NEXT: psrlw $1, %xmm0 426; SSE-NEXT: paddw %xmm4, %xmm0 427; SSE-NEXT: movdqa %xmm1, %xmm2 428; SSE-NEXT: pand %xmm3, %xmm2 429; SSE-NEXT: pxor %xmm3, %xmm1 430; SSE-NEXT: psrlw $1, %xmm1 431; SSE-NEXT: paddw %xmm2, %xmm1 432; SSE-NEXT: retq 433; 434; AVX1-LABEL: test_ext_v16i16: 435; AVX1: # %bb.0: 436; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 437; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 438; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 439; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 440; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1 441; AVX1-NEXT: vpaddw %xmm1, %xmm3, %xmm1 442; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 443; AVX1-NEXT: vpaddw %xmm0, %xmm2, %xmm0 444; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 445; AVX1-NEXT: retq 446; 447; AVX2-LABEL: test_ext_v16i16: 448; AVX2: # %bb.0: 449; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 450; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 451; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 452; AVX2-NEXT: vpaddw %ymm0, %ymm2, %ymm0 453; AVX2-NEXT: retq 454; 455; AVX512-LABEL: test_ext_v16i16: 456; AVX512: # %bb.0: 457; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 458; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 459; AVX512-NEXT: vpsrlw $1, %ymm0, %ymm0 460; AVX512-NEXT: vpaddw %ymm0, %ymm2, %ymm0 461; AVX512-NEXT: retq 462 %x0 = zext <16 x i16> %a0 to <16 x i32> 463 %x1 = zext <16 x i16> %a1 to <16 x i32> 464 %sum = add <16 x i32> %x0, %x1 465 %shift = lshr <16 x i32> %sum, <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> 466 %res = trunc <16 x i32> %shift to <16 x i16> 467 ret <16 x i16> %res 468} 469 470define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 471; SSE-LABEL: test_fixed_v8i32: 472; SSE: # %bb.0: 473; SSE-NEXT: movdqa %xmm0, %xmm4 474; SSE-NEXT: pand %xmm2, %xmm4 475; SSE-NEXT: pxor %xmm2, %xmm0 476; SSE-NEXT: psrld $1, %xmm0 477; SSE-NEXT: paddd %xmm4, %xmm0 478; SSE-NEXT: movdqa %xmm1, %xmm2 479; SSE-NEXT: pand %xmm3, %xmm2 480; SSE-NEXT: pxor %xmm3, %xmm1 481; SSE-NEXT: psrld $1, %xmm1 482; SSE-NEXT: paddd %xmm2, %xmm1 483; SSE-NEXT: retq 484; 485; AVX1-LABEL: test_fixed_v8i32: 486; AVX1: # %bb.0: 487; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 488; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 489; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 490; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 491; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 492; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1 493; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 494; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm0 495; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 496; AVX1-NEXT: retq 497; 498; AVX2-LABEL: test_fixed_v8i32: 499; AVX2: # %bb.0: 500; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 501; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 502; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 503; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0 504; AVX2-NEXT: retq 505; 506; AVX512-LABEL: test_fixed_v8i32: 507; AVX512: # %bb.0: 508; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 509; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 510; AVX512-NEXT: vpsrld $1, %ymm0, %ymm0 511; AVX512-NEXT: vpaddd %ymm0, %ymm2, %ymm0 512; AVX512-NEXT: retq 513 %and = and <8 x i32> %a0, %a1 514 %xor = xor <8 x i32> %a1, %a0 515 %shift = lshr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 516 %res = add <8 x i32> %and, %shift 517 ret <8 x i32> %res 518} 519 520define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 521; SSE-LABEL: test_ext_v8i32: 522; SSE: # %bb.0: 523; SSE-NEXT: movdqa %xmm0, %xmm4 524; SSE-NEXT: pand %xmm2, %xmm4 525; SSE-NEXT: pxor %xmm2, %xmm0 526; SSE-NEXT: psrld $1, %xmm0 527; SSE-NEXT: paddd %xmm4, %xmm0 528; SSE-NEXT: movdqa %xmm1, %xmm2 529; SSE-NEXT: pand %xmm3, %xmm2 530; SSE-NEXT: pxor %xmm3, %xmm1 531; SSE-NEXT: psrld $1, %xmm1 532; SSE-NEXT: paddd %xmm2, %xmm1 533; SSE-NEXT: retq 534; 535; AVX1-LABEL: test_ext_v8i32: 536; AVX1: # %bb.0: 537; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 538; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 539; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 540; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 541; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 542; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1 543; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 544; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm0 545; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 546; AVX1-NEXT: retq 547; 548; AVX2-LABEL: test_ext_v8i32: 549; AVX2: # %bb.0: 550; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 551; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 552; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 553; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0 554; AVX2-NEXT: retq 555; 556; AVX512-LABEL: test_ext_v8i32: 557; AVX512: # %bb.0: 558; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 559; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 560; AVX512-NEXT: vpsrld $1, %ymm0, %ymm0 561; AVX512-NEXT: vpaddd %ymm0, %ymm2, %ymm0 562; AVX512-NEXT: retq 563 %x0 = zext <8 x i32> %a0 to <8 x i64> 564 %x1 = zext <8 x i32> %a1 to <8 x i64> 565 %sum = add <8 x i64> %x0, %x1 566 %shift = lshr <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 567 %res = trunc <8 x i64> %shift to <8 x i32> 568 ret <8 x i32> %res 569} 570 571define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 572; SSE-LABEL: test_fixed_v4i64: 573; SSE: # %bb.0: 574; SSE-NEXT: movdqa %xmm0, %xmm4 575; SSE-NEXT: pand %xmm2, %xmm4 576; SSE-NEXT: pxor %xmm2, %xmm0 577; SSE-NEXT: psrlq $1, %xmm0 578; SSE-NEXT: paddq %xmm4, %xmm0 579; SSE-NEXT: movdqa %xmm1, %xmm2 580; SSE-NEXT: pand %xmm3, %xmm2 581; SSE-NEXT: pxor %xmm3, %xmm1 582; SSE-NEXT: psrlq $1, %xmm1 583; SSE-NEXT: paddq %xmm2, %xmm1 584; SSE-NEXT: retq 585; 586; AVX1-LABEL: test_fixed_v4i64: 587; AVX1: # %bb.0: 588; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 589; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 590; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 591; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 592; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 593; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm1 594; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 595; AVX1-NEXT: vpaddq %xmm0, %xmm2, %xmm0 596; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 597; AVX1-NEXT: retq 598; 599; AVX2-LABEL: test_fixed_v4i64: 600; AVX2: # %bb.0: 601; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 602; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 603; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 604; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0 605; AVX2-NEXT: retq 606; 607; AVX512-LABEL: test_fixed_v4i64: 608; AVX512: # %bb.0: 609; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 610; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 611; AVX512-NEXT: vpsrlq $1, %ymm0, %ymm0 612; AVX512-NEXT: vpaddq %ymm0, %ymm2, %ymm0 613; AVX512-NEXT: retq 614 %and = and <4 x i64> %a0, %a1 615 %xor = xor <4 x i64> %a1, %a0 616 %shift = lshr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1> 617 %res = add <4 x i64> %and, %shift 618 ret <4 x i64> %res 619} 620 621define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 622; SSE-LABEL: test_ext_v4i64: 623; SSE: # %bb.0: 624; SSE-NEXT: movdqa %xmm0, %xmm4 625; SSE-NEXT: pand %xmm2, %xmm4 626; SSE-NEXT: pxor %xmm2, %xmm0 627; SSE-NEXT: psrlq $1, %xmm0 628; SSE-NEXT: paddq %xmm4, %xmm0 629; SSE-NEXT: movdqa %xmm1, %xmm2 630; SSE-NEXT: pand %xmm3, %xmm2 631; SSE-NEXT: pxor %xmm3, %xmm1 632; SSE-NEXT: psrlq $1, %xmm1 633; SSE-NEXT: paddq %xmm2, %xmm1 634; SSE-NEXT: retq 635; 636; AVX1-LABEL: test_ext_v4i64: 637; AVX1: # %bb.0: 638; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm2 639; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 640; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 641; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 642; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 643; AVX1-NEXT: vpaddq %xmm1, %xmm3, %xmm1 644; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 645; AVX1-NEXT: vpaddq %xmm0, %xmm2, %xmm0 646; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 647; AVX1-NEXT: retq 648; 649; AVX2-LABEL: test_ext_v4i64: 650; AVX2: # %bb.0: 651; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2 652; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 653; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 654; AVX2-NEXT: vpaddq %ymm0, %ymm2, %ymm0 655; AVX2-NEXT: retq 656; 657; AVX512-LABEL: test_ext_v4i64: 658; AVX512: # %bb.0: 659; AVX512-NEXT: vpand %ymm1, %ymm0, %ymm2 660; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 661; AVX512-NEXT: vpsrlq $1, %ymm0, %ymm0 662; AVX512-NEXT: vpaddq %ymm0, %ymm2, %ymm0 663; AVX512-NEXT: retq 664 %x0 = zext <4 x i64> %a0 to <4 x i128> 665 %x1 = zext <4 x i64> %a1 to <4 x i128> 666 %sum = add <4 x i128> %x0, %x1 667 %shift = lshr <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1> 668 %res = trunc <4 x i128> %shift to <4 x i64> 669 ret <4 x i64> %res 670} 671 672; 673; 512-bit vectors 674; 675 676define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 677; SSE-LABEL: test_fixed_v64i8: 678; SSE: # %bb.0: 679; SSE-NEXT: movdqa %xmm0, %xmm8 680; SSE-NEXT: pand %xmm4, %xmm8 681; SSE-NEXT: pxor %xmm4, %xmm0 682; SSE-NEXT: psrlw $1, %xmm0 683; SSE-NEXT: movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 684; SSE-NEXT: pand %xmm4, %xmm0 685; SSE-NEXT: paddb %xmm8, %xmm0 686; SSE-NEXT: movdqa %xmm1, %xmm8 687; SSE-NEXT: pand %xmm5, %xmm8 688; SSE-NEXT: pxor %xmm5, %xmm1 689; SSE-NEXT: psrlw $1, %xmm1 690; SSE-NEXT: pand %xmm4, %xmm1 691; SSE-NEXT: paddb %xmm8, %xmm1 692; SSE-NEXT: movdqa %xmm2, %xmm5 693; SSE-NEXT: pand %xmm6, %xmm5 694; SSE-NEXT: pxor %xmm6, %xmm2 695; SSE-NEXT: psrlw $1, %xmm2 696; SSE-NEXT: pand %xmm4, %xmm2 697; SSE-NEXT: paddb %xmm5, %xmm2 698; SSE-NEXT: movdqa %xmm3, %xmm5 699; SSE-NEXT: pand %xmm7, %xmm5 700; SSE-NEXT: pxor %xmm7, %xmm3 701; SSE-NEXT: psrlw $1, %xmm3 702; SSE-NEXT: pand %xmm4, %xmm3 703; SSE-NEXT: paddb %xmm5, %xmm3 704; SSE-NEXT: retq 705; 706; AVX1-LABEL: test_fixed_v64i8: 707; AVX1: # %bb.0: 708; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4 709; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 710; AVX1-NEXT: vpsrlw $1, %xmm5, %xmm5 711; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 712; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5 713; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 714; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 715; AVX1-NEXT: vpaddb %xmm5, %xmm2, %xmm2 716; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4 717; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4 718; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm0 719; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 720; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2 721; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 722; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4 723; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4 724; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 725; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 726; AVX1-NEXT: vpaddb %xmm4, %xmm3, %xmm3 727; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 728; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm2 729; AVX1-NEXT: vpaddb %xmm2, %xmm1, %xmm1 730; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 731; AVX1-NEXT: retq 732; 733; AVX2-LABEL: test_fixed_v64i8: 734; AVX2: # %bb.0: 735; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 736; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 737; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 738; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 739; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 740; AVX2-NEXT: vpaddb %ymm0, %ymm4, %ymm0 741; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm4 742; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 743; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm1 744; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 745; AVX2-NEXT: vpaddb %ymm1, %ymm4, %ymm1 746; AVX2-NEXT: retq 747; 748; AVX512-LABEL: test_fixed_v64i8: 749; AVX512: # %bb.0: 750; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 751; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 752; AVX512-NEXT: vpsrlw $1, %zmm0, %zmm0 753; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 754; AVX512-NEXT: vpaddb %zmm0, %zmm2, %zmm0 755; AVX512-NEXT: retq 756 %and = and <64 x i8> %a0, %a1 757 %xor = xor <64 x i8> %a0, %a1 758 %shift = lshr <64 x i8> %xor, <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, 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, 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, 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> 759 %res = add <64 x i8> %and, %shift 760 ret <64 x i8> %res 761} 762 763define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 764; SSE-LABEL: test_ext_v64i8: 765; SSE: # %bb.0: 766; SSE-NEXT: movdqa %xmm0, %xmm8 767; SSE-NEXT: pand %xmm4, %xmm8 768; SSE-NEXT: pxor %xmm4, %xmm0 769; SSE-NEXT: psrlw $1, %xmm0 770; SSE-NEXT: movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 771; SSE-NEXT: pand %xmm4, %xmm0 772; SSE-NEXT: paddb %xmm8, %xmm0 773; SSE-NEXT: movdqa %xmm1, %xmm8 774; SSE-NEXT: pand %xmm5, %xmm8 775; SSE-NEXT: pxor %xmm5, %xmm1 776; SSE-NEXT: psrlw $1, %xmm1 777; SSE-NEXT: pand %xmm4, %xmm1 778; SSE-NEXT: paddb %xmm8, %xmm1 779; SSE-NEXT: movdqa %xmm2, %xmm5 780; SSE-NEXT: pand %xmm6, %xmm5 781; SSE-NEXT: pxor %xmm6, %xmm2 782; SSE-NEXT: psrlw $1, %xmm2 783; SSE-NEXT: pand %xmm4, %xmm2 784; SSE-NEXT: paddb %xmm5, %xmm2 785; SSE-NEXT: movdqa %xmm3, %xmm5 786; SSE-NEXT: pand %xmm7, %xmm5 787; SSE-NEXT: pxor %xmm7, %xmm3 788; SSE-NEXT: psrlw $1, %xmm3 789; SSE-NEXT: pand %xmm4, %xmm3 790; SSE-NEXT: paddb %xmm5, %xmm3 791; SSE-NEXT: retq 792; 793; AVX1-LABEL: test_ext_v64i8: 794; AVX1: # %bb.0: 795; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4 796; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 797; AVX1-NEXT: vpsrlw $1, %xmm5, %xmm5 798; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 799; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5 800; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 801; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 802; AVX1-NEXT: vpaddb %xmm5, %xmm2, %xmm2 803; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4 804; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4 805; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm0 806; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 807; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2 808; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 809; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4 810; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4 811; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 812; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 813; AVX1-NEXT: vpaddb %xmm4, %xmm3, %xmm3 814; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 815; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm2 816; AVX1-NEXT: vpaddb %xmm2, %xmm1, %xmm1 817; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 818; AVX1-NEXT: retq 819; 820; AVX2-LABEL: test_ext_v64i8: 821; AVX2: # %bb.0: 822; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 823; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 824; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 825; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 826; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 827; AVX2-NEXT: vpaddb %ymm0, %ymm4, %ymm0 828; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm4 829; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 830; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm1 831; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 832; AVX2-NEXT: vpaddb %ymm1, %ymm4, %ymm1 833; AVX2-NEXT: retq 834; 835; AVX512-LABEL: test_ext_v64i8: 836; AVX512: # %bb.0: 837; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 838; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 839; AVX512-NEXT: vpsrlw $1, %zmm0, %zmm0 840; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 841; AVX512-NEXT: vpaddb %zmm0, %zmm2, %zmm0 842; AVX512-NEXT: retq 843 %x0 = zext <64 x i8> %a0 to <64 x i16> 844 %x1 = zext <64 x i8> %a1 to <64 x i16> 845 %sum = add <64 x i16> %x0, %x1 846 %shift = lshr <64 x i16> %sum, <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, 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, 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, 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> 847 %res = trunc <64 x i16> %shift to <64 x i8> 848 ret <64 x i8> %res 849} 850 851define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 852; SSE-LABEL: test_fixed_v32i16: 853; SSE: # %bb.0: 854; SSE-NEXT: movdqa %xmm0, %xmm8 855; SSE-NEXT: pand %xmm4, %xmm8 856; SSE-NEXT: pxor %xmm4, %xmm0 857; SSE-NEXT: psrlw $1, %xmm0 858; SSE-NEXT: paddw %xmm8, %xmm0 859; SSE-NEXT: movdqa %xmm1, %xmm4 860; SSE-NEXT: pand %xmm5, %xmm4 861; SSE-NEXT: pxor %xmm5, %xmm1 862; SSE-NEXT: psrlw $1, %xmm1 863; SSE-NEXT: paddw %xmm4, %xmm1 864; SSE-NEXT: movdqa %xmm2, %xmm4 865; SSE-NEXT: pand %xmm6, %xmm4 866; SSE-NEXT: pxor %xmm6, %xmm2 867; SSE-NEXT: psrlw $1, %xmm2 868; SSE-NEXT: paddw %xmm4, %xmm2 869; SSE-NEXT: movdqa %xmm3, %xmm4 870; SSE-NEXT: pand %xmm7, %xmm4 871; SSE-NEXT: pxor %xmm7, %xmm3 872; SSE-NEXT: psrlw $1, %xmm3 873; SSE-NEXT: paddw %xmm4, %xmm3 874; SSE-NEXT: retq 875; 876; AVX1-LABEL: test_fixed_v32i16: 877; AVX1: # %bb.0: 878; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 879; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 880; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 881; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 882; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 883; AVX1-NEXT: vpaddw %xmm2, %xmm5, %xmm2 884; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 885; AVX1-NEXT: vpaddw %xmm0, %xmm4, %xmm0 886; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 887; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 888; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 889; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 890; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 891; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3 892; AVX1-NEXT: vpaddw %xmm3, %xmm4, %xmm3 893; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1 894; AVX1-NEXT: vpaddw %xmm1, %xmm2, %xmm1 895; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 896; AVX1-NEXT: retq 897; 898; AVX2-LABEL: test_fixed_v32i16: 899; AVX2: # %bb.0: 900; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 901; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 902; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 903; AVX2-NEXT: vpaddw %ymm0, %ymm4, %ymm0 904; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 905; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 906; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm1 907; AVX2-NEXT: vpaddw %ymm1, %ymm2, %ymm1 908; AVX2-NEXT: retq 909; 910; AVX512-LABEL: test_fixed_v32i16: 911; AVX512: # %bb.0: 912; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 913; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 914; AVX512-NEXT: vpsrlw $1, %zmm0, %zmm0 915; AVX512-NEXT: vpaddw %zmm0, %zmm2, %zmm0 916; AVX512-NEXT: retq 917 %and = and <32 x i16> %a0, %a1 918 %xor = xor <32 x i16> %a1, %a0 919 %shift = lshr <32 x i16> %xor, <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, 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> 920 %res = add <32 x i16> %and, %shift 921 ret <32 x i16> %res 922} 923 924define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 925; SSE-LABEL: test_ext_v32i16: 926; SSE: # %bb.0: 927; SSE-NEXT: movdqa %xmm0, %xmm8 928; SSE-NEXT: pand %xmm4, %xmm8 929; SSE-NEXT: pxor %xmm4, %xmm0 930; SSE-NEXT: psrlw $1, %xmm0 931; SSE-NEXT: paddw %xmm8, %xmm0 932; SSE-NEXT: movdqa %xmm1, %xmm4 933; SSE-NEXT: pand %xmm5, %xmm4 934; SSE-NEXT: pxor %xmm5, %xmm1 935; SSE-NEXT: psrlw $1, %xmm1 936; SSE-NEXT: paddw %xmm4, %xmm1 937; SSE-NEXT: movdqa %xmm2, %xmm4 938; SSE-NEXT: pand %xmm6, %xmm4 939; SSE-NEXT: pxor %xmm6, %xmm2 940; SSE-NEXT: psrlw $1, %xmm2 941; SSE-NEXT: paddw %xmm4, %xmm2 942; SSE-NEXT: movdqa %xmm3, %xmm4 943; SSE-NEXT: pand %xmm7, %xmm4 944; SSE-NEXT: pxor %xmm7, %xmm3 945; SSE-NEXT: psrlw $1, %xmm3 946; SSE-NEXT: paddw %xmm4, %xmm3 947; SSE-NEXT: retq 948; 949; AVX1-LABEL: test_ext_v32i16: 950; AVX1: # %bb.0: 951; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 952; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 953; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 954; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 955; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm2 956; AVX1-NEXT: vpaddw %xmm2, %xmm5, %xmm2 957; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0 958; AVX1-NEXT: vpaddw %xmm0, %xmm4, %xmm0 959; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 960; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 961; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 962; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 963; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 964; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3 965; AVX1-NEXT: vpaddw %xmm3, %xmm4, %xmm3 966; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1 967; AVX1-NEXT: vpaddw %xmm1, %xmm2, %xmm1 968; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 969; AVX1-NEXT: retq 970; 971; AVX2-LABEL: test_ext_v32i16: 972; AVX2: # %bb.0: 973; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 974; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 975; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0 976; AVX2-NEXT: vpaddw %ymm0, %ymm4, %ymm0 977; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 978; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 979; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm1 980; AVX2-NEXT: vpaddw %ymm1, %ymm2, %ymm1 981; AVX2-NEXT: retq 982; 983; AVX512-LABEL: test_ext_v32i16: 984; AVX512: # %bb.0: 985; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 986; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 987; AVX512-NEXT: vpsrlw $1, %zmm0, %zmm0 988; AVX512-NEXT: vpaddw %zmm0, %zmm2, %zmm0 989; AVX512-NEXT: retq 990 %x0 = zext <32 x i16> %a0 to <32 x i32> 991 %x1 = zext <32 x i16> %a1 to <32 x i32> 992 %sum = add <32 x i32> %x0, %x1 993 %shift = lshr <32 x i32> %sum, <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, 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> 994 %res = trunc <32 x i32> %shift to <32 x i16> 995 ret <32 x i16> %res 996} 997 998define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 999; SSE-LABEL: test_fixed_v16i32: 1000; SSE: # %bb.0: 1001; SSE-NEXT: movdqa %xmm0, %xmm8 1002; SSE-NEXT: pand %xmm4, %xmm8 1003; SSE-NEXT: pxor %xmm4, %xmm0 1004; SSE-NEXT: psrld $1, %xmm0 1005; SSE-NEXT: paddd %xmm8, %xmm0 1006; SSE-NEXT: movdqa %xmm1, %xmm4 1007; SSE-NEXT: pand %xmm5, %xmm4 1008; SSE-NEXT: pxor %xmm5, %xmm1 1009; SSE-NEXT: psrld $1, %xmm1 1010; SSE-NEXT: paddd %xmm4, %xmm1 1011; SSE-NEXT: movdqa %xmm2, %xmm4 1012; SSE-NEXT: pand %xmm6, %xmm4 1013; SSE-NEXT: pxor %xmm6, %xmm2 1014; SSE-NEXT: psrld $1, %xmm2 1015; SSE-NEXT: paddd %xmm4, %xmm2 1016; SSE-NEXT: movdqa %xmm3, %xmm4 1017; SSE-NEXT: pand %xmm7, %xmm4 1018; SSE-NEXT: pxor %xmm7, %xmm3 1019; SSE-NEXT: psrld $1, %xmm3 1020; SSE-NEXT: paddd %xmm4, %xmm3 1021; SSE-NEXT: retq 1022; 1023; AVX1-LABEL: test_fixed_v16i32: 1024; AVX1: # %bb.0: 1025; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 1026; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1027; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1028; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1029; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2 1030; AVX1-NEXT: vpaddd %xmm2, %xmm5, %xmm2 1031; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 1032; AVX1-NEXT: vpaddd %xmm0, %xmm4, %xmm0 1033; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1034; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 1035; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1036; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1037; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1038; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3 1039; AVX1-NEXT: vpaddd %xmm3, %xmm4, %xmm3 1040; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 1041; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm1 1042; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1043; AVX1-NEXT: retq 1044; 1045; AVX2-LABEL: test_fixed_v16i32: 1046; AVX2: # %bb.0: 1047; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 1048; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1049; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 1050; AVX2-NEXT: vpaddd %ymm0, %ymm4, %ymm0 1051; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 1052; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1053; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1 1054; AVX2-NEXT: vpaddd %ymm1, %ymm2, %ymm1 1055; AVX2-NEXT: retq 1056; 1057; AVX512-LABEL: test_fixed_v16i32: 1058; AVX512: # %bb.0: 1059; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm2 1060; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 1061; AVX512-NEXT: vpsrld $1, %zmm0, %zmm0 1062; AVX512-NEXT: vpaddd %zmm0, %zmm2, %zmm0 1063; AVX512-NEXT: retq 1064 %and = and <16 x i32> %a0, %a1 1065 %xor = xor <16 x i32> %a1, %a0 1066 %shift = lshr <16 x i32> %xor, <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> 1067 %res = add <16 x i32> %and, %shift 1068 ret <16 x i32> %res 1069} 1070 1071define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 1072; SSE-LABEL: test_ext_v16i32: 1073; SSE: # %bb.0: 1074; SSE-NEXT: movdqa %xmm0, %xmm8 1075; SSE-NEXT: pand %xmm4, %xmm8 1076; SSE-NEXT: pxor %xmm4, %xmm0 1077; SSE-NEXT: psrld $1, %xmm0 1078; SSE-NEXT: paddd %xmm8, %xmm0 1079; SSE-NEXT: movdqa %xmm1, %xmm4 1080; SSE-NEXT: pand %xmm5, %xmm4 1081; SSE-NEXT: pxor %xmm5, %xmm1 1082; SSE-NEXT: psrld $1, %xmm1 1083; SSE-NEXT: paddd %xmm4, %xmm1 1084; SSE-NEXT: movdqa %xmm2, %xmm4 1085; SSE-NEXT: pand %xmm6, %xmm4 1086; SSE-NEXT: pxor %xmm6, %xmm2 1087; SSE-NEXT: psrld $1, %xmm2 1088; SSE-NEXT: paddd %xmm4, %xmm2 1089; SSE-NEXT: movdqa %xmm3, %xmm4 1090; SSE-NEXT: pand %xmm7, %xmm4 1091; SSE-NEXT: pxor %xmm7, %xmm3 1092; SSE-NEXT: psrld $1, %xmm3 1093; SSE-NEXT: paddd %xmm4, %xmm3 1094; SSE-NEXT: retq 1095; 1096; AVX1-LABEL: test_ext_v16i32: 1097; AVX1: # %bb.0: 1098; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 1099; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1100; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1101; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1102; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2 1103; AVX1-NEXT: vpaddd %xmm2, %xmm5, %xmm2 1104; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 1105; AVX1-NEXT: vpaddd %xmm0, %xmm4, %xmm0 1106; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1107; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 1108; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1109; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1110; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1111; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3 1112; AVX1-NEXT: vpaddd %xmm3, %xmm4, %xmm3 1113; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 1114; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm1 1115; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1116; AVX1-NEXT: retq 1117; 1118; AVX2-LABEL: test_ext_v16i32: 1119; AVX2: # %bb.0: 1120; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 1121; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1122; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 1123; AVX2-NEXT: vpaddd %ymm0, %ymm4, %ymm0 1124; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 1125; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1126; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1 1127; AVX2-NEXT: vpaddd %ymm1, %ymm2, %ymm1 1128; AVX2-NEXT: retq 1129; 1130; AVX512-LABEL: test_ext_v16i32: 1131; AVX512: # %bb.0: 1132; AVX512-NEXT: vpandd %zmm1, %zmm0, %zmm2 1133; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 1134; AVX512-NEXT: vpsrld $1, %zmm0, %zmm0 1135; AVX512-NEXT: vpaddd %zmm0, %zmm2, %zmm0 1136; AVX512-NEXT: retq 1137 %x0 = zext <16 x i32> %a0 to <16 x i64> 1138 %x1 = zext <16 x i32> %a1 to <16 x i64> 1139 %sum = add <16 x i64> %x0, %x1 1140 %shift = lshr <16 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 1141 %res = trunc <16 x i64> %shift to <16 x i32> 1142 ret <16 x i32> %res 1143} 1144 1145define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 1146; SSE-LABEL: test_fixed_v8i64: 1147; SSE: # %bb.0: 1148; SSE-NEXT: movdqa %xmm0, %xmm8 1149; SSE-NEXT: pand %xmm4, %xmm8 1150; SSE-NEXT: pxor %xmm4, %xmm0 1151; SSE-NEXT: psrlq $1, %xmm0 1152; SSE-NEXT: paddq %xmm8, %xmm0 1153; SSE-NEXT: movdqa %xmm1, %xmm4 1154; SSE-NEXT: pand %xmm5, %xmm4 1155; SSE-NEXT: pxor %xmm5, %xmm1 1156; SSE-NEXT: psrlq $1, %xmm1 1157; SSE-NEXT: paddq %xmm4, %xmm1 1158; SSE-NEXT: movdqa %xmm2, %xmm4 1159; SSE-NEXT: pand %xmm6, %xmm4 1160; SSE-NEXT: pxor %xmm6, %xmm2 1161; SSE-NEXT: psrlq $1, %xmm2 1162; SSE-NEXT: paddq %xmm4, %xmm2 1163; SSE-NEXT: movdqa %xmm3, %xmm4 1164; SSE-NEXT: pand %xmm7, %xmm4 1165; SSE-NEXT: pxor %xmm7, %xmm3 1166; SSE-NEXT: psrlq $1, %xmm3 1167; SSE-NEXT: paddq %xmm4, %xmm3 1168; SSE-NEXT: retq 1169; 1170; AVX1-LABEL: test_fixed_v8i64: 1171; AVX1: # %bb.0: 1172; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 1173; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1174; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1175; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1176; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 1177; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm2 1178; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 1179; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0 1180; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1181; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 1182; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1183; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1184; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1185; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 1186; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3 1187; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 1188; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1 1189; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1190; AVX1-NEXT: retq 1191; 1192; AVX2-LABEL: test_fixed_v8i64: 1193; AVX2: # %bb.0: 1194; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 1195; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1196; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 1197; AVX2-NEXT: vpaddq %ymm0, %ymm4, %ymm0 1198; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 1199; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1200; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm1 1201; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1 1202; AVX2-NEXT: retq 1203; 1204; AVX512-LABEL: test_fixed_v8i64: 1205; AVX512: # %bb.0: 1206; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 1207; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1208; AVX512-NEXT: vpsrlq $1, %zmm0, %zmm0 1209; AVX512-NEXT: vpaddq %zmm0, %zmm2, %zmm0 1210; AVX512-NEXT: retq 1211 %and = and <8 x i64> %a0, %a1 1212 %xor = xor <8 x i64> %a1, %a0 1213 %shift = lshr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 1214 %res = add <8 x i64> %and, %shift 1215 ret <8 x i64> %res 1216} 1217 1218define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 1219; SSE-LABEL: test_ext_v8i64: 1220; SSE: # %bb.0: 1221; SSE-NEXT: movdqa %xmm0, %xmm8 1222; SSE-NEXT: pand %xmm4, %xmm8 1223; SSE-NEXT: pxor %xmm4, %xmm0 1224; SSE-NEXT: psrlq $1, %xmm0 1225; SSE-NEXT: paddq %xmm8, %xmm0 1226; SSE-NEXT: movdqa %xmm1, %xmm4 1227; SSE-NEXT: pand %xmm5, %xmm4 1228; SSE-NEXT: pxor %xmm5, %xmm1 1229; SSE-NEXT: psrlq $1, %xmm1 1230; SSE-NEXT: paddq %xmm4, %xmm1 1231; SSE-NEXT: movdqa %xmm2, %xmm4 1232; SSE-NEXT: pand %xmm6, %xmm4 1233; SSE-NEXT: pxor %xmm6, %xmm2 1234; SSE-NEXT: psrlq $1, %xmm2 1235; SSE-NEXT: paddq %xmm4, %xmm2 1236; SSE-NEXT: movdqa %xmm3, %xmm4 1237; SSE-NEXT: pand %xmm7, %xmm4 1238; SSE-NEXT: pxor %xmm7, %xmm3 1239; SSE-NEXT: psrlq $1, %xmm3 1240; SSE-NEXT: paddq %xmm4, %xmm3 1241; SSE-NEXT: retq 1242; 1243; AVX1-LABEL: test_ext_v8i64: 1244; AVX1: # %bb.0: 1245; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm4 1246; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1247; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1248; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1249; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 1250; AVX1-NEXT: vpaddq %xmm2, %xmm5, %xmm2 1251; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 1252; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0 1253; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1254; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm2 1255; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1256; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1257; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1258; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 1259; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3 1260; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 1261; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1 1262; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1263; AVX1-NEXT: retq 1264; 1265; AVX2-LABEL: test_ext_v8i64: 1266; AVX2: # %bb.0: 1267; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm4 1268; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1269; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 1270; AVX2-NEXT: vpaddq %ymm0, %ymm4, %ymm0 1271; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm2 1272; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1273; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm1 1274; AVX2-NEXT: vpaddq %ymm1, %ymm2, %ymm1 1275; AVX2-NEXT: retq 1276; 1277; AVX512-LABEL: test_ext_v8i64: 1278; AVX512: # %bb.0: 1279; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm2 1280; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1281; AVX512-NEXT: vpsrlq $1, %zmm0, %zmm0 1282; AVX512-NEXT: vpaddq %zmm0, %zmm2, %zmm0 1283; AVX512-NEXT: retq 1284 %x0 = zext <8 x i64> %a0 to <8 x i128> 1285 %x1 = zext <8 x i64> %a1 to <8 x i128> 1286 %sum = add <8 x i128> %x0, %x1 1287 %shift = lshr <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1> 1288 %res = trunc <8 x i128> %shift to <8 x i64> 1289 ret <8 x i64> %res 1290} 1291 1292;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 1293; SSE2: {{.*}} 1294; SSE4: {{.*}} 1295