port __udivmodsi4, aeabi_uidivmod and udivsi3

also rewrite these last two new aeabi intrinsics as naked functions
This commit is contained in:
Jorge Aparicio
2016-08-10 23:40:35 -05:00
parent 2aaa38504f
commit 4c93f05195
3 changed files with 100 additions and 11 deletions

View File

@@ -1,18 +1,33 @@
use core::mem;
use core::intrinsics;
#[repr(C)]
pub struct u64x2 {
a: u64,
b: u64,
// TODO use `global_asm!`
#[naked]
#[no_mangle]
pub unsafe extern "aapcs" fn __aeabi_uidivmod() {
asm!("push { lr }
sub sp, sp, #4
mov r2, sp
bl __udivmodsi4
ldr r1, [sp]
add sp, sp, #4
pop { pc }");
intrinsics::unreachable();
}
// TODO use `global_asm!`
#[naked]
#[no_mangle]
pub unsafe extern "aapcs" fn __aeabi_uldivmod(num: u64, den: u64) -> u64x2 {
let mut rem = mem::uninitialized();
let quot = ::__udivmoddi4(num, den, &mut rem);
u64x2 { a: quot, b: rem }
pub unsafe extern "aapcs" fn __aeabi_uldivmod() {
asm!("push {r11, lr}
sub sp, sp, #16
add r12, sp, #8
str r12, [sp]
bl __udivmoddi4
ldr r2, [sp, #8]
ldr r3, [sp, #12]
add sp, sp, #16
pop {r11, pc}");
intrinsics::unreachable();
}
extern "C" {