Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: findbit: convert to macros

Since the pairs of _find_first and _find_next functions are pretty
similar, use macros to generate this code. This commit does not
change the generated code.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

+44 -118
+44 -118
arch/arm/lib/findbit.S
··· 14 14 #include <asm/assembler.h> 15 15 .text 16 16 17 - /* 18 - * Purpose : Find a 'zero' bit 19 - * Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit); 20 - */ 21 - ENTRY(_find_first_zero_bit_le) 22 - teq r1, #0 17 + .macro find_first, endian, set, name 18 + ENTRY(_find_first_\name\()bit_\endian) 19 + teq r1, #0 23 20 beq 3f 24 21 mov r2, #0 25 22 1: 23 + .ifc \endian, be 24 + eor r3, r2, #0x18 25 + ARM( ldrb r3, [r0, r3, lsr #3] ) 26 + THUMB( lsr r3, #3 ) 27 + THUMB( ldrb r3, [r0, r3] ) 28 + .else 26 29 ARM( ldrb r3, [r0, r2, lsr #3] ) 27 30 THUMB( lsr r3, r2, #3 ) 28 31 THUMB( ldrb r3, [r0, r3] ) 32 + .endif 33 + .ifeq \set 29 34 eors r3, r3, #0xff @ invert bits 30 - bne .L_found @ any now set - found zero bit 31 - add r2, r2, #8 @ next bit pointer 32 - 2: cmp r2, r1 @ any more? 33 - blo 1b 34 - 3: mov r0, r1 @ no free bits 35 - ret lr 36 - ENDPROC(_find_first_zero_bit_le) 37 - 38 - /* 39 - * Purpose : Find next 'zero' bit 40 - * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset) 41 - */ 42 - ENTRY(_find_next_zero_bit_le) 43 - cmp r2, r1 44 - bhs 3b 45 - ands ip, r2, #7 46 - beq 1b @ If new byte, goto old routine 47 - ARM( ldrb r3, [r0, r2, lsr #3] ) 48 - THUMB( lsr r3, r2, #3 ) 49 - THUMB( ldrb r3, [r0, r3] ) 50 - eor r3, r3, #0xff @ now looking for a 1 bit 51 - movs r3, r3, lsr ip @ shift off unused bits 52 - bne .L_found 53 - orr r2, r2, #7 @ if zero, then no bits here 54 - add r2, r2, #1 @ align bit pointer 55 - b 2b @ loop for next bit 56 - ENDPROC(_find_next_zero_bit_le) 57 - 58 - /* 59 - * Purpose : Find a 'one' bit 60 - * Prototype: int find_first_bit(const unsigned long *addr, unsigned int maxbit); 61 - */ 62 - ENTRY(_find_first_bit_le) 63 - teq r1, #0 64 - beq 3f 65 - mov r2, #0 66 - 1: 67 - ARM( ldrb r3, [r0, r2, lsr #3] ) 68 - THUMB( lsr r3, r2, #3 ) 69 - THUMB( ldrb r3, [r0, r3] ) 35 + .else 70 36 movs r3, r3 37 + .endif 71 38 bne .L_found @ any now set - found zero bit 72 39 add r2, r2, #8 @ next bit pointer 73 40 2: cmp r2, r1 @ any more? 74 41 blo 1b 75 42 3: mov r0, r1 @ no free bits 76 43 ret lr 77 - ENDPROC(_find_first_bit_le) 44 + ENDPROC(_find_first_\name\()bit_\endian) 45 + .endm 78 46 79 - /* 80 - * Purpose : Find next 'one' bit 81 - * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset) 82 - */ 83 - ENTRY(_find_next_bit_le) 47 + .macro find_next, endian, set, name 48 + ENTRY(_find_next_\name\()bit_\endian) 84 49 cmp r2, r1 85 50 bhs 3b 86 51 ands ip, r2, #7 87 52 beq 1b @ If new byte, goto old routine 53 + .ifc \endian, be 54 + eor r3, r2, #0x18 55 + ARM( ldrb r3, [r0, r3, lsr #3] ) 56 + THUMB( lsr r3, #3 ) 57 + THUMB( ldrb r3, [r0, r3] ) 58 + .else 88 59 ARM( ldrb r3, [r0, r2, lsr #3] ) 89 60 THUMB( lsr r3, r2, #3 ) 90 61 THUMB( ldrb r3, [r0, r3] ) 62 + .endif 63 + .ifeq \set 64 + eor r3, r3, #0xff @ now looking for a 1 bit 65 + .endif 91 66 movs r3, r3, lsr ip @ shift off unused bits 92 67 bne .L_found 93 68 orr r2, r2, #7 @ if zero, then no bits here 94 69 add r2, r2, #1 @ align bit pointer 95 70 b 2b @ loop for next bit 96 - ENDPROC(_find_next_bit_le) 71 + ENDPROC(_find_next_\name\()bit_\endian) 72 + .endm 73 + 74 + .macro find_bit, endian, set, name 75 + find_first \endian, \set, \name 76 + find_next \endian, \set, \name 77 + .endm 78 + 79 + /* _find_first_zero_bit_le and _find_next_zero_bit_le */ 80 + find_bit le, 0, zero_ 81 + 82 + /* _find_first_bit_le and _find_next_bit_le */ 83 + find_bit le, 1 97 84 98 85 #ifdef __ARMEB__ 99 86 100 - ENTRY(_find_first_zero_bit_be) 101 - teq r1, #0 102 - beq 3f 103 - mov r2, #0 104 - 1: eor r3, r2, #0x18 @ big endian byte ordering 105 - ARM( ldrb r3, [r0, r3, lsr #3] ) 106 - THUMB( lsr r3, #3 ) 107 - THUMB( ldrb r3, [r0, r3] ) 108 - eors r3, r3, #0xff @ invert bits 109 - bne .L_found @ any now set - found zero bit 110 - add r2, r2, #8 @ next bit pointer 111 - 2: cmp r2, r1 @ any more? 112 - blo 1b 113 - 3: mov r0, r1 @ no free bits 114 - ret lr 115 - ENDPROC(_find_first_zero_bit_be) 87 + /* _find_first_zero_bit_be and _find_next_zero_bit_be */ 88 + find_bit be, 0, zero_ 116 89 117 - ENTRY(_find_next_zero_bit_be) 118 - cmp r2, r1 119 - bhs 3b 120 - ands ip, r2, #7 121 - beq 1b @ If new byte, goto old routine 122 - eor r3, r2, #0x18 @ big endian byte ordering 123 - ARM( ldrb r3, [r0, r3, lsr #3] ) 124 - THUMB( lsr r3, #3 ) 125 - THUMB( ldrb r3, [r0, r3] ) 126 - eor r3, r3, #0xff @ now looking for a 1 bit 127 - movs r3, r3, lsr ip @ shift off unused bits 128 - bne .L_found 129 - orr r2, r2, #7 @ if zero, then no bits here 130 - add r2, r2, #1 @ align bit pointer 131 - b 2b @ loop for next bit 132 - ENDPROC(_find_next_zero_bit_be) 133 - 134 - ENTRY(_find_first_bit_be) 135 - teq r1, #0 136 - beq 3f 137 - mov r2, #0 138 - 1: eor r3, r2, #0x18 @ big endian byte ordering 139 - ARM( ldrb r3, [r0, r3, lsr #3] ) 140 - THUMB( lsr r3, #3 ) 141 - THUMB( ldrb r3, [r0, r3] ) 142 - movs r3, r3 143 - bne .L_found @ any now set - found zero bit 144 - add r2, r2, #8 @ next bit pointer 145 - 2: cmp r2, r1 @ any more? 146 - blo 1b 147 - 3: mov r0, r1 @ no free bits 148 - ret lr 149 - ENDPROC(_find_first_bit_be) 150 - 151 - ENTRY(_find_next_bit_be) 152 - cmp r2, r1 153 - bhs 3b 154 - ands ip, r2, #7 155 - beq 1b @ If new byte, goto old routine 156 - eor r3, r2, #0x18 @ big endian byte ordering 157 - ARM( ldrb r3, [r0, r3, lsr #3] ) 158 - THUMB( lsr r3, #3 ) 159 - THUMB( ldrb r3, [r0, r3] ) 160 - movs r3, r3, lsr ip @ shift off unused bits 161 - bne .L_found 162 - orr r2, r2, #7 @ if zero, then no bits here 163 - add r2, r2, #1 @ align bit pointer 164 - b 2b @ loop for next bit 165 - ENDPROC(_find_next_bit_be) 90 + /* _find_first_bit_be and _find_next_bit_be */ 91 + find_bit be, 1 166 92 167 93 #endif 168 94