/* Shift functions for the GCC support library for the Renesas RL78 processors. Copyright (C) 2011-2016 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 . */ 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 in, char bit); sint32_type __ashrsi3 (sint32_type in, char bit); int __clrsbhi2 (sint16_type x); extern int __clrsbsi2 (sint32_type x); typedef struct { union { uint32_type u; uint16_type h[2]; } u; } dd; uint32_type __ashlsi3 (uint32_type in, 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, 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; }