Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ++/* Implement both __sync_<op>_and_fetch and __sync_fetch_and_<op> for
- ++ subword-sized quantities. */
- ++
- ++#define SUBWORD_SYNC_OP(OP, PFX_OP, INF_OP, TYPE, WIDTH, RETURN) \
- ++ TYPE HIDDEN \
- ++ NAME##_##RETURN (OP, WIDTH) (TYPE *ptr, TYPE val) \
- ++ { \
- ++ int *wordptr = (int *) ((unsigned int) ptr & ~3); \
- ++ unsigned int mask, shift, oldval, newval; \
- ++ int failure; \
- ++ \
- ++ shift = (((unsigned int) ptr & 3) << 3) ^ INVERT_MASK_##WIDTH; \
- ++ mask = MASK_##WIDTH << shift; \
- ++ \
- ++ do { \
- ++ oldval = *wordptr; \
- ++ newval = ((PFX_OP ((oldval & mask) >> shift) \
- ++ INF_OP (unsigned int) val) << shift) & mask; \
- ++ newval |= oldval & ~mask;
- ++ failure = __kernel_cmpxchg (oldval, newval, wordptr); \
- ++ } while (failure != 0); \
- ++ \
- ++ return (RETURN & mask) >> shift; \
- ++ }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement