divsi3.S revision 647fc7336b2bc302bb51e50022b27bf9b929071c
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 256bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen CanonDEFINE_COMPILERRT_FUNCTION(__divsi3) 266bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon ESTABLISH_FRAME 276bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Set aside the sign of the quotient. 286bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r4, r0, r1 296bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Take absolute value of a and b via abs(x) = (x^(x >> 31)) - (x >> 31). 306bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r2, r0, r0, asr #31 316bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r3, r1, r1, asr #31 326bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r0, r2, r0, asr #31 336bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r1, r3, r1, asr #31 346bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// abs(a) / abs(b) 35647fc7336b2bc302bb51e50022b27bf9b929071cAnton Korobeynikov bl SYMBOL_NAME(__udivsi3) 366bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon// Apply sign of quotient to result and return. 376bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon eor r0, r0, r4, asr #31 386bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon sub r0, r0, r4, asr #31 396bbe0bb0856f7e7cabe11bc0a10c268db034142bStephen Canon CLEAR_FRAME_AND_RETURN 40