diff options
Diffstat (limited to 'arch/m68k/lib/ashldi3.c')
-rw-r--r-- | arch/m68k/lib/ashldi3.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/arch/m68k/lib/ashldi3.c b/arch/m68k/lib/ashldi3.c new file mode 100644 index 0000000000..be197da81e --- /dev/null +++ b/arch/m68k/lib/ashldi3.c @@ -0,0 +1,50 @@ +/* + * ashldi3.c extracted from gcc-2.7.2.3/libgcc2.c and + * gcc-2.7.2.3/longlong.h + * + * Copyright (C) 1989-2015 Free Software Foundation, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#define BITS_PER_UNIT 8 + +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef int DItype __attribute__ ((mode (DI))); +typedef int word_type __attribute__ ((mode (__word__))); + +struct DIstruct {SItype high, low;}; + +typedef union +{ + struct DIstruct s; + DItype ll; +} DIunion; + +DItype __ashldi3 (DItype u, word_type b) +{ + DIunion w; + word_type bm; + DIunion uu; + + if (b == 0) + return u; + + uu.ll = u; + + bm = (sizeof (SItype) * BITS_PER_UNIT) - b; + if (bm <= 0) + { + w.s.low = 0; + w.s.high = (USItype)uu.s.low << -bm; + } + else + { + USItype carries = (USItype)uu.s.low >> bm; + w.s.low = (USItype)uu.s.low << b; + w.s.high = ((USItype)uu.s.high << b) | carries; + } + + return w.ll; +}
\ No newline at end of file |