diff --git a/usr/klibc/arch/arm/Makefile.inc b/usr/klibc/arch/arm/Makefile.inc index a03924d..564ff57 100644 --- a/usr/klibc/arch/arm/Makefile.inc +++ b/usr/klibc/arch/arm/Makefile.inc @@ -17,6 +17,13 @@ KLIBCARCHOBJS = \ libgcc/__umoddi3.o \ libgcc/__udivmoddi4.o \ +ifeq ($(CONFIG_EABI),y) +KLIBCLIBGCC := +KLIBCARCHOBJS += arch/arm/__aeabi_uidivmod.o \ + arch/arm/__aeabi_idivmod.o \ + +endif + ifeq ($(THUMB),y) KLIBCLIBGCC := KLIBCARCHOBJS += arch/arm/setjmp-thumb.o \ diff --git a/usr/klibc/arch/arm/__aeabi_idivmod.S b/usr/klibc/arch/arm/__aeabi_idivmod.S new file mode 100644 index 0000000..fc66d1a --- /dev/null +++ b/usr/klibc/arch/arm/__aeabi_idivmod.S @@ -0,0 +1,30 @@ +/* + * __aeabi_idivmod.S + * + * r0 = r2 / r3 + * r1 = r2 % r3 + */ + .text + .balign 4 + .type __aeabi_idivmod, #function + .globl __aeabi_idivmod +__aeabi_idivmod: + stmfd sp!,{r4,lr} + eor r4, r2, r3 /* save xor of sign bits */ + cmp r2, #0 + rsblt r2, r2, #0 + cmp r3, #0 + rsblt r3, r3, #0 + + bl __aeabi_uidivmod + + cmp r4, #0 + rsblt r0, r0, #0 + rsblt r1, r1, #0 + + ldmfd sp!,{r4,pc} + + .size __aeabi_idivmod, .-__aeabi_idivmod + + .globl __aeabi_idiv +__aeabi_idiv = __aeabi_idivmod diff --git a/usr/klibc/arch/arm/__aeabi_uidivmod.S b/usr/klibc/arch/arm/__aeabi_uidivmod.S new file mode 100644 index 0000000..59a3170 --- /dev/null +++ b/usr/klibc/arch/arm/__aeabi_uidivmod.S @@ -0,0 +1,42 @@ +/* + * __aeabi_uidivmod.S + * + * r0 = r2 / r3 + * r1 = r2 % r3 + */ + .text + .balign 4 + .type __aeabi_uidivmod, #function + .globl __aeabi_uidivmod +__aeabi_uidivmod: + mov r0, #0 + mov r1, #1 + cmp r3, #0 + beq 1f +2: + movge r3, r3, lsl #1 + movges r1, r1, lsl #1 + bge 2b + +3: + cmp r3, r2 + suble r2, r2, r3 + addle r0, r0, r1 + mov r3, r3, lsr #1 + movs r1, r1, lsr #1 + bne 3b + + mov r1, r2 + mov pc, lr + +/* Divide by zero error; EABI wants the return value to be (0, num) */ +1: + stmfd sp!,{r0,r3,lr} + mov r0, #8 /* SIGFPE */ + bl raise + ldmfd sp!,{r0,r1,pc} + + .size __aeabi_uidivmod, .-__aeabi_uidivmod + + .globl __aeabi_uidiv +__aeabi_uidiv = __aeabi_uidivmod