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.

92 lines
3.2KB

  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. #define AVV(x...) (x)
  13. /* The Apple assembler shipped w/ gcc-3.3 knows about DCBZL, previous assemblers don't
  14. We assume here that the Darwin GCC is from Apple.... */
  15. #if (__GNUC__ * 100 + __GNUC_MINOR__ < 303)
  16. #define NO_DCBZL
  17. #endif
  18. #else
  19. #define AVV(x...) {x}
  20. /* I don't think any non-Apple assembler knows about DCBZL */
  21. #define NO_DCBZL
  22. #if (__GNUC__ * 100 + __GNUC_MINOR__ < 303)
  23. /* This code was provided to me by Bartosch Pixa
  24. * as a separate header file (broken_mergel.h).
  25. * thanks to lu_zero for the workaround.
  26. *
  27. * See this mail for more information:
  28. * http://gcc.gnu.org/ml/gcc/2003-04/msg00967.html
  29. */
  30. static inline vector signed char my_vmrglb (vector signed char const A,
  31. vector signed char const B)
  32. {
  33. static const vector unsigned char lowbyte = {
  34. 0x08, 0x18, 0x09, 0x19, 0x0a, 0x1a, 0x0b, 0x1b,
  35. 0x0c, 0x1c, 0x0d, 0x1d, 0x0e, 0x1e, 0x0f, 0x1f
  36. };
  37. return vec_perm (A, B, lowbyte);
  38. }
  39. static inline vector signed short my_vmrglh (vector signed short const A,
  40. vector signed short const B)
  41. {
  42. static const vector unsigned char lowhalf = {
  43. 0x08, 0x09, 0x18, 0x19, 0x0a, 0x0b, 0x1a, 0x1b,
  44. 0x0c, 0x0d, 0x1c, 0x1d, 0x0e, 0x0f, 0x1e, 0x1f
  45. };
  46. return vec_perm (A, B, lowhalf);
  47. }
  48. static inline vector signed int my_vmrglw (vector signed int const A,
  49. vector signed int const B)
  50. {
  51. static const vector unsigned char lowword = {
  52. 0x08, 0x09, 0x0a, 0x0b, 0x18, 0x19, 0x1a, 0x1b,
  53. 0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f
  54. };
  55. return vec_perm (A, B, lowword);
  56. }
  57. /*#define my_vmrglb my_vmrglb
  58. #define my_vmrglh my_vmrglh
  59. #define my_vmrglw my_vmrglw
  60. */
  61. #undef vec_mergel
  62. #define vec_mergel(a1, a2) \
  63. __ch (__bin_args_eq (vector signed char, (a1), vector signed char, (a2)), \
  64. ((vector signed char) my_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
  65. __ch (__bin_args_eq (vector unsigned char, (a1), vector unsigned char, (a2)), \
  66. ((vector unsigned char) my_vmrglb ((vector signed char) (a1), (vector signed char) (a2))), \
  67. __ch (__bin_args_eq (vector signed short, (a1), vector signed short, (a2)), \
  68. ((vector signed short) my_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
  69. __ch (__bin_args_eq (vector unsigned short, (a1), vector unsigned short, (a2)), \
  70. ((vector unsigned short) my_vmrglh ((vector signed short) (a1), (vector signed short) (a2))), \
  71. __ch (__bin_args_eq (vector float, (a1), vector float, (a2)), \
  72. ((vector float) my_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  73. __ch (__bin_args_eq (vector signed int, (a1), vector signed int, (a2)), \
  74. ((vector signed int) my_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  75. __ch (__bin_args_eq (vector unsigned int, (a1), vector unsigned int, (a2)), \
  76. ((vector unsigned int) my_vmrglw ((vector signed int) (a1), (vector signed int) (a2))), \
  77. __altivec_link_error_invalid_argument ())))))))
  78. #endif
  79. #endif /* CONFIG_DARWIN */
  80. #endif /* _GCC_FIXES_ */