[PATCH] ARM: bitops
Convert ARM bitop assembly to a macro. All bitops follow the same format, so it's silly duplicating the code when only one or two instructions are different. Signed-off-by: Russell King <rmk@arm.linux.org.uk>
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/* Purpose : Function to change a bit
|
/* Purpose : Function to change a bit
|
||||||
@@ -17,12 +18,4 @@
|
|||||||
ENTRY(_change_bit_be)
|
ENTRY(_change_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_change_bit_le)
|
ENTRY(_change_bit_le)
|
||||||
and r2, r0, #7
|
bitop eor
|
||||||
mov r3, #1
|
|
||||||
mov r3, r3, lsl r2
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1, r0, lsr #3]
|
|
||||||
eor r2, r2, r3
|
|
||||||
strb r2, [r1, r0, lsr #3]
|
|
||||||
restore_irqs ip
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -18,14 +19,4 @@
|
|||||||
ENTRY(_clear_bit_be)
|
ENTRY(_clear_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_clear_bit_le)
|
ENTRY(_clear_bit_le)
|
||||||
and r2, r0, #7
|
bitop bic
|
||||||
mov r3, #1
|
|
||||||
mov r3, r3, lsl r2
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1, r0, lsr #3]
|
|
||||||
bic r2, r2, r3
|
|
||||||
strb r2, [r1, r0, lsr #3]
|
|
||||||
restore_irqs ip
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -18,12 +19,4 @@
|
|||||||
ENTRY(_set_bit_be)
|
ENTRY(_set_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_set_bit_le)
|
ENTRY(_set_bit_le)
|
||||||
and r2, r0, #7
|
bitop orr
|
||||||
mov r3, #1
|
|
||||||
mov r3, r3, lsl r2
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1, r0, lsr #3]
|
|
||||||
orr r2, r2, r3
|
|
||||||
strb r2, [r1, r0, lsr #3]
|
|
||||||
restore_irqs ip
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
@@ -9,21 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
ENTRY(_test_and_change_bit_be)
|
ENTRY(_test_and_change_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_test_and_change_bit_le)
|
ENTRY(_test_and_change_bit_le)
|
||||||
add r1, r1, r0, lsr #3
|
testop eor, strb
|
||||||
and r3, r0, #7
|
|
||||||
mov r0, #1
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1]
|
|
||||||
tst r2, r0, lsl r3
|
|
||||||
eor r2, r2, r0, lsl r3
|
|
||||||
strb r2, [r1]
|
|
||||||
restore_irqs ip
|
|
||||||
moveq r0, #0
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,21 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
ENTRY(_test_and_clear_bit_be)
|
ENTRY(_test_and_clear_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_test_and_clear_bit_le)
|
ENTRY(_test_and_clear_bit_le)
|
||||||
add r1, r1, r0, lsr #3 @ Get byte offset
|
testop bicne, strneb
|
||||||
and r3, r0, #7 @ Get bit offset
|
|
||||||
mov r0, #1
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1]
|
|
||||||
tst r2, r0, lsl r3
|
|
||||||
bic r2, r2, r0, lsl r3
|
|
||||||
strb r2, [r1]
|
|
||||||
restore_irqs ip
|
|
||||||
moveq r0, #0
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,21 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "bitops.h"
|
||||||
.text
|
.text
|
||||||
|
|
||||||
ENTRY(_test_and_set_bit_be)
|
ENTRY(_test_and_set_bit_be)
|
||||||
eor r0, r0, #0x18 @ big endian byte ordering
|
eor r0, r0, #0x18 @ big endian byte ordering
|
||||||
ENTRY(_test_and_set_bit_le)
|
ENTRY(_test_and_set_bit_le)
|
||||||
add r1, r1, r0, lsr #3 @ Get byte offset
|
testop orreq, streqb
|
||||||
and r3, r0, #7 @ Get bit offset
|
|
||||||
mov r0, #1
|
|
||||||
save_and_disable_irqs ip, r2
|
|
||||||
ldrb r2, [r1]
|
|
||||||
tst r2, r0, lsl r3
|
|
||||||
orr r2, r2, r0, lsl r3
|
|
||||||
strb r2, [r1]
|
|
||||||
restore_irqs ip
|
|
||||||
moveq r0, #0
|
|
||||||
RETINSTR(mov,pc,lr)
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user