17d523365SDimitry Andric //===-- JamCRC.cpp - Cyclic Redundancy Check --------------------*- C++ -*-===//
27d523365SDimitry Andric //
37d523365SDimitry Andric //                     The LLVM Compiler Infrastructure
47d523365SDimitry Andric //
57d523365SDimitry Andric // This file is distributed under the University of Illinois Open Source
67d523365SDimitry Andric // License. See LICENSE.TXT for details.
77d523365SDimitry Andric //
87d523365SDimitry Andric //===----------------------------------------------------------------------===//
97d523365SDimitry Andric //
107d523365SDimitry Andric // This file contains an implementation of JamCRC.
117d523365SDimitry Andric //
127d523365SDimitry Andric //===----------------------------------------------------------------------===//
137d523365SDimitry Andric //
147d523365SDimitry Andric // The implementation technique is the one mentioned in:
157d523365SDimitry Andric // D. V. Sarwate. 1988. Computation of cyclic redundancy checks via table
167d523365SDimitry Andric // look-up. Commun. ACM 31, 8 (August 1988)
177d523365SDimitry Andric //
187d523365SDimitry Andric //===----------------------------------------------------------------------===//
197d523365SDimitry Andric 
207d523365SDimitry Andric #include "llvm/Support/JamCRC.h"
21*3ca95b02SDimitry Andric #include "llvm/ADT/ArrayRef.h"
227d523365SDimitry Andric 
237d523365SDimitry Andric using namespace llvm;
247d523365SDimitry Andric 
257d523365SDimitry Andric static const uint32_t CRCTable[256] = {
267d523365SDimitry Andric     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
277d523365SDimitry Andric     0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
287d523365SDimitry Andric     0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
297d523365SDimitry Andric     0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
307d523365SDimitry Andric     0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
317d523365SDimitry Andric     0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
327d523365SDimitry Andric     0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
337d523365SDimitry Andric     0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
347d523365SDimitry Andric     0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
357d523365SDimitry Andric     0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
367d523365SDimitry Andric     0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
377d523365SDimitry Andric     0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
387d523365SDimitry Andric     0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
397d523365SDimitry Andric     0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
407d523365SDimitry Andric     0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
417d523365SDimitry Andric     0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
427d523365SDimitry Andric     0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
437d523365SDimitry Andric     0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
447d523365SDimitry Andric     0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
457d523365SDimitry Andric     0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
467d523365SDimitry Andric     0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
477d523365SDimitry Andric     0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
487d523365SDimitry Andric     0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
497d523365SDimitry Andric     0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
507d523365SDimitry Andric     0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
517d523365SDimitry Andric     0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
527d523365SDimitry Andric     0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
537d523365SDimitry Andric     0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
547d523365SDimitry Andric     0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
557d523365SDimitry Andric     0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
567d523365SDimitry Andric     0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
577d523365SDimitry Andric     0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
587d523365SDimitry Andric     0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
597d523365SDimitry Andric     0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
607d523365SDimitry Andric     0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
617d523365SDimitry Andric     0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
627d523365SDimitry Andric     0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
637d523365SDimitry Andric     0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
647d523365SDimitry Andric     0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
657d523365SDimitry Andric     0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
667d523365SDimitry Andric     0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
677d523365SDimitry Andric     0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
687d523365SDimitry Andric     0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
697d523365SDimitry Andric     0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
707d523365SDimitry Andric     0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
717d523365SDimitry Andric     0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
727d523365SDimitry Andric     0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
737d523365SDimitry Andric     0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
747d523365SDimitry Andric     0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
757d523365SDimitry Andric     0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
767d523365SDimitry Andric     0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
777d523365SDimitry Andric     0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
787d523365SDimitry Andric     0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
797d523365SDimitry Andric     0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
807d523365SDimitry Andric     0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
817d523365SDimitry Andric     0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
827d523365SDimitry Andric     0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
837d523365SDimitry Andric     0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
847d523365SDimitry Andric     0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
857d523365SDimitry Andric     0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
867d523365SDimitry Andric     0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
877d523365SDimitry Andric     0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
887d523365SDimitry Andric     0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
897d523365SDimitry Andric     0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
907d523365SDimitry Andric };
917d523365SDimitry Andric 
update(ArrayRef<char> Data)927d523365SDimitry Andric void JamCRC::update(ArrayRef<char> Data) {
937d523365SDimitry Andric   for (char Byte : Data) {
947d523365SDimitry Andric     int TableIdx = (CRC ^ Byte) & 0xff;
957d523365SDimitry Andric     CRC = CRCTable[TableIdx] ^ (CRC >> 8);
967d523365SDimitry Andric   }
977d523365SDimitry Andric }
98