lib1funcs.S (9938b04472d5c59f8bd8152a548533a8599596a2) | lib1funcs.S (4dd1837d7589f468ed109556513f476e7a7f9121) |
---|---|
1/* 2 * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines 3 * 4 * Author: Nicolas Pitre <nico@fluxnic.net> 5 * - contributed to gcc-3.4 on Sep 30, 2003 6 * - adapted for the Linux kernel on Oct 2, 2003 7 */ 8 --- 22 unchanged lines hidden (view full) --- 31along with this program; see the file COPYING. If not, write to 32the Free Software Foundation, 59 Temple Place - Suite 330, 33Boston, MA 02111-1307, USA. */ 34 35 36#include <linux/linkage.h> 37#include <asm/assembler.h> 38#include <asm/unwind.h> | 1/* 2 * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines 3 * 4 * Author: Nicolas Pitre <nico@fluxnic.net> 5 * - contributed to gcc-3.4 on Sep 30, 2003 6 * - adapted for the Linux kernel on Oct 2, 2003 7 */ 8 --- 22 unchanged lines hidden (view full) --- 31along with this program; see the file COPYING. If not, write to 32the Free Software Foundation, 59 Temple Place - Suite 330, 33Boston, MA 02111-1307, USA. */ 34 35 36#include <linux/linkage.h> 37#include <asm/assembler.h> 38#include <asm/unwind.h> |
39#include <asm/export.h> |
|
39 40.macro ARM_DIV_BODY dividend, divisor, result, curbit 41 42#if __LINUX_ARM_ARCH__ >= 5 43 44 clz \curbit, \divisor 45 clz \result, \dividend 46 sub \result, \curbit, \result --- 186 unchanged lines hidden (view full) --- 23312: ARM_DIV2_ORDER r1, r2 234 235 mov r0, r0, lsr r2 236 ret lr 237 238UNWIND(.fnend) 239ENDPROC(__udivsi3) 240ENDPROC(__aeabi_uidiv) | 40 41.macro ARM_DIV_BODY dividend, divisor, result, curbit 42 43#if __LINUX_ARM_ARCH__ >= 5 44 45 clz \curbit, \divisor 46 clz \result, \dividend 47 sub \result, \curbit, \result --- 186 unchanged lines hidden (view full) --- 23412: ARM_DIV2_ORDER r1, r2 235 236 mov r0, r0, lsr r2 237 ret lr 238 239UNWIND(.fnend) 240ENDPROC(__udivsi3) 241ENDPROC(__aeabi_uidiv) |
242EXPORT_SYMBOL(__udivsi3) 243EXPORT_SYMBOL(__aeabi_uidiv) |
|
241 242ENTRY(__umodsi3) 243UNWIND(.fnstart) 244 245 subs r2, r1, #1 @ compare divisor with 1 246 bcc Ldiv0 247 cmpne r0, r1 @ compare dividend with divisor 248 moveq r0, #0 249 tsthi r1, r2 @ see if divisor is power of 2 250 andeq r0, r0, r2 251 retls lr 252 253 ARM_MOD_BODY r0, r1, r2, r3 254 255 ret lr 256 257UNWIND(.fnend) 258ENDPROC(__umodsi3) | 244 245ENTRY(__umodsi3) 246UNWIND(.fnstart) 247 248 subs r2, r1, #1 @ compare divisor with 1 249 bcc Ldiv0 250 cmpne r0, r1 @ compare dividend with divisor 251 moveq r0, #0 252 tsthi r1, r2 @ see if divisor is power of 2 253 andeq r0, r0, r2 254 retls lr 255 256 ARM_MOD_BODY r0, r1, r2, r3 257 258 ret lr 259 260UNWIND(.fnend) 261ENDPROC(__umodsi3) |
262EXPORT_SYMBOL(__umodsi3) |
|
259 260#ifdef CONFIG_ARM_PATCH_IDIV 261 .align 3 262#endif 263 264ENTRY(__divsi3) 265ENTRY(__aeabi_idiv) 266UNWIND(.fnstart) --- 31 unchanged lines hidden (view full) --- 298 cmp ip, #0 299 mov r0, r3, lsr r2 300 rsbmi r0, r0, #0 301 ret lr 302 303UNWIND(.fnend) 304ENDPROC(__divsi3) 305ENDPROC(__aeabi_idiv) | 263 264#ifdef CONFIG_ARM_PATCH_IDIV 265 .align 3 266#endif 267 268ENTRY(__divsi3) 269ENTRY(__aeabi_idiv) 270UNWIND(.fnstart) --- 31 unchanged lines hidden (view full) --- 302 cmp ip, #0 303 mov r0, r3, lsr r2 304 rsbmi r0, r0, #0 305 ret lr 306 307UNWIND(.fnend) 308ENDPROC(__divsi3) 309ENDPROC(__aeabi_idiv) |
310EXPORT_SYMBOL(__divsi3) 311EXPORT_SYMBOL(__aeabi_idiv) |
|
306 307ENTRY(__modsi3) 308UNWIND(.fnstart) 309 310 cmp r1, #0 311 beq Ldiv0 312 rsbmi r1, r1, #0 @ loops below use unsigned. 313 movs ip, r0 @ preserve sign of dividend --- 8 unchanged lines hidden (view full) --- 322 ARM_MOD_BODY r0, r1, r2, r3 323 32410: cmp ip, #0 325 rsbmi r0, r0, #0 326 ret lr 327 328UNWIND(.fnend) 329ENDPROC(__modsi3) | 312 313ENTRY(__modsi3) 314UNWIND(.fnstart) 315 316 cmp r1, #0 317 beq Ldiv0 318 rsbmi r1, r1, #0 @ loops below use unsigned. 319 movs ip, r0 @ preserve sign of dividend --- 8 unchanged lines hidden (view full) --- 328 ARM_MOD_BODY r0, r1, r2, r3 329 33010: cmp ip, #0 331 rsbmi r0, r0, #0 332 ret lr 333 334UNWIND(.fnend) 335ENDPROC(__modsi3) |
336EXPORT_SYMBOL(__modsi3) |
|
330 331#ifdef CONFIG_AEABI 332 333ENTRY(__aeabi_uidivmod) 334UNWIND(.fnstart) 335UNWIND(.save {r0, r1, ip, lr} ) 336 337 stmfd sp!, {r0, r1, ip, lr} 338 bl __aeabi_uidiv 339 ldmfd sp!, {r1, r2, ip, lr} 340 mul r3, r0, r2 341 sub r1, r1, r3 342 ret lr 343 344UNWIND(.fnend) 345ENDPROC(__aeabi_uidivmod) | 337 338#ifdef CONFIG_AEABI 339 340ENTRY(__aeabi_uidivmod) 341UNWIND(.fnstart) 342UNWIND(.save {r0, r1, ip, lr} ) 343 344 stmfd sp!, {r0, r1, ip, lr} 345 bl __aeabi_uidiv 346 ldmfd sp!, {r1, r2, ip, lr} 347 mul r3, r0, r2 348 sub r1, r1, r3 349 ret lr 350 351UNWIND(.fnend) 352ENDPROC(__aeabi_uidivmod) |
353EXPORT_SYMBOL(__aeabi_uidivmod) |
|
346 347ENTRY(__aeabi_idivmod) 348UNWIND(.fnstart) 349UNWIND(.save {r0, r1, ip, lr} ) 350 stmfd sp!, {r0, r1, ip, lr} 351 bl __aeabi_idiv 352 ldmfd sp!, {r1, r2, ip, lr} 353 mul r3, r0, r2 354 sub r1, r1, r3 355 ret lr 356 357UNWIND(.fnend) 358ENDPROC(__aeabi_idivmod) | 354 355ENTRY(__aeabi_idivmod) 356UNWIND(.fnstart) 357UNWIND(.save {r0, r1, ip, lr} ) 358 stmfd sp!, {r0, r1, ip, lr} 359 bl __aeabi_idiv 360 ldmfd sp!, {r1, r2, ip, lr} 361 mul r3, r0, r2 362 sub r1, r1, r3 363 ret lr 364 365UNWIND(.fnend) 366ENDPROC(__aeabi_idivmod) |
367EXPORT_SYMBOL(__aeabi_idivmod) |
|
359 360#endif 361 362Ldiv0: 363UNWIND(.fnstart) 364UNWIND(.pad #4) 365UNWIND(.save {lr}) 366 str lr, [sp, #-8]! 367 bl __div0 368 mov r0, #0 @ About as wrong as it could be. 369 ldr pc, [sp], #8 370UNWIND(.fnend) 371ENDPROC(Ldiv0) | 368 369#endif 370 371Ldiv0: 372UNWIND(.fnstart) 373UNWIND(.pad #4) 374UNWIND(.save {lr}) 375 str lr, [sp, #-8]! 376 bl __div0 377 mov r0, #0 @ About as wrong as it could be. 378 ldr pc, [sp], #8 379UNWIND(.fnend) 380ENDPROC(Ldiv0) |