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