--- /dev/null
+       .macro  bitop, instr
+       and     r2, r0, #7
+       mov     r3, #1
+       mov     r3, r3, lsl r2
+       save_and_disable_irqs ip, r2
+       ldrb    r2, [r1, r0, lsr #3]
+       \instr  r2, r2, r3
+       strb    r2, [r1, r0, lsr #3]
+       restore_irqs ip
+       mov     pc, lr
+       .endm
+
+/**
+ * testop - implement a test_and_xxx_bit operation.
+ * @instr: operational instruction
+ * @store: store instruction
+ *
+ * Note: we can trivially conditionalise the store instruction
+ * to avoid dirting the data cache.
+ */
+       .macro  testop, instr, store
+       add     r1, r1, r0, lsr #3
+       and     r3, r0, #7
+       mov     r0, #1
+       save_and_disable_irqs ip, r2
+       ldrb    r2, [r1]
+       tst     r2, r0, lsl r3
+       \instr  r2, r2, r0, lsl r3
+       \store  r2, [r1]
+       restore_irqs ip
+       moveq   r0, #0
+       mov     pc, lr
+       .endm