xref: /rk3399_ARM-atf/lib/compiler-rt/builtins/arm/aeabi_ldivmod.S (revision 8c80c86573898eb59127a32b089e753f40e254fb)
1*8c80c865SLionel Debieve//===-- aeabi_ldivmod.S - EABI ldivmod implementation ---------------------===//
2*8c80c865SLionel Debieve//
3*8c80c865SLionel Debieve//                     The LLVM Compiler Infrastructure
4*8c80c865SLionel Debieve//
5*8c80c865SLionel Debieve// This file is dual licensed under the MIT and the University of Illinois Open
6*8c80c865SLionel Debieve// Source Licenses. See LICENSE.TXT for details.
7*8c80c865SLionel Debieve//
8*8c80c865SLionel Debieve//===----------------------------------------------------------------------===//
9*8c80c865SLionel Debieve
10*8c80c865SLionel Debieve#include "../assembly.h"
11*8c80c865SLionel Debieve
12*8c80c865SLionel Debieve// struct { int64_t quot, int64_t rem}
13*8c80c865SLionel Debieve//        __aeabi_ldivmod(int64_t numerator, int64_t denominator) {
14*8c80c865SLionel Debieve//   int64_t rem, quot;
15*8c80c865SLionel Debieve//   quot = __divmoddi4(numerator, denominator, &rem);
16*8c80c865SLionel Debieve//   return {quot, rem};
17*8c80c865SLionel Debieve// }
18*8c80c865SLionel Debieve
19*8c80c865SLionel Debieve#if defined(__MINGW32__)
20*8c80c865SLionel Debieve#define __aeabi_ldivmod __rt_sdiv64
21*8c80c865SLionel Debieve#endif
22*8c80c865SLionel Debieve
23*8c80c865SLionel Debieve        .syntax unified
24*8c80c865SLionel Debieve        .p2align 2
25*8c80c865SLionel DebieveDEFINE_COMPILERRT_FUNCTION(__aeabi_ldivmod)
26*8c80c865SLionel Debieve        push    {r6, lr}
27*8c80c865SLionel Debieve        sub     sp, sp, #16
28*8c80c865SLionel Debieve        add     r6, sp, #8
29*8c80c865SLionel Debieve        str     r6, [sp]
30*8c80c865SLionel Debieve#if defined(__MINGW32__)
31*8c80c865SLionel Debieve        movs    r6, r0
32*8c80c865SLionel Debieve        movs    r0, r2
33*8c80c865SLionel Debieve        movs    r2, r6
34*8c80c865SLionel Debieve        movs    r6, r1
35*8c80c865SLionel Debieve        movs    r1, r3
36*8c80c865SLionel Debieve        movs    r3, r6
37*8c80c865SLionel Debieve#endif
38*8c80c865SLionel Debieve        bl      SYMBOL_NAME(__divmoddi4)
39*8c80c865SLionel Debieve        ldr     r2, [sp, #8]
40*8c80c865SLionel Debieve        ldr     r3, [sp, #12]
41*8c80c865SLionel Debieve        add     sp, sp, #16
42*8c80c865SLionel Debieve        pop     {r6, pc}
43*8c80c865SLionel DebieveEND_COMPILERRT_FUNCTION(__aeabi_ldivmod)
44*8c80c865SLionel Debieve
45*8c80c865SLionel DebieveNO_EXEC_STACK_DIRECTIVE
46*8c80c865SLionel Debieve
47