123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- /* compiler-rt.c - compiler helpers. */
- /*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010-2014 Free Software Foundation, Inc.
- *
- * GRUB 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 of the License, or
- * (at your option) any later version.
- *
- * GRUB 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
- */
- #include <grub/misc.h>
- #include <grub/compiler-rt.h>
- #ifndef GRUB_EMBED_DECOMPRESSOR
- void * GRUB_BUILTIN_ATTR
- memcpy (void *dest, const void *src, grub_size_t n)
- {
- return grub_memmove (dest, src, n);
- }
- void * GRUB_BUILTIN_ATTR
- memmove (void *dest, const void *src, grub_size_t n)
- {
- return grub_memmove (dest, src, n);
- }
- int GRUB_BUILTIN_ATTR
- memcmp (const void *s1, const void *s2, grub_size_t n)
- {
- return grub_memcmp (s1, s2, n);
- }
- void * GRUB_BUILTIN_ATTR
- memset (void *s, int c, grub_size_t n)
- {
- return grub_memset (s, c, n);
- }
- #ifdef __APPLE__
- void GRUB_BUILTIN_ATTR
- __bzero (void *s, grub_size_t n)
- {
- grub_memset (s, 0, n);
- }
- #endif
- #if GRUB_DIVISION_IN_SOFTWARE
- grub_uint32_t
- __udivsi3 (grub_uint32_t a, grub_uint32_t b)
- {
- return grub_divmod64 (a, b, 0);
- }
- grub_int32_t
- __divsi3 (grub_int32_t a, grub_int32_t b)
- {
- return grub_divmod64s (a, b, 0);
- }
- grub_uint32_t
- __umodsi3 (grub_uint32_t a, grub_uint32_t b)
- {
- grub_uint64_t ret;
- grub_divmod64 (a, b, &ret);
- return ret;
- }
- grub_int32_t
- __modsi3 (grub_int32_t a, grub_int32_t b)
- {
- grub_int64_t ret;
- grub_divmod64s (a, b, &ret);
- return ret;
- }
- grub_uint64_t
- __udivdi3 (grub_uint64_t a, grub_uint64_t b)
- {
- return grub_divmod64 (a, b, 0);
- }
- grub_uint64_t
- __umoddi3 (grub_uint64_t a, grub_uint64_t b)
- {
- grub_uint64_t ret;
- grub_divmod64 (a, b, &ret);
- return ret;
- }
- grub_int64_t
- __divdi3 (grub_int64_t a, grub_int64_t b)
- {
- return grub_divmod64s (a, b, 0);
- }
- grub_int64_t
- __moddi3 (grub_int64_t a, grub_int64_t b)
- {
- grub_int64_t ret;
- grub_divmod64s (a, b, &ret);
- return ret;
- }
- #endif
- #endif
- #ifdef NEED_CTZDI2
- unsigned
- __ctzdi2 (grub_uint64_t x)
- {
- unsigned ret = 0;
- if (!x)
- return 64;
- if (!(x & 0xffffffff))
- {
- x >>= 32;
- ret |= 32;
- }
- if (!(x & 0xffff))
- {
- x >>= 16;
- ret |= 16;
- }
- if (!(x & 0xff))
- {
- x >>= 8;
- ret |= 8;
- }
- if (!(x & 0xf))
- {
- x >>= 4;
- ret |= 4;
- }
- if (!(x & 0x3))
- {
- x >>= 2;
- ret |= 2;
- }
- if (!(x & 0x1))
- {
- x >>= 1;
- ret |= 1;
- }
- return ret;
- }
- #endif
- #ifdef NEED_CTZSI2
- unsigned
- __ctzsi2 (grub_uint32_t x)
- {
- unsigned ret = 0;
- if (!x)
- return 32;
- if (!(x & 0xffff))
- {
- x >>= 16;
- ret |= 16;
- }
- if (!(x & 0xff))
- {
- x >>= 8;
- ret |= 8;
- }
- if (!(x & 0xf))
- {
- x >>= 4;
- ret |= 4;
- }
- if (!(x & 0x3))
- {
- x >>= 2;
- ret |= 2;
- }
- if (!(x & 0x1))
- {
- x >>= 1;
- ret |= 1;
- }
- return ret;
- }
- #endif
- #if (defined (__MINGW32__) || defined (__CYGWIN__))
- void __register_frame_info (void)
- {
- }
- void __deregister_frame_info (void)
- {
- }
- void ___chkstk_ms (void)
- {
- }
- void __chkstk_ms (void)
- {
- }
- #endif
- union component64
- {
- grub_uint64_t full;
- struct
- {
- #ifdef GRUB_CPU_WORDS_BIGENDIAN
- grub_uint32_t high;
- grub_uint32_t low;
- #else
- grub_uint32_t low;
- grub_uint32_t high;
- #endif
- };
- };
- #if defined (__powerpc__) || defined (__arm__) || defined(__mips__) || \
- (defined(__riscv) && (__riscv_xlen == 32))
- /* Based on libgcc2.c from gcc suite. */
- grub_uint64_t
- __lshrdi3 (grub_uint64_t u, int b)
- {
- if (b == 0)
- return u;
- const union component64 uu = {.full = u};
- const int bm = 32 - b;
- union component64 w;
- if (bm <= 0)
- {
- w.high = 0;
- w.low = (grub_uint32_t) uu.high >> -bm;
- }
- else
- {
- const grub_uint32_t carries = (grub_uint32_t) uu.high << bm;
- w.high = (grub_uint32_t) uu.high >> b;
- w.low = ((grub_uint32_t) uu.low >> b) | carries;
- }
- return w.full;
- }
- /* Based on libgcc2.c from gcc suite. */
- grub_uint64_t
- __ashrdi3 (grub_uint64_t u, int b)
- {
- if (b == 0)
- return u;
- const union component64 uu = {.full = u};
- const int bm = 32 - b;
- union component64 w;
- if (bm <= 0)
- {
- /* w.high = 1..1 or 0..0 */
- w.high = ((grub_int32_t) uu.high) >> (32 - 1);
- w.low = ((grub_int32_t) uu.high) >> -bm;
- }
- else
- {
- const grub_uint32_t carries = ((grub_uint32_t) uu.high) << bm;
- w.high = ((grub_int32_t) uu.high) >> b;
- w.low = ((grub_uint32_t) uu.low >> b) | carries;
- }
- return w.full;
- }
- /* Based on libgcc2.c from gcc suite. */
- grub_uint64_t
- __ashldi3 (grub_uint64_t u, int b)
- {
- if (b == 0)
- return u;
- const union component64 uu = {.full = u};
- const int bm = 32 - b;
- union component64 w;
- if (bm <= 0)
- {
- w.low = 0;
- w.high = (grub_uint32_t) uu.low << -bm;
- }
- else
- {
- const grub_uint32_t carries = (grub_uint32_t) uu.low >> bm;
- w.low = (grub_uint32_t) uu.low << b;
- w.high = ((grub_uint32_t) uu.high << b) | carries;
- }
- return w.full;
- }
- /* Based on libgcc2.c from gcc suite. */
- int
- __ucmpdi2 (grub_uint64_t a, grub_uint64_t b)
- {
- union component64 ac, bc;
- ac.full = a;
- bc.full = b;
- if (ac.high < bc.high)
- return 0;
- else if (ac.high > bc.high)
- return 2;
- if (ac.low < bc.low)
- return 0;
- else if (ac.low > bc.low)
- return 2;
- return 1;
- }
- #endif
- #if defined (__powerpc__) || defined(__mips__) || defined(__sparc__) || \
- defined(__arm__) || defined(__riscv)
- /* Based on libgcc2.c from gcc suite. */
- grub_uint32_t
- __bswapsi2 (grub_uint32_t u)
- {
- return ((((u) & 0xff000000) >> 24)
- | (((u) & 0x00ff0000) >> 8)
- | (((u) & 0x0000ff00) << 8)
- | (((u) & 0x000000ff) << 24));
- }
- /* Based on libgcc2.c from gcc suite. */
- grub_uint64_t
- __bswapdi2 (grub_uint64_t u)
- {
- return ((((u) & 0xff00000000000000ull) >> 56)
- | (((u) & 0x00ff000000000000ull) >> 40)
- | (((u) & 0x0000ff0000000000ull) >> 24)
- | (((u) & 0x000000ff00000000ull) >> 8)
- | (((u) & 0x00000000ff000000ull) << 8)
- | (((u) & 0x0000000000ff0000ull) << 24)
- | (((u) & 0x000000000000ff00ull) << 40)
- | (((u) & 0x00000000000000ffull) << 56));
- }
- #endif
- #ifdef __arm__
- grub_uint32_t
- __aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
- __attribute__ ((alias ("__udivsi3")));
- grub_int32_t
- __aeabi_idiv (grub_int32_t a, grub_int32_t b)
- __attribute__ ((alias ("__divsi3")));
- void *__aeabi_memcpy (void *dest, const void *src, grub_size_t n)
- __attribute__ ((alias ("grub_memcpy")));
- void *__aeabi_memcpy4 (void *dest, const void *src, grub_size_t n)
- __attribute__ ((alias ("grub_memcpy")));
- void *__aeabi_memcpy8 (void *dest, const void *src, grub_size_t n)
- __attribute__ ((alias ("grub_memcpy")));
- void *__aeabi_memset (void *s, int c, grub_size_t n)
- __attribute__ ((alias ("memset")));
- void
- __aeabi_memclr (void *s, grub_size_t n)
- {
- grub_memset (s, 0, n);
- }
- void __aeabi_memclr4 (void *s, grub_size_t n)
- __attribute__ ((alias ("__aeabi_memclr")));
- void __aeabi_memclr8 (void *s, grub_size_t n)
- __attribute__ ((alias ("__aeabi_memclr")));
- int
- __aeabi_ulcmp (grub_uint64_t a, grub_uint64_t b)
- {
- return __ucmpdi2 (a, b) - 1;
- }
- grub_uint64_t
- __aeabi_lasr (grub_uint64_t u, int b)
- __attribute__ ((alias ("__ashrdi3")));
- grub_uint64_t
- __aeabi_llsr (grub_uint64_t u, int b)
- __attribute__ ((alias ("__lshrdi3")));
- grub_uint64_t
- __aeabi_llsl (grub_uint64_t u, int b)
- __attribute__ ((alias ("__ashldi3")));
- #endif
- #if defined(__mips__) || defined(__riscv) || defined(__sparc__)
- /* Based on libgcc from gcc suite. */
- int
- __clzsi2 (grub_uint32_t val)
- {
- int i = 32;
- int j = 16;
- int temp;
- for (; j; j >>= 1)
- {
- if ((temp = val >> j))
- {
- if (j == 1)
- {
- return (i - 2);
- }
- else
- {
- i -= j;
- val = temp;
- }
- }
- }
- return (i - val);
- }
- #endif
- #if defined(__mips__) || defined(__riscv) || defined(__sparc__)
- int
- __clzdi2 (grub_uint64_t val)
- {
- if (val >> 32)
- {
- return __clzsi2 (val >> 32);
- }
- else
- {
- return __clzsi2 (val) + 32;
- }
- }
- #endif
|