1 #include <stdio.h>
2 #include "pico/stdlib.h"
3 
4 static int rc=0;
5 
6 typedef uint32_t ui32;
7 typedef uint64_t ui64;
8 
9 extern ui64 __aeabi_dadd(ui64, ui64);
10 extern ui64 __aeabi_dsub(ui64, ui64);
11 extern ui64 __aeabi_dmul(ui64, ui64);
12 extern ui64 ddiv_fast(ui64, ui64);
13 extern ui64 sqrt_fast(ui64);
14 
15 #define m33cf_dadd __aeabi_dadd
16 #define m33cf_dsub __aeabi_dsub
17 #define m33cf_dmul __aeabi_dmul
18 #define m33cf_ddiv_fast ddiv_fast
19 #define m33cf_dsqrt_fast sqrt_fast
checkf(ui32 r,ui32 t)20 static void checkf(ui32 r,ui32 t) {
21     static int n=0;
22     if(r!=t) {
23         printf("M33CF test F%d: expected %08x got %08x\n",n,t,r);
24         rc=-1;
25     }
26     n++;
27 }
28 
checkd(ui64 r,ui64 t)29 static void checkd(ui64 r,ui64 t) {
30     static int n=0;
31     if(r!=t) {
32         printf("M33CF test D%d: expected %08x%08x got %08x%08x\n",
33                n,
34                (ui32)(t>>32),(ui32)t,
35                (ui32)(r>>32),(ui32)r);
36         rc=-1;
37     }
38     n++;
39 }
40 
main()41 int main() {
42     stdio_init_all();
43     puts("M33CF function test\n");
44 
45 #if 0
46     checkf(m33cf_fadd(0x4d3c3e6f,0x7617944a),0x7617944a);
47     checkf(m33cf_fadd(0x67819fdb,0xe6225dcc),0x675aa843);
48     checkf(m33cf_fadd(0x3c9a71a0,0x22d538f1),0x3c9a71a0);
49     checkf(m33cf_fadd(0xc37ab23a,0x825141a3),0xc37ab23a);
50     checkf(m33cf_fadd(0x98586bf0,0x17d915be),0x97d7c222);
51     checkf(m33cf_fadd(0x69572e49,0x4e650317),0x69572e49);
52     checkf(m33cf_fadd(0xa67b6fbc,0x266be0aa),0xa478f120);
53     checkf(m33cf_fadd(0x01d100ff,0xf3a2011c),0xf3a2011c);
54     checkf(m33cf_fadd(0x01f9ed0f,0x81130914),0x01b06885);
55     checkf(m33cf_fadd(0xb2ce6eb7,0x325aff32),0xb241de3c);
56     checkf(m33cf_fsub(0xc8c2cfa1,0xaca3309c),0xc8c2cfa1);
57     checkf(m33cf_fsub(0xe1e2656e,0x311fb841),0xe1e2656e);
58     checkf(m33cf_fsub(0xbb5b7ea5,0x2e393a3c),0xbb5b7ea5);
59     checkf(m33cf_fsub(0x04047b97,0x07c5cd1a),0x87c4c423);
60     checkf(m33cf_fsub(0xda4c2f9b,0xda13370e),0xd963e234);
61     checkf(m33cf_fsub(0x06325a1d,0xd9ccae75),0x59ccae75);
62     checkf(m33cf_fsub(0x001f6b55,0x71efb885),0xf1efb885);
63     checkf(m33cf_fsub(0x3eafa278,0x7d3bc3af),0xfd3bc3af);
64     checkf(m33cf_fsub(0xe8203c86,0x3d93556b),0xe8203c86);
65     checkf(m33cf_fsub(0xa5f8dbf1,0xc3f00090),0x43f00090);
66     checkf(m33cf_fmul(0x8009dc76,0x7cb46e28),0x80000000);
67     checkf(m33cf_fmul(0x2e3ba1b3,0x0fa7a191),0x00000000);
68     checkf(m33cf_fmul(0xf0c99917,0xf0c7ff9a),0x7f800000);
69     checkf(m33cf_fmul(0x41b2a69c,0xc14000be),0xc385fd7a);
70     checkf(m33cf_fmul(0x765c15f1,0x0aad9b08),0x4195401c);
71     checkf(m33cf_fmul(0xea3a2755,0xcc8ba580),0x774b1767);
72     checkf(m33cf_fmul(0xe0368e14,0xbdc000de),0x5e88eb2d);
73     checkf(m33cf_fmul(0x832fe859,0x8217ff9f),0x00000000);
74     checkf(m33cf_fmul(0x00f19200,0xe3752d1a),0xa4e75b49);
75     checkf(m33cf_fmul(0x42d1061e,0x63a8a510),0x6709b2ca);
76     checkf(m33cf_fdiv_fast(0xbe891ac7,0x779000b4),0x8673bca3);
77     checkf(m33cf_fdiv_fast(0x06cd4e3a,0x8075c830),0xff800000);
78     checkf(m33cf_fdiv_fast(0x1fca4821,0x9f084021),0xc03e0865);
79     checkf(m33cf_fdiv_fast(0x036f1348,0x715ba87b),0x00000000);
80     checkf(m33cf_fdiv_fast(0x403c6064,0xbe000057),0xc1bc5fe4);
81     checkf(m33cf_fdiv_fast(0x009bf1e5,0xbe5000a0),0x81bfee10);
82     checkf(m33cf_fdiv_fast(0x507bac6d,0x946acd7e),0xfb89326b);
83     checkf(m33cf_fdiv_fast(0x0810656a,0x880448ea),0xbf8bb812);
84     checkf(m33cf_fdiv_fast(0x16e368e6,0x965dc974),0xc0033ebf);
85     checkf(m33cf_fdiv_fast(0x72a7e095,0x6ba01097),0x46863f59);
86     checkf(m33cf_fadd(0x83e2ed1d,0x00d5c831),0x83df95fc);
87     checkf(m33cf_fadd(0xe4ddd608,0xb9587489),0xe4ddd608);
88     checkf(m33cf_fadd(0x6f337823,0xc0679a9f),0x6f337823);
89     checkf(m33cf_fadd(0x49a367e6,0x3f4679ba),0x49a367ec);
90     checkf(m33cf_fadd(0xd1307f4d,0xaf17b226),0xd1307f4d);
91     checkf(m33cf_fadd(0xbdf2106c,0x49a6a874),0x49a6a873);
92     checkf(m33cf_fadd(0xf3eacf1b,0x52634887),0xf3eacf1b);
93     checkf(m33cf_fadd(0x6f33647b,0x0442ab37),0x6f33647b);
94     checkf(m33cf_fadd(0x4cdb9e7a,0x7d301bff),0x7d301bff);
95     checkf(m33cf_fadd(0x4e1abca7,0x57441d4c),0x57441d73);
96     checkf(m33cf_fsub(0x8391af63,0xfee57d3d),0x7ee57d3d);
97     checkf(m33cf_fsub(0x2508aef8,0x1bd43e41),0x2508aedd);
98     checkf(m33cf_fsub(0x47fe76b7,0x9131d5b0),0x47fe76b7);
99     checkf(m33cf_fsub(0x5d3119e5,0xd16c2f47),0x5d3119e6);
100     checkf(m33cf_fsub(0xe39f668c,0x1f0dabef),0xe39f668c);
101     checkf(m33cf_fsub(0x1e6d2035,0x3bdab1d6),0xbbdab1d6);
102     checkf(m33cf_fsub(0xb5fde6fa,0x1a379480),0xb5fde6fa);
103     checkf(m33cf_fsub(0x225bb239,0xfeff8ff3),0x7eff8ff3);
104     checkf(m33cf_fsub(0x844054a3,0x2122b279),0xa122b279);
105     checkf(m33cf_fsub(0x5a04757e,0x56caed2b),0x5a02dfa4);
106     checkf(m33cf_fmul(0x4cb93c51,0xd3c0275f),0xe10b09ba);
107     checkf(m33cf_fmul(0x3f390c21,0x64abdb95),0x647873a6);
108     checkf(m33cf_fmul(0x56bd6b48,0x04a56d68),0x1bf4ce32);
109     checkf(m33cf_fmul(0xa3367c5f,0x59e18108),0xbda0bf4a);
110     checkf(m33cf_fmul(0x55939e8d,0x29b3443a),0x3fcebe68);
111     checkf(m33cf_fmul(0xd9fe416a,0x4e18e879),0xe897ddba);
112     checkf(m33cf_fmul(0x4c0712bd,0xfe8f0d4e),0xff800000);
113     checkf(m33cf_fmul(0xbdcb53f9,0x7b5292ea),0xf9a73f92);
114     checkf(m33cf_fmul(0x290fc5cc,0x8d7fcbed),0x80000000);
115     checkf(m33cf_fmul(0x98abd414,0x595cce6e),0xb29434d0);
116     checkf(m33cf_fdiv_fast(0x19fec05d,0x198926d6),0x3fedc0ae);
117     checkf(m33cf_fdiv_fast(0xd3f6c6ef,0xeb89ccae),0x27e53a49);
118     checkf(m33cf_fdiv_fast(0xe929f69d,0x5dd3860a),0xcacdb375);
119     checkf(m33cf_fdiv_fast(0xceef0386,0x3a2a3aa2),0xd433b89f);
120     checkf(m33cf_fdiv_fast(0xf3e76a98,0x859a5a67),0x7f800000);
121     checkf(m33cf_fdiv_fast(0x2ade013a,0x42dbe607),0x278139dc);
122     checkf(m33cf_fdiv_fast(0x7676da5e,0x48e1ff79),0x6d0bcfd4);
123     checkf(m33cf_fdiv_fast(0x42a137e4,0x5c054bdf),0x261ad000);
124     checkf(m33cf_fdiv_fast(0x358e8442,0x4a4c7e5a),0x2ab269aa);
125     checkf(m33cf_fdiv_fast(0xf72429ca,0xdc475d3a),0x5a52cc93);
126     checkf(m33cf_fsqrt_fast(0xc100dc14),0xffc00000);
127     checkf(m33cf_fsqrt_fast(0x2a2eaa04),0x34d374f7);
128     checkf(m33cf_fsqrt_fast(0x6e9ff12a),0x570f151a);
129     checkf(m33cf_fsqrt_fast(0xae37c4b7),0xffc00000);
130     checkf(m33cf_fsqrt_fast(0x47584a58),0x436b4f1d);
131     checkf(m33cf_fsqrt_fast(0xebca1f1e),0xffc00000);
132     checkf(m33cf_fsqrt_fast(0xba92914d),0xffc00000);
133     checkf(m33cf_fsqrt_fast(0xdb304a6d),0xffc00000);
134     checkf(m33cf_fsqrt_fast(0x92a72ec1),0xffc00000);
135     checkf(m33cf_fsqrt_fast(0x936f9320),0xffc00000);
136 #endif
137 
138     checkd(m33cf_dadd(0x000000fc75a5900aULL,0x5bc7667ff4f5aed4ULL),0x5bc7667ff4f5aed4ULL);
139     checkd(m33cf_dadd(0x3b795f9a7971afcaULL,0x3b795f7a89f1afcaULL),0x3b895f8a81b1afcaULL);
140     checkd(m33cf_dadd(0x800c3012be12e063ULL,0x0007ffffffffffb2ULL),0x0000000000000000ULL);
141     checkd(m33cf_dadd(0xf2ebeaef727ecb8cULL,0xe919ba322b0d6abeULL),0xf2ebeaef727ecb8cULL);
142     checkd(m33cf_dadd(0xf318c8542dbf290fULL,0x7318c84fdc68b825ULL),0xf1f14559c3a80000ULL);
143     checkd(m33cf_dadd(0xe9cafb8dc44950d0ULL,0x000081e7baa8971aULL),0xe9cafb8dc44950d0ULL);
144     checkd(m33cf_dadd(0xffb51396c4a74144ULL,0x0006ec693b58bedeULL),0xffb51396c4a74144ULL);
145     checkd(m33cf_dadd(0x8cb46a68a3f226a7ULL,0xb73c729a98a91e3cULL),0xb73c729a98a91e3cULL);
146     checkd(m33cf_dadd(0x16d2eaf7f2850dc1ULL,0x96d2cf06aaf78c08ULL),0x165bf1478d81b900ULL);
147     checkd(m33cf_dadd(0x7fecab31e7006bc2ULL,0xffec71829182845fULL),0x7f7cd7aabef3b180ULL);
148     checkd(m33cf_dsub(0x7fe80001bfc46633ULL,0xc01c0000dfe2337aULL),0x7fe80001bfc46633ULL);
149     checkd(m33cf_dsub(0x956bc258e14cf502ULL,0x956bc257257e217bULL),0x942bbced38700000ULL);
150     checkd(m33cf_dsub(0x1304f931164a0dc4ULL,0x1c3725edf809d211ULL),0x9c3725edf809d211ULL);
151     checkd(m33cf_dsub(0x8cb8000dd190a395ULL,0x4ae40006e8c85189ULL),0xcae40006e8c85189ULL);
152     checkd(m33cf_dsub(0x800000304a84d45aULL,0x0c32000000000026ULL),0x8c32000000000026ULL);
153     checkd(m33cf_dsub(0xf2b4699998abeef8ULL,0xeb07d9b004a574ddULL),0xf2b4699998abeef8ULL);
154     checkd(m33cf_dsub(0x3fdfe7b9d8d1dbffULL,0x800d7094d9d8d639ULL),0x3fdfe7b9d8d1dbffULL);
155     checkd(m33cf_dsub(0xb4e058de3e8b4acaULL,0x803f94b600000001ULL),0xb4e058de3e8b4acaULL);
156     checkd(m33cf_dsub(0x8ddfdbe97e292ab1ULL,0x4b9c6fda25efa7e6ULL),0xcb9c6fda25efa7e6ULL);
157     checkd(m33cf_dsub(0x9cfebf98a0150dc2ULL,0x1cceb5d8a0150dc3ULL),0x9d014b29da0bd7bdULL);
158     checkd(m33cf_dmul(0x7eee03dd737c3204ULL,0xc19afd2262fa8aa9ULL),0xfff0000000000000ULL);
159     checkd(m33cf_dmul(0x80760ca8a50d4410ULL,0x807512348901231bULL),0x0000000000000000ULL);
160     checkd(m33cf_dmul(0x7ca0d01a0450b53dULL,0x7ca0cf355c70652fULL),0x7ff0000000000000ULL);
161     checkd(m33cf_dmul(0x0ea698eb5b8a7c9eULL,0x0d0fffffffffff0fULL),0x0000000000000000ULL);
162     checkd(m33cf_dmul(0xba4565707f05766dULL,0x2c5e39f11066eb37ULL),0xa6b435d75666263eULL);
163     checkd(m33cf_dmul(0xf2cd3698d8928584ULL,0x8ba3e96d6434a1b9ULL),0x3e822d8426f335d6ULL);
164     checkd(m33cf_dmul(0x7b386a737bf6693dULL,0xfff70000000000ecULL),0xffff0000000000ecULL);
165     checkd(m33cf_dmul(0x407f0007866747d5ULL,0xe0408003c333a303ULL),0xe0cff80f0cd052ebULL);
166     checkd(m33cf_dmul(0x8142be0e6bff63ceULL,0x8135ac3ae2fe4078ULL),0x0000000000000000ULL);
167     checkd(m33cf_dmul(0x4d1f3420ca65f2baULL,0x8000282866063841ULL),0x8000000000000000ULL);
168     checkd(m33cf_ddiv_fast(0x94885bb8363252b5ULL,0x9484cbb8363252b6ULL),0x3ff2bdae4b39ea58ULL);
169     checkd(m33cf_ddiv_fast(0x7112caa0922ef96aULL,0x7112c703422ef96aULL),0x3ff0031472b5f708ULL);
170     checkd(m33cf_ddiv_fast(0x803795fc115579cfULL,0x00251828182845f3ULL),0xc001e3ca5352423eULL);
171     checkd(m33cf_ddiv_fast(0x9098cf9d1d63a8a6ULL,0x0000bce378acc9edULL),0xfff0000000000000ULL);
172     checkd(m33cf_ddiv_fast(0x76eb74d4755d9e90ULL,0x56da74d4755d9e40ULL),0x60009ad22a263295ULL);
173     checkd(m33cf_ddiv_fast(0xb7ac4ff81ab5acd6ULL,0x3770052042a6f0c2ULL),0xc02c46e8ee4dcde4ULL);
174     checkd(m33cf_ddiv_fast(0x9f7b7105213fc016ULL,0x9f7b7105206fc017ULL),0x3ff00000007946b7ULL);
175     checkd(m33cf_ddiv_fast(0x155302277af2c615ULL,0x0052a52fdf6ae145ULL),0x54f04fc7152639a7ULL);
176     checkd(m33cf_ddiv_fast(0x55544fdcabf6c324ULL,0x7f398c80174fa929ULL),0x160970d87e92ac22ULL);
177     checkd(m33cf_ddiv_fast(0x92a415a76b37d7d2ULL,0x0200640000000000ULL),0xd0939b1df01b2df3ULL);
178     checkd(m33cf_dadd(0x3dd4731301475eafULL,0xde02f10226d652e5ULL),0xde02f10226d652e5ULL);
179     checkd(m33cf_dadd(0x1a031fc739b5b31cULL,0xe23b24be4b0200bfULL),0xe23b24be4b0200bfULL);
180     checkd(m33cf_dadd(0x4baad04027dc41beULL,0xefe184a8db9b5e28ULL),0xefe184a8db9b5e28ULL);
181     checkd(m33cf_dadd(0xa97a312516d84984ULL,0xe87c4e53da594b0bULL),0xe87c4e53da594b0bULL);
182     checkd(m33cf_dadd(0x65f94cdbf4e1655bULL,0xeb08d78147a5fa0cULL),0xeb08d78147a5fa0cULL);
183     checkd(m33cf_dadd(0xd758e560b9f8515eULL,0x40167af8bfabbfc8ULL),0xd758e560b9f8515eULL);
184     checkd(m33cf_dadd(0x3177a00dd7f30cfaULL,0x14ce136ab4488ffbULL),0x3177a00dd7f30cfaULL);
185     checkd(m33cf_dadd(0xe2de834ef78df600ULL,0xe9709814970e2cb1ULL),0xe9709814970e2cb1ULL);
186     checkd(m33cf_dadd(0x88ad647a702f0bedULL,0x2c0af4057a3c4795ULL),0x2c0af4057a3c4795ULL);
187     checkd(m33cf_dadd(0xb7dd95bbcbfdd773ULL,0x531893debd8fbf97ULL),0x531893debd8fbf97ULL);
188     checkd(m33cf_dsub(0x7ba38f5e7b843460ULL,0xf0b3823de05b22b4ULL),0x7ba38f5e7b843460ULL);
189     checkd(m33cf_dsub(0xee5169f2e74a0f18ULL,0xd501efe1254788b3ULL),0xee5169f2e74a0f18ULL);
190     checkd(m33cf_dsub(0x69a4707a9a0e8faeULL,0xb2f0883420b659dbULL),0x69a4707a9a0e8faeULL);
191     checkd(m33cf_dsub(0x427f8d2ef8b19474ULL,0x3a5d0ad508f37fedULL),0x427f8d2ef8b19474ULL);
192     checkd(m33cf_dsub(0x32a9c51a3d565d85ULL,0x86600a23c10b178aULL),0x32a9c51a3d565d85ULL);
193     checkd(m33cf_dsub(0x07dac3387f06fa0cULL,0x5c733002a61b620dULL),0xdc733002a61b620dULL);
194     checkd(m33cf_dsub(0x43d6c9f6fdb3d1b3ULL,0xba69f6160840b2b1ULL),0x43d6c9f6fdb3d1b3ULL);
195     checkd(m33cf_dsub(0x4293bb41f9808440ULL,0x2482605096e85ffeULL),0x4293bb41f9808440ULL);
196     checkd(m33cf_dsub(0x83337a590422130bULL,0x7a45cb63b68f1999ULL),0xfa45cb63b68f1999ULL);
197     checkd(m33cf_dsub(0x122533912d6612c9ULL,0x1b08519e5f8f78b5ULL),0x9b08519e5f8f78b5ULL);
198     checkd(m33cf_dmul(0xd0bd40b470b385cdULL,0xabfa84fccb01cb46ULL),0x3cc83e249b03d547ULL);
199     checkd(m33cf_dmul(0x740cc7981c80fddaULL,0x90c53fcc12a6a097ULL),0xc4e31c5c4f5c9ba4ULL);
200     checkd(m33cf_dmul(0x43290fa64e05e998ULL,0xad4bb7fa2bb564b9ULL),0xb085b549bd618756ULL);
201     checkd(m33cf_dmul(0xf8fd9c8c9b0bd944ULL,0x4f4a1743e96370a8ULL),0xfff0000000000000ULL);
202     checkd(m33cf_dmul(0x0c3cdfc8888b644fULL,0x43223d92356f971eULL),0x0f70756f504cf5dcULL);
203     checkd(m33cf_dmul(0x640b87064cb6c260ULL,0x5d9aabe9efed6024ULL),0x7ff0000000000000ULL);
204     checkd(m33cf_dmul(0x8718f6339a5eb7d5ULL,0x5d05b556aad4f81aULL),0xa430ef060c1c1204ULL);
205     checkd(m33cf_dmul(0xd2325605b52e4bbaULL,0x21bef3dbb44cb312ULL),0xb401bc60793a2186ULL);
206     checkd(m33cf_dmul(0xa1e31fb000c8768eULL,0x6d10072a62a042f7ULL),0xcf03284086d8733fULL);
207     checkd(m33cf_dmul(0xc787a9a862f5b946ULL,0xcbdeeaeafe6b567dULL),0x5376dcc440db5e02ULL);
208     checkd(m33cf_ddiv_fast(0xd1ab78cc3a53310bULL,0x871b22cc627440ffULL),0x7ff0000000000000ULL);
209     checkd(m33cf_ddiv_fast(0x8c64d3beb627c82bULL,0x8ec3d33d99470d80ULL),0x3d90cf03611e44bcULL);
210     checkd(m33cf_ddiv_fast(0xf6bfb08f555b9642ULL,0x51560ce4365f67a5ULL),0xe556fe91c490804dULL);
211     checkd(m33cf_ddiv_fast(0xe2a556ddbf80d538ULL,0x48808e2d782a9962ULL),0xda149f9aa72e3465ULL);
212     checkd(m33cf_ddiv_fast(0x9646a0875dd00eb0ULL,0x579f2c0d32efbfc3ULL),0x8000000000000000ULL);
213     checkd(m33cf_ddiv_fast(0x4eb970540e932394ULL,0xc9bc823d173ca6deULL),0xc4ec8dd8577f1941ULL);
214     checkd(m33cf_ddiv_fast(0x26492979e5664695ULL,0x082cff680d6d2530ULL),0x5e0bc467714a1337ULL);
215     checkd(m33cf_ddiv_fast(0x12db696de9340939ULL,0xe5632c6e98de9cc0ULL),0x8000000000000000ULL);
216     checkd(m33cf_ddiv_fast(0x4af31aa7075beb9dULL,0x13f5ee839770ee58ULL),0x76ebdfd4cfc4635bULL);
217     checkd(m33cf_ddiv_fast(0x3e62ca75a07c1ac2ULL,0xb048d234e122da6dULL),0xce0839c35d7657d1ULL);
218     checkd(m33cf_dsqrt_fast(0x56d82e2279837d7bULL),0x4b63ab5aaabcb779ULL);
219     checkd(m33cf_dsqrt_fast(0xfc6998b66a2a51deULL),0xfff8000000000000ULL);
220     checkd(m33cf_dsqrt_fast(0x2c0cc3149408dcc9ULL),0x35fe567d3c418723ULL);
221     checkd(m33cf_dsqrt_fast(0x1f71e22e323600e6ULL),0x2fb0ea62598ef070ULL);
222     checkd(m33cf_dsqrt_fast(0x71a6cf9286fdea03ULL),0x58cb047c625fe761ULL);
223     checkd(m33cf_dsqrt_fast(0x307b55796f027243ULL),0x3834e9a8788bda68ULL);
224     checkd(m33cf_dsqrt_fast(0x10518d57b7b32094ULL),0x2820c212d75b45adULL);
225     checkd(m33cf_dsqrt_fast(0x85d55765699fc337ULL),0xfff8000000000000ULL);
226     checkd(m33cf_dsqrt_fast(0x030a70b7171e4c51ULL),0x217d166dff1d7836ULL);
227     checkd(m33cf_dsqrt_fast(0x5284145a8007521fULL),0x493959345ef6a420ULL);
228 
229     if(rc==0) puts("Pass");
230     else      puts("Fail");
231 }
232