1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 7 8define <4 x i32> @test1(<4 x i32> %a) nounwind { 9; SSE2-LABEL: test1: 10; SSE2: # BB#0: 11; SSE2-NEXT: movdqa %xmm0, %xmm1 12; SSE2-NEXT: psrad $31, %xmm1 13; SSE2-NEXT: paddd %xmm1, %xmm0 14; SSE2-NEXT: pxor %xmm1, %xmm0 15; SSE2-NEXT: retq 16; 17; SSSE3-LABEL: test1: 18; SSSE3: # BB#0: 19; SSSE3-NEXT: pabsd %xmm0, %xmm0 20; SSSE3-NEXT: retq 21; 22; AVX-LABEL: test1: 23; AVX: # BB#0: 24; AVX-NEXT: vpabsd %xmm0, %xmm0 25; AVX-NEXT: retq 26 %tmp1neg = sub <4 x i32> zeroinitializer, %a 27 %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1> 28 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 29 ret <4 x i32> %abs 30} 31 32define <4 x i32> @test2(<4 x i32> %a) nounwind { 33; SSE2-LABEL: test2: 34; SSE2: # BB#0: 35; SSE2-NEXT: movdqa %xmm0, %xmm1 36; SSE2-NEXT: psrad $31, %xmm1 37; SSE2-NEXT: paddd %xmm1, %xmm0 38; SSE2-NEXT: pxor %xmm1, %xmm0 39; SSE2-NEXT: retq 40; 41; SSSE3-LABEL: test2: 42; SSSE3: # BB#0: 43; SSSE3-NEXT: pabsd %xmm0, %xmm0 44; SSSE3-NEXT: retq 45; 46; AVX-LABEL: test2: 47; AVX: # BB#0: 48; AVX-NEXT: vpabsd %xmm0, %xmm0 49; AVX-NEXT: retq 50 %tmp1neg = sub <4 x i32> zeroinitializer, %a 51 %b = icmp sge <4 x i32> %a, zeroinitializer 52 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 53 ret <4 x i32> %abs 54} 55 56define <8 x i16> @test3(<8 x i16> %a) nounwind { 57; SSE2-LABEL: test3: 58; SSE2: # BB#0: 59; SSE2-NEXT: movdqa %xmm0, %xmm1 60; SSE2-NEXT: psraw $15, %xmm1 61; SSE2-NEXT: paddw %xmm1, %xmm0 62; SSE2-NEXT: pxor %xmm1, %xmm0 63; SSE2-NEXT: retq 64; 65; SSSE3-LABEL: test3: 66; SSSE3: # BB#0: 67; SSSE3-NEXT: pabsw %xmm0, %xmm0 68; SSSE3-NEXT: retq 69; 70; AVX-LABEL: test3: 71; AVX: # BB#0: 72; AVX-NEXT: vpabsw %xmm0, %xmm0 73; AVX-NEXT: retq 74 %tmp1neg = sub <8 x i16> zeroinitializer, %a 75 %b = icmp sgt <8 x i16> %a, zeroinitializer 76 %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg 77 ret <8 x i16> %abs 78} 79 80define <16 x i8> @test4(<16 x i8> %a) nounwind { 81; SSE2-LABEL: test4: 82; SSE2: # BB#0: 83; SSE2-NEXT: pxor %xmm1, %xmm1 84; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 85; SSE2-NEXT: paddb %xmm1, %xmm0 86; SSE2-NEXT: pxor %xmm1, %xmm0 87; SSE2-NEXT: retq 88; 89; SSSE3-LABEL: test4: 90; SSSE3: # BB#0: 91; SSSE3-NEXT: pabsb %xmm0, %xmm0 92; SSSE3-NEXT: retq 93; 94; AVX-LABEL: test4: 95; AVX: # BB#0: 96; AVX-NEXT: vpabsb %xmm0, %xmm0 97; AVX-NEXT: retq 98 %tmp1neg = sub <16 x i8> zeroinitializer, %a 99 %b = icmp slt <16 x i8> %a, zeroinitializer 100 %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a 101 ret <16 x i8> %abs 102} 103 104define <4 x i32> @test5(<4 x i32> %a) nounwind { 105; SSE2-LABEL: test5: 106; SSE2: # BB#0: 107; SSE2-NEXT: movdqa %xmm0, %xmm1 108; SSE2-NEXT: psrad $31, %xmm1 109; SSE2-NEXT: paddd %xmm1, %xmm0 110; SSE2-NEXT: pxor %xmm1, %xmm0 111; SSE2-NEXT: retq 112; 113; SSSE3-LABEL: test5: 114; SSSE3: # BB#0: 115; SSSE3-NEXT: pabsd %xmm0, %xmm0 116; SSSE3-NEXT: retq 117; 118; AVX-LABEL: test5: 119; AVX: # BB#0: 120; AVX-NEXT: vpabsd %xmm0, %xmm0 121; AVX-NEXT: retq 122 %tmp1neg = sub <4 x i32> zeroinitializer, %a 123 %b = icmp sle <4 x i32> %a, zeroinitializer 124 %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a 125 ret <4 x i32> %abs 126} 127 128define <8 x i32> @test6(<8 x i32> %a) nounwind { 129; SSE2-LABEL: test6: 130; SSE2: # BB#0: 131; SSE2-NEXT: movdqa %xmm0, %xmm2 132; SSE2-NEXT: psrad $31, %xmm2 133; SSE2-NEXT: paddd %xmm2, %xmm0 134; SSE2-NEXT: pxor %xmm2, %xmm0 135; SSE2-NEXT: movdqa %xmm1, %xmm2 136; SSE2-NEXT: psrad $31, %xmm2 137; SSE2-NEXT: paddd %xmm2, %xmm1 138; SSE2-NEXT: pxor %xmm2, %xmm1 139; SSE2-NEXT: retq 140; 141; SSSE3-LABEL: test6: 142; SSSE3: # BB#0: 143; SSSE3-NEXT: pabsd %xmm0, %xmm0 144; SSSE3-NEXT: pabsd %xmm1, %xmm1 145; SSSE3-NEXT: retq 146; 147; AVX1-LABEL: test6: 148; AVX1: # BB#0: 149; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 150; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 151; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 152; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 153; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 154; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 155; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 156; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 157; AVX1-NEXT: retq 158; 159; AVX2-LABEL: test6: 160; AVX2: # BB#0: 161; AVX2-NEXT: vpabsd %ymm0, %ymm0 162; AVX2-NEXT: retq 163; 164; AVX512-LABEL: test6: 165; AVX512: # BB#0: 166; AVX512-NEXT: vpabsd %ymm0, %ymm0 167; AVX512-NEXT: retq 168 %tmp1neg = sub <8 x i32> zeroinitializer, %a 169 %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 170 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 171 ret <8 x i32> %abs 172} 173 174define <8 x i32> @test7(<8 x i32> %a) nounwind { 175; SSE2-LABEL: test7: 176; SSE2: # BB#0: 177; SSE2-NEXT: movdqa %xmm0, %xmm2 178; SSE2-NEXT: psrad $31, %xmm2 179; SSE2-NEXT: paddd %xmm2, %xmm0 180; SSE2-NEXT: pxor %xmm2, %xmm0 181; SSE2-NEXT: movdqa %xmm1, %xmm2 182; SSE2-NEXT: psrad $31, %xmm2 183; SSE2-NEXT: paddd %xmm2, %xmm1 184; SSE2-NEXT: pxor %xmm2, %xmm1 185; SSE2-NEXT: retq 186; 187; SSSE3-LABEL: test7: 188; SSSE3: # BB#0: 189; SSSE3-NEXT: pabsd %xmm0, %xmm0 190; SSSE3-NEXT: pabsd %xmm1, %xmm1 191; SSSE3-NEXT: retq 192; 193; AVX1-LABEL: test7: 194; AVX1: # BB#0: 195; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 196; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 197; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 198; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 199; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 200; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 201; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 202; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 203; AVX1-NEXT: retq 204; 205; AVX2-LABEL: test7: 206; AVX2: # BB#0: 207; AVX2-NEXT: vpabsd %ymm0, %ymm0 208; AVX2-NEXT: retq 209; 210; AVX512-LABEL: test7: 211; AVX512: # BB#0: 212; AVX512-NEXT: vpabsd %ymm0, %ymm0 213; AVX512-NEXT: retq 214 %tmp1neg = sub <8 x i32> zeroinitializer, %a 215 %b = icmp sge <8 x i32> %a, zeroinitializer 216 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 217 ret <8 x i32> %abs 218} 219 220define <16 x i16> @test8(<16 x i16> %a) nounwind { 221; SSE2-LABEL: test8: 222; SSE2: # BB#0: 223; SSE2-NEXT: movdqa %xmm0, %xmm2 224; SSE2-NEXT: psraw $15, %xmm2 225; SSE2-NEXT: paddw %xmm2, %xmm0 226; SSE2-NEXT: pxor %xmm2, %xmm0 227; SSE2-NEXT: movdqa %xmm1, %xmm2 228; SSE2-NEXT: psraw $15, %xmm2 229; SSE2-NEXT: paddw %xmm2, %xmm1 230; SSE2-NEXT: pxor %xmm2, %xmm1 231; SSE2-NEXT: retq 232; 233; SSSE3-LABEL: test8: 234; SSSE3: # BB#0: 235; SSSE3-NEXT: pabsw %xmm0, %xmm0 236; SSSE3-NEXT: pabsw %xmm1, %xmm1 237; SSSE3-NEXT: retq 238; 239; AVX1-LABEL: test8: 240; AVX1: # BB#0: 241; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 242; AVX1-NEXT: vpsraw $15, %xmm1, %xmm2 243; AVX1-NEXT: vpaddw %xmm2, %xmm1, %xmm1 244; AVX1-NEXT: vpsraw $15, %xmm0, %xmm3 245; AVX1-NEXT: vpaddw %xmm3, %xmm0, %xmm0 246; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 247; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 248; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 249; AVX1-NEXT: retq 250; 251; AVX2-LABEL: test8: 252; AVX2: # BB#0: 253; AVX2-NEXT: vpabsw %ymm0, %ymm0 254; AVX2-NEXT: retq 255; 256; AVX512-LABEL: test8: 257; AVX512: # BB#0: 258; AVX512-NEXT: vpabsw %ymm0, %ymm0 259; AVX512-NEXT: retq 260 %tmp1neg = sub <16 x i16> zeroinitializer, %a 261 %b = icmp sgt <16 x i16> %a, zeroinitializer 262 %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg 263 ret <16 x i16> %abs 264} 265 266define <32 x i8> @test9(<32 x i8> %a) nounwind { 267; SSE2-LABEL: test9: 268; SSE2: # BB#0: 269; SSE2-NEXT: pxor %xmm2, %xmm2 270; SSE2-NEXT: pxor %xmm3, %xmm3 271; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 272; SSE2-NEXT: paddb %xmm3, %xmm0 273; SSE2-NEXT: pxor %xmm3, %xmm0 274; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 275; SSE2-NEXT: paddb %xmm2, %xmm1 276; SSE2-NEXT: pxor %xmm2, %xmm1 277; SSE2-NEXT: retq 278; 279; SSSE3-LABEL: test9: 280; SSSE3: # BB#0: 281; SSSE3-NEXT: pabsb %xmm0, %xmm0 282; SSSE3-NEXT: pabsb %xmm1, %xmm1 283; SSSE3-NEXT: retq 284; 285; AVX1-LABEL: test9: 286; AVX1: # BB#0: 287; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 288; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 289; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 290; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 291; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm4 292; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 293; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 294; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 295; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 296; AVX1-NEXT: retq 297; 298; AVX2-LABEL: test9: 299; AVX2: # BB#0: 300; AVX2-NEXT: vpabsb %ymm0, %ymm0 301; AVX2-NEXT: retq 302; 303; AVX512-LABEL: test9: 304; AVX512: # BB#0: 305; AVX512-NEXT: vpabsb %ymm0, %ymm0 306; AVX512-NEXT: retq 307 %tmp1neg = sub <32 x i8> zeroinitializer, %a 308 %b = icmp slt <32 x i8> %a, zeroinitializer 309 %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a 310 ret <32 x i8> %abs 311} 312 313define <8 x i32> @test10(<8 x i32> %a) nounwind { 314; SSE2-LABEL: test10: 315; SSE2: # BB#0: 316; SSE2-NEXT: movdqa %xmm0, %xmm2 317; SSE2-NEXT: psrad $31, %xmm2 318; SSE2-NEXT: paddd %xmm2, %xmm0 319; SSE2-NEXT: pxor %xmm2, %xmm0 320; SSE2-NEXT: movdqa %xmm1, %xmm2 321; SSE2-NEXT: psrad $31, %xmm2 322; SSE2-NEXT: paddd %xmm2, %xmm1 323; SSE2-NEXT: pxor %xmm2, %xmm1 324; SSE2-NEXT: retq 325; 326; SSSE3-LABEL: test10: 327; SSSE3: # BB#0: 328; SSSE3-NEXT: pabsd %xmm0, %xmm0 329; SSSE3-NEXT: pabsd %xmm1, %xmm1 330; SSSE3-NEXT: retq 331; 332; AVX1-LABEL: test10: 333; AVX1: # BB#0: 334; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 335; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 336; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 337; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 338; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 339; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 340; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 341; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 342; AVX1-NEXT: retq 343; 344; AVX2-LABEL: test10: 345; AVX2: # BB#0: 346; AVX2-NEXT: vpabsd %ymm0, %ymm0 347; AVX2-NEXT: retq 348; 349; AVX512-LABEL: test10: 350; AVX512: # BB#0: 351; AVX512-NEXT: vpabsd %ymm0, %ymm0 352; AVX512-NEXT: retq 353 %tmp1neg = sub <8 x i32> zeroinitializer, %a 354 %b = icmp sle <8 x i32> %a, zeroinitializer 355 %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a 356 ret <8 x i32> %abs 357} 358 359define <16 x i32> @test11(<16 x i32> %a) nounwind { 360; SSE2-LABEL: test11: 361; SSE2: # BB#0: 362; SSE2-NEXT: movdqa %xmm0, %xmm4 363; SSE2-NEXT: psrad $31, %xmm4 364; SSE2-NEXT: paddd %xmm4, %xmm0 365; SSE2-NEXT: pxor %xmm4, %xmm0 366; SSE2-NEXT: movdqa %xmm1, %xmm4 367; SSE2-NEXT: psrad $31, %xmm4 368; SSE2-NEXT: paddd %xmm4, %xmm1 369; SSE2-NEXT: pxor %xmm4, %xmm1 370; SSE2-NEXT: movdqa %xmm2, %xmm4 371; SSE2-NEXT: psrad $31, %xmm4 372; SSE2-NEXT: paddd %xmm4, %xmm2 373; SSE2-NEXT: pxor %xmm4, %xmm2 374; SSE2-NEXT: movdqa %xmm3, %xmm4 375; SSE2-NEXT: psrad $31, %xmm4 376; SSE2-NEXT: paddd %xmm4, %xmm3 377; SSE2-NEXT: pxor %xmm4, %xmm3 378; SSE2-NEXT: retq 379; 380; SSSE3-LABEL: test11: 381; SSSE3: # BB#0: 382; SSSE3-NEXT: pabsd %xmm0, %xmm0 383; SSSE3-NEXT: pabsd %xmm1, %xmm1 384; SSSE3-NEXT: pabsd %xmm2, %xmm2 385; SSSE3-NEXT: pabsd %xmm3, %xmm3 386; SSSE3-NEXT: retq 387; 388; AVX1-LABEL: test11: 389; AVX1: # BB#0: 390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 391; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 392; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 393; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 394; AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm0 395; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 396; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 397; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 398; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 399; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 400; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 401; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 402; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm1 403; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 404; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 405; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 406; AVX1-NEXT: retq 407; 408; AVX2-LABEL: test11: 409; AVX2: # BB#0: 410; AVX2-NEXT: vpabsd %ymm0, %ymm0 411; AVX2-NEXT: vpabsd %ymm1, %ymm1 412; AVX2-NEXT: retq 413; 414; AVX512-LABEL: test11: 415; AVX512: # BB#0: 416; AVX512-NEXT: vpabsd %zmm0, %zmm0 417; AVX512-NEXT: retq 418 %tmp1neg = sub <16 x i32> zeroinitializer, %a 419 %b = icmp sle <16 x i32> %a, zeroinitializer 420 %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a 421 ret <16 x i32> %abs 422} 423 424define <8 x i64> @test12(<8 x i64> %a) nounwind { 425; SSE-LABEL: test12: 426; SSE: # BB#0: 427; SSE-NEXT: movdqa %xmm0, %xmm4 428; SSE-NEXT: psrad $31, %xmm4 429; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 430; SSE-NEXT: paddq %xmm4, %xmm0 431; SSE-NEXT: pxor %xmm4, %xmm0 432; SSE-NEXT: movdqa %xmm1, %xmm4 433; SSE-NEXT: psrad $31, %xmm4 434; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 435; SSE-NEXT: paddq %xmm4, %xmm1 436; SSE-NEXT: pxor %xmm4, %xmm1 437; SSE-NEXT: movdqa %xmm2, %xmm4 438; SSE-NEXT: psrad $31, %xmm4 439; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 440; SSE-NEXT: paddq %xmm4, %xmm2 441; SSE-NEXT: pxor %xmm4, %xmm2 442; SSE-NEXT: movdqa %xmm3, %xmm4 443; SSE-NEXT: psrad $31, %xmm4 444; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 445; SSE-NEXT: paddq %xmm4, %xmm3 446; SSE-NEXT: pxor %xmm4, %xmm3 447; SSE-NEXT: retq 448; 449; AVX1-LABEL: test12: 450; AVX1: # BB#0: 451; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 452; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 453; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 454; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 455; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 456; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 457; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 458; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 459; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 460; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 461; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 462; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 463; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 464; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 465; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 466; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 467; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm1 468; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 469; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 470; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 471; AVX1-NEXT: retq 472; 473; AVX2-LABEL: test12: 474; AVX2: # BB#0: 475; AVX2-NEXT: vpsrad $31, %ymm0, %ymm2 476; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 477; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 478; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 479; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2 480; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 481; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 482; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 483; AVX2-NEXT: retq 484; 485; AVX512-LABEL: test12: 486; AVX512: # BB#0: 487; AVX512-NEXT: vpabsq %zmm0, %zmm0 488; AVX512-NEXT: retq 489 %tmp1neg = sub <8 x i64> zeroinitializer, %a 490 %b = icmp sle <8 x i64> %a, zeroinitializer 491 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a 492 ret <8 x i64> %abs 493} 494 495define <8 x i64> @test13(<8 x i64>* %a.ptr) nounwind { 496; SSE-LABEL: test13: 497; SSE: # BB#0: 498; SSE-NEXT: movdqu (%rdi), %xmm0 499; SSE-NEXT: movdqu 16(%rdi), %xmm1 500; SSE-NEXT: movdqu 32(%rdi), %xmm2 501; SSE-NEXT: movdqu 48(%rdi), %xmm3 502; SSE-NEXT: movdqa %xmm0, %xmm4 503; SSE-NEXT: psrad $31, %xmm4 504; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 505; SSE-NEXT: paddq %xmm4, %xmm0 506; SSE-NEXT: pxor %xmm4, %xmm0 507; SSE-NEXT: movdqa %xmm1, %xmm4 508; SSE-NEXT: psrad $31, %xmm4 509; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 510; SSE-NEXT: paddq %xmm4, %xmm1 511; SSE-NEXT: pxor %xmm4, %xmm1 512; SSE-NEXT: movdqa %xmm2, %xmm4 513; SSE-NEXT: psrad $31, %xmm4 514; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 515; SSE-NEXT: paddq %xmm4, %xmm2 516; SSE-NEXT: pxor %xmm4, %xmm2 517; SSE-NEXT: movdqa %xmm3, %xmm4 518; SSE-NEXT: psrad $31, %xmm4 519; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 520; SSE-NEXT: paddq %xmm4, %xmm3 521; SSE-NEXT: pxor %xmm4, %xmm3 522; SSE-NEXT: retq 523; 524; AVX1-LABEL: test13: 525; AVX1: # BB#0: 526; AVX1-NEXT: vmovups (%rdi), %ymm0 527; AVX1-NEXT: vmovups 32(%rdi), %ymm1 528; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 529; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 530; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 531; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 532; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 533; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 534; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 535; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 536; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 537; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 538; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 539; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 540; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 541; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 542; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 543; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 544; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm1 545; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 546; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 547; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 548; AVX1-NEXT: retq 549; 550; AVX2-LABEL: test13: 551; AVX2: # BB#0: 552; AVX2-NEXT: vmovdqu (%rdi), %ymm0 553; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 554; AVX2-NEXT: vpsrad $31, %ymm0, %ymm2 555; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 556; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 557; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 558; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2 559; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 560; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 561; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 562; AVX2-NEXT: retq 563; 564; AVX512-LABEL: test13: 565; AVX512: # BB#0: 566; AVX512-NEXT: vpabsq (%rdi), %zmm0 567; AVX512-NEXT: retq 568 %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8 569 %tmp1neg = sub <8 x i64> zeroinitializer, %a 570 %b = icmp sle <8 x i64> %a, zeroinitializer 571 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a 572 ret <8 x i64> %abs 573} 574