diff options
Diffstat (limited to 'arch/avr32/lib/findbit.S')
| -rw-r--r-- | arch/avr32/lib/findbit.S | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/avr32/lib/findbit.S b/arch/avr32/lib/findbit.S index c6b91dee857c..997b33b2288a 100644 --- a/arch/avr32/lib/findbit.S +++ b/arch/avr32/lib/findbit.S | |||
| @@ -123,6 +123,36 @@ ENTRY(find_next_bit) | |||
| 123 | brgt 1b | 123 | brgt 1b |
| 124 | retal r11 | 124 | retal r11 |
| 125 | 125 | ||
| 126 | ENTRY(generic_find_next_le_bit) | ||
| 127 | lsr r8, r10, 5 | ||
| 128 | sub r9, r11, r10 | ||
| 129 | retle r11 | ||
| 130 | |||
| 131 | lsl r8, 2 | ||
| 132 | add r12, r8 | ||
| 133 | andl r10, 31, COH | ||
| 134 | breq 1f | ||
| 135 | |||
| 136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | ||
| 137 | ldswp.w r8, r12[0] | ||
| 138 | sub r12, -4 | ||
| 139 | lsr r8, r8, r10 | ||
| 140 | brne .L_found | ||
| 141 | |||
| 142 | /* r9 = r9 - (32 - r10) = r9 + r10 - 32 */ | ||
| 143 | add r9, r10 | ||
| 144 | sub r9, 32 | ||
| 145 | retle r11 | ||
| 146 | |||
| 147 | /* Main loop. offset must be word-aligned */ | ||
| 148 | 1: ldswp.w r8, r12[0] | ||
| 149 | cp.w r8, 0 | ||
| 150 | brne .L_found | ||
| 151 | sub r12, -4 | ||
| 152 | sub r9, 32 | ||
| 153 | brgt 1b | ||
| 154 | retal r11 | ||
| 155 | |||
| 126 | ENTRY(generic_find_next_zero_le_bit) | 156 | ENTRY(generic_find_next_zero_le_bit) |
| 127 | lsr r8, r10, 5 | 157 | lsr r8, r10, 5 |
| 128 | sub r9, r11, r10 | 158 | sub r9, r11, r10 |
