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 8 define <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 32 define <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 56 define <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 80 define <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 104 define <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 128 define <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 174 define <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 220 define <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 266 define <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 313 define <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 359 define <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 424 define <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 495 define <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