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 {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 16; SSE-NEXT: pxor %xmm2, %xmm1 17; SSE-NEXT: pxor %xmm2, %xmm0 18; SSE-NEXT: pavgb %xmm1, %xmm0 19; SSE-NEXT: pxor %xmm2, %xmm0 20; SSE-NEXT: retq 21; 22; AVX1-LABEL: test_fixed_v16i8: 23; AVX1: # %bb.0: 24; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 25; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 26; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 27; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 28; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 29; AVX1-NEXT: retq 30; 31; AVX2-LABEL: test_fixed_v16i8: 32; AVX2: # %bb.0: 33; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 34; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 35; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 36; AVX2-NEXT: vpavgb %xmm1, %xmm0, %xmm0 37; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 38; AVX2-NEXT: retq 39; 40; AVX512-LABEL: test_fixed_v16i8: 41; AVX512: # %bb.0: 42; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 43; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1 44; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0 45; AVX512-NEXT: vpavgb %xmm1, %xmm0, %xmm0 46; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0 47; AVX512-NEXT: retq 48 %or = or <16 x i8> %a0, %a1 49 %xor = xor <16 x i8> %a0, %a1 50 %shift = ashr <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> 51 %res = sub <16 x i8> %or, %shift 52 ret <16 x i8> %res 53} 54 55define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind { 56; SSE-LABEL: test_ext_v16i8: 57; SSE: # %bb.0: 58; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 59; SSE-NEXT: pxor %xmm2, %xmm1 60; SSE-NEXT: pxor %xmm2, %xmm0 61; SSE-NEXT: pavgb %xmm1, %xmm0 62; SSE-NEXT: pxor %xmm2, %xmm0 63; SSE-NEXT: retq 64; 65; AVX1-LABEL: test_ext_v16i8: 66; AVX1: # %bb.0: 67; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 68; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 69; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 70; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 71; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 72; AVX1-NEXT: retq 73; 74; AVX2-LABEL: test_ext_v16i8: 75; AVX2: # %bb.0: 76; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 77; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 78; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 79; AVX2-NEXT: vpavgb %xmm1, %xmm0, %xmm0 80; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 81; AVX2-NEXT: retq 82; 83; AVX512-LABEL: test_ext_v16i8: 84; AVX512: # %bb.0: 85; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 86; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1 87; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0 88; AVX512-NEXT: vpavgb %xmm1, %xmm0, %xmm0 89; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0 90; AVX512-NEXT: retq 91 %x0 = sext <16 x i8> %a0 to <16 x i16> 92 %x1 = sext <16 x i8> %a1 to <16 x i16> 93 %sum = add <16 x i16> %x0, %x1 94 %inc = add <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> 95 %shift = ashr <16 x i16> %inc, <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> 96 %res = trunc <16 x i16> %shift to <16 x i8> 97 ret <16 x i8> %res 98} 99 100define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind { 101; SSE-LABEL: test_fixed_v8i16: 102; SSE: # %bb.0: 103; SSE-NEXT: movdqa %xmm0, %xmm2 104; SSE-NEXT: por %xmm1, %xmm2 105; SSE-NEXT: pxor %xmm1, %xmm0 106; SSE-NEXT: psraw $1, %xmm0 107; SSE-NEXT: psubw %xmm0, %xmm2 108; SSE-NEXT: movdqa %xmm2, %xmm0 109; SSE-NEXT: retq 110; 111; AVX-LABEL: test_fixed_v8i16: 112; AVX: # %bb.0: 113; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 114; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 115; AVX-NEXT: vpsraw $1, %xmm0, %xmm0 116; AVX-NEXT: vpsubw %xmm0, %xmm2, %xmm0 117; AVX-NEXT: retq 118 %or = or <8 x i16> %a0, %a1 119 %xor = xor <8 x i16> %a1, %a0 120 %shift = ashr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 121 %res = sub <8 x i16> %or, %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: por %xmm1, %xmm2 130; SSE-NEXT: pxor %xmm1, %xmm0 131; SSE-NEXT: psraw $1, %xmm0 132; SSE-NEXT: psubw %xmm0, %xmm2 133; SSE-NEXT: movdqa %xmm2, %xmm0 134; SSE-NEXT: retq 135; 136; AVX-LABEL: test_ext_v8i16: 137; AVX: # %bb.0: 138; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 139; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 140; AVX-NEXT: vpsraw $1, %xmm0, %xmm0 141; AVX-NEXT: vpsubw %xmm0, %xmm2, %xmm0 142; AVX-NEXT: retq 143 %x0 = sext <8 x i16> %a0 to <8 x i32> 144 %x1 = sext <8 x i16> %a1 to <8 x i32> 145 %sum = add <8 x i32> %x0, %x1 146 %inc = add <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 147 %shift = ashr <8 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 148 %res = trunc <8 x i32> %shift to <8 x i16> 149 ret <8 x i16> %res 150} 151 152define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 153; SSE-LABEL: test_fixed_v4i32: 154; SSE: # %bb.0: 155; SSE-NEXT: movdqa %xmm0, %xmm2 156; SSE-NEXT: por %xmm1, %xmm2 157; SSE-NEXT: pxor %xmm1, %xmm0 158; SSE-NEXT: psrad $1, %xmm0 159; SSE-NEXT: psubd %xmm0, %xmm2 160; SSE-NEXT: movdqa %xmm2, %xmm0 161; SSE-NEXT: retq 162; 163; AVX-LABEL: test_fixed_v4i32: 164; AVX: # %bb.0: 165; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 166; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 167; AVX-NEXT: vpsrad $1, %xmm0, %xmm0 168; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0 169; AVX-NEXT: retq 170 %or = or <4 x i32> %a0, %a1 171 %xor = xor <4 x i32> %a1, %a0 172 %shift = ashr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1> 173 %res = sub <4 x i32> %or, %shift 174 ret <4 x i32> %res 175} 176 177define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 178; SSE-LABEL: test_ext_v4i32: 179; SSE: # %bb.0: 180; SSE-NEXT: movdqa %xmm0, %xmm2 181; SSE-NEXT: por %xmm1, %xmm2 182; SSE-NEXT: pxor %xmm1, %xmm0 183; SSE-NEXT: psrad $1, %xmm0 184; SSE-NEXT: psubd %xmm0, %xmm2 185; SSE-NEXT: movdqa %xmm2, %xmm0 186; SSE-NEXT: retq 187; 188; AVX-LABEL: test_ext_v4i32: 189; AVX: # %bb.0: 190; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 191; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 192; AVX-NEXT: vpsrad $1, %xmm0, %xmm0 193; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0 194; AVX-NEXT: retq 195 %x0 = sext <4 x i32> %a0 to <4 x i64> 196 %x1 = sext <4 x i32> %a1 to <4 x i64> 197 %sum = add <4 x i64> %x0, %x1 198 %inc = add <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1> 199 %shift = ashr <4 x i64> %inc, <i64 1, i64 1, i64 1, i64 1> 200 %res = trunc <4 x i64> %shift to <4 x i32> 201 ret <4 x i32> %res 202} 203 204define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 205; SSE2-LABEL: test_fixed_v2i64: 206; SSE2: # %bb.0: 207; SSE2-NEXT: movdqa %xmm0, %xmm2 208; SSE2-NEXT: pxor %xmm1, %xmm2 209; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3] 210; SSE2-NEXT: psrad $1, %xmm3 211; SSE2-NEXT: psrlq $1, %xmm2 212; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 213; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 214; SSE2-NEXT: por %xmm1, %xmm0 215; SSE2-NEXT: psubq %xmm2, %xmm0 216; SSE2-NEXT: retq 217; 218; SSE4-LABEL: test_fixed_v2i64: 219; SSE4: # %bb.0: 220; SSE4-NEXT: movdqa %xmm0, %xmm2 221; SSE4-NEXT: pxor %xmm1, %xmm2 222; SSE4-NEXT: movdqa %xmm2, %xmm3 223; SSE4-NEXT: psrad $1, %xmm3 224; SSE4-NEXT: psrlq $1, %xmm2 225; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 226; SSE4-NEXT: por %xmm1, %xmm0 227; SSE4-NEXT: psubq %xmm2, %xmm0 228; SSE4-NEXT: retq 229; 230; AVX1-LABEL: test_fixed_v2i64: 231; AVX1: # %bb.0: 232; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2 233; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3 234; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 235; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 236; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 237; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 238; AVX1-NEXT: retq 239; 240; AVX2-LABEL: test_fixed_v2i64: 241; AVX2: # %bb.0: 242; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm2 243; AVX2-NEXT: vpsrad $1, %xmm2, %xmm3 244; AVX2-NEXT: vpsrlq $1, %xmm2, %xmm2 245; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3] 246; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 247; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0 248; AVX2-NEXT: retq 249; 250; AVX512-LABEL: test_fixed_v2i64: 251; AVX512: # %bb.0: 252; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2 253; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0 254; AVX512-NEXT: vpsraq $1, %xmm0, %xmm0 255; AVX512-NEXT: vpsubq %xmm0, %xmm2, %xmm0 256; AVX512-NEXT: retq 257 %or = or <2 x i64> %a0, %a1 258 %xor = xor <2 x i64> %a1, %a0 259 %shift = ashr <2 x i64> %xor, <i64 1, i64 1> 260 %res = sub <2 x i64> %or, %shift 261 ret <2 x i64> %res 262} 263 264define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 265; SSE2-LABEL: test_ext_v2i64: 266; SSE2: # %bb.0: 267; SSE2-NEXT: movdqa %xmm0, %xmm2 268; SSE2-NEXT: pxor %xmm1, %xmm2 269; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3] 270; SSE2-NEXT: psrad $1, %xmm3 271; SSE2-NEXT: psrlq $1, %xmm2 272; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 273; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 274; SSE2-NEXT: por %xmm1, %xmm0 275; SSE2-NEXT: psubq %xmm2, %xmm0 276; SSE2-NEXT: retq 277; 278; SSE4-LABEL: test_ext_v2i64: 279; SSE4: # %bb.0: 280; SSE4-NEXT: movdqa %xmm0, %xmm2 281; SSE4-NEXT: pxor %xmm1, %xmm2 282; SSE4-NEXT: movdqa %xmm2, %xmm3 283; SSE4-NEXT: psrad $1, %xmm3 284; SSE4-NEXT: psrlq $1, %xmm2 285; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 286; SSE4-NEXT: por %xmm1, %xmm0 287; SSE4-NEXT: psubq %xmm2, %xmm0 288; SSE4-NEXT: retq 289; 290; AVX1-LABEL: test_ext_v2i64: 291; AVX1: # %bb.0: 292; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2 293; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3 294; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 295; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 296; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 297; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 298; AVX1-NEXT: retq 299; 300; AVX2-LABEL: test_ext_v2i64: 301; AVX2: # %bb.0: 302; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm2 303; AVX2-NEXT: vpsrad $1, %xmm2, %xmm3 304; AVX2-NEXT: vpsrlq $1, %xmm2, %xmm2 305; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3] 306; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 307; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0 308; AVX2-NEXT: retq 309; 310; AVX512-LABEL: test_ext_v2i64: 311; AVX512: # %bb.0: 312; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2 313; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0 314; AVX512-NEXT: vpsraq $1, %xmm0, %xmm0 315; AVX512-NEXT: vpsubq %xmm0, %xmm2, %xmm0 316; AVX512-NEXT: retq 317 %x0 = sext <2 x i64> %a0 to <2 x i128> 318 %x1 = sext <2 x i64> %a1 to <2 x i128> 319 %sum = add <2 x i128> %x0, %x1 320 %inc = add <2 x i128> %sum, <i128 1, i128 1> 321 %shift = ashr <2 x i128> %inc, <i128 1, i128 1> 322 %res = trunc <2 x i128> %shift to <2 x i64> 323 ret <2 x i64> %res 324} 325 326; 327; 256-bit vectors 328; 329 330define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 331; SSE-LABEL: test_fixed_v32i8: 332; SSE: # %bb.0: 333; SSE-NEXT: movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 334; SSE-NEXT: pxor %xmm4, %xmm2 335; SSE-NEXT: pxor %xmm4, %xmm0 336; SSE-NEXT: pavgb %xmm2, %xmm0 337; SSE-NEXT: pxor %xmm4, %xmm0 338; SSE-NEXT: pxor %xmm4, %xmm3 339; SSE-NEXT: pxor %xmm4, %xmm1 340; SSE-NEXT: pavgb %xmm3, %xmm1 341; SSE-NEXT: pxor %xmm4, %xmm1 342; SSE-NEXT: retq 343; 344; AVX1-LABEL: test_fixed_v32i8: 345; AVX1: # %bb.0: 346; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 347; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 348; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 349; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 350; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 351; AVX1-NEXT: vpavgb %xmm3, %xmm4, %xmm3 352; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 353; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 354; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 355; AVX1-NEXT: retq 356; 357; AVX2-LABEL: test_fixed_v32i8: 358; AVX2: # %bb.0: 359; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 360; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 361; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 362; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0 363; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 364; AVX2-NEXT: retq 365; 366; AVX512-LABEL: test_fixed_v32i8: 367; AVX512: # %bb.0: 368; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 369; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1 370; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 371; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0 372; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 373; AVX512-NEXT: retq 374 %or = or <32 x i8> %a0, %a1 375 %xor = xor <32 x i8> %a0, %a1 376 %shift = ashr <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> 377 %res = sub <32 x i8> %or, %shift 378 ret <32 x i8> %res 379} 380 381define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 382; SSE-LABEL: test_ext_v32i8: 383; SSE: # %bb.0: 384; SSE-NEXT: movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 385; SSE-NEXT: pxor %xmm4, %xmm2 386; SSE-NEXT: pxor %xmm4, %xmm0 387; SSE-NEXT: pavgb %xmm2, %xmm0 388; SSE-NEXT: pxor %xmm4, %xmm0 389; SSE-NEXT: pxor %xmm4, %xmm3 390; SSE-NEXT: pxor %xmm4, %xmm1 391; SSE-NEXT: pavgb %xmm3, %xmm1 392; SSE-NEXT: pxor %xmm4, %xmm1 393; SSE-NEXT: retq 394; 395; AVX1-LABEL: test_ext_v32i8: 396; AVX1: # %bb.0: 397; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 398; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 399; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 400; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 401; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 402; AVX1-NEXT: vpavgb %xmm3, %xmm4, %xmm3 403; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 404; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 405; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 406; AVX1-NEXT: retq 407; 408; AVX2-LABEL: test_ext_v32i8: 409; AVX2: # %bb.0: 410; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 411; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 412; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 413; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0 414; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 415; AVX2-NEXT: retq 416; 417; AVX512-LABEL: test_ext_v32i8: 418; AVX512: # %bb.0: 419; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 420; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1 421; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 422; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0 423; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0 424; AVX512-NEXT: retq 425 %x0 = sext <32 x i8> %a0 to <32 x i16> 426 %x1 = sext <32 x i8> %a1 to <32 x i16> 427 %sum = add <32 x i16> %x0, %x1 428 %inc = add <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> 429 %shift = ashr <32 x i16> %inc, <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> 430 %res = trunc <32 x i16> %shift to <32 x i8> 431 ret <32 x i8> %res 432} 433 434define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 435; SSE-LABEL: test_fixed_v16i16: 436; SSE: # %bb.0: 437; SSE-NEXT: movdqa %xmm0, %xmm4 438; SSE-NEXT: por %xmm2, %xmm4 439; SSE-NEXT: pxor %xmm2, %xmm0 440; SSE-NEXT: psraw $1, %xmm0 441; SSE-NEXT: psubw %xmm0, %xmm4 442; SSE-NEXT: movdqa %xmm1, %xmm2 443; SSE-NEXT: por %xmm3, %xmm2 444; SSE-NEXT: pxor %xmm3, %xmm1 445; SSE-NEXT: psraw $1, %xmm1 446; SSE-NEXT: psubw %xmm1, %xmm2 447; SSE-NEXT: movdqa %xmm4, %xmm0 448; SSE-NEXT: movdqa %xmm2, %xmm1 449; SSE-NEXT: retq 450; 451; AVX1-LABEL: test_fixed_v16i16: 452; AVX1: # %bb.0: 453; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 454; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 455; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 456; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 457; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1 458; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1 459; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0 460; AVX1-NEXT: vpsubw %xmm0, %xmm2, %xmm0 461; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 462; AVX1-NEXT: retq 463; 464; AVX2-LABEL: test_fixed_v16i16: 465; AVX2: # %bb.0: 466; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 467; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 468; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0 469; AVX2-NEXT: vpsubw %ymm0, %ymm2, %ymm0 470; AVX2-NEXT: retq 471; 472; AVX512-LABEL: test_fixed_v16i16: 473; AVX512: # %bb.0: 474; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 475; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 476; AVX512-NEXT: vpsraw $1, %ymm0, %ymm0 477; AVX512-NEXT: vpsubw %ymm0, %ymm2, %ymm0 478; AVX512-NEXT: retq 479 %or = or <16 x i16> %a0, %a1 480 %xor = xor <16 x i16> %a1, %a0 481 %shift = ashr <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> 482 %res = sub <16 x i16> %or, %shift 483 ret <16 x i16> %res 484} 485 486define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 487; SSE-LABEL: test_ext_v16i16: 488; SSE: # %bb.0: 489; SSE-NEXT: movdqa %xmm0, %xmm4 490; SSE-NEXT: por %xmm2, %xmm4 491; SSE-NEXT: pxor %xmm2, %xmm0 492; SSE-NEXT: psraw $1, %xmm0 493; SSE-NEXT: psubw %xmm0, %xmm4 494; SSE-NEXT: movdqa %xmm1, %xmm2 495; SSE-NEXT: por %xmm3, %xmm2 496; SSE-NEXT: pxor %xmm3, %xmm1 497; SSE-NEXT: psraw $1, %xmm1 498; SSE-NEXT: psubw %xmm1, %xmm2 499; SSE-NEXT: movdqa %xmm4, %xmm0 500; SSE-NEXT: movdqa %xmm2, %xmm1 501; SSE-NEXT: retq 502; 503; AVX1-LABEL: test_ext_v16i16: 504; AVX1: # %bb.0: 505; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 506; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 507; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 508; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 509; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1 510; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1 511; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0 512; AVX1-NEXT: vpsubw %xmm0, %xmm2, %xmm0 513; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 514; AVX1-NEXT: retq 515; 516; AVX2-LABEL: test_ext_v16i16: 517; AVX2: # %bb.0: 518; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 519; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 520; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0 521; AVX2-NEXT: vpsubw %ymm0, %ymm2, %ymm0 522; AVX2-NEXT: retq 523; 524; AVX512-LABEL: test_ext_v16i16: 525; AVX512: # %bb.0: 526; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 527; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 528; AVX512-NEXT: vpsraw $1, %ymm0, %ymm0 529; AVX512-NEXT: vpsubw %ymm0, %ymm2, %ymm0 530; AVX512-NEXT: retq 531 %x0 = sext <16 x i16> %a0 to <16 x i32> 532 %x1 = sext <16 x i16> %a1 to <16 x i32> 533 %sum = add <16 x i32> %x0, %x1 534 %inc = add <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> 535 %shift = ashr <16 x i32> %inc, <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> 536 %res = trunc <16 x i32> %shift to <16 x i16> 537 ret <16 x i16> %res 538} 539 540define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 541; SSE-LABEL: test_fixed_v8i32: 542; SSE: # %bb.0: 543; SSE-NEXT: movdqa %xmm0, %xmm4 544; SSE-NEXT: por %xmm2, %xmm4 545; SSE-NEXT: pxor %xmm2, %xmm0 546; SSE-NEXT: psrad $1, %xmm0 547; SSE-NEXT: psubd %xmm0, %xmm4 548; SSE-NEXT: movdqa %xmm1, %xmm2 549; SSE-NEXT: por %xmm3, %xmm2 550; SSE-NEXT: pxor %xmm3, %xmm1 551; SSE-NEXT: psrad $1, %xmm1 552; SSE-NEXT: psubd %xmm1, %xmm2 553; SSE-NEXT: movdqa %xmm4, %xmm0 554; SSE-NEXT: movdqa %xmm2, %xmm1 555; SSE-NEXT: retq 556; 557; AVX1-LABEL: test_fixed_v8i32: 558; AVX1: # %bb.0: 559; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 560; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 561; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 562; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 563; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1 564; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 565; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0 566; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0 567; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 568; AVX1-NEXT: retq 569; 570; AVX2-LABEL: test_fixed_v8i32: 571; AVX2: # %bb.0: 572; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 573; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 574; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0 575; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0 576; AVX2-NEXT: retq 577; 578; AVX512-LABEL: test_fixed_v8i32: 579; AVX512: # %bb.0: 580; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 581; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 582; AVX512-NEXT: vpsrad $1, %ymm0, %ymm0 583; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0 584; AVX512-NEXT: retq 585 %or = or <8 x i32> %a0, %a1 586 %xor = xor <8 x i32> %a1, %a0 587 %shift = ashr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 588 %res = sub <8 x i32> %or, %shift 589 ret <8 x i32> %res 590} 591 592define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 593; SSE-LABEL: test_ext_v8i32: 594; SSE: # %bb.0: 595; SSE-NEXT: movdqa %xmm0, %xmm4 596; SSE-NEXT: por %xmm2, %xmm4 597; SSE-NEXT: pxor %xmm2, %xmm0 598; SSE-NEXT: psrad $1, %xmm0 599; SSE-NEXT: psubd %xmm0, %xmm4 600; SSE-NEXT: movdqa %xmm1, %xmm2 601; SSE-NEXT: por %xmm3, %xmm2 602; SSE-NEXT: pxor %xmm3, %xmm1 603; SSE-NEXT: psrad $1, %xmm1 604; SSE-NEXT: psubd %xmm1, %xmm2 605; SSE-NEXT: movdqa %xmm4, %xmm0 606; SSE-NEXT: movdqa %xmm2, %xmm1 607; SSE-NEXT: retq 608; 609; AVX1-LABEL: test_ext_v8i32: 610; AVX1: # %bb.0: 611; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 612; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 613; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 614; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 615; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1 616; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 617; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0 618; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0 619; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 620; AVX1-NEXT: retq 621; 622; AVX2-LABEL: test_ext_v8i32: 623; AVX2: # %bb.0: 624; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 625; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 626; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0 627; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0 628; AVX2-NEXT: retq 629; 630; AVX512-LABEL: test_ext_v8i32: 631; AVX512: # %bb.0: 632; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 633; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 634; AVX512-NEXT: vpsrad $1, %ymm0, %ymm0 635; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0 636; AVX512-NEXT: retq 637 %x0 = sext <8 x i32> %a0 to <8 x i64> 638 %x1 = sext <8 x i32> %a1 to <8 x i64> 639 %sum = add <8 x i64> %x0, %x1 640 %inc = add <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 641 %shift = ashr <8 x i64> %inc, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 642 %res = trunc <8 x i64> %shift to <8 x i32> 643 ret <8 x i32> %res 644} 645 646define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 647; SSE2-LABEL: test_fixed_v4i64: 648; SSE2: # %bb.0: 649; SSE2-NEXT: movdqa %xmm0, %xmm4 650; SSE2-NEXT: pxor %xmm2, %xmm4 651; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 652; SSE2-NEXT: psrad $1, %xmm5 653; SSE2-NEXT: psrlq $1, %xmm4 654; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 655; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 656; SSE2-NEXT: por %xmm2, %xmm0 657; SSE2-NEXT: psubq %xmm4, %xmm0 658; SSE2-NEXT: movdqa %xmm1, %xmm2 659; SSE2-NEXT: pxor %xmm3, %xmm2 660; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3] 661; SSE2-NEXT: psrad $1, %xmm4 662; SSE2-NEXT: psrlq $1, %xmm2 663; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 664; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 665; SSE2-NEXT: por %xmm3, %xmm1 666; SSE2-NEXT: psubq %xmm2, %xmm1 667; SSE2-NEXT: retq 668; 669; SSE4-LABEL: test_fixed_v4i64: 670; SSE4: # %bb.0: 671; SSE4-NEXT: movdqa %xmm0, %xmm4 672; SSE4-NEXT: pxor %xmm2, %xmm4 673; SSE4-NEXT: movdqa %xmm4, %xmm5 674; SSE4-NEXT: psrad $1, %xmm5 675; SSE4-NEXT: psrlq $1, %xmm4 676; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 677; SSE4-NEXT: por %xmm2, %xmm0 678; SSE4-NEXT: psubq %xmm4, %xmm0 679; SSE4-NEXT: movdqa %xmm1, %xmm2 680; SSE4-NEXT: pxor %xmm3, %xmm2 681; SSE4-NEXT: movdqa %xmm2, %xmm4 682; SSE4-NEXT: psrad $1, %xmm4 683; SSE4-NEXT: psrlq $1, %xmm2 684; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 685; SSE4-NEXT: por %xmm3, %xmm1 686; SSE4-NEXT: psubq %xmm2, %xmm1 687; SSE4-NEXT: retq 688; 689; AVX1-LABEL: test_fixed_v4i64: 690; AVX1: # %bb.0: 691; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2 692; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 693; AVX1-NEXT: vpsrad $1, %xmm3, %xmm4 694; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 695; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7] 696; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 697; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 698; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1 699; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3 700; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 701; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 702; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 703; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 704; AVX1-NEXT: retq 705; 706; AVX2-LABEL: test_fixed_v4i64: 707; AVX2: # %bb.0: 708; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm2 709; AVX2-NEXT: vpsrad $1, %ymm2, %ymm3 710; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2 711; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3],ymm2[4],ymm3[5],ymm2[6],ymm3[7] 712; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 713; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 714; AVX2-NEXT: retq 715; 716; AVX512-LABEL: test_fixed_v4i64: 717; AVX512: # %bb.0: 718; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 719; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 720; AVX512-NEXT: vpsraq $1, %ymm0, %ymm0 721; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0 722; AVX512-NEXT: retq 723 %or = or <4 x i64> %a0, %a1 724 %xor = xor <4 x i64> %a1, %a0 725 %shift = ashr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1> 726 %res = sub <4 x i64> %or, %shift 727 ret <4 x i64> %res 728} 729 730define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 731; SSE2-LABEL: test_ext_v4i64: 732; SSE2: # %bb.0: 733; SSE2-NEXT: movdqa %xmm0, %xmm4 734; SSE2-NEXT: pxor %xmm2, %xmm4 735; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 736; SSE2-NEXT: psrad $1, %xmm5 737; SSE2-NEXT: psrlq $1, %xmm4 738; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 739; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 740; SSE2-NEXT: por %xmm2, %xmm0 741; SSE2-NEXT: psubq %xmm4, %xmm0 742; SSE2-NEXT: movdqa %xmm1, %xmm2 743; SSE2-NEXT: pxor %xmm3, %xmm2 744; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3] 745; SSE2-NEXT: psrad $1, %xmm4 746; SSE2-NEXT: psrlq $1, %xmm2 747; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 748; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 749; SSE2-NEXT: por %xmm3, %xmm1 750; SSE2-NEXT: psubq %xmm2, %xmm1 751; SSE2-NEXT: retq 752; 753; SSE4-LABEL: test_ext_v4i64: 754; SSE4: # %bb.0: 755; SSE4-NEXT: movdqa %xmm0, %xmm4 756; SSE4-NEXT: pxor %xmm2, %xmm4 757; SSE4-NEXT: movdqa %xmm4, %xmm5 758; SSE4-NEXT: psrad $1, %xmm5 759; SSE4-NEXT: psrlq $1, %xmm4 760; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 761; SSE4-NEXT: por %xmm2, %xmm0 762; SSE4-NEXT: psubq %xmm4, %xmm0 763; SSE4-NEXT: movdqa %xmm1, %xmm2 764; SSE4-NEXT: pxor %xmm3, %xmm2 765; SSE4-NEXT: movdqa %xmm2, %xmm4 766; SSE4-NEXT: psrad $1, %xmm4 767; SSE4-NEXT: psrlq $1, %xmm2 768; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 769; SSE4-NEXT: por %xmm3, %xmm1 770; SSE4-NEXT: psubq %xmm2, %xmm1 771; SSE4-NEXT: retq 772; 773; AVX1-LABEL: test_ext_v4i64: 774; AVX1: # %bb.0: 775; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2 776; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 777; AVX1-NEXT: vpsrad $1, %xmm3, %xmm4 778; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 779; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7] 780; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 781; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 782; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1 783; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3 784; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 785; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7] 786; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0 787; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 788; AVX1-NEXT: retq 789; 790; AVX2-LABEL: test_ext_v4i64: 791; AVX2: # %bb.0: 792; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm2 793; AVX2-NEXT: vpsrad $1, %ymm2, %ymm3 794; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2 795; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3],ymm2[4],ymm3[5],ymm2[6],ymm3[7] 796; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 797; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0 798; AVX2-NEXT: retq 799; 800; AVX512-LABEL: test_ext_v4i64: 801; AVX512: # %bb.0: 802; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 803; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 804; AVX512-NEXT: vpsraq $1, %ymm0, %ymm0 805; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0 806; AVX512-NEXT: retq 807 %x0 = sext <4 x i64> %a0 to <4 x i128> 808 %x1 = sext <4 x i64> %a1 to <4 x i128> 809 %sum = add <4 x i128> %x0, %x1 810 %inc = add <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1> 811 %shift = ashr <4 x i128> %inc, <i128 1, i128 1, i128 1, i128 1> 812 %res = trunc <4 x i128> %shift to <4 x i64> 813 ret <4 x i64> %res 814} 815 816; 817; 512-bit vectors 818; 819 820define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 821; SSE-LABEL: test_fixed_v64i8: 822; SSE: # %bb.0: 823; SSE-NEXT: movdqa {{.*#+}} xmm8 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 824; SSE-NEXT: pxor %xmm8, %xmm4 825; SSE-NEXT: pxor %xmm8, %xmm0 826; SSE-NEXT: pavgb %xmm4, %xmm0 827; SSE-NEXT: pxor %xmm8, %xmm0 828; SSE-NEXT: pxor %xmm8, %xmm5 829; SSE-NEXT: pxor %xmm8, %xmm1 830; SSE-NEXT: pavgb %xmm5, %xmm1 831; SSE-NEXT: pxor %xmm8, %xmm1 832; SSE-NEXT: pxor %xmm8, %xmm6 833; SSE-NEXT: pxor %xmm8, %xmm2 834; SSE-NEXT: pavgb %xmm6, %xmm2 835; SSE-NEXT: pxor %xmm8, %xmm2 836; SSE-NEXT: pxor %xmm8, %xmm7 837; SSE-NEXT: pxor %xmm8, %xmm3 838; SSE-NEXT: pavgb %xmm7, %xmm3 839; SSE-NEXT: pxor %xmm8, %xmm3 840; SSE-NEXT: retq 841; 842; AVX1-LABEL: test_fixed_v64i8: 843; AVX1: # %bb.0: 844; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 845; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 846; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 847; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 848; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 849; AVX1-NEXT: vpavgb %xmm5, %xmm6, %xmm5 850; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0 851; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 852; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 853; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2 854; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 855; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1 856; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 857; AVX1-NEXT: vpavgb %xmm3, %xmm5, %xmm3 858; AVX1-NEXT: vpavgb %xmm2, %xmm1, %xmm1 859; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 860; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1 861; AVX1-NEXT: retq 862; 863; AVX2-LABEL: test_fixed_v64i8: 864; AVX2: # %bb.0: 865; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 866; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2 867; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 868; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0 869; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 870; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2 871; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 872; AVX2-NEXT: vpavgb %ymm2, %ymm1, %ymm1 873; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 874; AVX2-NEXT: retq 875; 876; AVX512-LABEL: test_fixed_v64i8: 877; AVX512: # %bb.0: 878; AVX512-NEXT: vpbroadcastb {{.*#+}} zmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 879; AVX512-NEXT: vpxorq %zmm2, %zmm1, %zmm1 880; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0 881; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0 882; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0 883; AVX512-NEXT: retq 884 %or = or <64 x i8> %a0, %a1 885 %xor = xor <64 x i8> %a0, %a1 886 %shift = ashr <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> 887 %res = sub <64 x i8> %or, %shift 888 ret <64 x i8> %res 889} 890 891define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 892; SSE-LABEL: test_ext_v64i8: 893; SSE: # %bb.0: 894; SSE-NEXT: movdqa {{.*#+}} xmm8 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 895; SSE-NEXT: pxor %xmm8, %xmm4 896; SSE-NEXT: pxor %xmm8, %xmm0 897; SSE-NEXT: pavgb %xmm4, %xmm0 898; SSE-NEXT: pxor %xmm8, %xmm0 899; SSE-NEXT: pxor %xmm8, %xmm5 900; SSE-NEXT: pxor %xmm8, %xmm1 901; SSE-NEXT: pavgb %xmm5, %xmm1 902; SSE-NEXT: pxor %xmm8, %xmm1 903; SSE-NEXT: pxor %xmm8, %xmm6 904; SSE-NEXT: pxor %xmm8, %xmm2 905; SSE-NEXT: pavgb %xmm6, %xmm2 906; SSE-NEXT: pxor %xmm8, %xmm2 907; SSE-NEXT: pxor %xmm8, %xmm7 908; SSE-NEXT: pxor %xmm8, %xmm3 909; SSE-NEXT: pavgb %xmm7, %xmm3 910; SSE-NEXT: pxor %xmm8, %xmm3 911; SSE-NEXT: retq 912; 913; AVX1-LABEL: test_ext_v64i8: 914; AVX1: # %bb.0: 915; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 916; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 917; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 918; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 919; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 920; AVX1-NEXT: vpavgb %xmm5, %xmm6, %xmm5 921; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0 922; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 923; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 924; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2 925; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 926; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1 927; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 928; AVX1-NEXT: vpavgb %xmm3, %xmm5, %xmm3 929; AVX1-NEXT: vpavgb %xmm2, %xmm1, %xmm1 930; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 931; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1 932; AVX1-NEXT: retq 933; 934; AVX2-LABEL: test_ext_v64i8: 935; AVX2: # %bb.0: 936; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 937; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2 938; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 939; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0 940; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 941; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2 942; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 943; AVX2-NEXT: vpavgb %ymm2, %ymm1, %ymm1 944; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 945; AVX2-NEXT: retq 946; 947; AVX512-LABEL: test_ext_v64i8: 948; AVX512: # %bb.0: 949; AVX512-NEXT: vpbroadcastb {{.*#+}} zmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 950; AVX512-NEXT: vpxorq %zmm2, %zmm1, %zmm1 951; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0 952; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0 953; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0 954; AVX512-NEXT: retq 955 %x0 = sext <64 x i8> %a0 to <64 x i16> 956 %x1 = sext <64 x i8> %a1 to <64 x i16> 957 %sum = add <64 x i16> %x0, %x1 958 %inc = add <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> 959 %shift = ashr <64 x i16> %inc, <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> 960 %res = trunc <64 x i16> %shift to <64 x i8> 961 ret <64 x i8> %res 962} 963 964define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 965; SSE-LABEL: test_fixed_v32i16: 966; SSE: # %bb.0: 967; SSE-NEXT: movdqa %xmm0, %xmm8 968; SSE-NEXT: por %xmm4, %xmm8 969; SSE-NEXT: pxor %xmm4, %xmm0 970; SSE-NEXT: psraw $1, %xmm0 971; SSE-NEXT: psubw %xmm0, %xmm8 972; SSE-NEXT: movdqa %xmm1, %xmm4 973; SSE-NEXT: por %xmm5, %xmm4 974; SSE-NEXT: pxor %xmm5, %xmm1 975; SSE-NEXT: psraw $1, %xmm1 976; SSE-NEXT: psubw %xmm1, %xmm4 977; SSE-NEXT: movdqa %xmm2, %xmm5 978; SSE-NEXT: por %xmm6, %xmm5 979; SSE-NEXT: pxor %xmm6, %xmm2 980; SSE-NEXT: psraw $1, %xmm2 981; SSE-NEXT: psubw %xmm2, %xmm5 982; SSE-NEXT: movdqa %xmm3, %xmm6 983; SSE-NEXT: por %xmm7, %xmm6 984; SSE-NEXT: pxor %xmm7, %xmm3 985; SSE-NEXT: psraw $1, %xmm3 986; SSE-NEXT: psubw %xmm3, %xmm6 987; SSE-NEXT: movdqa %xmm8, %xmm0 988; SSE-NEXT: movdqa %xmm4, %xmm1 989; SSE-NEXT: movdqa %xmm5, %xmm2 990; SSE-NEXT: movdqa %xmm6, %xmm3 991; SSE-NEXT: retq 992; 993; AVX1-LABEL: test_fixed_v32i16: 994; AVX1: # %bb.0: 995; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 996; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 997; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 998; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 999; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2 1000; AVX1-NEXT: vpsubw %xmm2, %xmm5, %xmm2 1001; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0 1002; AVX1-NEXT: vpsubw %xmm0, %xmm4, %xmm0 1003; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1004; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 1005; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1006; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1007; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1008; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3 1009; AVX1-NEXT: vpsubw %xmm3, %xmm4, %xmm3 1010; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1 1011; AVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1 1012; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1013; AVX1-NEXT: retq 1014; 1015; AVX2-LABEL: test_fixed_v32i16: 1016; AVX2: # %bb.0: 1017; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 1018; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1019; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0 1020; AVX2-NEXT: vpsubw %ymm0, %ymm4, %ymm0 1021; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 1022; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1023; AVX2-NEXT: vpsraw $1, %ymm1, %ymm1 1024; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1 1025; AVX2-NEXT: retq 1026; 1027; AVX512-LABEL: test_fixed_v32i16: 1028; AVX512: # %bb.0: 1029; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 1030; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1031; AVX512-NEXT: vpsraw $1, %zmm0, %zmm0 1032; AVX512-NEXT: vpsubw %zmm0, %zmm2, %zmm0 1033; AVX512-NEXT: retq 1034 %or = or <32 x i16> %a0, %a1 1035 %xor = xor <32 x i16> %a1, %a0 1036 %shift = ashr <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> 1037 %res = sub <32 x i16> %or, %shift 1038 ret <32 x i16> %res 1039} 1040 1041define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 1042; SSE-LABEL: test_ext_v32i16: 1043; SSE: # %bb.0: 1044; SSE-NEXT: movdqa %xmm0, %xmm8 1045; SSE-NEXT: por %xmm4, %xmm8 1046; SSE-NEXT: pxor %xmm4, %xmm0 1047; SSE-NEXT: psraw $1, %xmm0 1048; SSE-NEXT: psubw %xmm0, %xmm8 1049; SSE-NEXT: movdqa %xmm1, %xmm4 1050; SSE-NEXT: por %xmm5, %xmm4 1051; SSE-NEXT: pxor %xmm5, %xmm1 1052; SSE-NEXT: psraw $1, %xmm1 1053; SSE-NEXT: psubw %xmm1, %xmm4 1054; SSE-NEXT: movdqa %xmm2, %xmm5 1055; SSE-NEXT: por %xmm6, %xmm5 1056; SSE-NEXT: pxor %xmm6, %xmm2 1057; SSE-NEXT: psraw $1, %xmm2 1058; SSE-NEXT: psubw %xmm2, %xmm5 1059; SSE-NEXT: movdqa %xmm3, %xmm6 1060; SSE-NEXT: por %xmm7, %xmm6 1061; SSE-NEXT: pxor %xmm7, %xmm3 1062; SSE-NEXT: psraw $1, %xmm3 1063; SSE-NEXT: psubw %xmm3, %xmm6 1064; SSE-NEXT: movdqa %xmm8, %xmm0 1065; SSE-NEXT: movdqa %xmm4, %xmm1 1066; SSE-NEXT: movdqa %xmm5, %xmm2 1067; SSE-NEXT: movdqa %xmm6, %xmm3 1068; SSE-NEXT: retq 1069; 1070; AVX1-LABEL: test_ext_v32i16: 1071; AVX1: # %bb.0: 1072; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 1073; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1074; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1075; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1076; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2 1077; AVX1-NEXT: vpsubw %xmm2, %xmm5, %xmm2 1078; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0 1079; AVX1-NEXT: vpsubw %xmm0, %xmm4, %xmm0 1080; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1081; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 1082; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1083; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1084; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1085; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3 1086; AVX1-NEXT: vpsubw %xmm3, %xmm4, %xmm3 1087; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1 1088; AVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1 1089; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1090; AVX1-NEXT: retq 1091; 1092; AVX2-LABEL: test_ext_v32i16: 1093; AVX2: # %bb.0: 1094; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 1095; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1096; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0 1097; AVX2-NEXT: vpsubw %ymm0, %ymm4, %ymm0 1098; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 1099; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1100; AVX2-NEXT: vpsraw $1, %ymm1, %ymm1 1101; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1 1102; AVX2-NEXT: retq 1103; 1104; AVX512-LABEL: test_ext_v32i16: 1105; AVX512: # %bb.0: 1106; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 1107; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1108; AVX512-NEXT: vpsraw $1, %zmm0, %zmm0 1109; AVX512-NEXT: vpsubw %zmm0, %zmm2, %zmm0 1110; AVX512-NEXT: retq 1111 %x0 = sext <32 x i16> %a0 to <32 x i32> 1112 %x1 = sext <32 x i16> %a1 to <32 x i32> 1113 %sum = add <32 x i32> %x0, %x1 1114 %inc = add <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> 1115 %shift = ashr <32 x i32> %inc, <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> 1116 %res = trunc <32 x i32> %shift to <32 x i16> 1117 ret <32 x i16> %res 1118} 1119 1120define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 1121; SSE-LABEL: test_fixed_v16i32: 1122; SSE: # %bb.0: 1123; SSE-NEXT: movdqa %xmm0, %xmm8 1124; SSE-NEXT: por %xmm4, %xmm8 1125; SSE-NEXT: pxor %xmm4, %xmm0 1126; SSE-NEXT: psrad $1, %xmm0 1127; SSE-NEXT: psubd %xmm0, %xmm8 1128; SSE-NEXT: movdqa %xmm1, %xmm4 1129; SSE-NEXT: por %xmm5, %xmm4 1130; SSE-NEXT: pxor %xmm5, %xmm1 1131; SSE-NEXT: psrad $1, %xmm1 1132; SSE-NEXT: psubd %xmm1, %xmm4 1133; SSE-NEXT: movdqa %xmm2, %xmm5 1134; SSE-NEXT: por %xmm6, %xmm5 1135; SSE-NEXT: pxor %xmm6, %xmm2 1136; SSE-NEXT: psrad $1, %xmm2 1137; SSE-NEXT: psubd %xmm2, %xmm5 1138; SSE-NEXT: movdqa %xmm3, %xmm6 1139; SSE-NEXT: por %xmm7, %xmm6 1140; SSE-NEXT: pxor %xmm7, %xmm3 1141; SSE-NEXT: psrad $1, %xmm3 1142; SSE-NEXT: psubd %xmm3, %xmm6 1143; SSE-NEXT: movdqa %xmm8, %xmm0 1144; SSE-NEXT: movdqa %xmm4, %xmm1 1145; SSE-NEXT: movdqa %xmm5, %xmm2 1146; SSE-NEXT: movdqa %xmm6, %xmm3 1147; SSE-NEXT: retq 1148; 1149; AVX1-LABEL: test_fixed_v16i32: 1150; AVX1: # %bb.0: 1151; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 1152; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1153; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1154; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1155; AVX1-NEXT: vpsrad $1, %xmm2, %xmm2 1156; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2 1157; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0 1158; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0 1159; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1160; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 1161; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1162; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1163; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1164; AVX1-NEXT: vpsrad $1, %xmm3, %xmm3 1165; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3 1166; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1 1167; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1 1168; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1169; AVX1-NEXT: retq 1170; 1171; AVX2-LABEL: test_fixed_v16i32: 1172; AVX2: # %bb.0: 1173; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 1174; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1175; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0 1176; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0 1177; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 1178; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1179; AVX2-NEXT: vpsrad $1, %ymm1, %ymm1 1180; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1 1181; AVX2-NEXT: retq 1182; 1183; AVX512-LABEL: test_fixed_v16i32: 1184; AVX512: # %bb.0: 1185; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2 1186; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 1187; AVX512-NEXT: vpsrad $1, %zmm0, %zmm0 1188; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0 1189; AVX512-NEXT: retq 1190 %or = or <16 x i32> %a0, %a1 1191 %xor = xor <16 x i32> %a1, %a0 1192 %shift = ashr <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> 1193 %res = sub <16 x i32> %or, %shift 1194 ret <16 x i32> %res 1195} 1196 1197define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 1198; SSE-LABEL: test_ext_v16i32: 1199; SSE: # %bb.0: 1200; SSE-NEXT: movdqa %xmm0, %xmm8 1201; SSE-NEXT: por %xmm4, %xmm8 1202; SSE-NEXT: pxor %xmm4, %xmm0 1203; SSE-NEXT: psrad $1, %xmm0 1204; SSE-NEXT: psubd %xmm0, %xmm8 1205; SSE-NEXT: movdqa %xmm1, %xmm4 1206; SSE-NEXT: por %xmm5, %xmm4 1207; SSE-NEXT: pxor %xmm5, %xmm1 1208; SSE-NEXT: psrad $1, %xmm1 1209; SSE-NEXT: psubd %xmm1, %xmm4 1210; SSE-NEXT: movdqa %xmm2, %xmm5 1211; SSE-NEXT: por %xmm6, %xmm5 1212; SSE-NEXT: pxor %xmm6, %xmm2 1213; SSE-NEXT: psrad $1, %xmm2 1214; SSE-NEXT: psubd %xmm2, %xmm5 1215; SSE-NEXT: movdqa %xmm3, %xmm6 1216; SSE-NEXT: por %xmm7, %xmm6 1217; SSE-NEXT: pxor %xmm7, %xmm3 1218; SSE-NEXT: psrad $1, %xmm3 1219; SSE-NEXT: psubd %xmm3, %xmm6 1220; SSE-NEXT: movdqa %xmm8, %xmm0 1221; SSE-NEXT: movdqa %xmm4, %xmm1 1222; SSE-NEXT: movdqa %xmm5, %xmm2 1223; SSE-NEXT: movdqa %xmm6, %xmm3 1224; SSE-NEXT: retq 1225; 1226; AVX1-LABEL: test_ext_v16i32: 1227; AVX1: # %bb.0: 1228; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 1229; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1230; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 1231; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1232; AVX1-NEXT: vpsrad $1, %xmm2, %xmm2 1233; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2 1234; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0 1235; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0 1236; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1237; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 1238; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1239; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 1240; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1241; AVX1-NEXT: vpsrad $1, %xmm3, %xmm3 1242; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3 1243; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1 1244; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1 1245; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1246; AVX1-NEXT: retq 1247; 1248; AVX2-LABEL: test_ext_v16i32: 1249; AVX2: # %bb.0: 1250; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 1251; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1252; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0 1253; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0 1254; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 1255; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1256; AVX2-NEXT: vpsrad $1, %ymm1, %ymm1 1257; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1 1258; AVX2-NEXT: retq 1259; 1260; AVX512-LABEL: test_ext_v16i32: 1261; AVX512: # %bb.0: 1262; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2 1263; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 1264; AVX512-NEXT: vpsrad $1, %zmm0, %zmm0 1265; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0 1266; AVX512-NEXT: retq 1267 %x0 = sext <16 x i32> %a0 to <16 x i64> 1268 %x1 = sext <16 x i32> %a1 to <16 x i64> 1269 %sum = add <16 x i64> %x0, %x1 1270 %inc = add <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> 1271 %shift = ashr <16 x i64> %inc, <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> 1272 %res = trunc <16 x i64> %shift to <16 x i32> 1273 ret <16 x i32> %res 1274} 1275 1276define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 1277; SSE2-LABEL: test_fixed_v8i64: 1278; SSE2: # %bb.0: 1279; SSE2-NEXT: movdqa %xmm0, %xmm8 1280; SSE2-NEXT: pxor %xmm4, %xmm8 1281; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,3,2,3] 1282; SSE2-NEXT: psrad $1, %xmm9 1283; SSE2-NEXT: psrlq $1, %xmm8 1284; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3] 1285; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1] 1286; SSE2-NEXT: por %xmm4, %xmm0 1287; SSE2-NEXT: psubq %xmm8, %xmm0 1288; SSE2-NEXT: movdqa %xmm1, %xmm4 1289; SSE2-NEXT: pxor %xmm5, %xmm4 1290; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,3,2,3] 1291; SSE2-NEXT: psrad $1, %xmm8 1292; SSE2-NEXT: psrlq $1, %xmm4 1293; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1294; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1] 1295; SSE2-NEXT: por %xmm5, %xmm1 1296; SSE2-NEXT: psubq %xmm4, %xmm1 1297; SSE2-NEXT: movdqa %xmm2, %xmm4 1298; SSE2-NEXT: pxor %xmm6, %xmm4 1299; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 1300; SSE2-NEXT: psrad $1, %xmm5 1301; SSE2-NEXT: psrlq $1, %xmm4 1302; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1303; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1304; SSE2-NEXT: por %xmm6, %xmm2 1305; SSE2-NEXT: psubq %xmm4, %xmm2 1306; SSE2-NEXT: movdqa %xmm3, %xmm4 1307; SSE2-NEXT: pxor %xmm7, %xmm4 1308; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 1309; SSE2-NEXT: psrad $1, %xmm5 1310; SSE2-NEXT: psrlq $1, %xmm4 1311; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1312; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1313; SSE2-NEXT: por %xmm7, %xmm3 1314; SSE2-NEXT: psubq %xmm4, %xmm3 1315; SSE2-NEXT: retq 1316; 1317; SSE4-LABEL: test_fixed_v8i64: 1318; SSE4: # %bb.0: 1319; SSE4-NEXT: movdqa %xmm0, %xmm8 1320; SSE4-NEXT: pxor %xmm4, %xmm8 1321; SSE4-NEXT: movdqa %xmm8, %xmm9 1322; SSE4-NEXT: psrad $1, %xmm9 1323; SSE4-NEXT: psrlq $1, %xmm8 1324; SSE4-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7] 1325; SSE4-NEXT: por %xmm4, %xmm0 1326; SSE4-NEXT: psubq %xmm8, %xmm0 1327; SSE4-NEXT: movdqa %xmm1, %xmm4 1328; SSE4-NEXT: pxor %xmm5, %xmm4 1329; SSE4-NEXT: movdqa %xmm4, %xmm8 1330; SSE4-NEXT: psrad $1, %xmm8 1331; SSE4-NEXT: psrlq $1, %xmm4 1332; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm8[2,3],xmm4[4,5],xmm8[6,7] 1333; SSE4-NEXT: por %xmm5, %xmm1 1334; SSE4-NEXT: psubq %xmm4, %xmm1 1335; SSE4-NEXT: movdqa %xmm2, %xmm4 1336; SSE4-NEXT: pxor %xmm6, %xmm4 1337; SSE4-NEXT: movdqa %xmm4, %xmm5 1338; SSE4-NEXT: psrad $1, %xmm5 1339; SSE4-NEXT: psrlq $1, %xmm4 1340; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1341; SSE4-NEXT: por %xmm6, %xmm2 1342; SSE4-NEXT: psubq %xmm4, %xmm2 1343; SSE4-NEXT: movdqa %xmm3, %xmm4 1344; SSE4-NEXT: pxor %xmm7, %xmm4 1345; SSE4-NEXT: movdqa %xmm4, %xmm5 1346; SSE4-NEXT: psrad $1, %xmm5 1347; SSE4-NEXT: psrlq $1, %xmm4 1348; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1349; SSE4-NEXT: por %xmm7, %xmm3 1350; SSE4-NEXT: psubq %xmm4, %xmm3 1351; SSE4-NEXT: retq 1352; 1353; AVX1-LABEL: test_fixed_v8i64: 1354; AVX1: # %bb.0: 1355; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4 1356; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1357; AVX1-NEXT: vpsrad $1, %xmm5, %xmm6 1358; AVX1-NEXT: vpsrlq $1, %xmm5, %xmm5 1359; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7] 1360; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 1361; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1362; AVX1-NEXT: vpsubq %xmm5, %xmm2, %xmm2 1363; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5 1364; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4 1365; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1366; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0 1367; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1368; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2 1369; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1370; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5 1371; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4 1372; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1373; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 1374; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1375; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm3 1376; AVX1-NEXT: vpsrad $1, %xmm2, %xmm4 1377; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 1378; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 1379; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1 1380; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1381; AVX1-NEXT: retq 1382; 1383; AVX2-LABEL: test_fixed_v8i64: 1384; AVX2: # %bb.0: 1385; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4 1386; AVX2-NEXT: vpsrad $1, %ymm4, %ymm5 1387; AVX2-NEXT: vpsrlq $1, %ymm4, %ymm4 1388; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0],ymm5[1],ymm4[2],ymm5[3],ymm4[4],ymm5[5],ymm4[6],ymm5[7] 1389; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 1390; AVX2-NEXT: vpsubq %ymm4, %ymm0, %ymm0 1391; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm2 1392; AVX2-NEXT: vpsrad $1, %ymm2, %ymm4 1393; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2 1394; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7] 1395; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 1396; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1 1397; AVX2-NEXT: retq 1398; 1399; AVX512-LABEL: test_fixed_v8i64: 1400; AVX512: # %bb.0: 1401; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 1402; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1403; AVX512-NEXT: vpsraq $1, %zmm0, %zmm0 1404; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0 1405; AVX512-NEXT: retq 1406 %or = or <8 x i64> %a0, %a1 1407 %xor = xor <8 x i64> %a1, %a0 1408 %shift = ashr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 1409 %res = sub <8 x i64> %or, %shift 1410 ret <8 x i64> %res 1411} 1412 1413define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 1414; SSE2-LABEL: test_ext_v8i64: 1415; SSE2: # %bb.0: 1416; SSE2-NEXT: movdqa %xmm0, %xmm8 1417; SSE2-NEXT: pxor %xmm4, %xmm8 1418; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,3,2,3] 1419; SSE2-NEXT: psrad $1, %xmm9 1420; SSE2-NEXT: psrlq $1, %xmm8 1421; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3] 1422; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1] 1423; SSE2-NEXT: por %xmm4, %xmm0 1424; SSE2-NEXT: psubq %xmm8, %xmm0 1425; SSE2-NEXT: movdqa %xmm1, %xmm4 1426; SSE2-NEXT: pxor %xmm5, %xmm4 1427; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,3,2,3] 1428; SSE2-NEXT: psrad $1, %xmm8 1429; SSE2-NEXT: psrlq $1, %xmm4 1430; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1431; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1] 1432; SSE2-NEXT: por %xmm5, %xmm1 1433; SSE2-NEXT: psubq %xmm4, %xmm1 1434; SSE2-NEXT: movdqa %xmm2, %xmm4 1435; SSE2-NEXT: pxor %xmm6, %xmm4 1436; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 1437; SSE2-NEXT: psrad $1, %xmm5 1438; SSE2-NEXT: psrlq $1, %xmm4 1439; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1440; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1441; SSE2-NEXT: por %xmm6, %xmm2 1442; SSE2-NEXT: psubq %xmm4, %xmm2 1443; SSE2-NEXT: movdqa %xmm3, %xmm4 1444; SSE2-NEXT: pxor %xmm7, %xmm4 1445; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3] 1446; SSE2-NEXT: psrad $1, %xmm5 1447; SSE2-NEXT: psrlq $1, %xmm4 1448; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3] 1449; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1] 1450; SSE2-NEXT: por %xmm7, %xmm3 1451; SSE2-NEXT: psubq %xmm4, %xmm3 1452; SSE2-NEXT: retq 1453; 1454; SSE4-LABEL: test_ext_v8i64: 1455; SSE4: # %bb.0: 1456; SSE4-NEXT: movdqa %xmm0, %xmm8 1457; SSE4-NEXT: pxor %xmm4, %xmm8 1458; SSE4-NEXT: movdqa %xmm8, %xmm9 1459; SSE4-NEXT: psrad $1, %xmm9 1460; SSE4-NEXT: psrlq $1, %xmm8 1461; SSE4-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7] 1462; SSE4-NEXT: por %xmm4, %xmm0 1463; SSE4-NEXT: psubq %xmm8, %xmm0 1464; SSE4-NEXT: movdqa %xmm1, %xmm4 1465; SSE4-NEXT: pxor %xmm5, %xmm4 1466; SSE4-NEXT: movdqa %xmm4, %xmm8 1467; SSE4-NEXT: psrad $1, %xmm8 1468; SSE4-NEXT: psrlq $1, %xmm4 1469; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm8[2,3],xmm4[4,5],xmm8[6,7] 1470; SSE4-NEXT: por %xmm5, %xmm1 1471; SSE4-NEXT: psubq %xmm4, %xmm1 1472; SSE4-NEXT: movdqa %xmm2, %xmm4 1473; SSE4-NEXT: pxor %xmm6, %xmm4 1474; SSE4-NEXT: movdqa %xmm4, %xmm5 1475; SSE4-NEXT: psrad $1, %xmm5 1476; SSE4-NEXT: psrlq $1, %xmm4 1477; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1478; SSE4-NEXT: por %xmm6, %xmm2 1479; SSE4-NEXT: psubq %xmm4, %xmm2 1480; SSE4-NEXT: movdqa %xmm3, %xmm4 1481; SSE4-NEXT: pxor %xmm7, %xmm4 1482; SSE4-NEXT: movdqa %xmm4, %xmm5 1483; SSE4-NEXT: psrad $1, %xmm5 1484; SSE4-NEXT: psrlq $1, %xmm4 1485; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1486; SSE4-NEXT: por %xmm7, %xmm3 1487; SSE4-NEXT: psubq %xmm4, %xmm3 1488; SSE4-NEXT: retq 1489; 1490; AVX1-LABEL: test_ext_v8i64: 1491; AVX1: # %bb.0: 1492; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4 1493; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1494; AVX1-NEXT: vpsrad $1, %xmm5, %xmm6 1495; AVX1-NEXT: vpsrlq $1, %xmm5, %xmm5 1496; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7] 1497; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0 1498; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1499; AVX1-NEXT: vpsubq %xmm5, %xmm2, %xmm2 1500; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5 1501; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4 1502; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1503; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0 1504; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1505; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2 1506; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1507; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5 1508; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4 1509; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7] 1510; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1 1511; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1512; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm3 1513; AVX1-NEXT: vpsrad $1, %xmm2, %xmm4 1514; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 1515; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 1516; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1 1517; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1518; AVX1-NEXT: retq 1519; 1520; AVX2-LABEL: test_ext_v8i64: 1521; AVX2: # %bb.0: 1522; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4 1523; AVX2-NEXT: vpsrad $1, %ymm4, %ymm5 1524; AVX2-NEXT: vpsrlq $1, %ymm4, %ymm4 1525; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0],ymm5[1],ymm4[2],ymm5[3],ymm4[4],ymm5[5],ymm4[6],ymm5[7] 1526; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 1527; AVX2-NEXT: vpsubq %ymm4, %ymm0, %ymm0 1528; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm2 1529; AVX2-NEXT: vpsrad $1, %ymm2, %ymm4 1530; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2 1531; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7] 1532; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 1533; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1 1534; AVX2-NEXT: retq 1535; 1536; AVX512-LABEL: test_ext_v8i64: 1537; AVX512: # %bb.0: 1538; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 1539; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1540; AVX512-NEXT: vpsraq $1, %zmm0, %zmm0 1541; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0 1542; AVX512-NEXT: retq 1543 %x0 = sext <8 x i64> %a0 to <8 x i128> 1544 %x1 = sext <8 x i64> %a1 to <8 x i128> 1545 %sum = add <8 x i128> %x0, %x1 1546 %inc = add <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1> 1547 %shift = ashr <8 x i128> %inc, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1> 1548 %res = trunc <8 x i128> %shift to <8 x i64> 1549 ret <8 x i64> %res 1550} 1551 1552