Mac OS 9
vBigNum.h
Go to the documentation of this file.
1 
19 #ifndef __VBIGNUM__
20 #define __VBIGNUM__
21 
22 #ifndef __CONDITIONALMACROS__
23 #include <ConditionalMacros.h>
24 #endif
25 
26 #if PRAGMA_ONCE
27 #pragma once
28 #endif
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 #if PRAGMA_IMPORT
36 #pragma import on
37 #endif
38 
39 #if PRAGMA_STRUCT_ALIGN
40 #pragma options align = mac68k
41 #elif PRAGMA_STRUCT_PACKPUSH
42 #pragma pack(push, 2)
43 #elif PRAGMA_STRUCT_PACK
44 #pragma pack(2)
45 #endif
46 
47 #ifdef __VEC__
48  /*************************************************************************************
49  * *
50  * This library provides a set of subroutines for basic algebraic and some
51  *logical * operations performed on operands with the following sizes: *
52  * *
53  * 128 - bits * 256 - bits * 512 - bits * 1024 - bits *
54  * *
55  * Following basic and algebraic operations are included: *
56  * *
57  * Addition * Subtraction * Multiplication * Division * Mod * Shift
58  *Right * Shift Right
59  *Arithmatic * Shift Left *
60  * Rotate Right * Rotate Left *
61  * *
62  * *
63  ************************************************************************************/
64  /************************************************************************************
65  * Following abbreviations are used in the names of functions in this library:
66  **
67  * *
68  * v Vector * U Unsigned * S Signed * 128
69  *128 - bit * 256 256 -
70  *bit * 512 512 -
71  *bit * 1024 1024 -
72  *bit * Add Addition,
73  *modular arithmetic * AddS Addition
74  *with Saturation * Sub Subtraction,
75  *modular arithmetic * SubS Subtraction
76  *with Saturation * Multiply Multiplication *
77  * Divide Division * Half Half (multiplication, width of
78  *result is the same as width of * operands) * Full Full
79  *(multiplication, width of result is twice width of each * operand) *
80  * *
81  * Mod Modular operation * Neg Negate a number * A
82  *Algebraic * LL Logical
83  *Left * LR Logical
84  *Right * Shift Shift *
85  * Rotate Rotation *
86  * *
87  ***********************************************************************************/
88  /*************************************************************************************
89  * *
90  * A few explanations for the choices made in naming, passing arguments, and *
91  * various functions. *
92  * *
93  * 1) Names for the functions are made compatible with the names used in
94  *the * vBasicOps library. The format of the names are the same and include a
95  ** designation to show a vector operation, then a symbol for the type of data *
96  * (signed or unsigned), followed by the size of operands, then the
97  *operation * performed. *
98  * *
99  * 2) Note that the logical and arithmetic shiftLeft operation are the
100  *same. *
101  * *
102  * 3) Rotate operation is performed on unsigned and signed numbers. *
103  * *
104  ************************************************************************************/
105 
106  /*************************************************************************************
107  * *
108  * Following are a set of structures for vector data types and scalar data
109  *types *
110  * *
111  ************************************************************************************/
112 
113  union vU128
114  {
115  vector unsigned int v;
116  struct
117  {
118  unsigned long MSW;
119  unsigned long d2;
120  unsigned long d3;
121  unsigned long LSW;
122  } s;
123  };
124  typedef union vU128 vU128;
125  union vS128
126  {
127  vector unsigned int v;
128  struct
129  {
130  signed long MSW;
131  unsigned long d2;
132  unsigned long d3;
133  unsigned long LSW;
134  } s;
135  };
136  typedef union vS128 vS128;
137  union vU256
138  {
139  vector unsigned int v[2];
140  struct
141  {
142  unsigned long MSW;
143  unsigned long d2;
144  unsigned long d3;
145  unsigned long d4;
146  unsigned long d5;
147  unsigned long d6;
148  unsigned long d7;
149  unsigned long LSW;
150  } s;
151  };
152  typedef union vU256 vU256;
153  union vS256
154  {
155  vector unsigned int v[2];
156  struct
157  {
158  signed long MSW;
159  unsigned long d2;
160  unsigned long d3;
161  unsigned long d4;
162  unsigned long d5;
163  unsigned long d6;
164  unsigned long d7;
165  unsigned long LSW;
166  } s;
167  };
168  typedef union vS256 vS256;
169  union vU512
170  {
171  vector unsigned int v[4];
172  struct
173  {
174  unsigned long MSB;
175  unsigned long d2;
176  unsigned long d3;
177  unsigned long d4;
178  unsigned long d5;
179  unsigned long d6;
180  unsigned long d7;
181  unsigned long d8;
182  unsigned long d9;
183  unsigned long d10;
184  unsigned long d11;
185  unsigned long d12;
186  unsigned long d13;
187  unsigned long d14;
188  unsigned long d15;
189  unsigned long LSB;
190  } s;
191  };
192  typedef union vU512 vU512;
193  union vS512
194  {
195  vector unsigned int v[4];
196  struct
197  {
198  signed long MSW;
199  unsigned long d2;
200  unsigned long d3;
201  unsigned long d4;
202  unsigned long d5;
203  unsigned long d6;
204  unsigned long d7;
205  unsigned long d8;
206  unsigned long d9;
207  unsigned long d10;
208  unsigned long d11;
209  unsigned long d12;
210  unsigned long d13;
211  unsigned long d14;
212  unsigned long d15;
213  unsigned long LSW;
214  } s;
215  };
216  typedef union vS512 vS512;
217  union vU1024
218  {
219  vector unsigned int v[8];
220  struct
221  {
222  unsigned long MSW;
223  unsigned long d2;
224  unsigned long d3;
225  unsigned long d4;
226  unsigned long d5;
227  unsigned long d6;
228  unsigned long d7;
229  unsigned long d8;
230  unsigned long d9;
231  unsigned long d10;
232  unsigned long d11;
233  unsigned long d12;
234  unsigned long d13;
235  unsigned long d14;
236  unsigned long d15;
237  unsigned long d16;
238  unsigned long d17;
239  unsigned long d18;
240  unsigned long d19;
241  unsigned long d20;
242  unsigned long d21;
243  unsigned long d22;
244  unsigned long d23;
245  unsigned long d24;
246  unsigned long d25;
247  unsigned long d26;
248  unsigned long d27;
249  unsigned long d28;
250  unsigned long d29;
251  unsigned long d30;
252  unsigned long d31;
253  unsigned long LSW;
254  } s;
255  };
256  typedef union vU1024 vU1024;
257  union vS1024
258  {
259  vector unsigned int v[8];
260  struct
261  {
262  signed long MSW;
263  unsigned long d2;
264  unsigned long d3;
265  unsigned long d4;
266  unsigned long d5;
267  unsigned long d6;
268  unsigned long d7;
269  unsigned long d8;
270  unsigned long d9;
271  unsigned long d10;
272  unsigned long d11;
273  unsigned long d12;
274  unsigned long d13;
275  unsigned long d14;
276  unsigned long d15;
277  unsigned long d16;
278  unsigned long d17;
279  unsigned long d18;
280  unsigned long d19;
281  unsigned long d20;
282  unsigned long d21;
283  unsigned long d22;
284  unsigned long d23;
285  unsigned long d24;
286  unsigned long d25;
287  unsigned long d26;
288  unsigned long d27;
289  unsigned long d28;
290  unsigned long d29;
291  unsigned long d30;
292  unsigned long d31;
293  unsigned long LSW;
294  } s;
295  };
296  typedef union vS1024 vS1024;
297 
298  /*************************************************************************************
299  * *
300  * Division operations *
301  * *
302  ************************************************************************************/
303 
312  void
313  vU256Divide(const vU256 *numerator, const vU256 *divisor, vU256 *result,
314  vU256 *remainder);
315 
324  void
325  vS256Divide(const vS256 *numerator, const vS256 *divisor, vS256 *result,
326  vS256 *remainder);
327 
336  void
337  vU512Divide(const vU512 *numerator, const vU512 *divisor, vU512 *result,
338  vU512 *remainder);
339 
348  void
349  vS512Divide(const vS512 *numerator, const vS512 *divisor, vS512 *result,
350  vS512 *remainder);
351 
360  void
361  vU1024Divide(const vU1024 *numerator, const vU1024 *divisor, vU1024 *result,
362  vU1024 *remainder);
363 
372  void
373  vS1024Divide(const vS1024 *numerator, const vS1024 *divisor, vS1024 *result,
374  vS1024 *remainder);
375 
376  /*************************************************************************************
377  * *
378  * Multiply operations *
379  * *
380  ************************************************************************************/
381 
390  void
391  vU128FullMultiply(const vU128 *a, const vU128 *b, vU256 *result);
392 
401  void
402  vS128FullMultiply(const vS128 *a, const vS128 *b, vS256 *result);
403 
412  void
413  vU256FullMultiply(const vU256 *a, const vU256 *b, vU512 *result);
414 
423  void
424  vS256FullMultiply(const vS256 *a, const vS256 *b, vS512 *result);
425 
434  void
435  vU512FullMultiply(const vU512 *a, const vU512 *b, vU1024 *result);
436 
445  void
446  vS512FullMultiply(const vS512 *a, const vS512 *b, vS1024 *result);
447 
456  void
457  vU256HalfMultiply(const vU256 *a, const vU256 *b, vU256 *result);
458 
467  void
468  vS256HalfMultiply(const vS256 *a, const vS256 *b, vS256 *result);
469 
478  void
479  vU512HalfMultiply(const vU512 *a, const vU512 *b, vU512 *result);
480 
489  void
490  vS512HalfMultiply(const vS512 *a, const vS512 *b, vS512 *result);
491 
500  void
501  vU1024HalfMultiply(const vU1024 *a, const vU1024 *b, vU1024 *result);
502 
511  void
512  vS1024HalfMultiply(const vS1024 *a, const vS1024 *b, vS1024 *result);
513 
514  /*************************************************************************************
515  * *
516  * Subtraction operations *
517  * *
518  ************************************************************************************/
519 
528  void
529  vU256Sub(const vU256 *a, const vU256 *b, vU256 *result);
530 
539  void
540  vS256Sub(const vS256 *a, const vS256 *b, vS256 *result);
541 
550  void
551  vU256SubS(const vU256 *a, const vU256 *b, vU256 *result);
552 
561  void
562  vS256SubS(const vS256 *a, const vS256 *b, vS256 *result);
563 
572  void
573  vU512Sub(const vU512 *a, const vU512 *b, vU512 *result);
574 
583  void
584  vS512Sub(const vS512 *a, const vS512 *b, vS512 *result);
585 
594  void
595  vU512SubS(const vU512 *a, const vU512 *b, vU512 *result);
596 
605  void
606  vS512SubS(const vS512 *a, const vS512 *b, vS512 *result);
607 
616  void
617  vU1024Sub(const vU1024 *a, const vU1024 *b, vU1024 *result);
618 
627  void
628  vS1024Sub(const vS1024 *a, const vS1024 *b, vS1024 *result);
629 
638  void
639  vU1024SubS(const vU1024 *a, const vU1024 *b, vU1024 *result);
640 
649  void
650  vS1024SubS(const vS1024 *a, const vS1024 *b, vS1024 *result);
651 
652  /*************************************************************************************
653  * *
654  * Negate operations *
655  * *
656  ************************************************************************************/
657 
666  void
667  vU256Neg(const vU256 *a, vU256 *result);
668 
677  void
678  vS256Neg(const vS256 *a, vS256 *result);
679 
688  void
689  vU512Neg(const vU512 *a, vU512 *result);
690 
699  void
700  vS512Neg(const vS512 *a, vS512 *result);
701 
710  void
711  vU1024Neg(const vU1024 *a, vU1024 *result);
712 
721  void
722  vS1024Neg(const vS1024 *a, vS1024 *result);
723 
724  /*************************************************************************************
725  * *
726  * Addition operations *
727  * *
728  ************************************************************************************/
729 
738  void
739  vU256Add(const vU256 *a, const vU256 *b, vU256 *result);
740 
749  void
750  vS256Add(const vS256 *a, const vS256 *b, vS256 *result);
751 
760  void
761  vU256AddS(const vU256 *a, const vU256 *b, vU256 *result);
762 
771  void
772  vS256AddS(const vS256 *a, const vS256 *b, vS256 *result);
773 
782  void
783  vU512Add(const vU512 *a, const vU512 *b, vU512 *result);
784 
793  void
794  vS512Add(const vS512 *a, const vS512 *b, vS512 *result);
795 
804  void
805  vU512AddS(const vU512 *a, const vU512 *b, vU512 *result);
806 
815  void
816  vS512AddS(const vS512 *a, const vS512 *b, vS512 *result);
817 
826  void
827  vU1024Add(const vU1024 *a, const vU1024 *b, vU1024 *result);
828 
837  void
838  vS1024Add(const vS1024 *a, const vS1024 *b, vS1024 *result);
839 
848  void
849  vU1024AddS(const vU1024 *a, const vU1024 *b, vU1024 *result);
850 
859  void
860  vS1024AddS(const vS1024 *a, const vS1024 *b, vS1024 *result);
861 
862  /*************************************************************************************
863  * *
864  * Mod operations *
865  * *
866  ************************************************************************************/
867 
876  void
877  vU256Mod(const vU256 *numerator, const vU256 *divisor, vU256 *remainder);
878 
887  void
888  vS256Mod(const vS256 *numerator, const vS256 *divisor, vS256 *remainder);
889 
898  void
899  vU512Mod(const vU512 *numerator, const vU512 *divisor, vU512 *remainder);
900 
909  void
910  vS512Mod(const vS512 *numerator, const vS512 *divisor, vS512 *remainder);
911 
920  void
921  vU1024Mod(const vU1024 *numerator, const vU1024 *divisor, vU1024 *remainder);
922 
931  void
932  vS1024Mod(const vS1024 *numerator, const vS1024 *divisor, vS1024 *remainder);
933 
934  /*************************************************************************************
935  * *
936  * Shift operations *
937  * *
938  ************************************************************************************/
939 
948  void
949  vLL256Shift(const vU256 *a, unsigned long shiftAmount, vU256 *result);
950 
959  void
960  vLL512Shift(const vU512 *a, unsigned long shiftAmount, vU512 *result);
961 
970  void
971  vLL1024Shift(const vU1024 *a, unsigned long shiftAmount, vU1024 *result);
972 
981  void
982  vLR256Shift(const vU256 *a, unsigned long shiftAmount, vU256 *result);
983 
992  void
993  vLR512Shift(const vU512 *a, unsigned long shiftAmount, vU512 *result);
994 
1003  void
1004  vLR1024Shift(const vU1024 *a, unsigned long shiftAmount, vU1024 *result);
1005 
1014  void
1015  vA256Shift(const vS256 *a, unsigned long shiftAmount, vS256 *result);
1016 
1025  void
1026  vA512Shift(const vS512 *a, unsigned long shiftAmount, vS512 *result);
1027 
1036  void
1037  vA1024Shift(const vS1024 *a, unsigned long shiftAmount, vS1024 *result);
1038 
1039  /*************************************************************************************
1040  * *
1041  * Rotate operations *
1042  * *
1043  ************************************************************************************/
1044 
1053  void
1054  vL256Rotate(const vU256 *a, unsigned long rotateAmount, vU256 *result);
1055 
1064  void
1065  vL512Rotate(const vU512 *a, unsigned long rotateAmount, vU512 *result);
1066 
1075  void
1076  vL1024Rotate(const vU1024 *a, unsigned long rotateAmount, vU1024 *result);
1077 
1086  void
1087  vR256Rotate(const vU256 *a, unsigned long rotateAmount, vU256 *result);
1088 
1097  void
1098  vR512Rotate(const vU512 *a, unsigned long rotateAmount, vU512 *result);
1099 
1108  void
1109  vR1024Rotate(const vU1024 *a, unsigned long rotateAmount, vU1024 *result);
1110 
1111 #endif
1113 #if PRAGMA_STRUCT_ALIGN
1114 #pragma options align = reset
1115 #elif PRAGMA_STRUCT_PACKPUSH
1116 #pragma pack(pop)
1117 #elif PRAGMA_STRUCT_PACK
1118 #pragma pack()
1119 #endif
1120 
1121 #ifdef PRAGMA_IMPORT_OFF
1122 #pragma import off
1123 #elif PRAGMA_IMPORT
1124 #pragma import reset
1125 #endif
1126 
1127 #ifdef __cplusplus
1128 }
1129 #endif
1130 
1131 #endif
Set up for compiler independent conditionals.
Definition: RAVE.h:426