sfp-util.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. #define udiv_qrnnd(q, r, n1, n0, d) \
  51. do { unsigned long __r; \
  52. (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \
  53. (r) = __r; \
  54. } while (0)
  55. extern unsigned long __udiv_qrnnd (unsigned long *, unsigned long,
  56. unsigned long , unsigned long);
  57. #define UDIV_NEEDS_NORMALIZATION 0
  58. #define abort() return 0
  59. #define __BYTE_ORDER __BIG_ENDIAN