diff --git a/config/templates/exosphere.mk b/config/templates/exosphere.mk index 27bd718b..bb994cb8 100644 --- a/config/templates/exosphere.mk +++ b/config/templates/exosphere.mk @@ -43,7 +43,7 @@ export CXXWRAPS := -Wl,--wrap,__cxa_pure_virtual \ -Wl,--wrap,_ZSt20__throw_length_errorPKc \ -Wl,--wrap,_ZNSt11logic_errorC2EPKc -export LIBS := -l$(LIBEXOSPHERE_NAME) +export LIBS := -l$(LIBEXOSPHERE_NAME) -lgcc #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/libexosphere/source/libc/libgcc_division.arch.arm.c b/libexosphere/source/libc/libgcc_division.arch.arm.c deleted file mode 100644 index d9e86177..00000000 --- a/libexosphere/source/libc/libgcc_division.arch.arm.c +++ /dev/null @@ -1,260 +0,0 @@ -// SPDX-License-Identifier: BSD-2-Clause -/* - * Copyright (c) 2014, STMicroelectronics International N.V. - */ - -/* - * Form ABI specifications: - * int __aeabi_idiv(int numerator, int denominator); - * unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator); - * - * typedef struct { int quot; int rem; } idiv_return; - * typedef struct { unsigned quot; unsigned rem; } uidiv_return; - * - * __value_in_regs idiv_return __aeabi_idivmod(int numerator, - * int *denominator); - * __value_in_regs uidiv_return __aeabi_uidivmod(unsigned *numerator, - * unsigned denominator); - */ - -#ifdef __cplusplus -extern "C" { -#endif - - -/* struct qr - stores qutient/remainder to handle divmod EABI interfaces. */ -struct qr { - unsigned q; /* computed quotient */ - unsigned r; /* computed remainder */ - unsigned q_n; /* specficies if quotient shall be negative */ - unsigned r_n; /* specficies if remainder shall be negative */ -}; - -static void uint_div_qr(unsigned numerator, unsigned denominator, - struct qr *qr); - -/* returns in R0 and R1 by tail calling an asm function */ -unsigned __aeabi_uidivmod(unsigned numerator, unsigned denominator); - -unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator); - -/* returns in R0 and R1 by tail calling an asm function */ -signed __aeabi_idivmod(signed numerator, signed denominator); - -signed __aeabi_idiv(signed numerator, signed denominator); - -/* - * __ste_idivmod_ret_t __aeabi_idivmod(signed numerator, signed denominator) - * Numerator and Denominator are received in R0 and R1. - * Where __ste_idivmod_ret_t is returned in R0 and R1. - * - * __ste_uidivmod_ret_t __aeabi_uidivmod(unsigned numerator, - * unsigned denominator) - * Numerator and Denominator are received in R0 and R1. - * Where __ste_uidivmod_ret_t is returned in R0 and R1. - */ -#ifdef __GNUC__ -signed ret_idivmod_values(signed quotient, signed remainder); -unsigned ret_uidivmod_values(unsigned quotient, unsigned remainder); -#else -#error "Compiler not supported" -#endif - -static void division_qr(unsigned n, unsigned p, struct qr *qr) -{ - unsigned i = 1, q = 0; - if (p == 0) { - qr->r = 0xFFFFFFFF; /* division by 0 */ - return; - } - - while ((p >> 31) == 0) { - i = i << 1; /* count the max division steps */ - p = p << 1; /* increase p until it has maximum size*/ - } - - while (i > 0) { - q = q << 1; /* write bit in q at index (size-1) */ - if (n >= p) - { - n -= p; - q++; - } - p = p >> 1; /* decrease p */ - i = i >> 1; /* decrease remaining size in q */ - } - qr->r = n; - qr->q = q; -} - -static void uint_div_qr(unsigned numerator, unsigned denominator, struct qr *qr) -{ - - division_qr(numerator, denominator, qr); - - /* negate quotient and/or remainder according to requester */ - if (qr->q_n) - qr->q = -qr->q; - if (qr->r_n) - qr->r = -qr->r; -} - -unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator) -{ - struct qr qr = { .q_n = 0, .r_n = 0 }; - - uint_div_qr(numerator, denominator, &qr); - - return qr.q; -} - -unsigned __aeabi_uidivmod(unsigned numerator, unsigned denominator) -{ - struct qr qr = { .q_n = 0, .r_n = 0 }; - - uint_div_qr(numerator, denominator, &qr); - - return ret_uidivmod_values(qr.q, qr.r); -} - -signed __aeabi_idiv(signed numerator, signed denominator) -{ - struct qr qr = { .q_n = 0, .r_n = 0 }; - - if (((numerator < 0) && (denominator > 0)) || - ((numerator > 0) && (denominator < 0))) - qr.q_n = 1; /* quotient shall be negate */ - if (numerator < 0) { - numerator = -numerator; - qr.r_n = 1; /* remainder shall be negate */ - } - if (denominator < 0) - denominator = -denominator; - - uint_div_qr(numerator, denominator, &qr); - - return qr.q; -} - -signed __aeabi_idivmod(signed numerator, signed denominator) -{ - struct qr qr = { .q_n = 0, .r_n = 0 }; - - if (((numerator < 0) && (denominator > 0)) || - ((numerator > 0) && (denominator < 0))) - qr.q_n = 1; /* quotient shall be negate */ - if (numerator < 0) { - numerator = -numerator; - qr.r_n = 1; /* remainder shall be negate */ - } - if (denominator < 0) - denominator = -denominator; - - uint_div_qr(numerator, denominator, &qr); - - return ret_idivmod_values(qr.q, qr.r); -} - -/* struct lqr - stores qutient/remainder to handle divmod EABI interfaces. */ -struct lqr { - unsigned long long q; /* computed quotient */ - unsigned long long r; /* computed remainder */ - unsigned q_n; /* specficies if quotient shall be negative */ - unsigned r_n; /* specficies if remainder shall be negative */ -}; - -static void ul_div_qr(unsigned long long numerator, - unsigned long long denominator, struct lqr *qr); - - -static void division_lqr(unsigned long long n, unsigned long long p, - struct lqr *qr) -{ - unsigned long long i = 1, q = 0; - if (p == 0) { - qr->r = 0xFFFFFFFFFFFFFFFFULL; /* division by 0 */ - return; - } - - while ((p >> 63) == 0) { - i = i << 1; /* count the max division steps */ - p = p << 1; /* increase p until it has maximum size*/ - } - - while (i > 0) { - q = q << 1; /* write bit in q at index (size-1) */ - if (n >= p) { - n -= p; - q++; - } - p = p >> 1; /* decrease p */ - i = i >> 1; /* decrease remaining size in q */ - } - qr->r = n; - qr->q = q; -} - -static void ul_div_qr(unsigned long long numerator, - unsigned long long denominator, struct lqr *qr) -{ - - division_lqr(numerator, denominator, qr); - - /* negate quotient and/or remainder according to requester */ - if (qr->q_n) - qr->q = -qr->q; - if (qr->r_n) - qr->r = -qr->r; -} - -struct asm_ulqr { - unsigned long long v0; - unsigned long long v1; -}; - -/* called from assembly function __aeabi_uldivmod */ -void __ul_divmod(struct asm_ulqr *asm_ulqr); -void __ul_divmod(struct asm_ulqr *asm_ulqr) -{ - unsigned long long numerator = asm_ulqr->v0; - unsigned long long denominator = asm_ulqr->v1; - struct lqr qr = { .q_n = 0, .r_n = 0 }; - - ul_div_qr(numerator, denominator, &qr); - - asm_ulqr->v0 = qr.q; - asm_ulqr->v1 = qr.r; -} - -struct asm_lqr { - long long v0; - long long v1; -}; - -/* called from assembly function __aeabi_ldivmod */ -void __l_divmod(struct asm_lqr *asm_lqr); -void __l_divmod(struct asm_lqr *asm_lqr) -{ - long long numerator = asm_lqr->v0; - long long denominator = asm_lqr->v1; - struct lqr qr = { .q_n = 0, .r_n = 0 }; - - if (((numerator < 0) && (denominator > 0)) || - ((numerator > 0) && (denominator < 0))) - qr.q_n = 1; /* quotient shall be negate */ - if (numerator < 0) { - numerator = -numerator; - qr.r_n = 1; /* remainder shall be negate */ - } - if (denominator < 0) - denominator = -denominator; - - ul_div_qr(numerator, denominator, &qr); - - asm_lqr->v0 = qr.q; - asm_lqr->v1 = qr.r; -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif \ No newline at end of file diff --git a/libexosphere/source/libc/libgcc_division_asm.arch.arm.s b/libexosphere/source/libc/libgcc_division_asm.arch.arm.s deleted file mode 100644 index bfa0a750..00000000 --- a/libexosphere/source/libc/libgcc_division_asm.arch.arm.s +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (c) 2014, STMicroelectronics International N.V. - */ - -/* - * signed ret_idivmod_values(signed quot, signed rem); - * return quotient and remaining the EABI way (regs r0,r1) - */ -.section .text.ret_idivmod_values, "ax", %progbits -.globl ret_idivmod_values -.align 0 -.syntax unified -ret_idivmod_values: - bx lr -.type ret_idivmod_values, %function -.size ret_idivmod_values, .-ret_idivmod_values - -/* - * unsigned ret_uidivmod_values(unsigned quot, unsigned rem); - * return quotient and remaining the EABI way (regs r0,r1) - */ -.section .text.ret_uidivmod_values, "ax", %progbits -.globl ret_uidivmod_values -.align 0 -.syntax unified -ret_uidivmod_values: - bx lr -.type ret_uidivmod_values, %function -.size ret_uidivmod_values, .-ret_uidivmod_values - -/* - * __value_in_regs lldiv_t __aeabi_ldivmod( long long n, long long d) - */ -.section .text.__aeabi_ldivmod, "ax", %progbits -.globl __aeabi_ldivmod -.align 0 -.syntax unified -__aeabi_ldivmod: - push {ip, lr} - push {r0-r3} - mov r0, sp - bl __l_divmod - pop {r0-r3} - pop {ip, lr} - bx lr - -.type __aeabi_ldivmod, %function -.size __aeabi_ldivmod, .-__aeabi_ldivmod - -/* - * __value_in_regs ulldiv_t __aeabi_uldivmod( - * unsigned long long n, unsigned long long d) - */ -.section .text.__aeabi_uldivmod , "ax", %progbits -.globl __aeabi_uldivmod -.align 0 -.syntax unified -__aeabi_uldivmod : - push {ip, lr} - push {r0-r3} - mov r0, sp - bl __ul_divmod - pop {r0-r3} - pop {ip, lr} - bx lr - -.type __aeabi_uldivmod, %function -.size __aeabi_uldivmod, .-__aeabi_uldivmod diff --git a/libexosphere/source/libc/libgcc_thumb_case.arch.arm.s b/libexosphere/source/libc/libgcc_thumb_case.arch.arm.s deleted file mode 100644 index 36f61525..00000000 --- a/libexosphere/source/libc/libgcc_thumb_case.arch.arm.s +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 1995-2018 Free Software Foundation, Inc. -This file 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. -This file 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 -. */ - - -.section .text.__gnu_thumb1_case_uqi, "ax", %progbits -.globl __gnu_thumb1_case_uqi -.align 0 -.thumb_func -.syntax unified -__gnu_thumb1_case_uqi: - push {r1} - mov r1, lr - lsrs r1, r1, #1 - lsls r1, r1, #1 - ldrb r1, [r1, r0] - lsls r1, r1, #1 - add lr, lr, r1 - pop {r1} - bx lr -.type __gnu_thumb1_case_uqi, %function -.size __gnu_thumb1_case_uqi, .-__gnu_thumb1_case_uqi - -.section .text.__gnu_thumb1_case_uhi, "ax", %progbits -.globl __gnu_thumb1_case_uhi -.align 0 -.thumb_func -.syntax unified -__gnu_thumb1_case_uhi: - push {r0, r1} - mov r1, lr - lsrs r1, r1, #1 - lsls r0, r0, #1 - lsls r1, r1, #1 - ldrh r1, [r1, r0] - lsls r1, r1, #1 - add lr, lr, r1 - pop {r0, r1} - bx lr -.type __gnu_thumb1_case_uhi, %function -.size __gnu_thumb1_case_uhi, .-__gnu_thumb1_case_uhi - -.section .text.__gnu_thumb1_case_si, "ax", %progbits -.globl __gnu_thumb1_case_si -.align 0 -.thumb_func -.syntax unified -__gnu_thumb1_case_si: - push {r0, r1} - mov r1, lr - adds.n r1, r1, #2 - lsrs r1, r1, #2 - lsls r0, r0, #2 - lsls r1, r1, #2 - ldr r0, [r1, r0] - adds r0, r0, r1 - mov lr, r0 - pop {r0, r1} - bx lr -.type __gnu_thumb1_case_si, %function -.size __gnu_thumb1_case_si, .-__gnu_thumb1_case_si - -.section .text.__gnu_thumb1_case_shi, "ax", %progbits -.globl __gnu_thumb1_case_shi -.align 0 -.thumb_func -.syntax unified -__gnu_thumb1_case_shi: - push {r0, r1} - mov r1, lr - lsrs r1, r1, #1 - lsls r0, r0, #1 - lsls r1, r1, #1 - ldrsh r1, [r1, r0] - lsls r1, r1, #1 - add lr, lr, r1 - pop {r0, r1} - bx lr -.type __gnu_thumb1_case_shi, %function -.size __gnu_thumb1_case_shi, .-__gnu_thumb1_case_shi - -.section .text.__gnu_thumb1_case_sqi, "ax", %progbits -.globl __gnu_thumb1_case_sqi -.align 0 -.thumb_func -.syntax unified -__gnu_thumb1_case_sqi: - push {r1} - mov r1, lr - lsrs r1, r1, #1 - lsls r1, r1, #1 - ldrsb r1, [r1, r0] - lsls r1, r1, #1 - add lr, lr, r1 - pop {r1} - bx lr -.type __gnu_thumb1_case_sqi, %function -.size __gnu_thumb1_case_sqi, .-__gnu_thumb1_case_sqi