1/1

|
NetBSD to OpenRISC project, optimized divide code for the OpenRISC
by Unknown on Feb 3, 2005 |
Not available! | ||
|
NetBSD has kernel lib called libkern.
It implements critical code like divide, So i had to implement divide.
The implementation can be viewed/downloaded from:
view:
http://212.199.169.246/trac/file/netbsd/branches/nirm/src/sys/lib/libkern/arch/openrisc/divsi3.S
download:
http://212.199.169.246/trac/file/netbsd/branches/nirm/src/sys/lib/libkern/arch/openrisc/divsi3.S?rev=32&format=raw
(All the sources can be browsed at http://212.199.169.246/trac, trac
system is wiki/milestone/bug ticket system integrated with SubVersion
version control system, svn access http://212.199.169.246/svn )
This is some of the code of L_udivide:
L_udivide:
l.sfeqi r4, 0 /* check if divisor 0 */
l.bf L_overflow
l.sfeqi r4, 1 /* check if divisor 1 */
l.bf L_divide_l1
l.sfeqi r3, 0 /* check if dividend 0 */
l.bf L_divide_l2
l.sfeqi r3, 1 /* check if dividend 1 */
l.bf L_divide_l3
l.sfeq r3, r4 /* check if dividend = divisor */
l.bf L_divide_l4
l.addi r11, r3, 0
l.addi r15, r4, 0
L_divide_l0:
L_divide_b31:
l.srli r12, r11, 31 /* Set remainder LSB from divisor MSB */
l.slli r11, r11, 1 /* Left shit dividend */
l.sfltu r12, r15 /* Is remainder less then divisor */
l.bf L_divide_b30 /* If so skip to next bit */
l.srli r13, r11, 31 /* Delay slot get MSB of quotient */
l.sub r12, r12, r15 /* Substruct divisor from remainder */
l.addi r11, r11, 1 /* Set remainder LSB to 1 */
L_divide_b30:
l.slli r12, r12, 1 /* Left shit remainder */
l.slli r11, r11, 1 /* Left shit quotient */
l.add r12, r12, r13 /* Set remainder LSB from quotient MSB */
l.sfltu r12, r15 /* Is remainder less then divisor */
l.bf L_divide_b29 /* If so skip to next bit */
l.srli r13, r11, 31 /* Delay slot get MSB of remainder */
l.sub r12, r12, r15 /* Substruct divisor from remainder */
l.addi r11, r11, 1 /* Set remainder LSB to 1 */
L_divide_b29:
|
|||
1/1

