xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/arm/aeabi_idivmod.S (revision 3cab2bb3f667058bece8e38b12449a63a9d73c4b)
1*3cab2bb3Spatrick//===-- aeabi_idivmod.S - EABI idivmod 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 { int quot, int rem} __aeabi_idivmod(int numerator, int denominator) {
12*3cab2bb3Spatrick//   int rem, quot;
13*3cab2bb3Spatrick//   quot = __divmodsi4(numerator, denominator, &rem);
14*3cab2bb3Spatrick//   return {quot, rem};
15*3cab2bb3Spatrick// }
16*3cab2bb3Spatrick
17*3cab2bb3Spatrick#if defined(__MINGW32__)
18*3cab2bb3Spatrick#define __aeabi_idivmod __rt_sdiv
19*3cab2bb3Spatrick#endif
20*3cab2bb3Spatrick
21*3cab2bb3Spatrick        .syntax unified
22*3cab2bb3Spatrick        .text
23*3cab2bb3Spatrick        DEFINE_CODE_STATE
24*3cab2bb3Spatrick        .p2align 2
25*3cab2bb3SpatrickDEFINE_COMPILERRT_FUNCTION(__aeabi_idivmod)
26*3cab2bb3Spatrick#if defined(USE_THUMB_1)
27*3cab2bb3Spatrick        push    {r0, r1, lr}
28*3cab2bb3Spatrick        bl      SYMBOL_NAME(__divsi3)
29*3cab2bb3Spatrick        pop     {r1, r2, r3} // now r0 = quot, r1 = num, r2 = denom
30*3cab2bb3Spatrick        muls    r2, r0, r2   // r2 = quot * denom
31*3cab2bb3Spatrick        subs    r1, r1, r2
32*3cab2bb3Spatrick        JMP     (r3)
33*3cab2bb3Spatrick#else  // defined(USE_THUMB_1)
34*3cab2bb3Spatrick        push    { lr }
35*3cab2bb3Spatrick        sub     sp, sp, #4
36*3cab2bb3Spatrick        mov     r2, sp
37*3cab2bb3Spatrick#if defined(__MINGW32__)
38*3cab2bb3Spatrick        mov     r3, r0
39*3cab2bb3Spatrick        mov     r0, r1
40*3cab2bb3Spatrick        mov     r1, r3
41*3cab2bb3Spatrick#endif
42*3cab2bb3Spatrick        bl      SYMBOL_NAME(__divmodsi4)
43*3cab2bb3Spatrick        ldr     r1, [sp]
44*3cab2bb3Spatrick        add     sp, sp, #4
45*3cab2bb3Spatrick        pop     { pc }
46*3cab2bb3Spatrick#endif //  defined(USE_THUMB_1)
47*3cab2bb3SpatrickEND_COMPILERRT_FUNCTION(__aeabi_idivmod)
48*3cab2bb3Spatrick
49*3cab2bb3SpatrickNO_EXEC_STACK_DIRECTIVE
50*3cab2bb3Spatrick
51