@@ -24,6 +24,7 @@ cflatobjs += lib/arm/spinlock.o
cflatobjs += lib/arm/processor.o
cflatobjs += lib/arm/stack.o
cflatobjs += lib/ldiv32.o
+cflatobjs += lib/arm/ldivmod.o
# arm specific tests
tests =
new file mode 100644
@@ -0,0 +1,32 @@
+// EABI ldivmod and uldivmod implementation based on libcompiler-rt
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses.
+
+ .syntax unified
+ .align 2
+ .globl __aeabi_uldivmod
+ .type __aeabi_uldivmod, %function
+__aeabi_uldivmod:
+ push {r11, lr}
+ sub sp, sp, #16
+ add r12, sp, #8
+ str r12, [sp] // third argument to __udivmoddi4
+ bl __udivmoddi4
+ ldr r2, [sp, #8] // remainder returned in r2-r3
+ ldr r3, [sp, #12]
+ add sp, sp, #16
+ pop {r11, pc}
+
+ .globl __aeabi_ldivmod
+ .type __aeabi_ldivmod, %function
+__aeabi_ldivmod:
+ push {r11, lr}
+ sub sp, sp, #16
+ add r12, sp, #8
+ str r12, [sp] // third argument to __divmoddi4
+ bl __divmoddi4
+ ldr r2, [sp, #8] // remainder returned in r2-r3
+ ldr r3, [sp, #12]
+ add sp, sp, #16
+ pop {r11, pc}
eabi prescribes different entry points for 64-bit division on 32-bit platforms. Implement a wrapper for the GCC-style __divmoddi4 and __udivmoddi4 functions. Reported-by: Alexandru Elisei <alexandru.elisei@arm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- arm/Makefile.arm | 1 + lib/arm/ldivmod.S | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 lib/arm/ldivmod.S