xref: /netbsd-src/external/gpl3/gcc.old/dist/libgcc/config/msp430/lib2divSI.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg /* SI mode divide routines for libgcc for MSP430
2*8feb0f0bSmrg    Copyright (C) 2012-2020 Free Software Foundation, Inc.
336ac495dSmrg    Contributed by Red Hat.
436ac495dSmrg 
536ac495dSmrg    This file is part of GCC.
636ac495dSmrg 
736ac495dSmrg    GCC is free software; you can redistribute it and/or modify it
836ac495dSmrg    under the terms of the GNU General Public License as published
936ac495dSmrg    by the Free Software Foundation; either version 3, or (at your
1036ac495dSmrg    option) any later version.
1136ac495dSmrg 
1236ac495dSmrg    GCC is distributed in the hope that it will be useful, but WITHOUT
1336ac495dSmrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1436ac495dSmrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1536ac495dSmrg    License for more details.
1636ac495dSmrg 
1736ac495dSmrg    Under Section 7 of GPL version 3, you are granted additional
1836ac495dSmrg    permissions described in the GCC Runtime Library Exception, version
1936ac495dSmrg    3.1, as published by the Free Software Foundation.
2036ac495dSmrg 
2136ac495dSmrg    You should have received a copy of the GNU General Public License and
2236ac495dSmrg    a copy of the GCC Runtime Library Exception along with this program;
2336ac495dSmrg    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2436ac495dSmrg    <http://www.gnu.org/licenses/>.  */
2536ac495dSmrg 
2636ac495dSmrg typedef          int  sint32_type   __attribute__ ((mode (SI)));
2736ac495dSmrg typedef unsigned int  uint32_type   __attribute__ ((mode (SI)));
2836ac495dSmrg typedef          int  sint16_type   __attribute__ ((mode (HI)));
2936ac495dSmrg typedef unsigned int  uint16_type   __attribute__ ((mode (HI)));
3036ac495dSmrg typedef          int  sint08_type   __attribute__ ((mode (QI)));
3136ac495dSmrg typedef unsigned int  uint08_type   __attribute__ ((mode (QI)));
3236ac495dSmrg typedef int           word_type     __attribute__ ((mode (__word__)));
3336ac495dSmrg 
3436ac495dSmrg #define C3B(a,b,c) a##b##c
3536ac495dSmrg #define C3(a,b,c) C3B(a,b,c)
3636ac495dSmrg 
3736ac495dSmrg #define UINT_TYPE	uint32_type
3836ac495dSmrg #define SINT_TYPE	sint32_type
3936ac495dSmrg #define BITS_MINUS_1	31
4036ac495dSmrg #define NAME_MODE	si
4136ac495dSmrg 
4236ac495dSmrg #include "msp430-divmod.h"
4336ac495dSmrg 
4436ac495dSmrg /* ---------------------------------------------------------------------*/
4536ac495dSmrg 
4636ac495dSmrg /* There is a typo in the MSP430 ABI document.  It calls the unsigned
4736ac495dSmrg    long integer division function __mspabi_divlu when it should be
4836ac495dSmrg    __mspabi_divul.  Likewise the unsigned long long integer division
4936ac495dSmrg    function is called __mspabi_divllu when it should be __mspabi_divull.
5036ac495dSmrg 
5136ac495dSmrg    Earlier versions of this toolchain used generate the ABI compliant
5236ac495dSmrg    names, so in order to support object files built with those tools
5336ac495dSmrg    we provide stub functions that call the correct routines.  */
5436ac495dSmrg 
5536ac495dSmrg asm (".global __mspabi_divlu\n\
5636ac495dSmrg          .set __mspabi_divlu, __mspabi_divul");
5736ac495dSmrg 
5836ac495dSmrg /* We cannot use the same trick for __mspabi_divllu as that is defined
5936ac495dSmrg    in a different file.  Instead we create a stub here.  The cost of
6036ac495dSmrg    executing the branch instruction will be trivial compared to the
6136ac495dSmrg    cost of executing a long long division.  */
6236ac495dSmrg 
6336ac495dSmrg #ifdef __MSP430X_LARGE__
6436ac495dSmrg asm (".global __mspabi_divllu\n\
6536ac495dSmrg       __mspabi_divllu:\n\
6636ac495dSmrg            BRA #__mspabi_divull");
6736ac495dSmrg #else
6836ac495dSmrg asm (".global __mspabi_divllu\n\
6936ac495dSmrg       __mspabi_divllu:\n\
7036ac495dSmrg            BR #__mspabi_divull");
7136ac495dSmrg #endif
72