1353358Sdim//===-- modsi3.S - 32-bit signed integer modulus --------------------------===// 2353358Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6353358Sdim// 7353358Sdim//===----------------------------------------------------------------------===// 8353358Sdim// 9353358Sdim// This file implements the __modsi3 (32-bit signed integer modulus) function 10353358Sdim// for the ARM architecture as a wrapper around the unsigned routine. 11353358Sdim// 12353358Sdim//===----------------------------------------------------------------------===// 13276789Sdim 14276789Sdim#include "../assembly.h" 15276789Sdim 16276789Sdim#define ESTABLISH_FRAME \ 17276789Sdim push {r4, r7, lr} ;\ 18276789Sdim add r7, sp, #4 19276789Sdim#define CLEAR_FRAME_AND_RETURN \ 20276789Sdim pop {r4, r7, pc} 21276789Sdim 22276789Sdim .syntax unified 23276789Sdim .text 24327952Sdim DEFINE_CODE_STATE 25276789Sdim 26276789Sdim@ int __modsi3(int divident, int divisor) 27276789Sdim@ Calculate and return the remainder of the (signed) division. 28276789Sdim 29276789Sdim .p2align 3 30276789SdimDEFINE_COMPILERRT_FUNCTION(__modsi3) 31276789Sdim#if __ARM_ARCH_EXT_IDIV__ 32276789Sdim tst r1, r1 33276789Sdim beq LOCAL_LABEL(divzero) 34276789Sdim sdiv r2, r0, r1 35276789Sdim mls r0, r2, r1, r0 36276789Sdim bx lr 37276789SdimLOCAL_LABEL(divzero): 38276789Sdim mov r0, #0 39276789Sdim bx lr 40276789Sdim#else 41276789Sdim ESTABLISH_FRAME 42276789Sdim // Set aside the sign of the dividend. 43276789Sdim mov r4, r0 44276789Sdim // Take absolute value of a and b via abs(x) = (x^(x >> 31)) - (x >> 31). 45276789Sdim eor r2, r0, r0, asr #31 46276789Sdim eor r3, r1, r1, asr #31 47276789Sdim sub r0, r2, r0, asr #31 48276789Sdim sub r1, r3, r1, asr #31 49276789Sdim // abs(a) % abs(b) 50276789Sdim bl SYMBOL_NAME(__umodsi3) 51276789Sdim // Apply sign of dividend to result and return. 52276789Sdim eor r0, r0, r4, asr #31 53276789Sdim sub r0, r0, r4, asr #31 54276789Sdim CLEAR_FRAME_AND_RETURN 55276789Sdim#endif 56276789SdimEND_COMPILERRT_FUNCTION(__modsi3) 57309124Sdim 58309124SdimNO_EXEC_STACK_DIRECTIVE 59309124Sdim 60