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