Advertisement
Guest User

Untitled

a guest
Sep 17th, 2010
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. ++/* Implement both __sync_<op>_and_fetch and __sync_fetch_and_<op> for
  2. ++ subword-sized quantities. */
  3. ++
  4. ++#define SUBWORD_SYNC_OP(OP, PFX_OP, INF_OP, TYPE, WIDTH, RETURN) \
  5. ++ TYPE HIDDEN \
  6. ++ NAME##_##RETURN (OP, WIDTH) (TYPE *ptr, TYPE val) \
  7. ++ { \
  8. ++ int *wordptr = (int *) ((unsigned int) ptr & ~3); \
  9. ++ unsigned int mask, shift, oldval, newval; \
  10. ++ int failure; \
  11. ++ \
  12. ++ shift = (((unsigned int) ptr & 3) << 3) ^ INVERT_MASK_##WIDTH; \
  13. ++ mask = MASK_##WIDTH << shift; \
  14. ++ \
  15. ++ do { \
  16. ++ oldval = *wordptr; \
  17. ++ newval = ((PFX_OP ((oldval & mask) >> shift) \
  18. ++ INF_OP (unsigned int) val) << shift) & mask; \
  19. ++ newval |= oldval & ~mask;
  20. ++ failure = __kernel_cmpxchg (oldval, newval, wordptr); \
  21. ++ } while (failure != 0); \
  22. ++ \
  23. ++ return (RETURN & mask) >> shift; \
  24. ++ }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement