123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /* Shift functions for the GCC support library for the MSP430
- Copyright (C) 2011-2022 Free Software Foundation, Inc.
- Contributed by Red Hat.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- GCC is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- Under Section 7 of GPL version 3, you are granted additional
- permissions described in the GCC Runtime Library Exception, version
- 3.1, as published by the Free Software Foundation.
- You should have received a copy of the GNU General Public License and
- a copy of the GCC Runtime Library Exception along with this program;
- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- <http://www.gnu.org/licenses/>. */
- typedef int sint32_type __attribute__ ((mode (SI)));
- typedef unsigned int uint32_type __attribute__ ((mode (SI)));
- typedef int sint16_type __attribute__ ((mode (HI)));
- typedef unsigned int uint16_type __attribute__ ((mode (HI)));
- uint32_type __ashlsi3 (uint32_type, signed char);
- sint32_type __ashrsi3 (sint32_type, signed char);
- int __clrsbhi2 (sint16_type);
- extern int __clrsbsi2 (sint32_type);
- typedef struct
- {
- union
- {
- uint32_type u;
- uint16_type h[2];
- } u;
- } dd;
- uint32_type
- __ashlsi3 (uint32_type in, signed char bit)
- {
- uint16_type h, l;
- dd d;
- if (bit > 32)
- return 0;
- if (bit < 0)
- return in;
- d.u.u = in;
- h = d.u.h[1];
- l = d.u.h[0];
- if (bit > 15)
- {
- h = l;
- l = 0;
- bit -= 16;
- }
- while (bit)
- {
- h = (h << 1) | (l >> 15);
- l <<= 1;
- bit --;
- }
- d.u.h[1] = h;
- d.u.h[0] = l;
- return d.u.u;
- }
- sint32_type
- __ashrsi3 (sint32_type in, signed char bit)
- {
- sint16_type h;
- uint16_type l;
- dd d;
- if (bit > 32)
- return 0;
- if (bit < 0)
- return in;
- d.u.u = in;
- h = d.u.h[1];
- l = d.u.h[0];
- while (bit)
- {
- l = (h << 15) | (l >> 1);
- h >>= 1;
- bit --;
- }
- d.u.h[1] = h;
- d.u.h[0] = l;
- return d.u.u;
- }
- int
- __clrsbhi2 (sint16_type x)
- {
- if (x == 0)
- return 15;
- return __clrsbsi2 ((sint32_type) x) - 16;
- }
|