sfp-util.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <linux/kernel.h>
  2. #include <linux/sched.h>
  3. #include <linux/types.h>
  4. #include <asm/byteorder.h>
  5. #define add_ssaaaa(sh, sl, ah, al, bh, bl) ({ \
  6. unsigned int __sh = (ah); \
  7. unsigned int __sl = (al); \
  8. asm volatile( \
  9. " alr %1,%3\n" \
  10. " brc 12,0f\n" \
  11. " ahi %0,1\n" \
  12. "0: alr %0,%2" \
  13. : "+&d" (__sh), "+d" (__sl) \
  14. : "d" (bh), "d" (bl) : "cc"); \
  15. (sh) = __sh; \
  16. (sl) = __sl; \
  17. })
  18. #define sub_ddmmss(sh, sl, ah, al, bh, bl) ({ \
  19. unsigned int __sh = (ah); \
  20. unsigned int __sl = (al); \
  21. asm volatile( \
  22. " slr %1,%3\n" \
  23. " brc 3,0f\n" \
  24. " ahi %0,-1\n" \
  25. "0: slr %0,%2" \
  26. : "+&d" (__sh), "+d" (__sl) \
  27. : "d" (bh), "d" (bl) : "cc"); \
  28. (sh) = __sh; \
  29. (sl) = __sl; \
  30. })
  31. /* a umul b = a mul b + (a>=2<<31) ? b<<32:0 + (b>=2<<31) ? a<<32:0 */
  32. #define umul_ppmm(wh, wl, u, v) ({ \
  33. unsigned int __wh = u; \
  34. unsigned int __wl = v; \
  35. asm volatile( \
  36. " ltr 1,%0\n" \
  37. " mr 0,%1\n" \
  38. " jnm 0f\n" \
  39. " alr 0,%1\n" \
  40. "0: ltr %1,%1\n" \
  41. " jnm 1f\n" \
  42. " alr 0,%0\n" \
  43. "1: lr %0,0\n" \
  44. " lr %1,1\n" \
  45. : "+d" (__wh), "+d" (__wl) \
  46. : : "0", "1", "cc"); \
  47. wh = __wh; \
  48. wl = __wl; \
  49. })
  50. #ifdef __s390x__
  51. #define udiv_qrnnd(q, r, n1, n0, d) \
  52. do { unsigned long __n; \
  53. unsigned int __r, __d; \
  54. __n = ((unsigned long)(n1) << 32) + n0; \
  55. __d = (d); \
  56. (q) = __n / __d; \
  57. (r) = __n % __d; \
  58. } while (0)
  59. #else
  60. #define udiv_qrnnd(q, r, n1, n0, d) \
  61. do { unsigned int __r; \
  62. (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
  63. (r) = __r; \
  64. } while (0)
  65. extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int,
  66. unsigned int , unsigned int);
  67. #endif
  68. #define UDIV_NEEDS_NORMALIZATION 0
  69. #define abort() BUG()
  70. #define __BYTE_ORDER __BIG_ENDIAN