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