• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023-2025 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
16function And(a: double, b: double): long {
17    return a & b
18}
19
20function Or(a: double, b: double): long {
21    return a | b
22}
23
24function Xor(a: double, b: double): long {
25    return a ^ b
26}
27
28function LeftShift(a: double, b: double): long {
29    return a << b
30}
31
32function RightShift(a: double, b: double): long {
33    return a >> b
34}
35
36function UnsignedRightShift(a: double, b: double): long {
37    return a >>> b
38}
39
40function Inversion(a: double): long {
41    return ~a;
42}
43
44function main(): void {
45    /* ---- Compile time tests ---- */
46
47    // Testing "and" operator:
48    assertEQ((542.910991 & -1903.2040221), 16)
49    assertEQ((-542.910991 & 1903.2040221), 1378)
50    assertEQ((-542.910991 & -1903.2040221), -1920)
51    assertEQ((9E120 & 56.75), 56)
52    assertEQ((0.0 & 0.0), 0)
53    assertEQ((NaN & 42.131330352), 0)
54    assertEQ((-NaN & -23432.34110144432), 0)
55    assertEQ((Infinity & -94.24445985981884), 9223372036854775714)
56    assertEQ((-Infinity & 94.24445985981884), 0)
57
58    // Testing "or" operator:
59    assertEQ((542.910991 | 1903.2040221), 1919)
60    assertEQ((542.910991 | -1903.2040221), -1377)
61    assertEQ((-542.910991 | 1903.2040221), -17)
62    assertEQ((-542.910991 | -1903.2040221), -525)
63    assertEQ((9E120 | 0), 9223372036854775807)
64    assertEQ((824E3 | 21.018763), 824021)
65    assertEQ((1.0 | 0.1), 1)
66    assertEQ((NaN | 0.2), 0)
67    assertEQ((-NaN | 0.3), 0)
68    assertEQ((Infinity | 0.4), 9223372036854775807)
69    assertEQ((-Infinity | 0.5), -9223372036854775808)
70
71    // Testing "xor" operator:
72    assertEQ((542.910991 ^ 1903.2040221), 1393)
73    assertEQ((542.910991 ^ -1903.2040221), -1393)
74    assertEQ((-542.910991 ^ 1903.2040221), -1395)
75    assertEQ((-542.910991 ^ -1903.2040221), 1395)
76    assertEQ((49509.2348100001 ^ 49509.2348100001), 0)
77    assertEQ((9E120 ^ 1.2), 9223372036854775806)
78    assertEQ((824E3 ^ 21.018763), 824021)
79    assertEQ((NaN ^ 99854258.24), 99854258)
80    assertEQ((-NaN ^ 30483040.293244), 30483040)
81    assertEQ((Infinity ^ 1.2), 9223372036854775806)
82    assertEQ((-Infinity ^ 10049329.80001), -9223372036844726479)
83
84    // Testing "left shift" operator:
85    assertEQ((1E-100 << 0.0), 0)
86    assertEQ((0.00003 << 12.13), 0)
87    assertEQ((42.109 << 0.0120939), 42)
88    assertEQ((1.409240940 << 17.3), 131072)
89    assertEQ((4342435.309421 << 3.1), 34739480)
90    assertEQ((9010034745.3449093132 << 7.000000000001), 1153284447360)
91    assertEQ((-423.14981 << 20.32), -443547648)
92    assertEQ((500.13 << 128.3440), 500)
93    assertEQ((500.45 << 121.10000002), -1729382256910270464)
94    assertEQ((NaN << 330.3911), 0)
95    assertEQ((-NaN << 12.91213), 0)
96    assertEQ((Infinity << 1.0092), -2)
97    assertEQ((-Infinity << 1.0092), 0)
98    assertEQ((-52242.2301 << -8.7), -1297036692682702848)
99    assertEQ((52242.2301 << -8.7), 1297036692682702848)
100
101    // Testing "right shift" operator:
102    assertEQ((1E-100 >> 0.0), 0)
103    assertEQ((0.00003 >> 12.13), 0)
104    assertEQ((42.109 >> 0.0120939), 42)
105    assertEQ((1.409240940 >> 17.3), 0)
106    assertEQ((4342435.309421 >> 3.1), 542804)
107    assertEQ((9010034.3449093132 >> 3.000000000001), 1126254)
108    assertEQ((-4599090490.24 >> 11), -2245650)
109    assertEQ((500.13 >> 128.3440), 500)
110    assertEQ((500.45 >> 121.10000002), 0)
111    assertEQ((NaN >> 11.000003), 0)
112    assertEQ((-NaN >> 7.912130001), 0)
113    assertEQ((Infinity >> 61), 3)
114    assertEQ((-Infinity >> 61), -4)
115    assertEQ((132090941883.34343 >> -32.2), 30)
116    assertEQ((-132090941883.34343 >> -32.2), -31)
117
118    // Testing "unsigned right shift" operator:
119    assertEQ((1E-100 >>> 0.0), 0)
120    assertEQ((0.00003 >>> 12.13), 0)
121    assertEQ((42.109 >>> 0.0120939), 42)
122    assertEQ((1.409240940 >>> 17.3), 0)
123    assertEQ((4342435.309421 >>> 3.1), 542804)
124    assertEQ((9010034.3449093132 >>> 3.000000000001), 1126254)
125    assertEQ((-4599090490.24 >>> 11), 9007199252495342)
126    assertEQ((500.13 >>> 128.3440), 500)
127    assertEQ((500.45 >>> 121.10000002), 0)
128    assertEQ((NaN >>> 11.000003), 0)
129    assertEQ((-NaN >>> 7.912130001), 0)
130    assertEQ((Infinity >>> 61.8), 3)
131    assertEQ((-Infinity >>> 61.8), 4)
132    assertEQ((132090941883.34343 >>> -32.2), 30)
133    assertEQ((-132090941883.34343 >>> -32.2), 4294967265)
134
135    // Testing "bitwise complement" operator
136    assertEQ(~0, -1)
137    assertEQ(~0.000034, -1)
138    assertEQ(~39530.93, -39531)
139    assertEQ(~93718001.5424230894, -93718002)
140    assertEQ(~Infinity, -9223372036854775808)
141    assertEQ(~-Infinity, 9223372036854775807)
142    assertEQ(~NaN, -1   )
143    assertEQ(~-NaN, -1)
144    assertEQ(~1E210, -9223372036854775808)
145    assertEQ(~-1E210,  9223372036854775807)
146    assertEQ(~56E5, -5600001)
147    assertEQ(~-56E5, 5599999)
148
149    /* ---- Run time tests ---- */
150
151    // Testing "and" operator:
152    assertEQ(And(542.910991, -1903.2040221), 16)
153    assertEQ(And(-542.910991, 1903.2040221), 1378)
154    assertEQ(And(-542.910991, -1903.2040221), -1920)
155    assertEQ(And(9E120, 56.75), 56)
156    assertEQ(And(0.0, 0.0), 0)
157    assertEQ(And(NaN, 42.131330352), 0)
158    assertEQ(And(-NaN, -23432.34110144432), 0)
159    assertEQ(And(Infinity, -94.24445985981884), 9223372036854775714)
160    assertEQ(And(-Infinity, 94.24445985981884), 0)
161
162    // Testing "or" operator:
163    assertEQ(Or(542.910991, 1903.2040221), 1919)
164    assertEQ(Or(542.910991, -1903.2040221), -1377)
165    assertEQ(Or(-542.910991, 1903.2040221), -17)
166    assertEQ(Or(-542.910991, -1903.2040221), -525)
167    assertEQ(Or(9E120, 0), 9223372036854775807)
168    assertEQ(Or(824E3, 21.018763), 824021)
169    assertEQ(Or(1.0, 0.1), 1)
170    assertEQ(Or(NaN, 0.2), 0)
171    assertEQ(Or(-NaN, 0.3), 0)
172    assertEQ(Or(Infinity, 0.4), 9223372036854775807)
173    assertEQ(Or(-Infinity, 0.5), -9223372036854775808)
174
175    // Testing "xor" operator:
176    assertEQ(Xor(542.910991, 1903.2040221), 1393)
177    assertEQ(Xor(542.910991, -1903.2040221), -1393)
178    assertEQ(Xor(-542.910991, 1903.2040221), -1395)
179    assertEQ(Xor(-542.910991, -1903.2040221), 1395)
180    assertEQ(Xor(49509.2348100001, 49509.2348100001), 0)
181    assertEQ(Xor(9E120, 1.2), 9223372036854775806)
182    assertEQ(Xor(824E3, 21.018763), 824021)
183    assertEQ(Xor(NaN, 99854258.24), 99854258)
184    assertEQ(Xor(-NaN, 30483040.293244), 30483040)
185    assertEQ(Xor(Infinity, 1.2), 9223372036854775806)
186    assertEQ(Xor(-Infinity, 10049329.80001), -9223372036844726479)
187
188    // Testing "left shift" operator:
189    assertEQ(LeftShift(1E-100, 0.0), 0)
190    assertEQ(LeftShift(0.00003, 12.13), 0)
191    assertEQ(LeftShift(42.109, 0.0120939), 42)
192    assertEQ(LeftShift(1.409240940, 17.3), 131072)
193    assertEQ(LeftShift(4342435.309421, 3.1), 34739480)
194    assertEQ(LeftShift(9010034745.3449093132, 7.000000000001), 1153284447360)
195    assertEQ(LeftShift(-423.14981, 20.32), -443547648)
196    assertEQ(LeftShift(500.13, 128.3440), 500)
197    assertEQ(LeftShift(500.45, 121.10000002), -1729382256910270464)
198    assertEQ(LeftShift(NaN, 330.3911), 0)
199    assertEQ(LeftShift(-NaN, 12.91213), 0)
200    assertEQ(LeftShift(Infinity, 1.0092), -2)
201    assertEQ(LeftShift(-Infinity, 1.0092), 0)
202    assertEQ(LeftShift(-52242.2301, -8.7), -1297036692682702848)
203    assertEQ(LeftShift(52242.2301,-8.7), 1297036692682702848)
204
205    // Testing "right shift" operator:
206    assertEQ(RightShift(1E-100, 0.0), 0)
207    assertEQ(RightShift(0.00003, 12.13), 0)
208    assertEQ(RightShift(42.109, 0.0120939), 42)
209    assertEQ(RightShift(1.409240940, 17.3), 0)
210    assertEQ(RightShift(4342435.309421, 3.1), 542804)
211    assertEQ(RightShift(9010034.3449093132, 3.000000000001), 1126254)
212    assertEQ(RightShift(-4599090490.24, 11), -2245650)
213    assertEQ(RightShift(500.13, 128.3440), 500)
214    assertEQ(RightShift(500.45, 121.10000002), 0)
215    assertEQ(RightShift(NaN, 11.000003), 0)
216    assertEQ(RightShift(-NaN, 7.912130001), 0)
217    assertEQ(RightShift(Infinity, 61), 3)
218    assertEQ(RightShift(-Infinity, 61), -4)
219    assertEQ(RightShift(132090941883.34343, -32.2), 30)
220    assertEQ(RightShift(-132090941883.34343, -32.2), -31)
221
222    // Testing "unsigned right shift" operator:
223    assertEQ(UnsignedRightShift(1E-100, 0.0), 0)
224    assertEQ(UnsignedRightShift(0.00003,12.13), 0)
225    assertEQ(UnsignedRightShift(42.109, 0.0120939), 42)
226    assertEQ(UnsignedRightShift(1.409240940, 17.3), 0)
227    assertEQ(UnsignedRightShift(4342435.309421, 3.1), 542804)
228    assertEQ(UnsignedRightShift(9010034.3449093132, 3.000000000001), 1126254)
229    assertEQ(UnsignedRightShift(-4599090490.24, 11), 9007199252495342)
230    assertEQ(UnsignedRightShift(500.13, 128.3440), 500)
231    assertEQ(UnsignedRightShift(500.45, 121.10000002), 0)
232    assertEQ(UnsignedRightShift(NaN, 11.000003), 0)
233    assertEQ(UnsignedRightShift(-NaN, 7.912130001), 0)
234    assertEQ(UnsignedRightShift(Infinity, 61.8), 3)
235    assertEQ(UnsignedRightShift(-Infinity, 61.8), 4)
236    assertEQ(UnsignedRightShift(132090941883.34343, -32.2), 30)
237    assertEQ(UnsignedRightShift(-132090941883.34343, -32.2), 4294967265)
238
239    // Testing "bitwise complement" operator
240    assertEQ(Inversion(0), -1)
241    assertEQ(Inversion(0.000034), -1)
242    assertEQ(Inversion(39530.93), -39531)
243    assertEQ(Inversion(93718001.5424230894), -93718002)
244    assertEQ(Inversion(Infinity), -9223372036854775808)
245    assertEQ(Inversion(-Infinity), 9223372036854775807)
246    assertEQ(Inversion(NaN), -1   )
247    assertEQ(Inversion(-NaN), -1)
248    assertEQ(Inversion(1E210), -9223372036854775808)
249    assertEQ(Inversion(-1E210),  9223372036854775807)
250    assertEQ(Inversion(56E5), -5600001)
251    assertEQ(Inversion(-56E5), 5599999)
252}
253