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