NASM 2.10.02
[nasm.git] / perllib / crc64.ph
blob30a477531ec2134c2c3a64a7649d3737e1808e11
1 # -*- perl -*-
3 # Pure Perl implementation of the same CRC64 implementation used
4 # elsewhere in NASM.
6 # Note: Perl may have 32- or 64-bit integers; we need to handle both
7 # without overflowing into floating point (yuck), so handle them as
8 # pairs of 32-bit numbers.  Ordering is BIGENDIAN.
11 @crc64_tab = (
12     [0x00000000, 0x00000000], [0x7ad870c8, 0x30358979],
13     [0xf5b0e190, 0x606b12f2], [0x8f689158, 0x505e9b8b],
14     [0xc038e573, 0x9841b68f], [0xbae095bb, 0xa8743ff6],
15     [0x358804e3, 0xf82aa47d], [0x4f50742b, 0xc81f2d04],
16     [0xab28ecb4, 0x6814fe75], [0xd1f09c7c, 0x5821770c],
17     [0x5e980d24, 0x087fec87], [0x24407dec, 0x384a65fe],
18     [0x6b1009c7, 0xf05548fa], [0x11c8790f, 0xc060c183],
19     [0x9ea0e857, 0x903e5a08], [0xe478989f, 0xa00bd371],
20     [0x7d08ff3b, 0x88be6f81], [0x07d08ff3, 0xb88be6f8],
21     [0x88b81eab, 0xe8d57d73], [0xf2606e63, 0xd8e0f40a],
22     [0xbd301a48, 0x10ffd90e], [0xc7e86a80, 0x20ca5077],
23     [0x4880fbd8, 0x7094cbfc], [0x32588b10, 0x40a14285],
24     [0xd620138f, 0xe0aa91f4], [0xacf86347, 0xd09f188d],
25     [0x2390f21f, 0x80c18306], [0x594882d7, 0xb0f40a7f],
26     [0x1618f6fc, 0x78eb277b], [0x6cc08634, 0x48deae02],
27     [0xe3a8176c, 0x18803589], [0x997067a4, 0x28b5bcf0],
28     [0xfa11fe77, 0x117cdf02], [0x80c98ebf, 0x2149567b],
29     [0x0fa11fe7, 0x7117cdf0], [0x75796f2f, 0x41224489],
30     [0x3a291b04, 0x893d698d], [0x40f16bcc, 0xb908e0f4],
31     [0xcf99fa94, 0xe9567b7f], [0xb5418a5c, 0xd963f206],
32     [0x513912c3, 0x79682177], [0x2be1620b, 0x495da80e],
33     [0xa489f353, 0x19033385], [0xde51839b, 0x2936bafc],
34     [0x9101f7b0, 0xe12997f8], [0xebd98778, 0xd11c1e81],
35     [0x64b11620, 0x8142850a], [0x1e6966e8, 0xb1770c73],
36     [0x8719014c, 0x99c2b083], [0xfdc17184, 0xa9f739fa],
37     [0x72a9e0dc, 0xf9a9a271], [0x08719014, 0xc99c2b08],
38     [0x4721e43f, 0x0183060c], [0x3df994f7, 0x31b68f75],
39     [0xb29105af, 0x61e814fe], [0xc8497567, 0x51dd9d87],
40     [0x2c31edf8, 0xf1d64ef6], [0x56e99d30, 0xc1e3c78f],
41     [0xd9810c68, 0x91bd5c04], [0xa3597ca0, 0xa188d57d],
42     [0xec09088b, 0x6997f879], [0x96d17843, 0x59a27100],
43     [0x19b9e91b, 0x09fcea8b], [0x636199d3, 0x39c963f2],
44     [0xdf7adabd, 0x7a6e2d6f], [0xa5a2aa75, 0x4a5ba416],
45     [0x2aca3b2d, 0x1a053f9d], [0x50124be5, 0x2a30b6e4],
46     [0x1f423fce, 0xe22f9be0], [0x659a4f06, 0xd21a1299],
47     [0xeaf2de5e, 0x82448912], [0x902aae96, 0xb271006b],
48     [0x74523609, 0x127ad31a], [0x0e8a46c1, 0x224f5a63],
49     [0x81e2d799, 0x7211c1e8], [0xfb3aa751, 0x42244891],
50     [0xb46ad37a, 0x8a3b6595], [0xceb2a3b2, 0xba0eecec],
51     [0x41da32ea, 0xea507767], [0x3b024222, 0xda65fe1e],
52     [0xa2722586, 0xf2d042ee], [0xd8aa554e, 0xc2e5cb97],
53     [0x57c2c416, 0x92bb501c], [0x2d1ab4de, 0xa28ed965],
54     [0x624ac0f5, 0x6a91f461], [0x1892b03d, 0x5aa47d18],
55     [0x97fa2165, 0x0afae693], [0xed2251ad, 0x3acf6fea],
56     [0x095ac932, 0x9ac4bc9b], [0x7382b9fa, 0xaaf135e2],
57     [0xfcea28a2, 0xfaafae69], [0x8632586a, 0xca9a2710],
58     [0xc9622c41, 0x02850a14], [0xb3ba5c89, 0x32b0836d],
59     [0x3cd2cdd1, 0x62ee18e6], [0x460abd19, 0x52db919f],
60     [0x256b24ca, 0x6b12f26d], [0x5fb35402, 0x5b277b14],
61     [0xd0dbc55a, 0x0b79e09f], [0xaa03b592, 0x3b4c69e6],
62     [0xe553c1b9, 0xf35344e2], [0x9f8bb171, 0xc366cd9b],
63     [0x10e32029, 0x93385610], [0x6a3b50e1, 0xa30ddf69],
64     [0x8e43c87e, 0x03060c18], [0xf49bb8b6, 0x33338561],
65     [0x7bf329ee, 0x636d1eea], [0x012b5926, 0x53589793],
66     [0x4e7b2d0d, 0x9b47ba97], [0x34a35dc5, 0xab7233ee],
67     [0xbbcbcc9d, 0xfb2ca865], [0xc113bc55, 0xcb19211c],
68     [0x5863dbf1, 0xe3ac9dec], [0x22bbab39, 0xd3991495],
69     [0xadd33a61, 0x83c78f1e], [0xd70b4aa9, 0xb3f20667],
70     [0x985b3e82, 0x7bed2b63], [0xe2834e4a, 0x4bd8a21a],
71     [0x6debdf12, 0x1b863991], [0x1733afda, 0x2bb3b0e8],
72     [0xf34b3745, 0x8bb86399], [0x8993478d, 0xbb8deae0],
73     [0x06fbd6d5, 0xebd3716b], [0x7c23a61d, 0xdbe6f812],
74     [0x3373d236, 0x13f9d516], [0x49aba2fe, 0x23cc5c6f],
75     [0xc6c333a6, 0x7392c7e4], [0xbc1b436e, 0x43a74e9d],
76     [0x95ac9329, 0xac4bc9b5], [0xef74e3e1, 0x9c7e40cc],
77     [0x601c72b9, 0xcc20db47], [0x1ac40271, 0xfc15523e],
78     [0x5594765a, 0x340a7f3a], [0x2f4c0692, 0x043ff643],
79     [0xa02497ca, 0x54616dc8], [0xdafce702, 0x6454e4b1],
80     [0x3e847f9d, 0xc45f37c0], [0x445c0f55, 0xf46abeb9],
81     [0xcb349e0d, 0xa4342532], [0xb1eceec5, 0x9401ac4b],
82     [0xfebc9aee, 0x5c1e814f], [0x8464ea26, 0x6c2b0836],
83     [0x0b0c7b7e, 0x3c7593bd], [0x71d40bb6, 0x0c401ac4],
84     [0xe8a46c12, 0x24f5a634], [0x927c1cda, 0x14c02f4d],
85     [0x1d148d82, 0x449eb4c6], [0x67ccfd4a, 0x74ab3dbf],
86     [0x289c8961, 0xbcb410bb], [0x5244f9a9, 0x8c8199c2],
87     [0xdd2c68f1, 0xdcdf0249], [0xa7f41839, 0xecea8b30],
88     [0x438c80a6, 0x4ce15841], [0x3954f06e, 0x7cd4d138],
89     [0xb63c6136, 0x2c8a4ab3], [0xcce411fe, 0x1cbfc3ca],
90     [0x83b465d5, 0xd4a0eece], [0xf96c151d, 0xe49567b7],
91     [0x76048445, 0xb4cbfc3c], [0x0cdcf48d, 0x84fe7545],
92     [0x6fbd6d5e, 0xbd3716b7], [0x15651d96, 0x8d029fce],
93     [0x9a0d8cce, 0xdd5c0445], [0xe0d5fc06, 0xed698d3c],
94     [0xaf85882d, 0x2576a038], [0xd55df8e5, 0x15432941],
95     [0x5a3569bd, 0x451db2ca], [0x20ed1975, 0x75283bb3],
96     [0xc49581ea, 0xd523e8c2], [0xbe4df122, 0xe51661bb],
97     [0x3125607a, 0xb548fa30], [0x4bfd10b2, 0x857d7349],
98     [0x04ad6499, 0x4d625e4d], [0x7e751451, 0x7d57d734],
99     [0xf11d8509, 0x2d094cbf], [0x8bc5f5c1, 0x1d3cc5c6],
100     [0x12b59265, 0x35897936], [0x686de2ad, 0x05bcf04f],
101     [0xe70573f5, 0x55e26bc4], [0x9ddd033d, 0x65d7e2bd],
102     [0xd28d7716, 0xadc8cfb9], [0xa85507de, 0x9dfd46c0],
103     [0x273d9686, 0xcda3dd4b], [0x5de5e64e, 0xfd965432],
104     [0xb99d7ed1, 0x5d9d8743], [0xc3450e19, 0x6da80e3a],
105     [0x4c2d9f41, 0x3df695b1], [0x36f5ef89, 0x0dc31cc8],
106     [0x79a59ba2, 0xc5dc31cc], [0x037deb6a, 0xf5e9b8b5],
107     [0x8c157a32, 0xa5b7233e], [0xf6cd0afa, 0x9582aa47],
108     [0x4ad64994, 0xd625e4da], [0x300e395c, 0xe6106da3],
109     [0xbf66a804, 0xb64ef628], [0xc5bed8cc, 0x867b7f51],
110     [0x8aeeace7, 0x4e645255], [0xf036dc2f, 0x7e51db2c],
111     [0x7f5e4d77, 0x2e0f40a7], [0x05863dbf, 0x1e3ac9de],
112     [0xe1fea520, 0xbe311aaf], [0x9b26d5e8, 0x8e0493d6],
113     [0x144e44b0, 0xde5a085d], [0x6e963478, 0xee6f8124],
114     [0x21c64053, 0x2670ac20], [0x5b1e309b, 0x16452559],
115     [0xd476a1c3, 0x461bbed2], [0xaeaed10b, 0x762e37ab],
116     [0x37deb6af, 0x5e9b8b5b], [0x4d06c667, 0x6eae0222],
117     [0xc26e573f, 0x3ef099a9], [0xb8b627f7, 0x0ec510d0],
118     [0xf7e653dc, 0xc6da3dd4], [0x8d3e2314, 0xf6efb4ad],
119     [0x0256b24c, 0xa6b12f26], [0x788ec284, 0x9684a65f],
120     [0x9cf65a1b, 0x368f752e], [0xe62e2ad3, 0x06bafc57],
121     [0x6946bb8b, 0x56e467dc], [0x139ecb43, 0x66d1eea5],
122     [0x5ccebf68, 0xaecec3a1], [0x2616cfa0, 0x9efb4ad8],
123     [0xa97e5ef8, 0xcea5d153], [0xd3a62e30, 0xfe90582a],
124     [0xb0c7b7e3, 0xc7593bd8], [0xca1fc72b, 0xf76cb2a1],
125     [0x45775673, 0xa732292a], [0x3faf26bb, 0x9707a053],
126     [0x70ff5290, 0x5f188d57], [0x0a272258, 0x6f2d042e],
127     [0x854fb300, 0x3f739fa5], [0xff97c3c8, 0x0f4616dc],
128     [0x1bef5b57, 0xaf4dc5ad], [0x61372b9f, 0x9f784cd4],
129     [0xee5fbac7, 0xcf26d75f], [0x9487ca0f, 0xff135e26],
130     [0xdbd7be24, 0x370c7322], [0xa10fceec, 0x0739fa5b],
131     [0x2e675fb4, 0x576761d0], [0x54bf2f7c, 0x6752e8a9],
132     [0xcdcf48d8, 0x4fe75459], [0xb7173810, 0x7fd2dd20],
133     [0x387fa948, 0x2f8c46ab], [0x42a7d980, 0x1fb9cfd2],
134     [0x0df7adab, 0xd7a6e2d6], [0x772fdd63, 0xe7936baf],
135     [0xf8474c3b, 0xb7cdf024], [0x829f3cf3, 0x87f8795d],
136     [0x66e7a46c, 0x27f3aa2c], [0x1c3fd4a4, 0x17c62355],
137     [0x935745fc, 0x4798b8de], [0xe98f3534, 0x77ad31a7],
138     [0xa6df411f, 0xbfb21ca3], [0xdc0731d7, 0x8f8795da],
139     [0x536fa08f, 0xdfd90e51], [0x29b7d047, 0xefec8728]
140     );
142 sub crc64($$) {
143     my ($cv, $str) = @_;
144     my $c;
145     my @cc = @$cv;
146     $cc[0] %= 4294967296;
147     $cc[1] %= 4294967296;
149     foreach $c (unpack("C*", $str)) {
150         my @ct = @{$crc64_tab[($cc[1] & 0xff) ^ $c]};
152         $cc[1] = $ct[1] ^
153             ((($cc[1] & 0xffffff00) >> 8) | (($cc[0] & 0xff) << 24));
154         $cc[0] = $ct[0] ^ (($cc[0] & 0xffffff00) >> 8);
155     }
157     return @cc;