xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/arm/aeabi_ldivmod.S (revision 3cab2bb3f667058bece8e38b12449a63a9d73c4b)
1*3cab2bb3Spatrick//===-- aeabi_ldivmod.S - EABI ldivmod implementation ---------------------===//
2*3cab2bb3Spatrick//
3*3cab2bb3Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3cab2bb3Spatrick// See https://llvm.org/LICENSE.txt for license information.
5*3cab2bb3Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3cab2bb3Spatrick//
7*3cab2bb3Spatrick//===----------------------------------------------------------------------===//
8*3cab2bb3Spatrick
9*3cab2bb3Spatrick#include "../assembly.h"
10*3cab2bb3Spatrick
11*3cab2bb3Spatrick// struct { int64_t quot, int64_t rem}
12*3cab2bb3Spatrick//        __aeabi_ldivmod(int64_t numerator, int64_t denominator) {
13*3cab2bb3Spatrick//   int64_t rem, quot;
14*3cab2bb3Spatrick//   quot = __divmoddi4(numerator, denominator, &rem);
15*3cab2bb3Spatrick//   return {quot, rem};
16*3cab2bb3Spatrick// }
17*3cab2bb3Spatrick
18*3cab2bb3Spatrick#if defined(__MINGW32__)
19*3cab2bb3Spatrick#define __aeabi_ldivmod __rt_sdiv64
20*3cab2bb3Spatrick#endif
21*3cab2bb3Spatrick
22*3cab2bb3Spatrick        .syntax unified
23*3cab2bb3Spatrick        .p2align 2
24*3cab2bb3SpatrickDEFINE_COMPILERRT_FUNCTION(__aeabi_ldivmod)
25*3cab2bb3Spatrick        push    {r6, lr}
26*3cab2bb3Spatrick        sub     sp, sp, #16
27*3cab2bb3Spatrick        add     r6, sp, #8
28*3cab2bb3Spatrick        str     r6, [sp]
29*3cab2bb3Spatrick#if defined(__MINGW32__)
30*3cab2bb3Spatrick        movs    r6, r0
31*3cab2bb3Spatrick        movs    r0, r2
32*3cab2bb3Spatrick        movs    r2, r6
33*3cab2bb3Spatrick        movs    r6, r1
34*3cab2bb3Spatrick        movs    r1, r3
35*3cab2bb3Spatrick        movs    r3, r6
36*3cab2bb3Spatrick#endif
37*3cab2bb3Spatrick        bl      SYMBOL_NAME(__divmoddi4)
38*3cab2bb3Spatrick        ldr     r2, [sp, #8]
39*3cab2bb3Spatrick        ldr     r3, [sp, #12]
40*3cab2bb3Spatrick        add     sp, sp, #16
41*3cab2bb3Spatrick        pop     {r6, pc}
42*3cab2bb3SpatrickEND_COMPILERRT_FUNCTION(__aeabi_ldivmod)
43*3cab2bb3Spatrick
44*3cab2bb3SpatrickNO_EXEC_STACK_DIRECTIVE
45*3cab2bb3Spatrick
46