1 /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 2 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GCC is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 Under Section 7 of GPL version 3, you are granted additional 17 permissions described in the GCC Runtime Library Exception, version 18 3.1, as published by the Free Software Foundation. 19 20 You should have received a copy of the GNU General Public License and 21 a copy of the GCC Runtime Library Exception along with this program; 22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 <http://www.gnu.org/licenses/>. */ 24 25 /* Implemented from the specification included in the Intel C++ Compiler 26 User Guide and Reference, version 9.0. */ 27 28 #ifndef _MMINTRIN_H_INCLUDED 29 #define _MMINTRIN_H_INCLUDED 30 31 #ifndef __MMX__ 32 # error "MMX instruction set not enabled" 33 #else 34 /* The Intel API is flexible enough that we must allow aliasing with other 35 vector types, and their scalar components. */ 36 typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__)); 37 38 /* Internal data types for implementing the intrinsics. */ 39 typedef int __v2si __attribute__ ((__vector_size__ (8))); 40 typedef short __v4hi __attribute__ ((__vector_size__ (8))); 41 typedef char __v8qi __attribute__ ((__vector_size__ (8))); 42 typedef long long __v1di __attribute__ ((__vector_size__ (8))); 43 typedef float __v2sf __attribute__ ((__vector_size__ (8))); 44 45 /* Empty the multimedia state. */ 46 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 47 _mm_empty (void) 48 { 49 __builtin_ia32_emms (); 50 } 51 52 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 53 _m_empty (void) 54 { 55 _mm_empty (); 56 } 57 58 /* Convert I to a __m64 object. The integer is zero-extended to 64-bits. */ 59 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 60 _mm_cvtsi32_si64 (int __i) 61 { 62 return (__m64) __builtin_ia32_vec_init_v2si (__i, 0); 63 } 64 65 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 66 _m_from_int (int __i) 67 { 68 return _mm_cvtsi32_si64 (__i); 69 } 70 71 #ifdef __x86_64__ 72 /* Convert I to a __m64 object. */ 73 74 /* Intel intrinsic. */ 75 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 76 _m_from_int64 (long long __i) 77 { 78 return (__m64) __i; 79 } 80 81 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 82 _mm_cvtsi64_m64 (long long __i) 83 { 84 return (__m64) __i; 85 } 86 87 /* Microsoft intrinsic. */ 88 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 89 _mm_cvtsi64x_si64 (long long __i) 90 { 91 return (__m64) __i; 92 } 93 94 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 95 _mm_set_pi64x (long long __i) 96 { 97 return (__m64) __i; 98 } 99 #endif 100 101 /* Convert the lower 32 bits of the __m64 object into an integer. */ 102 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 103 _mm_cvtsi64_si32 (__m64 __i) 104 { 105 return __builtin_ia32_vec_ext_v2si ((__v2si)__i, 0); 106 } 107 108 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 109 _m_to_int (__m64 __i) 110 { 111 return _mm_cvtsi64_si32 (__i); 112 } 113 114 #ifdef __x86_64__ 115 /* Convert the __m64 object to a 64bit integer. */ 116 117 /* Intel intrinsic. */ 118 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 119 _m_to_int64 (__m64 __i) 120 { 121 return (long long)__i; 122 } 123 124 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 125 _mm_cvtm64_si64 (__m64 __i) 126 { 127 return (long long)__i; 128 } 129 130 /* Microsoft intrinsic. */ 131 extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 132 _mm_cvtsi64_si64x (__m64 __i) 133 { 134 return (long long)__i; 135 } 136 #endif 137 138 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of 139 the result, and the four 16-bit values from M2 into the upper four 8-bit 140 values of the result, all with signed saturation. */ 141 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 142 _mm_packs_pi16 (__m64 __m1, __m64 __m2) 143 { 144 return (__m64) __builtin_ia32_packsswb ((__v4hi)__m1, (__v4hi)__m2); 145 } 146 147 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 148 _m_packsswb (__m64 __m1, __m64 __m2) 149 { 150 return _mm_packs_pi16 (__m1, __m2); 151 } 152 153 /* Pack the two 32-bit values from M1 in to the lower two 16-bit values of 154 the result, and the two 32-bit values from M2 into the upper two 16-bit 155 values of the result, all with signed saturation. */ 156 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 157 _mm_packs_pi32 (__m64 __m1, __m64 __m2) 158 { 159 return (__m64) __builtin_ia32_packssdw ((__v2si)__m1, (__v2si)__m2); 160 } 161 162 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 163 _m_packssdw (__m64 __m1, __m64 __m2) 164 { 165 return _mm_packs_pi32 (__m1, __m2); 166 } 167 168 /* Pack the four 16-bit values from M1 into the lower four 8-bit values of 169 the result, and the four 16-bit values from M2 into the upper four 8-bit 170 values of the result, all with unsigned saturation. */ 171 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 172 _mm_packs_pu16 (__m64 __m1, __m64 __m2) 173 { 174 return (__m64) __builtin_ia32_packuswb ((__v4hi)__m1, (__v4hi)__m2); 175 } 176 177 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 178 _m_packuswb (__m64 __m1, __m64 __m2) 179 { 180 return _mm_packs_pu16 (__m1, __m2); 181 } 182 183 /* Interleave the four 8-bit values from the high half of M1 with the four 184 8-bit values from the high half of M2. */ 185 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 186 _mm_unpackhi_pi8 (__m64 __m1, __m64 __m2) 187 { 188 return (__m64) __builtin_ia32_punpckhbw ((__v8qi)__m1, (__v8qi)__m2); 189 } 190 191 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 192 _m_punpckhbw (__m64 __m1, __m64 __m2) 193 { 194 return _mm_unpackhi_pi8 (__m1, __m2); 195 } 196 197 /* Interleave the two 16-bit values from the high half of M1 with the two 198 16-bit values from the high half of M2. */ 199 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 200 _mm_unpackhi_pi16 (__m64 __m1, __m64 __m2) 201 { 202 return (__m64) __builtin_ia32_punpckhwd ((__v4hi)__m1, (__v4hi)__m2); 203 } 204 205 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 206 _m_punpckhwd (__m64 __m1, __m64 __m2) 207 { 208 return _mm_unpackhi_pi16 (__m1, __m2); 209 } 210 211 /* Interleave the 32-bit value from the high half of M1 with the 32-bit 212 value from the high half of M2. */ 213 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 214 _mm_unpackhi_pi32 (__m64 __m1, __m64 __m2) 215 { 216 return (__m64) __builtin_ia32_punpckhdq ((__v2si)__m1, (__v2si)__m2); 217 } 218 219 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 220 _m_punpckhdq (__m64 __m1, __m64 __m2) 221 { 222 return _mm_unpackhi_pi32 (__m1, __m2); 223 } 224 225 /* Interleave the four 8-bit values from the low half of M1 with the four 226 8-bit values from the low half of M2. */ 227 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 228 _mm_unpacklo_pi8 (__m64 __m1, __m64 __m2) 229 { 230 return (__m64) __builtin_ia32_punpcklbw ((__v8qi)__m1, (__v8qi)__m2); 231 } 232 233 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 234 _m_punpcklbw (__m64 __m1, __m64 __m2) 235 { 236 return _mm_unpacklo_pi8 (__m1, __m2); 237 } 238 239 /* Interleave the two 16-bit values from the low half of M1 with the two 240 16-bit values from the low half of M2. */ 241 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 242 _mm_unpacklo_pi16 (__m64 __m1, __m64 __m2) 243 { 244 return (__m64) __builtin_ia32_punpcklwd ((__v4hi)__m1, (__v4hi)__m2); 245 } 246 247 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 248 _m_punpcklwd (__m64 __m1, __m64 __m2) 249 { 250 return _mm_unpacklo_pi16 (__m1, __m2); 251 } 252 253 /* Interleave the 32-bit value from the low half of M1 with the 32-bit 254 value from the low half of M2. */ 255 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 256 _mm_unpacklo_pi32 (__m64 __m1, __m64 __m2) 257 { 258 return (__m64) __builtin_ia32_punpckldq ((__v2si)__m1, (__v2si)__m2); 259 } 260 261 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 262 _m_punpckldq (__m64 __m1, __m64 __m2) 263 { 264 return _mm_unpacklo_pi32 (__m1, __m2); 265 } 266 267 /* Add the 8-bit values in M1 to the 8-bit values in M2. */ 268 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 269 _mm_add_pi8 (__m64 __m1, __m64 __m2) 270 { 271 return (__m64) __builtin_ia32_paddb ((__v8qi)__m1, (__v8qi)__m2); 272 } 273 274 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 275 _m_paddb (__m64 __m1, __m64 __m2) 276 { 277 return _mm_add_pi8 (__m1, __m2); 278 } 279 280 /* Add the 16-bit values in M1 to the 16-bit values in M2. */ 281 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 282 _mm_add_pi16 (__m64 __m1, __m64 __m2) 283 { 284 return (__m64) __builtin_ia32_paddw ((__v4hi)__m1, (__v4hi)__m2); 285 } 286 287 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 288 _m_paddw (__m64 __m1, __m64 __m2) 289 { 290 return _mm_add_pi16 (__m1, __m2); 291 } 292 293 /* Add the 32-bit values in M1 to the 32-bit values in M2. */ 294 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 295 _mm_add_pi32 (__m64 __m1, __m64 __m2) 296 { 297 return (__m64) __builtin_ia32_paddd ((__v2si)__m1, (__v2si)__m2); 298 } 299 300 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 301 _m_paddd (__m64 __m1, __m64 __m2) 302 { 303 return _mm_add_pi32 (__m1, __m2); 304 } 305 306 /* Add the 64-bit values in M1 to the 64-bit values in M2. */ 307 #ifdef __SSE2__ 308 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 309 _mm_add_si64 (__m64 __m1, __m64 __m2) 310 { 311 return (__m64) __builtin_ia32_paddq ((__v1di)__m1, (__v1di)__m2); 312 } 313 #endif 314 315 /* Add the 8-bit values in M1 to the 8-bit values in M2 using signed 316 saturated arithmetic. */ 317 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 318 _mm_adds_pi8 (__m64 __m1, __m64 __m2) 319 { 320 return (__m64) __builtin_ia32_paddsb ((__v8qi)__m1, (__v8qi)__m2); 321 } 322 323 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 324 _m_paddsb (__m64 __m1, __m64 __m2) 325 { 326 return _mm_adds_pi8 (__m1, __m2); 327 } 328 329 /* Add the 16-bit values in M1 to the 16-bit values in M2 using signed 330 saturated arithmetic. */ 331 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 332 _mm_adds_pi16 (__m64 __m1, __m64 __m2) 333 { 334 return (__m64) __builtin_ia32_paddsw ((__v4hi)__m1, (__v4hi)__m2); 335 } 336 337 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 338 _m_paddsw (__m64 __m1, __m64 __m2) 339 { 340 return _mm_adds_pi16 (__m1, __m2); 341 } 342 343 /* Add the 8-bit values in M1 to the 8-bit values in M2 using unsigned 344 saturated arithmetic. */ 345 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 346 _mm_adds_pu8 (__m64 __m1, __m64 __m2) 347 { 348 return (__m64) __builtin_ia32_paddusb ((__v8qi)__m1, (__v8qi)__m2); 349 } 350 351 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 352 _m_paddusb (__m64 __m1, __m64 __m2) 353 { 354 return _mm_adds_pu8 (__m1, __m2); 355 } 356 357 /* Add the 16-bit values in M1 to the 16-bit values in M2 using unsigned 358 saturated arithmetic. */ 359 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 360 _mm_adds_pu16 (__m64 __m1, __m64 __m2) 361 { 362 return (__m64) __builtin_ia32_paddusw ((__v4hi)__m1, (__v4hi)__m2); 363 } 364 365 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 366 _m_paddusw (__m64 __m1, __m64 __m2) 367 { 368 return _mm_adds_pu16 (__m1, __m2); 369 } 370 371 /* Subtract the 8-bit values in M2 from the 8-bit values in M1. */ 372 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 373 _mm_sub_pi8 (__m64 __m1, __m64 __m2) 374 { 375 return (__m64) __builtin_ia32_psubb ((__v8qi)__m1, (__v8qi)__m2); 376 } 377 378 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 379 _m_psubb (__m64 __m1, __m64 __m2) 380 { 381 return _mm_sub_pi8 (__m1, __m2); 382 } 383 384 /* Subtract the 16-bit values in M2 from the 16-bit values in M1. */ 385 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 386 _mm_sub_pi16 (__m64 __m1, __m64 __m2) 387 { 388 return (__m64) __builtin_ia32_psubw ((__v4hi)__m1, (__v4hi)__m2); 389 } 390 391 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 392 _m_psubw (__m64 __m1, __m64 __m2) 393 { 394 return _mm_sub_pi16 (__m1, __m2); 395 } 396 397 /* Subtract the 32-bit values in M2 from the 32-bit values in M1. */ 398 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 399 _mm_sub_pi32 (__m64 __m1, __m64 __m2) 400 { 401 return (__m64) __builtin_ia32_psubd ((__v2si)__m1, (__v2si)__m2); 402 } 403 404 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 405 _m_psubd (__m64 __m1, __m64 __m2) 406 { 407 return _mm_sub_pi32 (__m1, __m2); 408 } 409 410 /* Add the 64-bit values in M1 to the 64-bit values in M2. */ 411 #ifdef __SSE2__ 412 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 413 _mm_sub_si64 (__m64 __m1, __m64 __m2) 414 { 415 return (__m64) __builtin_ia32_psubq ((__v1di)__m1, (__v1di)__m2); 416 } 417 #endif 418 419 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using signed 420 saturating arithmetic. */ 421 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 422 _mm_subs_pi8 (__m64 __m1, __m64 __m2) 423 { 424 return (__m64) __builtin_ia32_psubsb ((__v8qi)__m1, (__v8qi)__m2); 425 } 426 427 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 428 _m_psubsb (__m64 __m1, __m64 __m2) 429 { 430 return _mm_subs_pi8 (__m1, __m2); 431 } 432 433 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using 434 signed saturating arithmetic. */ 435 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 436 _mm_subs_pi16 (__m64 __m1, __m64 __m2) 437 { 438 return (__m64) __builtin_ia32_psubsw ((__v4hi)__m1, (__v4hi)__m2); 439 } 440 441 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 442 _m_psubsw (__m64 __m1, __m64 __m2) 443 { 444 return _mm_subs_pi16 (__m1, __m2); 445 } 446 447 /* Subtract the 8-bit values in M2 from the 8-bit values in M1 using 448 unsigned saturating arithmetic. */ 449 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 450 _mm_subs_pu8 (__m64 __m1, __m64 __m2) 451 { 452 return (__m64) __builtin_ia32_psubusb ((__v8qi)__m1, (__v8qi)__m2); 453 } 454 455 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 456 _m_psubusb (__m64 __m1, __m64 __m2) 457 { 458 return _mm_subs_pu8 (__m1, __m2); 459 } 460 461 /* Subtract the 16-bit values in M2 from the 16-bit values in M1 using 462 unsigned saturating arithmetic. */ 463 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 464 _mm_subs_pu16 (__m64 __m1, __m64 __m2) 465 { 466 return (__m64) __builtin_ia32_psubusw ((__v4hi)__m1, (__v4hi)__m2); 467 } 468 469 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 470 _m_psubusw (__m64 __m1, __m64 __m2) 471 { 472 return _mm_subs_pu16 (__m1, __m2); 473 } 474 475 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing 476 four 32-bit intermediate results, which are then summed by pairs to 477 produce two 32-bit results. */ 478 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 479 _mm_madd_pi16 (__m64 __m1, __m64 __m2) 480 { 481 return (__m64) __builtin_ia32_pmaddwd ((__v4hi)__m1, (__v4hi)__m2); 482 } 483 484 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 485 _m_pmaddwd (__m64 __m1, __m64 __m2) 486 { 487 return _mm_madd_pi16 (__m1, __m2); 488 } 489 490 /* Multiply four signed 16-bit values in M1 by four signed 16-bit values in 491 M2 and produce the high 16 bits of the 32-bit results. */ 492 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 493 _mm_mulhi_pi16 (__m64 __m1, __m64 __m2) 494 { 495 return (__m64) __builtin_ia32_pmulhw ((__v4hi)__m1, (__v4hi)__m2); 496 } 497 498 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 499 _m_pmulhw (__m64 __m1, __m64 __m2) 500 { 501 return _mm_mulhi_pi16 (__m1, __m2); 502 } 503 504 /* Multiply four 16-bit values in M1 by four 16-bit values in M2 and produce 505 the low 16 bits of the results. */ 506 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 507 _mm_mullo_pi16 (__m64 __m1, __m64 __m2) 508 { 509 return (__m64) __builtin_ia32_pmullw ((__v4hi)__m1, (__v4hi)__m2); 510 } 511 512 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 513 _m_pmullw (__m64 __m1, __m64 __m2) 514 { 515 return _mm_mullo_pi16 (__m1, __m2); 516 } 517 518 /* Shift four 16-bit values in M left by COUNT. */ 519 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 520 _mm_sll_pi16 (__m64 __m, __m64 __count) 521 { 522 return (__m64) __builtin_ia32_psllw ((__v4hi)__m, (__v4hi)__count); 523 } 524 525 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 526 _m_psllw (__m64 __m, __m64 __count) 527 { 528 return _mm_sll_pi16 (__m, __count); 529 } 530 531 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 532 _mm_slli_pi16 (__m64 __m, int __count) 533 { 534 return (__m64) __builtin_ia32_psllwi ((__v4hi)__m, __count); 535 } 536 537 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 538 _m_psllwi (__m64 __m, int __count) 539 { 540 return _mm_slli_pi16 (__m, __count); 541 } 542 543 /* Shift two 32-bit values in M left by COUNT. */ 544 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 545 _mm_sll_pi32 (__m64 __m, __m64 __count) 546 { 547 return (__m64) __builtin_ia32_pslld ((__v2si)__m, (__v2si)__count); 548 } 549 550 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 551 _m_pslld (__m64 __m, __m64 __count) 552 { 553 return _mm_sll_pi32 (__m, __count); 554 } 555 556 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 557 _mm_slli_pi32 (__m64 __m, int __count) 558 { 559 return (__m64) __builtin_ia32_pslldi ((__v2si)__m, __count); 560 } 561 562 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 563 _m_pslldi (__m64 __m, int __count) 564 { 565 return _mm_slli_pi32 (__m, __count); 566 } 567 568 /* Shift the 64-bit value in M left by COUNT. */ 569 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 570 _mm_sll_si64 (__m64 __m, __m64 __count) 571 { 572 return (__m64) __builtin_ia32_psllq ((__v1di)__m, (__v1di)__count); 573 } 574 575 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 576 _m_psllq (__m64 __m, __m64 __count) 577 { 578 return _mm_sll_si64 (__m, __count); 579 } 580 581 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 582 _mm_slli_si64 (__m64 __m, int __count) 583 { 584 return (__m64) __builtin_ia32_psllqi ((__v1di)__m, __count); 585 } 586 587 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 588 _m_psllqi (__m64 __m, int __count) 589 { 590 return _mm_slli_si64 (__m, __count); 591 } 592 593 /* Shift four 16-bit values in M right by COUNT; shift in the sign bit. */ 594 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 595 _mm_sra_pi16 (__m64 __m, __m64 __count) 596 { 597 return (__m64) __builtin_ia32_psraw ((__v4hi)__m, (__v4hi)__count); 598 } 599 600 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 601 _m_psraw (__m64 __m, __m64 __count) 602 { 603 return _mm_sra_pi16 (__m, __count); 604 } 605 606 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 607 _mm_srai_pi16 (__m64 __m, int __count) 608 { 609 return (__m64) __builtin_ia32_psrawi ((__v4hi)__m, __count); 610 } 611 612 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 613 _m_psrawi (__m64 __m, int __count) 614 { 615 return _mm_srai_pi16 (__m, __count); 616 } 617 618 /* Shift two 32-bit values in M right by COUNT; shift in the sign bit. */ 619 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 620 _mm_sra_pi32 (__m64 __m, __m64 __count) 621 { 622 return (__m64) __builtin_ia32_psrad ((__v2si)__m, (__v2si)__count); 623 } 624 625 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 626 _m_psrad (__m64 __m, __m64 __count) 627 { 628 return _mm_sra_pi32 (__m, __count); 629 } 630 631 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 632 _mm_srai_pi32 (__m64 __m, int __count) 633 { 634 return (__m64) __builtin_ia32_psradi ((__v2si)__m, __count); 635 } 636 637 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 638 _m_psradi (__m64 __m, int __count) 639 { 640 return _mm_srai_pi32 (__m, __count); 641 } 642 643 /* Shift four 16-bit values in M right by COUNT; shift in zeros. */ 644 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 645 _mm_srl_pi16 (__m64 __m, __m64 __count) 646 { 647 return (__m64) __builtin_ia32_psrlw ((__v4hi)__m, (__v4hi)__count); 648 } 649 650 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 651 _m_psrlw (__m64 __m, __m64 __count) 652 { 653 return _mm_srl_pi16 (__m, __count); 654 } 655 656 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 657 _mm_srli_pi16 (__m64 __m, int __count) 658 { 659 return (__m64) __builtin_ia32_psrlwi ((__v4hi)__m, __count); 660 } 661 662 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 663 _m_psrlwi (__m64 __m, int __count) 664 { 665 return _mm_srli_pi16 (__m, __count); 666 } 667 668 /* Shift two 32-bit values in M right by COUNT; shift in zeros. */ 669 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 670 _mm_srl_pi32 (__m64 __m, __m64 __count) 671 { 672 return (__m64) __builtin_ia32_psrld ((__v2si)__m, (__v2si)__count); 673 } 674 675 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 676 _m_psrld (__m64 __m, __m64 __count) 677 { 678 return _mm_srl_pi32 (__m, __count); 679 } 680 681 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 682 _mm_srli_pi32 (__m64 __m, int __count) 683 { 684 return (__m64) __builtin_ia32_psrldi ((__v2si)__m, __count); 685 } 686 687 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 688 _m_psrldi (__m64 __m, int __count) 689 { 690 return _mm_srli_pi32 (__m, __count); 691 } 692 693 /* Shift the 64-bit value in M left by COUNT; shift in zeros. */ 694 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 695 _mm_srl_si64 (__m64 __m, __m64 __count) 696 { 697 return (__m64) __builtin_ia32_psrlq ((__v1di)__m, (__v1di)__count); 698 } 699 700 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 701 _m_psrlq (__m64 __m, __m64 __count) 702 { 703 return _mm_srl_si64 (__m, __count); 704 } 705 706 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 707 _mm_srli_si64 (__m64 __m, int __count) 708 { 709 return (__m64) __builtin_ia32_psrlqi ((__v1di)__m, __count); 710 } 711 712 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 713 _m_psrlqi (__m64 __m, int __count) 714 { 715 return _mm_srli_si64 (__m, __count); 716 } 717 718 /* Bit-wise AND the 64-bit values in M1 and M2. */ 719 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 720 _mm_and_si64 (__m64 __m1, __m64 __m2) 721 { 722 return __builtin_ia32_pand (__m1, __m2); 723 } 724 725 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 726 _m_pand (__m64 __m1, __m64 __m2) 727 { 728 return _mm_and_si64 (__m1, __m2); 729 } 730 731 /* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the 732 64-bit value in M2. */ 733 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 734 _mm_andnot_si64 (__m64 __m1, __m64 __m2) 735 { 736 return __builtin_ia32_pandn (__m1, __m2); 737 } 738 739 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 740 _m_pandn (__m64 __m1, __m64 __m2) 741 { 742 return _mm_andnot_si64 (__m1, __m2); 743 } 744 745 /* Bit-wise inclusive OR the 64-bit values in M1 and M2. */ 746 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 747 _mm_or_si64 (__m64 __m1, __m64 __m2) 748 { 749 return __builtin_ia32_por (__m1, __m2); 750 } 751 752 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 753 _m_por (__m64 __m1, __m64 __m2) 754 { 755 return _mm_or_si64 (__m1, __m2); 756 } 757 758 /* Bit-wise exclusive OR the 64-bit values in M1 and M2. */ 759 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 760 _mm_xor_si64 (__m64 __m1, __m64 __m2) 761 { 762 return __builtin_ia32_pxor (__m1, __m2); 763 } 764 765 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 766 _m_pxor (__m64 __m1, __m64 __m2) 767 { 768 return _mm_xor_si64 (__m1, __m2); 769 } 770 771 /* Compare eight 8-bit values. The result of the comparison is 0xFF if the 772 test is true and zero if false. */ 773 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 774 _mm_cmpeq_pi8 (__m64 __m1, __m64 __m2) 775 { 776 return (__m64) __builtin_ia32_pcmpeqb ((__v8qi)__m1, (__v8qi)__m2); 777 } 778 779 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 780 _m_pcmpeqb (__m64 __m1, __m64 __m2) 781 { 782 return _mm_cmpeq_pi8 (__m1, __m2); 783 } 784 785 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 786 _mm_cmpgt_pi8 (__m64 __m1, __m64 __m2) 787 { 788 return (__m64) __builtin_ia32_pcmpgtb ((__v8qi)__m1, (__v8qi)__m2); 789 } 790 791 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 792 _m_pcmpgtb (__m64 __m1, __m64 __m2) 793 { 794 return _mm_cmpgt_pi8 (__m1, __m2); 795 } 796 797 /* Compare four 16-bit values. The result of the comparison is 0xFFFF if 798 the test is true and zero if false. */ 799 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 800 _mm_cmpeq_pi16 (__m64 __m1, __m64 __m2) 801 { 802 return (__m64) __builtin_ia32_pcmpeqw ((__v4hi)__m1, (__v4hi)__m2); 803 } 804 805 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 806 _m_pcmpeqw (__m64 __m1, __m64 __m2) 807 { 808 return _mm_cmpeq_pi16 (__m1, __m2); 809 } 810 811 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 812 _mm_cmpgt_pi16 (__m64 __m1, __m64 __m2) 813 { 814 return (__m64) __builtin_ia32_pcmpgtw ((__v4hi)__m1, (__v4hi)__m2); 815 } 816 817 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 818 _m_pcmpgtw (__m64 __m1, __m64 __m2) 819 { 820 return _mm_cmpgt_pi16 (__m1, __m2); 821 } 822 823 /* Compare two 32-bit values. The result of the comparison is 0xFFFFFFFF if 824 the test is true and zero if false. */ 825 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 826 _mm_cmpeq_pi32 (__m64 __m1, __m64 __m2) 827 { 828 return (__m64) __builtin_ia32_pcmpeqd ((__v2si)__m1, (__v2si)__m2); 829 } 830 831 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 832 _m_pcmpeqd (__m64 __m1, __m64 __m2) 833 { 834 return _mm_cmpeq_pi32 (__m1, __m2); 835 } 836 837 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 838 _mm_cmpgt_pi32 (__m64 __m1, __m64 __m2) 839 { 840 return (__m64) __builtin_ia32_pcmpgtd ((__v2si)__m1, (__v2si)__m2); 841 } 842 843 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 844 _m_pcmpgtd (__m64 __m1, __m64 __m2) 845 { 846 return _mm_cmpgt_pi32 (__m1, __m2); 847 } 848 849 /* Creates a 64-bit zero. */ 850 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 851 _mm_setzero_si64 (void) 852 { 853 return (__m64)0LL; 854 } 855 856 /* Creates a vector of two 32-bit values; I0 is least significant. */ 857 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 858 _mm_set_pi32 (int __i1, int __i0) 859 { 860 return (__m64) __builtin_ia32_vec_init_v2si (__i0, __i1); 861 } 862 863 /* Creates a vector of four 16-bit values; W0 is least significant. */ 864 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 865 _mm_set_pi16 (short __w3, short __w2, short __w1, short __w0) 866 { 867 return (__m64) __builtin_ia32_vec_init_v4hi (__w0, __w1, __w2, __w3); 868 } 869 870 /* Creates a vector of eight 8-bit values; B0 is least significant. */ 871 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 872 _mm_set_pi8 (char __b7, char __b6, char __b5, char __b4, 873 char __b3, char __b2, char __b1, char __b0) 874 { 875 return (__m64) __builtin_ia32_vec_init_v8qi (__b0, __b1, __b2, __b3, 876 __b4, __b5, __b6, __b7); 877 } 878 879 /* Similar, but with the arguments in reverse order. */ 880 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 881 _mm_setr_pi32 (int __i0, int __i1) 882 { 883 return _mm_set_pi32 (__i1, __i0); 884 } 885 886 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 887 _mm_setr_pi16 (short __w0, short __w1, short __w2, short __w3) 888 { 889 return _mm_set_pi16 (__w3, __w2, __w1, __w0); 890 } 891 892 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 893 _mm_setr_pi8 (char __b0, char __b1, char __b2, char __b3, 894 char __b4, char __b5, char __b6, char __b7) 895 { 896 return _mm_set_pi8 (__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0); 897 } 898 899 /* Creates a vector of two 32-bit values, both elements containing I. */ 900 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 901 _mm_set1_pi32 (int __i) 902 { 903 return _mm_set_pi32 (__i, __i); 904 } 905 906 /* Creates a vector of four 16-bit values, all elements containing W. */ 907 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 908 _mm_set1_pi16 (short __w) 909 { 910 return _mm_set_pi16 (__w, __w, __w, __w); 911 } 912 913 /* Creates a vector of eight 8-bit values, all elements containing B. */ 914 extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 915 _mm_set1_pi8 (char __b) 916 { 917 return _mm_set_pi8 (__b, __b, __b, __b, __b, __b, __b, __b); 918 } 919 920 #endif /* __MMX__ */ 921 #endif /* _MMINTRIN_H_INCLUDED */ 922