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=+avx512vl | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F --check-prefix=AVX512VL 7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW 8 9define <4 x i32> @test_abs_gt_v4i32(<4 x i32> %a) nounwind { 10; SSE2-LABEL: test_abs_gt_v4i32: 11; SSE2: # BB#0: 12; SSE2-NEXT: movdqa %xmm0, %xmm1 13; SSE2-NEXT: psrad $31, %xmm1 14; SSE2-NEXT: paddd %xmm1, %xmm0 15; SSE2-NEXT: pxor %xmm1, %xmm0 16; SSE2-NEXT: retq 17; 18; SSSE3-LABEL: test_abs_gt_v4i32: 19; SSSE3: # BB#0: 20; SSSE3-NEXT: pabsd %xmm0, %xmm0 21; SSSE3-NEXT: retq 22; 23; AVX-LABEL: test_abs_gt_v4i32: 24; AVX: # BB#0: 25; AVX-NEXT: vpabsd %xmm0, %xmm0 26; AVX-NEXT: retq 27 %tmp1neg = sub <4 x i32> zeroinitializer, %a 28 %b = icmp sgt <4 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1> 29 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 30 ret <4 x i32> %abs 31} 32 33define <4 x i32> @test_abs_ge_v4i32(<4 x i32> %a) nounwind { 34; SSE2-LABEL: test_abs_ge_v4i32: 35; SSE2: # BB#0: 36; SSE2-NEXT: movdqa %xmm0, %xmm1 37; SSE2-NEXT: psrad $31, %xmm1 38; SSE2-NEXT: paddd %xmm1, %xmm0 39; SSE2-NEXT: pxor %xmm1, %xmm0 40; SSE2-NEXT: retq 41; 42; SSSE3-LABEL: test_abs_ge_v4i32: 43; SSSE3: # BB#0: 44; SSSE3-NEXT: pabsd %xmm0, %xmm0 45; SSSE3-NEXT: retq 46; 47; AVX-LABEL: test_abs_ge_v4i32: 48; AVX: # BB#0: 49; AVX-NEXT: vpabsd %xmm0, %xmm0 50; AVX-NEXT: retq 51 %tmp1neg = sub <4 x i32> zeroinitializer, %a 52 %b = icmp sge <4 x i32> %a, zeroinitializer 53 %abs = select <4 x i1> %b, <4 x i32> %a, <4 x i32> %tmp1neg 54 ret <4 x i32> %abs 55} 56 57define <8 x i16> @test_abs_gt_v8i16(<8 x i16> %a) nounwind { 58; SSE2-LABEL: test_abs_gt_v8i16: 59; SSE2: # BB#0: 60; SSE2-NEXT: movdqa %xmm0, %xmm1 61; SSE2-NEXT: psraw $15, %xmm1 62; SSE2-NEXT: paddw %xmm1, %xmm0 63; SSE2-NEXT: pxor %xmm1, %xmm0 64; SSE2-NEXT: retq 65; 66; SSSE3-LABEL: test_abs_gt_v8i16: 67; SSSE3: # BB#0: 68; SSSE3-NEXT: pabsw %xmm0, %xmm0 69; SSSE3-NEXT: retq 70; 71; AVX-LABEL: test_abs_gt_v8i16: 72; AVX: # BB#0: 73; AVX-NEXT: vpabsw %xmm0, %xmm0 74; AVX-NEXT: retq 75 %tmp1neg = sub <8 x i16> zeroinitializer, %a 76 %b = icmp sgt <8 x i16> %a, zeroinitializer 77 %abs = select <8 x i1> %b, <8 x i16> %a, <8 x i16> %tmp1neg 78 ret <8 x i16> %abs 79} 80 81define <16 x i8> @test_abs_lt_v16i8(<16 x i8> %a) nounwind { 82; SSE2-LABEL: test_abs_lt_v16i8: 83; SSE2: # BB#0: 84; SSE2-NEXT: pxor %xmm1, %xmm1 85; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 86; SSE2-NEXT: paddb %xmm1, %xmm0 87; SSE2-NEXT: pxor %xmm1, %xmm0 88; SSE2-NEXT: retq 89; 90; SSSE3-LABEL: test_abs_lt_v16i8: 91; SSSE3: # BB#0: 92; SSSE3-NEXT: pabsb %xmm0, %xmm0 93; SSSE3-NEXT: retq 94; 95; AVX-LABEL: test_abs_lt_v16i8: 96; AVX: # BB#0: 97; AVX-NEXT: vpabsb %xmm0, %xmm0 98; AVX-NEXT: retq 99 %tmp1neg = sub <16 x i8> zeroinitializer, %a 100 %b = icmp slt <16 x i8> %a, zeroinitializer 101 %abs = select <16 x i1> %b, <16 x i8> %tmp1neg, <16 x i8> %a 102 ret <16 x i8> %abs 103} 104 105define <4 x i32> @test_abs_le_v4i32(<4 x i32> %a) nounwind { 106; SSE2-LABEL: test_abs_le_v4i32: 107; SSE2: # BB#0: 108; SSE2-NEXT: movdqa %xmm0, %xmm1 109; SSE2-NEXT: psrad $31, %xmm1 110; SSE2-NEXT: paddd %xmm1, %xmm0 111; SSE2-NEXT: pxor %xmm1, %xmm0 112; SSE2-NEXT: retq 113; 114; SSSE3-LABEL: test_abs_le_v4i32: 115; SSSE3: # BB#0: 116; SSSE3-NEXT: pabsd %xmm0, %xmm0 117; SSSE3-NEXT: retq 118; 119; AVX-LABEL: test_abs_le_v4i32: 120; AVX: # BB#0: 121; AVX-NEXT: vpabsd %xmm0, %xmm0 122; AVX-NEXT: retq 123 %tmp1neg = sub <4 x i32> zeroinitializer, %a 124 %b = icmp sle <4 x i32> %a, zeroinitializer 125 %abs = select <4 x i1> %b, <4 x i32> %tmp1neg, <4 x i32> %a 126 ret <4 x i32> %abs 127} 128 129define <8 x i32> @test_abs_gt_v8i32(<8 x i32> %a) nounwind { 130; SSE2-LABEL: test_abs_gt_v8i32: 131; SSE2: # BB#0: 132; SSE2-NEXT: movdqa %xmm0, %xmm2 133; SSE2-NEXT: psrad $31, %xmm2 134; SSE2-NEXT: paddd %xmm2, %xmm0 135; SSE2-NEXT: pxor %xmm2, %xmm0 136; SSE2-NEXT: movdqa %xmm1, %xmm2 137; SSE2-NEXT: psrad $31, %xmm2 138; SSE2-NEXT: paddd %xmm2, %xmm1 139; SSE2-NEXT: pxor %xmm2, %xmm1 140; SSE2-NEXT: retq 141; 142; SSSE3-LABEL: test_abs_gt_v8i32: 143; SSSE3: # BB#0: 144; SSSE3-NEXT: pabsd %xmm0, %xmm0 145; SSSE3-NEXT: pabsd %xmm1, %xmm1 146; SSSE3-NEXT: retq 147; 148; AVX1-LABEL: test_abs_gt_v8i32: 149; AVX1: # BB#0: 150; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 151; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 152; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 153; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 154; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 155; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 156; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 157; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 158; AVX1-NEXT: retq 159; 160; AVX2-LABEL: test_abs_gt_v8i32: 161; AVX2: # BB#0: 162; AVX2-NEXT: vpabsd %ymm0, %ymm0 163; AVX2-NEXT: retq 164; 165; AVX512-LABEL: test_abs_gt_v8i32: 166; AVX512: # BB#0: 167; AVX512-NEXT: vpabsd %ymm0, %ymm0 168; AVX512-NEXT: retq 169 %tmp1neg = sub <8 x i32> zeroinitializer, %a 170 %b = icmp sgt <8 x i32> %a, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1> 171 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 172 ret <8 x i32> %abs 173} 174 175define <8 x i32> @test_abs_ge_v8i32(<8 x i32> %a) nounwind { 176; SSE2-LABEL: test_abs_ge_v8i32: 177; SSE2: # BB#0: 178; SSE2-NEXT: movdqa %xmm0, %xmm2 179; SSE2-NEXT: psrad $31, %xmm2 180; SSE2-NEXT: paddd %xmm2, %xmm0 181; SSE2-NEXT: pxor %xmm2, %xmm0 182; SSE2-NEXT: movdqa %xmm1, %xmm2 183; SSE2-NEXT: psrad $31, %xmm2 184; SSE2-NEXT: paddd %xmm2, %xmm1 185; SSE2-NEXT: pxor %xmm2, %xmm1 186; SSE2-NEXT: retq 187; 188; SSSE3-LABEL: test_abs_ge_v8i32: 189; SSSE3: # BB#0: 190; SSSE3-NEXT: pabsd %xmm0, %xmm0 191; SSSE3-NEXT: pabsd %xmm1, %xmm1 192; SSSE3-NEXT: retq 193; 194; AVX1-LABEL: test_abs_ge_v8i32: 195; AVX1: # BB#0: 196; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 197; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 198; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 199; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 200; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 201; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 202; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 203; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 204; AVX1-NEXT: retq 205; 206; AVX2-LABEL: test_abs_ge_v8i32: 207; AVX2: # BB#0: 208; AVX2-NEXT: vpabsd %ymm0, %ymm0 209; AVX2-NEXT: retq 210; 211; AVX512-LABEL: test_abs_ge_v8i32: 212; AVX512: # BB#0: 213; AVX512-NEXT: vpabsd %ymm0, %ymm0 214; AVX512-NEXT: retq 215 %tmp1neg = sub <8 x i32> zeroinitializer, %a 216 %b = icmp sge <8 x i32> %a, zeroinitializer 217 %abs = select <8 x i1> %b, <8 x i32> %a, <8 x i32> %tmp1neg 218 ret <8 x i32> %abs 219} 220 221define <16 x i16> @test_abs_gt_v16i16(<16 x i16> %a) nounwind { 222; SSE2-LABEL: test_abs_gt_v16i16: 223; SSE2: # BB#0: 224; SSE2-NEXT: movdqa %xmm0, %xmm2 225; SSE2-NEXT: psraw $15, %xmm2 226; SSE2-NEXT: paddw %xmm2, %xmm0 227; SSE2-NEXT: pxor %xmm2, %xmm0 228; SSE2-NEXT: movdqa %xmm1, %xmm2 229; SSE2-NEXT: psraw $15, %xmm2 230; SSE2-NEXT: paddw %xmm2, %xmm1 231; SSE2-NEXT: pxor %xmm2, %xmm1 232; SSE2-NEXT: retq 233; 234; SSSE3-LABEL: test_abs_gt_v16i16: 235; SSSE3: # BB#0: 236; SSSE3-NEXT: pabsw %xmm0, %xmm0 237; SSSE3-NEXT: pabsw %xmm1, %xmm1 238; SSSE3-NEXT: retq 239; 240; AVX1-LABEL: test_abs_gt_v16i16: 241; AVX1: # BB#0: 242; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 243; AVX1-NEXT: vpsraw $15, %xmm1, %xmm2 244; AVX1-NEXT: vpaddw %xmm2, %xmm1, %xmm1 245; AVX1-NEXT: vpsraw $15, %xmm0, %xmm3 246; AVX1-NEXT: vpaddw %xmm3, %xmm0, %xmm0 247; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 248; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 249; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 250; AVX1-NEXT: retq 251; 252; AVX2-LABEL: test_abs_gt_v16i16: 253; AVX2: # BB#0: 254; AVX2-NEXT: vpabsw %ymm0, %ymm0 255; AVX2-NEXT: retq 256; 257; AVX512-LABEL: test_abs_gt_v16i16: 258; AVX512: # BB#0: 259; AVX512-NEXT: vpabsw %ymm0, %ymm0 260; AVX512-NEXT: retq 261 %tmp1neg = sub <16 x i16> zeroinitializer, %a 262 %b = icmp sgt <16 x i16> %a, zeroinitializer 263 %abs = select <16 x i1> %b, <16 x i16> %a, <16 x i16> %tmp1neg 264 ret <16 x i16> %abs 265} 266 267define <32 x i8> @test_abs_lt_v32i8(<32 x i8> %a) nounwind { 268; SSE2-LABEL: test_abs_lt_v32i8: 269; SSE2: # BB#0: 270; SSE2-NEXT: pxor %xmm2, %xmm2 271; SSE2-NEXT: pxor %xmm3, %xmm3 272; SSE2-NEXT: pcmpgtb %xmm0, %xmm3 273; SSE2-NEXT: paddb %xmm3, %xmm0 274; SSE2-NEXT: pxor %xmm3, %xmm0 275; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 276; SSE2-NEXT: paddb %xmm2, %xmm1 277; SSE2-NEXT: pxor %xmm2, %xmm1 278; SSE2-NEXT: retq 279; 280; SSSE3-LABEL: test_abs_lt_v32i8: 281; SSSE3: # BB#0: 282; SSSE3-NEXT: pabsb %xmm0, %xmm0 283; SSSE3-NEXT: pabsb %xmm1, %xmm1 284; SSSE3-NEXT: retq 285; 286; AVX1-LABEL: test_abs_lt_v32i8: 287; AVX1: # BB#0: 288; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 289; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 290; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm3 291; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 292; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm4 293; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 294; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 295; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 296; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0 297; AVX1-NEXT: retq 298; 299; AVX2-LABEL: test_abs_lt_v32i8: 300; AVX2: # BB#0: 301; AVX2-NEXT: vpabsb %ymm0, %ymm0 302; AVX2-NEXT: retq 303; 304; AVX512-LABEL: test_abs_lt_v32i8: 305; AVX512: # BB#0: 306; AVX512-NEXT: vpabsb %ymm0, %ymm0 307; AVX512-NEXT: retq 308 %tmp1neg = sub <32 x i8> zeroinitializer, %a 309 %b = icmp slt <32 x i8> %a, zeroinitializer 310 %abs = select <32 x i1> %b, <32 x i8> %tmp1neg, <32 x i8> %a 311 ret <32 x i8> %abs 312} 313 314define <8 x i32> @test_abs_le_v8i32(<8 x i32> %a) nounwind { 315; SSE2-LABEL: test_abs_le_v8i32: 316; SSE2: # BB#0: 317; SSE2-NEXT: movdqa %xmm0, %xmm2 318; SSE2-NEXT: psrad $31, %xmm2 319; SSE2-NEXT: paddd %xmm2, %xmm0 320; SSE2-NEXT: pxor %xmm2, %xmm0 321; SSE2-NEXT: movdqa %xmm1, %xmm2 322; SSE2-NEXT: psrad $31, %xmm2 323; SSE2-NEXT: paddd %xmm2, %xmm1 324; SSE2-NEXT: pxor %xmm2, %xmm1 325; SSE2-NEXT: retq 326; 327; SSSE3-LABEL: test_abs_le_v8i32: 328; SSSE3: # BB#0: 329; SSSE3-NEXT: pabsd %xmm0, %xmm0 330; SSSE3-NEXT: pabsd %xmm1, %xmm1 331; SSSE3-NEXT: retq 332; 333; AVX1-LABEL: test_abs_le_v8i32: 334; AVX1: # BB#0: 335; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 336; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 337; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 338; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 339; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 340; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 341; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 342; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 343; AVX1-NEXT: retq 344; 345; AVX2-LABEL: test_abs_le_v8i32: 346; AVX2: # BB#0: 347; AVX2-NEXT: vpabsd %ymm0, %ymm0 348; AVX2-NEXT: retq 349; 350; AVX512-LABEL: test_abs_le_v8i32: 351; AVX512: # BB#0: 352; AVX512-NEXT: vpabsd %ymm0, %ymm0 353; AVX512-NEXT: retq 354 %tmp1neg = sub <8 x i32> zeroinitializer, %a 355 %b = icmp sle <8 x i32> %a, zeroinitializer 356 %abs = select <8 x i1> %b, <8 x i32> %tmp1neg, <8 x i32> %a 357 ret <8 x i32> %abs 358} 359 360define <16 x i32> @test_abs_le_16i32(<16 x i32> %a) nounwind { 361; SSE2-LABEL: test_abs_le_16i32: 362; SSE2: # BB#0: 363; SSE2-NEXT: movdqa %xmm0, %xmm4 364; SSE2-NEXT: psrad $31, %xmm4 365; SSE2-NEXT: paddd %xmm4, %xmm0 366; SSE2-NEXT: pxor %xmm4, %xmm0 367; SSE2-NEXT: movdqa %xmm1, %xmm4 368; SSE2-NEXT: psrad $31, %xmm4 369; SSE2-NEXT: paddd %xmm4, %xmm1 370; SSE2-NEXT: pxor %xmm4, %xmm1 371; SSE2-NEXT: movdqa %xmm2, %xmm4 372; SSE2-NEXT: psrad $31, %xmm4 373; SSE2-NEXT: paddd %xmm4, %xmm2 374; SSE2-NEXT: pxor %xmm4, %xmm2 375; SSE2-NEXT: movdqa %xmm3, %xmm4 376; SSE2-NEXT: psrad $31, %xmm4 377; SSE2-NEXT: paddd %xmm4, %xmm3 378; SSE2-NEXT: pxor %xmm4, %xmm3 379; SSE2-NEXT: retq 380; 381; SSSE3-LABEL: test_abs_le_16i32: 382; SSSE3: # BB#0: 383; SSSE3-NEXT: pabsd %xmm0, %xmm0 384; SSSE3-NEXT: pabsd %xmm1, %xmm1 385; SSSE3-NEXT: pabsd %xmm2, %xmm2 386; SSSE3-NEXT: pabsd %xmm3, %xmm3 387; SSSE3-NEXT: retq 388; 389; AVX1-LABEL: test_abs_le_16i32: 390; AVX1: # BB#0: 391; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 392; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 393; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 394; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 395; AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm0 396; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 397; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 398; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 399; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 400; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 401; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 402; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 403; AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm1 404; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 405; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 406; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 407; AVX1-NEXT: retq 408; 409; AVX2-LABEL: test_abs_le_16i32: 410; AVX2: # BB#0: 411; AVX2-NEXT: vpabsd %ymm0, %ymm0 412; AVX2-NEXT: vpabsd %ymm1, %ymm1 413; AVX2-NEXT: retq 414; 415; AVX512-LABEL: test_abs_le_16i32: 416; AVX512: # BB#0: 417; AVX512-NEXT: vpabsd %zmm0, %zmm0 418; AVX512-NEXT: retq 419 %tmp1neg = sub <16 x i32> zeroinitializer, %a 420 %b = icmp sle <16 x i32> %a, zeroinitializer 421 %abs = select <16 x i1> %b, <16 x i32> %tmp1neg, <16 x i32> %a 422 ret <16 x i32> %abs 423} 424 425define <2 x i64> @test_abs_ge_v2i64(<2 x i64> %a) nounwind { 426; SSE-LABEL: test_abs_ge_v2i64: 427; SSE: # BB#0: 428; SSE-NEXT: movdqa %xmm0, %xmm1 429; SSE-NEXT: psrad $31, %xmm1 430; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 431; SSE-NEXT: paddq %xmm1, %xmm0 432; SSE-NEXT: pxor %xmm1, %xmm0 433; SSE-NEXT: retq 434; 435; AVX1-LABEL: test_abs_ge_v2i64: 436; AVX1: # BB#0: 437; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1 438; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 439; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 440; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 441; AVX1-NEXT: retq 442; 443; AVX2-LABEL: test_abs_ge_v2i64: 444; AVX2: # BB#0: 445; AVX2-NEXT: vpsrad $31, %xmm0, %xmm1 446; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 447; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 448; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 449; AVX2-NEXT: retq 450; 451; AVX512-LABEL: test_abs_ge_v2i64: 452; AVX512: # BB#0: 453; AVX512-NEXT: vpsraq $63, %xmm0, %xmm1 454; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 455; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0 456; AVX512-NEXT: retq 457 %tmp1neg = sub <2 x i64> zeroinitializer, %a 458 %b = icmp sge <2 x i64> %a, zeroinitializer 459 %abs = select <2 x i1> %b, <2 x i64> %a, <2 x i64> %tmp1neg 460 ret <2 x i64> %abs 461} 462 463define <4 x i64> @test_abs_gt_v4i64(<4 x i64> %a) nounwind { 464; SSE-LABEL: test_abs_gt_v4i64: 465; SSE: # BB#0: 466; SSE-NEXT: movdqa %xmm0, %xmm2 467; SSE-NEXT: psrad $31, %xmm2 468; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 469; SSE-NEXT: paddq %xmm2, %xmm0 470; SSE-NEXT: pxor %xmm2, %xmm0 471; SSE-NEXT: movdqa %xmm1, %xmm2 472; SSE-NEXT: psrad $31, %xmm2 473; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 474; SSE-NEXT: paddq %xmm2, %xmm1 475; SSE-NEXT: pxor %xmm2, %xmm1 476; SSE-NEXT: retq 477; 478; AVX1-LABEL: test_abs_gt_v4i64: 479; AVX1: # BB#0: 480; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 481; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 482; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 483; AVX1-NEXT: vpaddq %xmm2, %xmm1, %xmm1 484; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 485; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 486; AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm0 487; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 488; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm1 489; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 490; AVX1-NEXT: retq 491; 492; AVX2-LABEL: test_abs_gt_v4i64: 493; AVX2: # BB#0: 494; AVX2-NEXT: vpsrad $31, %ymm0, %ymm1 495; AVX2-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7] 496; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 497; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 498; AVX2-NEXT: retq 499; 500; AVX512-LABEL: test_abs_gt_v4i64: 501; AVX512: # BB#0: 502; AVX512-NEXT: vpsraq $63, %ymm0, %ymm1 503; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 504; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 505; AVX512-NEXT: retq 506 %tmp1neg = sub <4 x i64> zeroinitializer, %a 507 %b = icmp sgt <4 x i64> %a, <i64 -1, i64 -1, i64 -1, i64 -1> 508 %abs = select <4 x i1> %b, <4 x i64> %a, <4 x i64> %tmp1neg 509 ret <4 x i64> %abs 510} 511 512define <8 x i64> @test_abs_le_v8i64(<8 x i64> %a) nounwind { 513; SSE-LABEL: test_abs_le_v8i64: 514; SSE: # BB#0: 515; SSE-NEXT: movdqa %xmm0, %xmm4 516; SSE-NEXT: psrad $31, %xmm4 517; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 518; SSE-NEXT: paddq %xmm4, %xmm0 519; SSE-NEXT: pxor %xmm4, %xmm0 520; SSE-NEXT: movdqa %xmm1, %xmm4 521; SSE-NEXT: psrad $31, %xmm4 522; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 523; SSE-NEXT: paddq %xmm4, %xmm1 524; SSE-NEXT: pxor %xmm4, %xmm1 525; SSE-NEXT: movdqa %xmm2, %xmm4 526; SSE-NEXT: psrad $31, %xmm4 527; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 528; SSE-NEXT: paddq %xmm4, %xmm2 529; SSE-NEXT: pxor %xmm4, %xmm2 530; SSE-NEXT: movdqa %xmm3, %xmm4 531; SSE-NEXT: psrad $31, %xmm4 532; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 533; SSE-NEXT: paddq %xmm4, %xmm3 534; SSE-NEXT: pxor %xmm4, %xmm3 535; SSE-NEXT: retq 536; 537; AVX1-LABEL: test_abs_le_v8i64: 538; AVX1: # BB#0: 539; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 540; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 541; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 542; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 543; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 544; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 545; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 546; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 547; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 548; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 549; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 550; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 551; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 552; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 553; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 554; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 555; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm1 556; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 557; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 558; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 559; AVX1-NEXT: retq 560; 561; AVX2-LABEL: test_abs_le_v8i64: 562; AVX2: # BB#0: 563; AVX2-NEXT: vpsrad $31, %ymm0, %ymm2 564; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 565; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 566; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 567; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2 568; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 569; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 570; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 571; AVX2-NEXT: retq 572; 573; AVX512-LABEL: test_abs_le_v8i64: 574; AVX512: # BB#0: 575; AVX512-NEXT: vpabsq %zmm0, %zmm0 576; AVX512-NEXT: retq 577 %tmp1neg = sub <8 x i64> zeroinitializer, %a 578 %b = icmp sle <8 x i64> %a, zeroinitializer 579 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a 580 ret <8 x i64> %abs 581} 582 583define <8 x i64> @test_abs_le_v8i64_fold(<8 x i64>* %a.ptr) nounwind { 584; SSE-LABEL: test_abs_le_v8i64_fold: 585; SSE: # BB#0: 586; SSE-NEXT: movdqu (%rdi), %xmm0 587; SSE-NEXT: movdqu 16(%rdi), %xmm1 588; SSE-NEXT: movdqu 32(%rdi), %xmm2 589; SSE-NEXT: movdqu 48(%rdi), %xmm3 590; SSE-NEXT: movdqa %xmm0, %xmm4 591; SSE-NEXT: psrad $31, %xmm4 592; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 593; SSE-NEXT: paddq %xmm4, %xmm0 594; SSE-NEXT: pxor %xmm4, %xmm0 595; SSE-NEXT: movdqa %xmm1, %xmm4 596; SSE-NEXT: psrad $31, %xmm4 597; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 598; SSE-NEXT: paddq %xmm4, %xmm1 599; SSE-NEXT: pxor %xmm4, %xmm1 600; SSE-NEXT: movdqa %xmm2, %xmm4 601; SSE-NEXT: psrad $31, %xmm4 602; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 603; SSE-NEXT: paddq %xmm4, %xmm2 604; SSE-NEXT: pxor %xmm4, %xmm2 605; SSE-NEXT: movdqa %xmm3, %xmm4 606; SSE-NEXT: psrad $31, %xmm4 607; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 608; SSE-NEXT: paddq %xmm4, %xmm3 609; SSE-NEXT: pxor %xmm4, %xmm3 610; SSE-NEXT: retq 611; 612; AVX1-LABEL: test_abs_le_v8i64_fold: 613; AVX1: # BB#0: 614; AVX1-NEXT: vmovups (%rdi), %ymm0 615; AVX1-NEXT: vmovups 32(%rdi), %ymm1 616; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 617; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 618; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 619; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 620; AVX1-NEXT: vpsrad $31, %xmm0, %xmm4 621; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 622; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 623; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 624; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 625; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 626; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 627; AVX1-NEXT: vpsrad $31, %xmm2, %xmm3 628; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 629; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 630; AVX1-NEXT: vpsrad $31, %xmm1, %xmm4 631; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 632; AVX1-NEXT: vpaddq %xmm4, %xmm1, %xmm1 633; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 634; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 635; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 636; AVX1-NEXT: retq 637; 638; AVX2-LABEL: test_abs_le_v8i64_fold: 639; AVX2: # BB#0: 640; AVX2-NEXT: vmovdqu (%rdi), %ymm0 641; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 642; AVX2-NEXT: vpsrad $31, %ymm0, %ymm2 643; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 644; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 645; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 646; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2 647; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7] 648; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 649; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 650; AVX2-NEXT: retq 651; 652; AVX512-LABEL: test_abs_le_v8i64_fold: 653; AVX512: # BB#0: 654; AVX512-NEXT: vpabsq (%rdi), %zmm0 655; AVX512-NEXT: retq 656 %a = load <8 x i64>, <8 x i64>* %a.ptr, align 8 657 %tmp1neg = sub <8 x i64> zeroinitializer, %a 658 %b = icmp sle <8 x i64> %a, zeroinitializer 659 %abs = select <8 x i1> %b, <8 x i64> %tmp1neg, <8 x i64> %a 660 ret <8 x i64> %abs 661} 662 663define <64 x i8> @test_abs_lt_v64i8(<64 x i8> %a) nounwind { 664; SSE2-LABEL: test_abs_lt_v64i8: 665; SSE2: # BB#0: 666; SSE2-NEXT: pxor %xmm4, %xmm4 667; SSE2-NEXT: pxor %xmm5, %xmm5 668; SSE2-NEXT: pcmpgtb %xmm0, %xmm5 669; SSE2-NEXT: paddb %xmm5, %xmm0 670; SSE2-NEXT: pxor %xmm5, %xmm0 671; SSE2-NEXT: pxor %xmm5, %xmm5 672; SSE2-NEXT: pcmpgtb %xmm1, %xmm5 673; SSE2-NEXT: paddb %xmm5, %xmm1 674; SSE2-NEXT: pxor %xmm5, %xmm1 675; SSE2-NEXT: pxor %xmm5, %xmm5 676; SSE2-NEXT: pcmpgtb %xmm2, %xmm5 677; SSE2-NEXT: paddb %xmm5, %xmm2 678; SSE2-NEXT: pxor %xmm5, %xmm2 679; SSE2-NEXT: pcmpgtb %xmm3, %xmm4 680; SSE2-NEXT: paddb %xmm4, %xmm3 681; SSE2-NEXT: pxor %xmm4, %xmm3 682; SSE2-NEXT: retq 683; 684; SSSE3-LABEL: test_abs_lt_v64i8: 685; SSSE3: # BB#0: 686; SSSE3-NEXT: pabsb %xmm0, %xmm0 687; SSSE3-NEXT: pabsb %xmm1, %xmm1 688; SSSE3-NEXT: pabsb %xmm2, %xmm2 689; SSSE3-NEXT: pabsb %xmm3, %xmm3 690; SSSE3-NEXT: retq 691; 692; AVX1-LABEL: test_abs_lt_v64i8: 693; AVX1: # BB#0: 694; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 695; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 696; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm4 697; AVX1-NEXT: vpcmpgtb %xmm0, %xmm3, %xmm5 698; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm6 699; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2 700; AVX1-NEXT: vpaddb %xmm5, %xmm0, %xmm0 701; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 702; AVX1-NEXT: vxorps %ymm6, %ymm0, %ymm0 703; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 704; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm4 705; AVX1-NEXT: vpcmpgtb %xmm1, %xmm3, %xmm3 706; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm5 707; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2 708; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 709; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 710; AVX1-NEXT: vxorps %ymm5, %ymm1, %ymm1 711; AVX1-NEXT: retq 712; 713; AVX2-LABEL: test_abs_lt_v64i8: 714; AVX2: # BB#0: 715; AVX2-NEXT: vpabsb %ymm0, %ymm0 716; AVX2-NEXT: vpabsb %ymm1, %ymm1 717; AVX2-NEXT: retq 718; 719; AVX512F-LABEL: test_abs_lt_v64i8: 720; AVX512F: # BB#0: 721; AVX512F-NEXT: vpabsb %ymm0, %ymm0 722; AVX512F-NEXT: vpabsb %ymm1, %ymm1 723; AVX512F-NEXT: retq 724; 725; AVX512BW-LABEL: test_abs_lt_v64i8: 726; AVX512BW: # BB#0: 727; AVX512BW-NEXT: vpabsb %zmm0, %zmm0 728; AVX512BW-NEXT: retq 729 %tmp1neg = sub <64 x i8> zeroinitializer, %a 730 %b = icmp slt <64 x i8> %a, zeroinitializer 731 %abs = select <64 x i1> %b, <64 x i8> %tmp1neg, <64 x i8> %a 732 ret <64 x i8> %abs 733} 734 735define <32 x i16> @test_abs_gt_v32i16(<32 x i16> %a) nounwind { 736; SSE2-LABEL: test_abs_gt_v32i16: 737; SSE2: # BB#0: 738; SSE2-NEXT: movdqa %xmm0, %xmm4 739; SSE2-NEXT: psraw $15, %xmm4 740; SSE2-NEXT: paddw %xmm4, %xmm0 741; SSE2-NEXT: pxor %xmm4, %xmm0 742; SSE2-NEXT: movdqa %xmm1, %xmm4 743; SSE2-NEXT: psraw $15, %xmm4 744; SSE2-NEXT: paddw %xmm4, %xmm1 745; SSE2-NEXT: pxor %xmm4, %xmm1 746; SSE2-NEXT: movdqa %xmm2, %xmm4 747; SSE2-NEXT: psraw $15, %xmm4 748; SSE2-NEXT: paddw %xmm4, %xmm2 749; SSE2-NEXT: pxor %xmm4, %xmm2 750; SSE2-NEXT: movdqa %xmm3, %xmm4 751; SSE2-NEXT: psraw $15, %xmm4 752; SSE2-NEXT: paddw %xmm4, %xmm3 753; SSE2-NEXT: pxor %xmm4, %xmm3 754; SSE2-NEXT: retq 755; 756; SSSE3-LABEL: test_abs_gt_v32i16: 757; SSSE3: # BB#0: 758; SSSE3-NEXT: pabsw %xmm0, %xmm0 759; SSSE3-NEXT: pabsw %xmm1, %xmm1 760; SSSE3-NEXT: pabsw %xmm2, %xmm2 761; SSSE3-NEXT: pabsw %xmm3, %xmm3 762; SSSE3-NEXT: retq 763; 764; AVX1-LABEL: test_abs_gt_v32i16: 765; AVX1: # BB#0: 766; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 767; AVX1-NEXT: vpsraw $15, %xmm2, %xmm3 768; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2 769; AVX1-NEXT: vpsraw $15, %xmm0, %xmm4 770; AVX1-NEXT: vpaddw %xmm4, %xmm0, %xmm0 771; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 772; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 773; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0 774; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 775; AVX1-NEXT: vpsraw $15, %xmm2, %xmm3 776; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2 777; AVX1-NEXT: vpsraw $15, %xmm1, %xmm4 778; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm1 779; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 780; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm2 781; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 782; AVX1-NEXT: retq 783; 784; AVX2-LABEL: test_abs_gt_v32i16: 785; AVX2: # BB#0: 786; AVX2-NEXT: vpabsw %ymm0, %ymm0 787; AVX2-NEXT: vpabsw %ymm1, %ymm1 788; AVX2-NEXT: retq 789; 790; AVX512F-LABEL: test_abs_gt_v32i16: 791; AVX512F: # BB#0: 792; AVX512F-NEXT: vpabsw %ymm0, %ymm0 793; AVX512F-NEXT: vpabsw %ymm1, %ymm1 794; AVX512F-NEXT: retq 795; 796; AVX512BW-LABEL: test_abs_gt_v32i16: 797; AVX512BW: # BB#0: 798; AVX512BW-NEXT: vpabsw %zmm0, %zmm0 799; AVX512BW-NEXT: retq 800 %tmp1neg = sub <32 x i16> zeroinitializer, %a 801 %b = icmp sgt <32 x i16> %a, zeroinitializer 802 %abs = select <32 x i1> %b, <32 x i16> %a, <32 x i16> %tmp1neg 803 ret <32 x i16> %abs 804} 805