16bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon/*===-- divsi3.S - 32-bit signed integer divide ---------------------------===// 26bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * 36bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * The LLVM Compiler Infrastructure 46bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * 56bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * This file is dual licensed under the MIT and the University of Illinois Open 66bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * Source Licenses. See LICENSE.TXT for details. 76bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * 86bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon *===----------------------------------------------------------------------===// 96bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * 106bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * This file implements the __divsi3 (32-bit signed integer divide) function 116bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * for the ARM architecture as a wrapper around the unsigned routine. 126bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon * 136bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon *===----------------------------------------------------------------------===*/ 146bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon 156bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon#include "../assembly.h" 166bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon 176bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon#define ESTABLISH_FRAME \ 186bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon push {r4, r7, lr} ;\ 196bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon add r7, sp, #4 206bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon#define CLEAR_FRAME_AND_RETURN \ 216bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon pop {r4, r7, pc} 226bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon 236bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon.syntax unified 246bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon.align 3 2537b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov// Ok, APCS and AAPCS agree on 32 bit args, so it's safe to use the same routine. 2637b97d1cf4501b94347e0b4e880f4b25825a289fAnton KorobeynikovDEFINE_AEABI_FUNCTION_ALIAS(__aeabi_idiv, __divsi3) 276bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen CanonDEFINE_COMPILERRT_FUNCTION(__divsi3) 28004c4340248841aefe5a23d1d20556ac801c871dBob Wilson#if __ARM_ARCH_7S__ 29004c4340248841aefe5a23d1d20556ac801c871dBob Wilson tst r1,r1 30004c4340248841aefe5a23d1d20556ac801c871dBob Wilson beq LOCAL_LABEL(divzero) 31004c4340248841aefe5a23d1d20556ac801c871dBob Wilson sdiv r0, r0, r1 32004c4340248841aefe5a23d1d20556ac801c871dBob Wilson bx lr 33004c4340248841aefe5a23d1d20556ac801c871dBob WilsonLOCAL_LABEL(divzero): 34004c4340248841aefe5a23d1d20556ac801c871dBob Wilson mov r0,#0 35004c4340248841aefe5a23d1d20556ac801c871dBob Wilson bx lr 36004c4340248841aefe5a23d1d20556ac801c871dBob Wilson#else 37004c4340248841aefe5a23d1d20556ac801c871dBob WilsonESTABLISH_FRAME 386bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Set aside the sign of the quotient. 396bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r4, r0, r1 406bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Take absolute value of a and b via abs(x) = (x^(x >> 31)) - (x >> 31). 416bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r2, r0, r0, asr #31 426bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r3, r1, r1, asr #31 436bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r0, r2, r0, asr #31 446bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r1, r3, r1, asr #31 456bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// abs(a) / abs(b) 46647fc7336b2bc302bb51e50022b27bf9b929071cAnton Korobeynikov bl SYMBOL_NAME(__udivsi3) 476bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Apply sign of quotient to result and return. 486bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r0, r0, r4, asr #31 496bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r0, r0, r4, asr #31 506bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon CLEAR_FRAME_AND_RETURN 51004c4340248841aefe5a23d1d20556ac801c871dBob Wilson#endif 52