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: pavgb %xmm1, %xmm0 16; SSE-NEXT: retq 17; 18; AVX-LABEL: test_fixed_v16i8: 19; AVX: # %bb.0: 20; AVX-NEXT: vpavgb %xmm1, %xmm0, %xmm0 21; AVX-NEXT: retq 22 %or = or <16 x i8> %a0, %a1 23 %xor = xor <16 x i8> %a0, %a1 24 %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> 25 %res = sub <16 x i8> %or, %shift 26 ret <16 x i8> %res 27} 28 29define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind { 30; SSE-LABEL: test_ext_v16i8: 31; SSE: # %bb.0: 32; SSE-NEXT: pavgb %xmm1, %xmm0 33; SSE-NEXT: retq 34; 35; AVX-LABEL: test_ext_v16i8: 36; AVX: # %bb.0: 37; AVX-NEXT: vpavgb %xmm1, %xmm0, %xmm0 38; AVX-NEXT: retq 39 %x0 = zext <16 x i8> %a0 to <16 x i16> 40 %x1 = zext <16 x i8> %a1 to <16 x i16> 41 %sum = add <16 x i16> %x0, %x1 42 %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> 43 %shift = lshr <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> 44 %res = trunc <16 x i16> %shift to <16 x i8> 45 ret <16 x i8> %res 46} 47 48define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind { 49; SSE-LABEL: test_fixed_v8i16: 50; SSE: # %bb.0: 51; SSE-NEXT: pavgw %xmm1, %xmm0 52; SSE-NEXT: retq 53; 54; AVX-LABEL: test_fixed_v8i16: 55; AVX: # %bb.0: 56; AVX-NEXT: vpavgw %xmm1, %xmm0, %xmm0 57; AVX-NEXT: retq 58 %or = or <8 x i16> %a0, %a1 59 %xor = xor <8 x i16> %a1, %a0 60 %shift = lshr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 61 %res = sub <8 x i16> %or, %shift 62 ret <8 x i16> %res 63} 64 65define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind { 66; SSE-LABEL: test_ext_v8i16: 67; SSE: # %bb.0: 68; SSE-NEXT: pavgw %xmm1, %xmm0 69; SSE-NEXT: retq 70; 71; AVX-LABEL: test_ext_v8i16: 72; AVX: # %bb.0: 73; AVX-NEXT: vpavgw %xmm1, %xmm0, %xmm0 74; AVX-NEXT: retq 75 %x0 = zext <8 x i16> %a0 to <8 x i32> 76 %x1 = zext <8 x i16> %a1 to <8 x i32> 77 %sum = add <8 x i32> %x0, %x1 78 %inc = add <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 79 %shift = lshr <8 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 80 %res = trunc <8 x i32> %shift to <8 x i16> 81 ret <8 x i16> %res 82} 83 84define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 85; SSE-LABEL: test_fixed_v4i32: 86; SSE: # %bb.0: 87; SSE-NEXT: movdqa %xmm0, %xmm2 88; SSE-NEXT: por %xmm1, %xmm2 89; SSE-NEXT: pxor %xmm1, %xmm0 90; SSE-NEXT: psrld $1, %xmm0 91; SSE-NEXT: psubd %xmm0, %xmm2 92; SSE-NEXT: movdqa %xmm2, %xmm0 93; SSE-NEXT: retq 94; 95; AVX-LABEL: test_fixed_v4i32: 96; AVX: # %bb.0: 97; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 98; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 99; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 100; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0 101; AVX-NEXT: retq 102 %or = or <4 x i32> %a0, %a1 103 %xor = xor <4 x i32> %a1, %a0 104 %shift = lshr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1> 105 %res = sub <4 x i32> %or, %shift 106 ret <4 x i32> %res 107} 108 109define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind { 110; SSE-LABEL: test_ext_v4i32: 111; SSE: # %bb.0: 112; SSE-NEXT: movdqa %xmm0, %xmm2 113; SSE-NEXT: por %xmm1, %xmm2 114; SSE-NEXT: pxor %xmm1, %xmm0 115; SSE-NEXT: psrld $1, %xmm0 116; SSE-NEXT: psubd %xmm0, %xmm2 117; SSE-NEXT: movdqa %xmm2, %xmm0 118; SSE-NEXT: retq 119; 120; AVX-LABEL: test_ext_v4i32: 121; AVX: # %bb.0: 122; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 123; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 124; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 125; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0 126; AVX-NEXT: retq 127 %x0 = zext <4 x i32> %a0 to <4 x i64> 128 %x1 = zext <4 x i32> %a1 to <4 x i64> 129 %sum = add <4 x i64> %x0, %x1 130 %inc = add <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1> 131 %shift = lshr <4 x i64> %inc, <i64 1, i64 1, i64 1, i64 1> 132 %res = trunc <4 x i64> %shift to <4 x i32> 133 ret <4 x i32> %res 134} 135 136define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 137; SSE-LABEL: test_fixed_v2i64: 138; SSE: # %bb.0: 139; SSE-NEXT: movdqa %xmm0, %xmm2 140; SSE-NEXT: por %xmm1, %xmm2 141; SSE-NEXT: pxor %xmm1, %xmm0 142; SSE-NEXT: psrlq $1, %xmm0 143; SSE-NEXT: psubq %xmm0, %xmm2 144; SSE-NEXT: movdqa %xmm2, %xmm0 145; SSE-NEXT: retq 146; 147; AVX-LABEL: test_fixed_v2i64: 148; AVX: # %bb.0: 149; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 150; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 151; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 152; AVX-NEXT: vpsubq %xmm0, %xmm2, %xmm0 153; AVX-NEXT: retq 154 %or = or <2 x i64> %a0, %a1 155 %xor = xor <2 x i64> %a1, %a0 156 %shift = lshr <2 x i64> %xor, <i64 1, i64 1> 157 %res = sub <2 x i64> %or, %shift 158 ret <2 x i64> %res 159} 160 161define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind { 162; SSE-LABEL: test_ext_v2i64: 163; SSE: # %bb.0: 164; SSE-NEXT: movdqa %xmm0, %xmm2 165; SSE-NEXT: por %xmm1, %xmm2 166; SSE-NEXT: pxor %xmm1, %xmm0 167; SSE-NEXT: psrlq $1, %xmm0 168; SSE-NEXT: psubq %xmm0, %xmm2 169; SSE-NEXT: movdqa %xmm2, %xmm0 170; SSE-NEXT: retq 171; 172; AVX-LABEL: test_ext_v2i64: 173; AVX: # %bb.0: 174; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2 175; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 176; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 177; AVX-NEXT: vpsubq %xmm0, %xmm2, %xmm0 178; AVX-NEXT: retq 179 %x0 = zext <2 x i64> %a0 to <2 x i128> 180 %x1 = zext <2 x i64> %a1 to <2 x i128> 181 %sum = add <2 x i128> %x0, %x1 182 %inc = add <2 x i128> %sum, <i128 1, i128 1> 183 %shift = lshr <2 x i128> %inc, <i128 1, i128 1> 184 %res = trunc <2 x i128> %shift to <2 x i64> 185 ret <2 x i64> %res 186} 187 188; 189; 256-bit vectors 190; 191 192define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 193; SSE-LABEL: test_fixed_v32i8: 194; SSE: # %bb.0: 195; SSE-NEXT: pavgb %xmm2, %xmm0 196; SSE-NEXT: pavgb %xmm3, %xmm1 197; SSE-NEXT: retq 198; 199; AVX1-LABEL: test_fixed_v32i8: 200; AVX1: # %bb.0: 201; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 202; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 203; AVX1-NEXT: vpavgb %xmm2, %xmm3, %xmm2 204; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 205; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 206; AVX1-NEXT: retq 207; 208; AVX2-LABEL: test_fixed_v32i8: 209; AVX2: # %bb.0: 210; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0 211; AVX2-NEXT: retq 212; 213; AVX512-LABEL: test_fixed_v32i8: 214; AVX512: # %bb.0: 215; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0 216; AVX512-NEXT: retq 217 %or = or <32 x i8> %a0, %a1 218 %xor = xor <32 x i8> %a0, %a1 219 %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> 220 %res = sub <32 x i8> %or, %shift 221 ret <32 x i8> %res 222} 223 224define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind { 225; SSE-LABEL: test_ext_v32i8: 226; SSE: # %bb.0: 227; SSE-NEXT: pavgb %xmm2, %xmm0 228; SSE-NEXT: pavgb %xmm3, %xmm1 229; SSE-NEXT: retq 230; 231; AVX1-LABEL: test_ext_v32i8: 232; AVX1: # %bb.0: 233; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 234; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 235; AVX1-NEXT: vpavgb %xmm2, %xmm3, %xmm2 236; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0 237; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 238; AVX1-NEXT: retq 239; 240; AVX2-LABEL: test_ext_v32i8: 241; AVX2: # %bb.0: 242; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0 243; AVX2-NEXT: retq 244; 245; AVX512-LABEL: test_ext_v32i8: 246; AVX512: # %bb.0: 247; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0 248; AVX512-NEXT: retq 249 %x0 = zext <32 x i8> %a0 to <32 x i16> 250 %x1 = zext <32 x i8> %a1 to <32 x i16> 251 %sum = add <32 x i16> %x0, %x1 252 %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> 253 %shift = lshr <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> 254 %res = trunc <32 x i16> %shift to <32 x i8> 255 ret <32 x i8> %res 256} 257 258define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 259; SSE-LABEL: test_fixed_v16i16: 260; SSE: # %bb.0: 261; SSE-NEXT: pavgw %xmm2, %xmm0 262; SSE-NEXT: pavgw %xmm3, %xmm1 263; SSE-NEXT: retq 264; 265; AVX1-LABEL: test_fixed_v16i16: 266; AVX1: # %bb.0: 267; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 268; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 269; AVX1-NEXT: vpavgw %xmm2, %xmm3, %xmm2 270; AVX1-NEXT: vpavgw %xmm1, %xmm0, %xmm0 271; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 272; AVX1-NEXT: retq 273; 274; AVX2-LABEL: test_fixed_v16i16: 275; AVX2: # %bb.0: 276; AVX2-NEXT: vpavgw %ymm1, %ymm0, %ymm0 277; AVX2-NEXT: retq 278; 279; AVX512-LABEL: test_fixed_v16i16: 280; AVX512: # %bb.0: 281; AVX512-NEXT: vpavgw %ymm1, %ymm0, %ymm0 282; AVX512-NEXT: retq 283 %or = or <16 x i16> %a0, %a1 284 %xor = xor <16 x i16> %a1, %a0 285 %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> 286 %res = sub <16 x i16> %or, %shift 287 ret <16 x i16> %res 288} 289 290define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind { 291; SSE-LABEL: test_ext_v16i16: 292; SSE: # %bb.0: 293; SSE-NEXT: pavgw %xmm2, %xmm0 294; SSE-NEXT: pavgw %xmm3, %xmm1 295; SSE-NEXT: retq 296; 297; AVX1-LABEL: test_ext_v16i16: 298; AVX1: # %bb.0: 299; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 300; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 301; AVX1-NEXT: vpavgw %xmm2, %xmm3, %xmm2 302; AVX1-NEXT: vpavgw %xmm1, %xmm0, %xmm0 303; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 304; AVX1-NEXT: retq 305; 306; AVX2-LABEL: test_ext_v16i16: 307; AVX2: # %bb.0: 308; AVX2-NEXT: vpavgw %ymm1, %ymm0, %ymm0 309; AVX2-NEXT: retq 310; 311; AVX512-LABEL: test_ext_v16i16: 312; AVX512: # %bb.0: 313; AVX512-NEXT: vpavgw %ymm1, %ymm0, %ymm0 314; AVX512-NEXT: retq 315 %x0 = zext <16 x i16> %a0 to <16 x i32> 316 %x1 = zext <16 x i16> %a1 to <16 x i32> 317 %sum = add <16 x i32> %x0, %x1 318 %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> 319 %shift = lshr <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> 320 %res = trunc <16 x i32> %shift to <16 x i16> 321 ret <16 x i16> %res 322} 323 324define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 325; SSE-LABEL: test_fixed_v8i32: 326; SSE: # %bb.0: 327; SSE-NEXT: movdqa %xmm0, %xmm4 328; SSE-NEXT: por %xmm2, %xmm4 329; SSE-NEXT: pxor %xmm2, %xmm0 330; SSE-NEXT: psrld $1, %xmm0 331; SSE-NEXT: psubd %xmm0, %xmm4 332; SSE-NEXT: movdqa %xmm1, %xmm2 333; SSE-NEXT: por %xmm3, %xmm2 334; SSE-NEXT: pxor %xmm3, %xmm1 335; SSE-NEXT: psrld $1, %xmm1 336; SSE-NEXT: psubd %xmm1, %xmm2 337; SSE-NEXT: movdqa %xmm4, %xmm0 338; SSE-NEXT: movdqa %xmm2, %xmm1 339; SSE-NEXT: retq 340; 341; AVX1-LABEL: test_fixed_v8i32: 342; AVX1: # %bb.0: 343; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 344; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 345; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 346; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 347; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 348; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 349; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 350; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0 351; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 352; AVX1-NEXT: retq 353; 354; AVX2-LABEL: test_fixed_v8i32: 355; AVX2: # %bb.0: 356; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 357; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 358; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 359; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0 360; AVX2-NEXT: retq 361; 362; AVX512-LABEL: test_fixed_v8i32: 363; AVX512: # %bb.0: 364; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 365; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 366; AVX512-NEXT: vpsrld $1, %ymm0, %ymm0 367; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0 368; AVX512-NEXT: retq 369 %or = or <8 x i32> %a0, %a1 370 %xor = xor <8 x i32> %a1, %a0 371 %shift = lshr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 372 %res = sub <8 x i32> %or, %shift 373 ret <8 x i32> %res 374} 375 376define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind { 377; SSE-LABEL: test_ext_v8i32: 378; SSE: # %bb.0: 379; SSE-NEXT: movdqa %xmm0, %xmm4 380; SSE-NEXT: por %xmm2, %xmm4 381; SSE-NEXT: pxor %xmm2, %xmm0 382; SSE-NEXT: psrld $1, %xmm0 383; SSE-NEXT: psubd %xmm0, %xmm4 384; SSE-NEXT: movdqa %xmm1, %xmm2 385; SSE-NEXT: por %xmm3, %xmm2 386; SSE-NEXT: pxor %xmm3, %xmm1 387; SSE-NEXT: psrld $1, %xmm1 388; SSE-NEXT: psubd %xmm1, %xmm2 389; SSE-NEXT: movdqa %xmm4, %xmm0 390; SSE-NEXT: movdqa %xmm2, %xmm1 391; SSE-NEXT: retq 392; 393; AVX1-LABEL: test_ext_v8i32: 394; AVX1: # %bb.0: 395; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 396; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 397; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 398; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 399; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 400; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1 401; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 402; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0 403; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 404; AVX1-NEXT: retq 405; 406; AVX2-LABEL: test_ext_v8i32: 407; AVX2: # %bb.0: 408; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 409; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 410; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 411; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0 412; AVX2-NEXT: retq 413; 414; AVX512-LABEL: test_ext_v8i32: 415; AVX512: # %bb.0: 416; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 417; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 418; AVX512-NEXT: vpsrld $1, %ymm0, %ymm0 419; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0 420; AVX512-NEXT: retq 421 %x0 = zext <8 x i32> %a0 to <8 x i64> 422 %x1 = zext <8 x i32> %a1 to <8 x i64> 423 %sum = add <8 x i64> %x0, %x1 424 %inc = add <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 425 %shift = lshr <8 x i64> %inc, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 426 %res = trunc <8 x i64> %shift to <8 x i32> 427 ret <8 x i32> %res 428} 429 430define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 431; SSE-LABEL: test_fixed_v4i64: 432; SSE: # %bb.0: 433; SSE-NEXT: movdqa %xmm0, %xmm4 434; SSE-NEXT: por %xmm2, %xmm4 435; SSE-NEXT: pxor %xmm2, %xmm0 436; SSE-NEXT: psrlq $1, %xmm0 437; SSE-NEXT: psubq %xmm0, %xmm4 438; SSE-NEXT: movdqa %xmm1, %xmm2 439; SSE-NEXT: por %xmm3, %xmm2 440; SSE-NEXT: pxor %xmm3, %xmm1 441; SSE-NEXT: psrlq $1, %xmm1 442; SSE-NEXT: psubq %xmm1, %xmm2 443; SSE-NEXT: movdqa %xmm4, %xmm0 444; SSE-NEXT: movdqa %xmm2, %xmm1 445; SSE-NEXT: retq 446; 447; AVX1-LABEL: test_fixed_v4i64: 448; AVX1: # %bb.0: 449; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 450; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 451; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 452; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 453; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 454; AVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1 455; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 456; AVX1-NEXT: vpsubq %xmm0, %xmm2, %xmm0 457; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 458; AVX1-NEXT: retq 459; 460; AVX2-LABEL: test_fixed_v4i64: 461; AVX2: # %bb.0: 462; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 463; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 464; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 465; AVX2-NEXT: vpsubq %ymm0, %ymm2, %ymm0 466; AVX2-NEXT: retq 467; 468; AVX512-LABEL: test_fixed_v4i64: 469; AVX512: # %bb.0: 470; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 471; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 472; AVX512-NEXT: vpsrlq $1, %ymm0, %ymm0 473; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0 474; AVX512-NEXT: retq 475 %or = or <4 x i64> %a0, %a1 476 %xor = xor <4 x i64> %a1, %a0 477 %shift = lshr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1> 478 %res = sub <4 x i64> %or, %shift 479 ret <4 x i64> %res 480} 481 482define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind { 483; SSE-LABEL: test_ext_v4i64: 484; SSE: # %bb.0: 485; SSE-NEXT: movdqa %xmm0, %xmm4 486; SSE-NEXT: por %xmm2, %xmm4 487; SSE-NEXT: pxor %xmm2, %xmm0 488; SSE-NEXT: psrlq $1, %xmm0 489; SSE-NEXT: psubq %xmm0, %xmm4 490; SSE-NEXT: movdqa %xmm1, %xmm2 491; SSE-NEXT: por %xmm3, %xmm2 492; SSE-NEXT: pxor %xmm3, %xmm1 493; SSE-NEXT: psrlq $1, %xmm1 494; SSE-NEXT: psubq %xmm1, %xmm2 495; SSE-NEXT: movdqa %xmm4, %xmm0 496; SSE-NEXT: movdqa %xmm2, %xmm1 497; SSE-NEXT: retq 498; 499; AVX1-LABEL: test_ext_v4i64: 500; AVX1: # %bb.0: 501; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2 502; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 503; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 504; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 505; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 506; AVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1 507; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 508; AVX1-NEXT: vpsubq %xmm0, %xmm2, %xmm0 509; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 510; AVX1-NEXT: retq 511; 512; AVX2-LABEL: test_ext_v4i64: 513; AVX2: # %bb.0: 514; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2 515; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 516; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 517; AVX2-NEXT: vpsubq %ymm0, %ymm2, %ymm0 518; AVX2-NEXT: retq 519; 520; AVX512-LABEL: test_ext_v4i64: 521; AVX512: # %bb.0: 522; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2 523; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 524; AVX512-NEXT: vpsrlq $1, %ymm0, %ymm0 525; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0 526; AVX512-NEXT: retq 527 %x0 = zext <4 x i64> %a0 to <4 x i128> 528 %x1 = zext <4 x i64> %a1 to <4 x i128> 529 %sum = add <4 x i128> %x0, %x1 530 %inc = add <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1> 531 %shift = lshr <4 x i128> %inc, <i128 1, i128 1, i128 1, i128 1> 532 %res = trunc <4 x i128> %shift to <4 x i64> 533 ret <4 x i64> %res 534} 535 536; 537; 512-bit vectors 538; 539 540define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 541; SSE-LABEL: test_fixed_v64i8: 542; SSE: # %bb.0: 543; SSE-NEXT: pavgb %xmm4, %xmm0 544; SSE-NEXT: pavgb %xmm5, %xmm1 545; SSE-NEXT: pavgb %xmm6, %xmm2 546; SSE-NEXT: pavgb %xmm7, %xmm3 547; SSE-NEXT: retq 548; 549; AVX1-LABEL: test_fixed_v64i8: 550; AVX1: # %bb.0: 551; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 552; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 553; AVX1-NEXT: vpavgb %xmm4, %xmm5, %xmm4 554; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0 555; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 556; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 557; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 558; AVX1-NEXT: vpavgb %xmm2, %xmm4, %xmm2 559; AVX1-NEXT: vpavgb %xmm3, %xmm1, %xmm1 560; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 561; AVX1-NEXT: retq 562; 563; AVX2-LABEL: test_fixed_v64i8: 564; AVX2: # %bb.0: 565; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0 566; AVX2-NEXT: vpavgb %ymm3, %ymm1, %ymm1 567; AVX2-NEXT: retq 568; 569; AVX512-LABEL: test_fixed_v64i8: 570; AVX512: # %bb.0: 571; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0 572; AVX512-NEXT: retq 573 %or = or <64 x i8> %a0, %a1 574 %xor = xor <64 x i8> %a0, %a1 575 %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> 576 %res = sub <64 x i8> %or, %shift 577 ret <64 x i8> %res 578} 579 580define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind { 581; SSE-LABEL: test_ext_v64i8: 582; SSE: # %bb.0: 583; SSE-NEXT: pavgb %xmm4, %xmm0 584; SSE-NEXT: pavgb %xmm5, %xmm1 585; SSE-NEXT: pavgb %xmm6, %xmm2 586; SSE-NEXT: pavgb %xmm7, %xmm3 587; SSE-NEXT: retq 588; 589; AVX1-LABEL: test_ext_v64i8: 590; AVX1: # %bb.0: 591; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 592; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 593; AVX1-NEXT: vpavgb %xmm4, %xmm5, %xmm4 594; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0 595; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 596; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 597; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 598; AVX1-NEXT: vpavgb %xmm2, %xmm4, %xmm2 599; AVX1-NEXT: vpavgb %xmm3, %xmm1, %xmm1 600; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 601; AVX1-NEXT: retq 602; 603; AVX2-LABEL: test_ext_v64i8: 604; AVX2: # %bb.0: 605; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0 606; AVX2-NEXT: vpavgb %ymm3, %ymm1, %ymm1 607; AVX2-NEXT: retq 608; 609; AVX512-LABEL: test_ext_v64i8: 610; AVX512: # %bb.0: 611; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0 612; AVX512-NEXT: retq 613 %x0 = zext <64 x i8> %a0 to <64 x i16> 614 %x1 = zext <64 x i8> %a1 to <64 x i16> 615 %sum = add <64 x i16> %x0, %x1 616 %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> 617 %shift = lshr <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> 618 %res = trunc <64 x i16> %shift to <64 x i8> 619 ret <64 x i8> %res 620} 621 622define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 623; SSE-LABEL: test_fixed_v32i16: 624; SSE: # %bb.0: 625; SSE-NEXT: pavgw %xmm4, %xmm0 626; SSE-NEXT: pavgw %xmm5, %xmm1 627; SSE-NEXT: pavgw %xmm6, %xmm2 628; SSE-NEXT: pavgw %xmm7, %xmm3 629; SSE-NEXT: retq 630; 631; AVX1-LABEL: test_fixed_v32i16: 632; AVX1: # %bb.0: 633; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 634; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 635; AVX1-NEXT: vpavgw %xmm4, %xmm5, %xmm4 636; AVX1-NEXT: vpavgw %xmm2, %xmm0, %xmm0 637; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 638; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 639; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 640; AVX1-NEXT: vpavgw %xmm2, %xmm4, %xmm2 641; AVX1-NEXT: vpavgw %xmm3, %xmm1, %xmm1 642; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 643; AVX1-NEXT: retq 644; 645; AVX2-LABEL: test_fixed_v32i16: 646; AVX2: # %bb.0: 647; AVX2-NEXT: vpavgw %ymm2, %ymm0, %ymm0 648; AVX2-NEXT: vpavgw %ymm3, %ymm1, %ymm1 649; AVX2-NEXT: retq 650; 651; AVX512-LABEL: test_fixed_v32i16: 652; AVX512: # %bb.0: 653; AVX512-NEXT: vpavgw %zmm1, %zmm0, %zmm0 654; AVX512-NEXT: retq 655 %or = or <32 x i16> %a0, %a1 656 %xor = xor <32 x i16> %a1, %a0 657 %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> 658 %res = sub <32 x i16> %or, %shift 659 ret <32 x i16> %res 660} 661 662define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind { 663; SSE-LABEL: test_ext_v32i16: 664; SSE: # %bb.0: 665; SSE-NEXT: pavgw %xmm4, %xmm0 666; SSE-NEXT: pavgw %xmm5, %xmm1 667; SSE-NEXT: pavgw %xmm6, %xmm2 668; SSE-NEXT: pavgw %xmm7, %xmm3 669; SSE-NEXT: retq 670; 671; AVX1-LABEL: test_ext_v32i16: 672; AVX1: # %bb.0: 673; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 674; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 675; AVX1-NEXT: vpavgw %xmm4, %xmm5, %xmm4 676; AVX1-NEXT: vpavgw %xmm2, %xmm0, %xmm0 677; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 678; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 679; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 680; AVX1-NEXT: vpavgw %xmm2, %xmm4, %xmm2 681; AVX1-NEXT: vpavgw %xmm3, %xmm1, %xmm1 682; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 683; AVX1-NEXT: retq 684; 685; AVX2-LABEL: test_ext_v32i16: 686; AVX2: # %bb.0: 687; AVX2-NEXT: vpavgw %ymm2, %ymm0, %ymm0 688; AVX2-NEXT: vpavgw %ymm3, %ymm1, %ymm1 689; AVX2-NEXT: retq 690; 691; AVX512-LABEL: test_ext_v32i16: 692; AVX512: # %bb.0: 693; AVX512-NEXT: vpavgw %zmm1, %zmm0, %zmm0 694; AVX512-NEXT: retq 695 %x0 = zext <32 x i16> %a0 to <32 x i32> 696 %x1 = zext <32 x i16> %a1 to <32 x i32> 697 %sum = add <32 x i32> %x0, %x1 698 %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> 699 %shift = lshr <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> 700 %res = trunc <32 x i32> %shift to <32 x i16> 701 ret <32 x i16> %res 702} 703 704define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 705; SSE-LABEL: test_fixed_v16i32: 706; SSE: # %bb.0: 707; SSE-NEXT: movdqa %xmm0, %xmm8 708; SSE-NEXT: por %xmm4, %xmm8 709; SSE-NEXT: pxor %xmm4, %xmm0 710; SSE-NEXT: psrld $1, %xmm0 711; SSE-NEXT: psubd %xmm0, %xmm8 712; SSE-NEXT: movdqa %xmm1, %xmm4 713; SSE-NEXT: por %xmm5, %xmm4 714; SSE-NEXT: pxor %xmm5, %xmm1 715; SSE-NEXT: psrld $1, %xmm1 716; SSE-NEXT: psubd %xmm1, %xmm4 717; SSE-NEXT: movdqa %xmm2, %xmm5 718; SSE-NEXT: por %xmm6, %xmm5 719; SSE-NEXT: pxor %xmm6, %xmm2 720; SSE-NEXT: psrld $1, %xmm2 721; SSE-NEXT: psubd %xmm2, %xmm5 722; SSE-NEXT: movdqa %xmm3, %xmm6 723; SSE-NEXT: por %xmm7, %xmm6 724; SSE-NEXT: pxor %xmm7, %xmm3 725; SSE-NEXT: psrld $1, %xmm3 726; SSE-NEXT: psubd %xmm3, %xmm6 727; SSE-NEXT: movdqa %xmm8, %xmm0 728; SSE-NEXT: movdqa %xmm4, %xmm1 729; SSE-NEXT: movdqa %xmm5, %xmm2 730; SSE-NEXT: movdqa %xmm6, %xmm3 731; SSE-NEXT: retq 732; 733; AVX1-LABEL: test_fixed_v16i32: 734; AVX1: # %bb.0: 735; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 736; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 737; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 738; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 739; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2 740; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2 741; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 742; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0 743; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 744; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 745; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 746; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 747; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 748; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3 749; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3 750; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 751; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1 752; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 753; AVX1-NEXT: retq 754; 755; AVX2-LABEL: test_fixed_v16i32: 756; AVX2: # %bb.0: 757; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 758; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 759; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 760; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0 761; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 762; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 763; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1 764; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1 765; AVX2-NEXT: retq 766; 767; AVX512-LABEL: test_fixed_v16i32: 768; AVX512: # %bb.0: 769; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2 770; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 771; AVX512-NEXT: vpsrld $1, %zmm0, %zmm0 772; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0 773; AVX512-NEXT: retq 774 %or = or <16 x i32> %a0, %a1 775 %xor = xor <16 x i32> %a1, %a0 776 %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> 777 %res = sub <16 x i32> %or, %shift 778 ret <16 x i32> %res 779} 780 781define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind { 782; SSE-LABEL: test_ext_v16i32: 783; SSE: # %bb.0: 784; SSE-NEXT: movdqa %xmm0, %xmm8 785; SSE-NEXT: por %xmm4, %xmm8 786; SSE-NEXT: pxor %xmm4, %xmm0 787; SSE-NEXT: psrld $1, %xmm0 788; SSE-NEXT: psubd %xmm0, %xmm8 789; SSE-NEXT: movdqa %xmm1, %xmm4 790; SSE-NEXT: por %xmm5, %xmm4 791; SSE-NEXT: pxor %xmm5, %xmm1 792; SSE-NEXT: psrld $1, %xmm1 793; SSE-NEXT: psubd %xmm1, %xmm4 794; SSE-NEXT: movdqa %xmm2, %xmm5 795; SSE-NEXT: por %xmm6, %xmm5 796; SSE-NEXT: pxor %xmm6, %xmm2 797; SSE-NEXT: psrld $1, %xmm2 798; SSE-NEXT: psubd %xmm2, %xmm5 799; SSE-NEXT: movdqa %xmm3, %xmm6 800; SSE-NEXT: por %xmm7, %xmm6 801; SSE-NEXT: pxor %xmm7, %xmm3 802; SSE-NEXT: psrld $1, %xmm3 803; SSE-NEXT: psubd %xmm3, %xmm6 804; SSE-NEXT: movdqa %xmm8, %xmm0 805; SSE-NEXT: movdqa %xmm4, %xmm1 806; SSE-NEXT: movdqa %xmm5, %xmm2 807; SSE-NEXT: movdqa %xmm6, %xmm3 808; SSE-NEXT: retq 809; 810; AVX1-LABEL: test_ext_v16i32: 811; AVX1: # %bb.0: 812; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 813; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 814; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 815; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 816; AVX1-NEXT: vpsrld $1, %xmm2, %xmm2 817; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2 818; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0 819; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0 820; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 821; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 822; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 823; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 824; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 825; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3 826; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3 827; AVX1-NEXT: vpsrld $1, %xmm1, %xmm1 828; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1 829; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 830; AVX1-NEXT: retq 831; 832; AVX2-LABEL: test_ext_v16i32: 833; AVX2: # %bb.0: 834; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 835; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 836; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0 837; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0 838; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 839; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 840; AVX2-NEXT: vpsrld $1, %ymm1, %ymm1 841; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1 842; AVX2-NEXT: retq 843; 844; AVX512-LABEL: test_ext_v16i32: 845; AVX512: # %bb.0: 846; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2 847; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0 848; AVX512-NEXT: vpsrld $1, %zmm0, %zmm0 849; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0 850; AVX512-NEXT: retq 851 %x0 = zext <16 x i32> %a0 to <16 x i64> 852 %x1 = zext <16 x i32> %a1 to <16 x i64> 853 %sum = add <16 x i64> %x0, %x1 854 %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> 855 %shift = lshr <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> 856 %res = trunc <16 x i64> %shift to <16 x i32> 857 ret <16 x i32> %res 858} 859 860define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 861; SSE-LABEL: test_fixed_v8i64: 862; SSE: # %bb.0: 863; SSE-NEXT: movdqa %xmm0, %xmm8 864; SSE-NEXT: por %xmm4, %xmm8 865; SSE-NEXT: pxor %xmm4, %xmm0 866; SSE-NEXT: psrlq $1, %xmm0 867; SSE-NEXT: psubq %xmm0, %xmm8 868; SSE-NEXT: movdqa %xmm1, %xmm4 869; SSE-NEXT: por %xmm5, %xmm4 870; SSE-NEXT: pxor %xmm5, %xmm1 871; SSE-NEXT: psrlq $1, %xmm1 872; SSE-NEXT: psubq %xmm1, %xmm4 873; SSE-NEXT: movdqa %xmm2, %xmm5 874; SSE-NEXT: por %xmm6, %xmm5 875; SSE-NEXT: pxor %xmm6, %xmm2 876; SSE-NEXT: psrlq $1, %xmm2 877; SSE-NEXT: psubq %xmm2, %xmm5 878; SSE-NEXT: movdqa %xmm3, %xmm6 879; SSE-NEXT: por %xmm7, %xmm6 880; SSE-NEXT: pxor %xmm7, %xmm3 881; SSE-NEXT: psrlq $1, %xmm3 882; SSE-NEXT: psubq %xmm3, %xmm6 883; SSE-NEXT: movdqa %xmm8, %xmm0 884; SSE-NEXT: movdqa %xmm4, %xmm1 885; SSE-NEXT: movdqa %xmm5, %xmm2 886; SSE-NEXT: movdqa %xmm6, %xmm3 887; SSE-NEXT: retq 888; 889; AVX1-LABEL: test_fixed_v8i64: 890; AVX1: # %bb.0: 891; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 892; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 893; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 894; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 895; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 896; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2 897; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 898; AVX1-NEXT: vpsubq %xmm0, %xmm4, %xmm0 899; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 900; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 901; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 902; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 903; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 904; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 905; AVX1-NEXT: vpsubq %xmm3, %xmm4, %xmm3 906; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 907; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 908; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 909; AVX1-NEXT: retq 910; 911; AVX2-LABEL: test_fixed_v8i64: 912; AVX2: # %bb.0: 913; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 914; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 915; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 916; AVX2-NEXT: vpsubq %ymm0, %ymm4, %ymm0 917; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 918; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 919; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm1 920; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1 921; AVX2-NEXT: retq 922; 923; AVX512-LABEL: test_fixed_v8i64: 924; AVX512: # %bb.0: 925; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 926; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 927; AVX512-NEXT: vpsrlq $1, %zmm0, %zmm0 928; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0 929; AVX512-NEXT: retq 930 %or = or <8 x i64> %a0, %a1 931 %xor = xor <8 x i64> %a1, %a0 932 %shift = lshr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 933 %res = sub <8 x i64> %or, %shift 934 ret <8 x i64> %res 935} 936 937define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind { 938; SSE-LABEL: test_ext_v8i64: 939; SSE: # %bb.0: 940; SSE-NEXT: movdqa %xmm0, %xmm8 941; SSE-NEXT: por %xmm4, %xmm8 942; SSE-NEXT: pxor %xmm4, %xmm0 943; SSE-NEXT: psrlq $1, %xmm0 944; SSE-NEXT: psubq %xmm0, %xmm8 945; SSE-NEXT: movdqa %xmm1, %xmm4 946; SSE-NEXT: por %xmm5, %xmm4 947; SSE-NEXT: pxor %xmm5, %xmm1 948; SSE-NEXT: psrlq $1, %xmm1 949; SSE-NEXT: psubq %xmm1, %xmm4 950; SSE-NEXT: movdqa %xmm2, %xmm5 951; SSE-NEXT: por %xmm6, %xmm5 952; SSE-NEXT: pxor %xmm6, %xmm2 953; SSE-NEXT: psrlq $1, %xmm2 954; SSE-NEXT: psubq %xmm2, %xmm5 955; SSE-NEXT: movdqa %xmm3, %xmm6 956; SSE-NEXT: por %xmm7, %xmm6 957; SSE-NEXT: pxor %xmm7, %xmm3 958; SSE-NEXT: psrlq $1, %xmm3 959; SSE-NEXT: psubq %xmm3, %xmm6 960; SSE-NEXT: movdqa %xmm8, %xmm0 961; SSE-NEXT: movdqa %xmm4, %xmm1 962; SSE-NEXT: movdqa %xmm5, %xmm2 963; SSE-NEXT: movdqa %xmm6, %xmm3 964; SSE-NEXT: retq 965; 966; AVX1-LABEL: test_ext_v8i64: 967; AVX1: # %bb.0: 968; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4 969; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 970; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 971; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 972; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2 973; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2 974; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0 975; AVX1-NEXT: vpsubq %xmm0, %xmm4, %xmm0 976; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 977; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2 978; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 979; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1 980; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 981; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3 982; AVX1-NEXT: vpsubq %xmm3, %xmm4, %xmm3 983; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm1 984; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1 985; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 986; AVX1-NEXT: retq 987; 988; AVX2-LABEL: test_ext_v8i64: 989; AVX2: # %bb.0: 990; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4 991; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 992; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm0 993; AVX2-NEXT: vpsubq %ymm0, %ymm4, %ymm0 994; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2 995; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 996; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm1 997; AVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1 998; AVX2-NEXT: retq 999; 1000; AVX512-LABEL: test_ext_v8i64: 1001; AVX512: # %bb.0: 1002; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2 1003; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0 1004; AVX512-NEXT: vpsrlq $1, %zmm0, %zmm0 1005; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0 1006; AVX512-NEXT: retq 1007 %x0 = zext <8 x i64> %a0 to <8 x i128> 1008 %x1 = zext <8 x i64> %a1 to <8 x i128> 1009 %sum = add <8 x i128> %x0, %x1 1010 %inc = add <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1> 1011 %shift = lshr <8 x i128> %inc, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1> 1012 %res = trunc <8 x i128> %shift to <8 x i64> 1013 ret <8 x i64> %res 1014} 1015 1016;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 1017; SSE2: {{.*}} 1018; SSE4: {{.*}} 1019