linux/arch/m68k/lib/lshrdi3.c
<<
>>
Prefs
   1/* lshrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */
   2/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
   3
   4This file is part of GNU CC.
   5
   6GNU CC is free software; you can redistribute it and/or modify
   7it under the terms of the GNU General Public License as published by
   8the Free Software Foundation; either version 2, or (at your option)
   9any later version.
  10
  11GNU CC is distributed in the hope that it will be useful,
  12but WITHOUT ANY WARRANTY; without even the implied warranty of
  13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14GNU General Public License for more details. */
  15
  16#include <linux/compiler.h>
  17#include <linux/export.h>
  18
  19#define BITS_PER_UNIT 8
  20
  21typedef          int SItype     __mode(SI);
  22typedef unsigned int USItype    __mode(SI);
  23typedef          int DItype     __mode(DI);
  24typedef int word_type           __mode(__word__);
  25
  26struct DIstruct {SItype high, low;};
  27
  28typedef union
  29{
  30  struct DIstruct s;
  31  DItype ll;
  32} DIunion;
  33
  34DItype
  35__lshrdi3 (DItype u, word_type b)
  36{
  37  DIunion w;
  38  word_type bm;
  39  DIunion uu;
  40
  41  if (b == 0)
  42    return u;
  43
  44  uu.ll = u;
  45
  46  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
  47  if (bm <= 0)
  48    {
  49      w.s.high = 0;
  50      w.s.low = (USItype)uu.s.high >> -bm;
  51    }
  52  else
  53    {
  54      USItype carries = (USItype)uu.s.high << bm;
  55      w.s.high = (USItype)uu.s.high >> b;
  56      w.s.low = ((USItype)uu.s.low >> b) | carries;
  57    }
  58
  59  return w.ll;
  60}
  61EXPORT_SYMBOL(__lshrdi3);
  62