1*0b57cec5SDimitry Andric//===-- aeabi_uidivmod.S - EABI uidivmod implementation -------------------===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric#include "../assembly.h" 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric// struct { unsigned quot, unsigned rem} 12*0b57cec5SDimitry Andric// __aeabi_uidivmod(unsigned numerator, unsigned denominator) { 13*0b57cec5SDimitry Andric// unsigned rem, quot; 14*0b57cec5SDimitry Andric// quot = __udivmodsi4(numerator, denominator, &rem); 15*0b57cec5SDimitry Andric// return {quot, rem}; 16*0b57cec5SDimitry Andric// } 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric#if defined(__MINGW32__) 19*0b57cec5SDimitry Andric#define __aeabi_uidivmod __rt_udiv 20*0b57cec5SDimitry Andric#endif 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric .syntax unified 23*0b57cec5SDimitry Andric .text 24*0b57cec5SDimitry Andric DEFINE_CODE_STATE 25*0b57cec5SDimitry Andric .p2align 2 26*0b57cec5SDimitry AndricDEFINE_COMPILERRT_FUNCTION(__aeabi_uidivmod) 27*0b57cec5SDimitry Andric#if defined(USE_THUMB_1) 28*0b57cec5SDimitry Andric cmp r0, r1 29*0b57cec5SDimitry Andric bcc LOCAL_LABEL(case_denom_larger) 30*0b57cec5SDimitry Andric push {r0, r1, lr} 31*0b57cec5SDimitry Andric bl SYMBOL_NAME(__aeabi_uidiv) 32*0b57cec5SDimitry Andric pop {r1, r2, r3} 33*0b57cec5SDimitry Andric muls r2, r0, r2 // r2 = quot * denom 34*0b57cec5SDimitry Andric subs r1, r1, r2 35*0b57cec5SDimitry Andric JMP (r3) 36*0b57cec5SDimitry AndricLOCAL_LABEL(case_denom_larger): 37*0b57cec5SDimitry Andric movs r1, r0 38*0b57cec5SDimitry Andric movs r0, #0 39*0b57cec5SDimitry Andric JMP (lr) 40*0b57cec5SDimitry Andric#else // defined(USE_THUMB_1) 41*0b57cec5SDimitry Andric push { lr } 42*0b57cec5SDimitry Andric sub sp, sp, #4 43*0b57cec5SDimitry Andric mov r2, sp 44*0b57cec5SDimitry Andric#if defined(__MINGW32__) 45*0b57cec5SDimitry Andric mov r3, r0 46*0b57cec5SDimitry Andric mov r0, r1 47*0b57cec5SDimitry Andric mov r1, r3 48*0b57cec5SDimitry Andric#endif 49*0b57cec5SDimitry Andric bl SYMBOL_NAME(__udivmodsi4) 50*0b57cec5SDimitry Andric ldr r1, [sp] 51*0b57cec5SDimitry Andric add sp, sp, #4 52*0b57cec5SDimitry Andric pop { pc } 53*0b57cec5SDimitry Andric#endif 54*0b57cec5SDimitry AndricEND_COMPILERRT_FUNCTION(__aeabi_uidivmod) 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry AndricNO_EXEC_STACK_DIRECTIVE 57*0b57cec5SDimitry Andric 58