1/* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16// Gcc lib-helpers: 17#ifdef __arm__ 18// NOLINTBEGIN(readability-identifier-naming, misc-definitions-in-headers) 19 20// defined in libgcc_s.so 21extern "C" uint64_t __aeabi_uldivmod(uint64_t numerator, uint64_t denominator); 22extern "C" int64_t __aeabi_ldivmod(int64_t numerator, int64_t denominator); 23 24extern "C" uint32_t __aeabi_uidivmod(uint32_t numerator, uint32_t denominator); 25extern "C" int32_t __aeabi_idivmod(int32_t numerator, int32_t denominator); 26 27extern "C" float __aeabi_l2f(int64_t data); 28extern "C" float __aeabi_ul2f(uint64_t data); 29extern "C" double __aeabi_l2d(int64_t data); 30extern "C" double __aeabi_ul2d(uint64_t data); 31 32extern "C" int64_t __aeabi_f2lz(float data); 33extern "C" uint64_t __aeabi_f2ulz(float data); 34extern "C" int64_t __aeabi_d2lz(double data); 35extern "C" uint64_t __aeabi_d2ulz(double data); 36 37// NOLINTEND(readability-identifier-naming, misc-definitions-in-headers) 38#else 39struct DivLUResult { 40 uint64_t quotient; 41 uint64_t remainder; 42}; 43 44struct DivLSResult { 45 int64_t quotient; 46 int64_t remainder; 47}; 48 49// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 50DivLUResult __aeabi_uldivmod(uint64_t numerator, uint64_t denominator) 51{ 52 ASSERT(denominator != 0); 53 DivLUResult res {0, 0}; 54 res.quotient = numerator / denominator; 55 res.remainder = numerator % denominator; 56 return res; 57} 58// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 59DivLSResult __aeabi_ldivmod(int64_t numerator, int64_t denominator) 60{ 61 ASSERT(denominator != 0); 62 DivLSResult res {0, 0}; 63 res.quotient = numerator / denominator; 64 res.remainder = numerator % denominator; 65 return res; 66} 67 68struct DivUResult { 69 uint32_t quotient; 70 uint32_t remainder; 71}; 72 73struct DivSResult { 74 int32_t quotient; 75 int32_t remainder; 76}; 77 78// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 79DivUResult __aeabi_uidivmod(uint32_t numerator, uint32_t denominator) 80{ 81 ASSERT(denominator != 0); 82 DivUResult res {0, 0}; 83 res.quotient = numerator / denominator; 84 res.remainder = numerator % denominator; 85 return res; 86} 87// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 88DivSResult __aeabi_idivmod(int32_t numerator, int32_t denominator) 89{ 90 ASSERT(denominator != 0); 91 DivSResult res {0, 0}; 92 res.quotient = numerator / denominator; 93 res.remainder = numerator % denominator; 94 return res; 95} 96 97// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 98float __aeabi_l2f(int64_t data) 99{ 100 return static_cast<float>(data); 101} 102 103// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 104float __aeabi_ul2f(uint64_t data) 105{ 106 return static_cast<float>(data); 107} 108 109// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 110double __aeabi_l2d(int64_t data) 111{ 112 return static_cast<double>(data); 113} 114 115// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 116double __aeabi_ul2d(uint64_t data) 117{ 118 return static_cast<double>(data); 119} 120 121// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 122int64_t __aeabi_f2lz(float data) 123{ 124 return static_cast<int64_t>(data); 125} 126 127// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 128uint64_t __aeabi_f2ulz(float data) 129{ 130 return static_cast<uint64_t>(data); 131} 132 133// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 134int64_t __aeabi_d2lz(double data) 135{ 136 return static_cast<int64_t>(data); 137} 138 139// NOLINTNEXTLINE(readability-identifier-naming,misc-definitions-in-headers) 140uint64_t __aeabi_d2ulz(double data) 141{ 142 return static_cast<uint64_t>(data); 143} 144#endif 145 146// defined in libm.so, fmodf function from math.h 147extern "C" float fmodf(float a, float b); // NOLINT(misc-definitions-in-headers,readability-identifier-naming) 148// defined in libm.so, fmod function from math.h 149extern "C" double fmod(double a, double b); // NOLINT(misc-definitions-in-headers,readability-identifier-naming) 150