You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.3KB

  1. /*
  2. * gcc fixes for altivec.
  3. * Used to workaround broken gcc (FSF gcc-3 pre gcc-3.3)
  4. * and to stay somewhat compatible with Darwin.
  5. */
  6. #ifndef _GCC_FIXES_
  7. #define _GCC_FIXES_
  8. #ifdef HAVE_ALTIVEC_H
  9. #include <altivec.h>
  10. #endif
  11. #ifdef CONFIG_DARWIN
  12. # ifndef __MWERKS__
  13. # define AVV(x...) (x)
  14. # else
  15. # define AVV
  16. # endif
  17. #define REG_v(a) asm ( #a )
  18. #else
  19. #define AVV(x...) {x}
  20. #if (__GNUC__ < 4)
  21. # define REG_v(a)
  22. #else
  23. # define REG_v(a) asm ( #a )
  24. #endif
  25. #if (__GNUC__ * 100 + __GNUC_MINOR__ < 303)
  26. /* This code was provided to me by Bartosch Pixa
  27. * as a separate header file (broken_mergel.h).
  28. * thanks to lu_zero for the workaround.
  29. *
  30. * See this mail for more information:
  31. * http://gcc.gnu.org/ml/gcc/2003-04/msg00967.html
  32. */
  33. static inline vector signed char ff_vmrglb (vector signed char const A,
  34. vector signed char const B)
  35. {
  36. static const vector unsigned char lowbyte = {
  37. 0x08, 0x18, 0x09, 0x19, 0x0a, 0x1a, 0x0b, 0x1b,
  38. 0x0c, 0x1c, 0x0d, 0x1d, 0x0e, 0x1e, 0x0f, 0x1f
  39. };
  40. return vec_perm (A, B, lowbyte);
  41. }
  42. static inline vector signed short ff_vmrglh (vector signed short const A,
  43. vector signed short const B)
  44. {
  45. static const vector unsigned char lowhalf = {
  46. 0x08, 0x09, 0x18, 0x19, 0x0a, 0x0b, 0x1a, 0x1b,
  47. 0x0c, 0x0d, 0x1c, 0x1d, 0x0e, 0x0f, 0x1e, 0x1f
  48. };
  49. return vec_perm (A, B, lowhalf);
  50. }
  51. static inline vector signed int ff_vmrglw (vector signed int const A,
  52. vector signed int const B)
  53. {
  54. static const vector unsigned char lowword = {
  55. 0x08, 0x09, 0x0a, 0x0b, 0x18, 0x19, 0x1a, 0x1b,
  56. 0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f
  57. };
  58. return vec_perm (A, B, lowword);
  59. }
  60. /*#define ff_vmrglb ff_vmrglb
  61. #define ff_vmrglh ff_vmrglh
  62. #define ff_vmrglw ff_vmrglw
  63. */
  64. #undef vec_mergel
  65. #define vec_mergel(a1, a2) \
  66. __ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
  67. ((vector signed char) ff_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
  68. __ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
  69. ((vector unsigned char) ff_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
  70. __ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
  71. ((vector signed short) ff_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
  72. __ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
  73. ((vector unsigned short) ff_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
  74. __ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
  75. ((vector float) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  76. __ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
  77. ((vector signed int) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  78. __ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
  79. ((vector unsigned int) ff_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  80. __altivec_link_error_invalid_argument ())))))))
  81. #endif
  82. #endif /* CONFIG_DARWIN */
  83. #ifndef __MWERKS__
  84. #define const_vector const vector
  85. #else
  86. #define const_vector vector
  87. #endif
  88. #endif /* _GCC_FIXES_ */