compiler.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  2. #ifndef _UAPI__ALPHA_COMPILER_H
  3. #define _UAPI__ALPHA_COMPILER_H
  4. /*
  5. * Herein are macros we use when describing various patterns we want to GCC.
  6. * In all cases we can get better schedules out of the compiler if we hide
  7. * as little as possible inside inline assembly. However, we want to be
  8. * able to know what we'll get out before giving up inline assembly. Thus
  9. * these tests and macros.
  10. */
  11. #if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
  12. # define __kernel_insbl(val, shift) __builtin_alpha_insbl(val, shift)
  13. # define __kernel_inswl(val, shift) __builtin_alpha_inswl(val, shift)
  14. # define __kernel_insql(val, shift) __builtin_alpha_insql(val, shift)
  15. # define __kernel_inslh(val, shift) __builtin_alpha_inslh(val, shift)
  16. # define __kernel_extbl(val, shift) __builtin_alpha_extbl(val, shift)
  17. # define __kernel_extwl(val, shift) __builtin_alpha_extwl(val, shift)
  18. # define __kernel_cmpbge(a, b) __builtin_alpha_cmpbge(a, b)
  19. #else
  20. # define __kernel_insbl(val, shift) \
  21. ({ unsigned long __kir; \
  22. __asm__("insbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  23. __kir; })
  24. # define __kernel_inswl(val, shift) \
  25. ({ unsigned long __kir; \
  26. __asm__("inswl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  27. __kir; })
  28. # define __kernel_insql(val, shift) \
  29. ({ unsigned long __kir; \
  30. __asm__("insql %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  31. __kir; })
  32. # define __kernel_inslh(val, shift) \
  33. ({ unsigned long __kir; \
  34. __asm__("inslh %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  35. __kir; })
  36. # define __kernel_extbl(val, shift) \
  37. ({ unsigned long __kir; \
  38. __asm__("extbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  39. __kir; })
  40. # define __kernel_extwl(val, shift) \
  41. ({ unsigned long __kir; \
  42. __asm__("extwl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val)); \
  43. __kir; })
  44. # define __kernel_cmpbge(a, b) \
  45. ({ unsigned long __kir; \
  46. __asm__("cmpbge %r2,%1,%0" : "=r"(__kir) : "rI"(b), "rJ"(a)); \
  47. __kir; })
  48. #endif
  49. #ifdef __alpha_cix__
  50. # if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
  51. # define __kernel_cttz(x) __builtin_ctzl(x)
  52. # define __kernel_ctlz(x) __builtin_clzl(x)
  53. # define __kernel_ctpop(x) __builtin_popcountl(x)
  54. # else
  55. # define __kernel_cttz(x) \
  56. ({ unsigned long __kir; \
  57. __asm__("cttz %1,%0" : "=r"(__kir) : "r"(x)); \
  58. __kir; })
  59. # define __kernel_ctlz(x) \
  60. ({ unsigned long __kir; \
  61. __asm__("ctlz %1,%0" : "=r"(__kir) : "r"(x)); \
  62. __kir; })
  63. # define __kernel_ctpop(x) \
  64. ({ unsigned long __kir; \
  65. __asm__("ctpop %1,%0" : "=r"(__kir) : "r"(x)); \
  66. __kir; })
  67. # endif
  68. #else
  69. # define __kernel_cttz(x) \
  70. ({ unsigned long __kir; \
  71. __asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x)); \
  72. __kir; })
  73. # define __kernel_ctlz(x) \
  74. ({ unsigned long __kir; \
  75. __asm__(".arch ev67; ctlz %1,%0" : "=r"(__kir) : "r"(x)); \
  76. __kir; })
  77. # define __kernel_ctpop(x) \
  78. ({ unsigned long __kir; \
  79. __asm__(".arch ev67; ctpop %1,%0" : "=r"(__kir) : "r"(x)); \
  80. __kir; })
  81. #endif
  82. /*
  83. * Beginning with EGCS 1.1, GCC defines __alpha_bwx__ when the BWX
  84. * extension is enabled. Previous versions did not define anything
  85. * we could test during compilation -- too bad, so sad.
  86. */
  87. #if defined(__alpha_bwx__)
  88. #define __kernel_ldbu(mem) (mem)
  89. #define __kernel_ldwu(mem) (mem)
  90. #define __kernel_stb(val,mem) ((mem) = (val))
  91. #define __kernel_stw(val,mem) ((mem) = (val))
  92. #else
  93. #define __kernel_ldbu(mem) \
  94. ({ unsigned char __kir; \
  95. __asm__(".arch ev56; \
  96. ldbu %0,%1" : "=r"(__kir) : "m"(mem)); \
  97. __kir; })
  98. #define __kernel_ldwu(mem) \
  99. ({ unsigned short __kir; \
  100. __asm__(".arch ev56; \
  101. ldwu %0,%1" : "=r"(__kir) : "m"(mem)); \
  102. __kir; })
  103. #define __kernel_stb(val,mem) \
  104. __asm__(".arch ev56; \
  105. stb %1,%0" : "=m"(mem) : "r"(val))
  106. #define __kernel_stw(val,mem) \
  107. __asm__(".arch ev56; \
  108. stw %1,%0" : "=m"(mem) : "r"(val))
  109. #endif
  110. #endif /* _UAPI__ALPHA_COMPILER_H */