Browse Source

[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>
Russell King 20 years ago
parent
commit
684f970e2f

+ 2 - 9
arch/arm/lib/changebit.S

@@ -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
-		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)
+	bitop	eor

+ 2 - 11
arch/arm/lib/clearbit.S

@@ -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
-		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)
-
-
+	bitop	bic

+ 2 - 9
arch/arm/lib/setbit.S

@@ -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
-		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)
+	bitop	orr

+ 2 - 13
arch/arm/lib/testchangebit.S

@@ -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
-		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)
-
-
+	testop	eor, strb

+ 2 - 13
arch/arm/lib/testclearbit.S

@@ -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
-		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)
-
-
+	testop	bicne, strneb

+ 2 - 13
arch/arm/lib/testsetbit.S

@@ -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
-		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)
-
-
+	testop	orreq, streqb