-#define BV_DO_ALIGNED(T, A) \
- mask = BV_MASK_HIGHER(T, BITS(T) - fs); \
- if (fs + l <= BITS(T)) { \
- /* Branching is apparently useless, \
- * but since we can't portably shift \
- * CHAR_BITS from a char... \
- * Actually, we only copy up to this */ \
- if (fs + l < BITS(T)) \
- mask &= BV_MASK_LOWER(T, fs + l); \
- *t = (*t & ~mask) | (*f & mask); \
- } else { \
- size_t lo, lk; \
- *t = (*t & ~mask) | (*f & mask); \
- ++t; \
- ++f; \
- l -= (BITS(T) - ts); \
- lo = l % BITS(T); \
- lk = l / BITS(T); \
- BV_##A##_UNIT_ALIGNED(T, t, f, lk); \
- if (lo) { \
- mask = BV_MASK_LOWER(T, lo); \
- t[lk] = (t[lk] & ~mask) \
- | (f[lk] & mask); \
- } \
+#define BV_DO_ALIGNED_FORWARD(T, A) \
+ mask = BV_MASK_HIGHER(T, BITS(T) - fs); \
+ if (fs + l <= BITS(T)) { \
+ /* Branching is apparently useless, \
+ * but since we can't portably shift \
+ * CHAR_BITS from a char... \
+ * Actually, we only copy up to this */ \
+ if (fs + l < BITS(T)) \
+ mask &= BV_MASK_LOWER(T, fs + l); \
+ *t = (*t & ~mask) | (*f & mask); \
+ } else { \
+ size_t lo, lk; \
+ *t = (*t & ~mask) | (*f & mask); \
+ ++t; \
+ ++f; \
+ l -= (BITS(T) - ts); \
+ lo = l % BITS(T); \
+ lk = l / BITS(T); \
+ BV_##A##_UNIT_ALIGNED(T, t, f, lk); \
+ t += lk; \
+ f += lk; \
+ if (lo) { \
+ mask = BV_MASK_LOWER(T, lo); \
+ *t = (*t & ~mask) | (*f & mask); \
+ } \
+ }
+
+#define BV_DO_ALIGNED_BACKWARD(T, A) \
+ if (fs + l <= BITS(T)) { \
+ mask = BV_MASK_HIGHER(T, BITS(T) - fs); \
+ /* Branching is apparently useless, \
+ * but since we can't portably shift \
+ * CHAR_BITS from a char... \
+ * Actually, we only copy up to this */ \
+ if (fs + l < BITS(T)) \
+ mask &= BV_MASK_LOWER(T, fs + l); \
+ *t = (*t & ~mask) | (*f & mask); \
+ } else { \
+ size_t lo, lk; \
+ l -= (BITS(T) - ts); \
+ lo = l % BITS(T); \
+ lk = l / BITS(T); \
+ ++t; \
+ ++f; \
+ if (lo) { \
+ mask = BV_MASK_LOWER(T, lo); \
+ t[lk] = (t[lk] & ~mask) | (f[lk] & mask); \
+ } \
+ BV_##A##_UNIT_ALIGNED(T, t, f, lk); \
+ mask = BV_MASK_HIGHER(T, BITS(T) - fs); \
+ t[-1] = (t[-1] & ~mask) | (f[-1] & mask); \