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