1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** GUIX Component */
16 /** */
17 /** Utility (Utility) */
18 /** */
19 /**************************************************************************/
20
21 #define GX_SOURCE_CODE
22
23
24 /* Include necessary system files. */
25
26 #include "gx_api.h"
27 #include "gx_utility.h"
28
29
30 static GX_CONST GX_UBYTE sqrt_table[256] = {
31 0x00, 0x10, 0x16, 0x1b, 0x20, 0x23, 0x27, 0x2a, 0x2d, 0x30, 0x32, 0x35, 0x37, 0x39, 0x3b,
32 0x3d, 0x40, 0x41, 0x43, 0x45, 0x47, 0x49, 0x4b, 0x4c, 0x4e, 0x50, 0x51, 0x53, 0x54, 0x56,
33 0x57, 0x59, 0x5a, 0x5b, 0x5d, 0x5e, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68, 0x6a,
34 0x6b, 0x6c, 0x6d, 0x6e, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
35 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
36 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x96,
37 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa0, 0xa1, 0xa2, 0xa3,
38 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac, 0xad, 0xad, 0xae,
39 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb4, 0xb5, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, 0xb9,
40 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbd, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3,
41 0xc3, 0xc4, 0xc5, 0xc5, 0xc6, 0xc7, 0xc7, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcc,
42 0xcd, 0xce, 0xce, 0xcf, 0xd0, 0xd0, 0xd1, 0xd1, 0xd2, 0xd3, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6,
43 0xd6, 0xd7, 0xd7, 0xd8, 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, 0xde, 0xde,
44 0xdf, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe5, 0xe5, 0xe6, 0xe6, 0xe7,
45 0xe7, 0xe8, 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xed, 0xee, 0xee, 0xef,
46 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, 0xf6, 0xf7,
47 0xf7, 0xf8, 0xf8, 0xf9, 0xf9, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, 0xfe, 0xfe,
48 0xff
49 };
50
51
52
53 /**************************************************************************/
54 /* */
55 /* FUNCTION RELEASE */
56 /* */
57 /* _gx_utility_math_sqrt PORTABLE C */
58 /* 6.1 */
59 /* AUTHOR */
60 /* */
61 /* Kenneth Maxwell, Microsoft Corporation */
62 /* */
63 /* DESCRIPTION */
64 /* */
65 /* This service computes the square root of the supplied value. */
66 /* */
67 /* INPUT */
68 /* */
69 /* value Value to compute square */
70 /* root of */
71 /* */
72 /* OUTPUT */
73 /* */
74 /* square_root Square root of supplied value */
75 /* */
76 /* CALLS */
77 /* */
78 /* None */
79 /* */
80 /* CALLED BY */
81 /* */
82 /* Application Code */
83 /* */
84 /* RELEASE HISTORY */
85 /* */
86 /* DATE NAME DESCRIPTION */
87 /* */
88 /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
89 /* 09-30-2020 Kenneth Maxwell Modified comment(s), */
90 /* resulting in version 6.1 */
91 /* */
92 /**************************************************************************/
93
_gx_utility_math_sqrt(UINT value)94 UINT _gx_utility_math_sqrt(UINT value)
95 {
96 UINT square_root;
97
98 if (value >= 0x7FFEA810)
99 {
100 square_root = 0xB504;
101 }
102 else if (value >= 0x1000000)
103 {
104 if (value >= 0x40000000)
105 {
106 square_root = (UINT)sqrt_table[value >> 24] << 8;
107 }
108 else if (value >= 0x10000000)
109 {
110 square_root = (UINT)sqrt_table[value >> 22] << 7;
111 }
112 else if (value >= 0x4000000)
113 {
114 square_root = (UINT)sqrt_table[value >> 20] << 6;
115 }
116 else
117 {
118 square_root = (UINT)sqrt_table[value >> 18] << 5;
119 }
120
121 square_root = (square_root + 1 + (value / square_root)) >> 1;
122 square_root = (square_root + 1 + (value / square_root)) >> 1;
123 }
124 else if (value >= 0x10000)
125 {
126 if (value >= 0x400000)
127 {
128 square_root = (UINT)sqrt_table[value >> 16] << 4;
129 }
130 else if (value >= 0x100000)
131 {
132 square_root = (UINT)sqrt_table[value >> 14] << 3;
133 }
134 else if (value >= 0x40000)
135 {
136 square_root = (UINT)sqrt_table[value >> 12] << 2;
137 }
138 else
139 {
140 square_root = (UINT)sqrt_table[value >> 10] << 1;
141 }
142
143 square_root = (square_root + 1 + (value / square_root)) >> 1;
144 }
145 else
146 {
147 if (value >= 0x4000)
148 {
149 square_root = (UINT)(sqrt_table[value >> 8]) + 1;
150 }
151 else if (value >= 0x1000)
152 {
153 square_root = (UINT)(sqrt_table[value >> 6] >> 1) + 1;
154 }
155 else if (value >= 0x400)
156 {
157 square_root = (UINT)(sqrt_table[value >> 4] >> 2) + 1;
158 }
159 else if (value >= 0x100)
160 {
161 square_root = (UINT)(sqrt_table[value >> 2] >> 3) + 1;
162 }
163 else
164 {
165 square_root = sqrt_table[value] >> 4;
166 }
167 }
168
169 if ((square_root * square_root) > value)
170 {
171 square_root--;
172 }
173
174 return square_root;
175 }
176
177