• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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