Page 1 of 1

zlib crc32 error

Posted: Thu Mar 24, 2016 5:55 pm
by wilbert
Does anyone understand why this code results in an "Assembler error!" on Linux x64 ?
On OSX it works fine. :?

Code: Select all

ImportC "-lz"
  crc32(crc, *buf, len)
EndImport

a.l = $12345678

Debug crc32(0, @a, 4)

Re: zlib crc32 error

Posted: Thu Mar 24, 2016 6:13 pm
by Keya
perhaps its confusing it with the crc32 asm instruction? might have to patch the name with a hex editor?! if no formal workaround
seems that is the case, because if you change crc32 with another asm instruction like cpuid it triggers the same error.. use non-asm instructions, different error.
And "! crc32 eax, ebx" etc is valid to fasm (but apparently not yasm on OSX! old yasm perhaps?)
i guess its still "crc32" in zlib for backwards compatibility as zlib predates the thought of a crc32 asm instruction, and only asm linkers would probably have errors with it? id just hex edit the darned thing lol, but i dont know what the correct approach is :)

Re: zlib crc32 error

Posted: Fri Mar 25, 2016 6:16 am
by wilbert
You are right.
I just need to get the symbol address and use a PrototypeC to work around it.

Re: zlib crc32 error

Posted: Fri Mar 25, 2016 7:00 am
by idle
post it might save someone a headache

Re: zlib crc32 error

Posted: Fri Mar 25, 2016 6:36 pm
by wilbert
Searching for a solution I also tried creating my own module to compute a crc32.
On my computer it seems to be faster as the procedure that PB offers but on x64, the one from zlib is still about 10 times faster.
I guess the one from zlib uses the hardware crc32 instruction to speed things up.
Anyway, here's the module in case anyone is interested.

Code: Select all

DeclareModule CRC32
  
  Declare.l CRC32(crc.l, *buf, len)
  
EndDeclareModule

Module CRC32
  
  DisableDebugger
  EnableExplicit
  EnableASM
  
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    Macro rbx : ebx : EndMacro
    Macro rcx : ecx : EndMacro
    Macro rdx : edx : EndMacro
    Macro rsi : esi : EndMacro  
    Macro rdi : edi : EndMacro  
  CompilerEndIf 
  
  Procedure.l CRC32(crc.l, *buf, len)
    mov rdx, *buf
    mov rcx, len
    mov eax, crc
    push rbx
    push rsi
    push rdi
    lea rdi, [crc32.l_crc32table]
    Not eax
    sub rcx, 4
    !jc crc32.l_crc32_l1
    !crc32.l_crc32_l0:
    mov ebx, [rdx]
    XOr ebx, eax
    movzx esi, bl
    mov eax, [rdi + rsi * 4 + 3072]
    shr ebx, 8
    movzx esi, bl
    XOr eax, [rdi + rsi * 4 + 2048]
    shr ebx, 8
    movzx esi, bl
    XOr eax, [rdi + rsi * 4 + 1024]
    shr ebx, 8
    XOr eax, [rdi + rbx * 4]
    add rdx, 4
    sub rcx, 4
    !jnc crc32.l_crc32_l0
    !crc32.l_crc32_l1:
    add rcx, 4
    !jz crc32.l_crc32_l3
    !crc32.l_crc32_l2:
    movzx ebx, byte [rdx]
    XOr bl, al
    shr eax, 8
    XOr eax, [rdi + rbx * 4]    
    add rdx, 1
    sub rcx, 1
    !jnz crc32.l_crc32_l2
    !crc32.l_crc32_l3:
    pop rdi
    pop rsi
    pop rbx
    Not eax
    ProcedureReturn
  EndProcedure
  
  DataSection
    !crc32.l_crc32table:
    ; 0
    !dd 0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3
    !dd 0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91
    !dd 0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7
    !dd 0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5
    !dd 0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b
    !dd 0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59
    !dd 0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f
    !dd 0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,0xb6662d3d
    !dd 0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433
    !dd 0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01
    !dd 0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457
    !dd 0x65b0d9c6,0x12b7e950,0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65
    !dd 0x4db26158,0x3ab551ce,0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb
    !dd 0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9
    !dd 0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409,0xce61e49f
    !dd 0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,0xb7bd5c3b,0xc0ba6cad
    !dd 0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,0x73dc1683
    !dd 0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1
    !dd 0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7
    !dd 0xfed41b76,0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5
    !dd 0xd6d6a3e8,0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b
    !dd 0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79
    !dd 0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f
    !dd 0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,0xb5d0cf31,0x2cd99e8b,0x5bdeae1d
    !dd 0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,0x72076785,0x05005713
    !dd 0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21
    !dd 0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777
    !dd 0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45
    !dd 0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db
    !dd 0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9
    !dd 0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf
    !dd 0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d
    ; 1
    !dd 0x00000000,0x191b3141,0x32366282,0x2b2d53c3,0x646cc504,0x7d77f445,0x565aa786,0x4f4196c7
    !dd 0xc8d98a08,0xd1c2bb49,0xfaefe88a,0xe3f4d9cb,0xacb54f0c,0xb5ae7e4d,0x9e832d8e,0x87981ccf
    !dd 0x4ac21251,0x53d92310,0x78f470d3,0x61ef4192,0x2eaed755,0x37b5e614,0x1c98b5d7,0x05838496
    !dd 0x821b9859,0x9b00a918,0xb02dfadb,0xa936cb9a,0xe6775d5d,0xff6c6c1c,0xd4413fdf,0xcd5a0e9e
    !dd 0x958424a2,0x8c9f15e3,0xa7b24620,0xbea97761,0xf1e8e1a6,0xe8f3d0e7,0xc3de8324,0xdac5b265
    !dd 0x5d5daeaa,0x44469feb,0x6f6bcc28,0x7670fd69,0x39316bae,0x202a5aef,0x0b07092c,0x121c386d
    !dd 0xdf4636f3,0xc65d07b2,0xed705471,0xf46b6530,0xbb2af3f7,0xa231c2b6,0x891c9175,0x9007a034
    !dd 0x179fbcfb,0x0e848dba,0x25a9de79,0x3cb2ef38,0x73f379ff,0x6ae848be,0x41c51b7d,0x58de2a3c
    !dd 0xf0794f05,0xe9627e44,0xc24f2d87,0xdb541cc6,0x94158a01,0x8d0ebb40,0xa623e883,0xbf38d9c2
    !dd 0x38a0c50d,0x21bbf44c,0x0a96a78f,0x138d96ce,0x5ccc0009,0x45d73148,0x6efa628b,0x77e153ca
    !dd 0xbabb5d54,0xa3a06c15,0x888d3fd6,0x91960e97,0xded79850,0xc7cca911,0xece1fad2,0xf5facb93
    !dd 0x7262d75c,0x6b79e61d,0x4054b5de,0x594f849f,0x160e1258,0x0f152319,0x243870da,0x3d23419b
    !dd 0x65fd6ba7,0x7ce65ae6,0x57cb0925,0x4ed03864,0x0191aea3,0x188a9fe2,0x33a7cc21,0x2abcfd60
    !dd 0xad24e1af,0xb43fd0ee,0x9f12832d,0x8609b26c,0xc94824ab,0xd05315ea,0xfb7e4629,0xe2657768
    !dd 0x2f3f79f6,0x362448b7,0x1d091b74,0x04122a35,0x4b53bcf2,0x52488db3,0x7965de70,0x607eef31
    !dd 0xe7e6f3fe,0xfefdc2bf,0xd5d0917c,0xcccba03d,0x838a36fa,0x9a9107bb,0xb1bc5478,0xa8a76539
    !dd 0x3b83984b,0x2298a90a,0x09b5fac9,0x10aecb88,0x5fef5d4f,0x46f46c0e,0x6dd93fcd,0x74c20e8c
    !dd 0xf35a1243,0xea412302,0xc16c70c1,0xd8774180,0x9736d747,0x8e2de606,0xa500b5c5,0xbc1b8484
    !dd 0x71418a1a,0x685abb5b,0x4377e898,0x5a6cd9d9,0x152d4f1e,0x0c367e5f,0x271b2d9c,0x3e001cdd
    !dd 0xb9980012,0xa0833153,0x8bae6290,0x92b553d1,0xddf4c516,0xc4eff457,0xefc2a794,0xf6d996d5
    !dd 0xae07bce9,0xb71c8da8,0x9c31de6b,0x852aef2a,0xca6b79ed,0xd37048ac,0xf85d1b6f,0xe1462a2e
    !dd 0x66de36e1,0x7fc507a0,0x54e85463,0x4df36522,0x02b2f3e5,0x1ba9c2a4,0x30849167,0x299fa026
    !dd 0xe4c5aeb8,0xfdde9ff9,0xd6f3cc3a,0xcfe8fd7b,0x80a96bbc,0x99b25afd,0xb29f093e,0xab84387f
    !dd 0x2c1c24b0,0x350715f1,0x1e2a4632,0x07317773,0x4870e1b4,0x516bd0f5,0x7a468336,0x635db277
    !dd 0xcbfad74e,0xd2e1e60f,0xf9ccb5cc,0xe0d7848d,0xaf96124a,0xb68d230b,0x9da070c8,0x84bb4189
    !dd 0x03235d46,0x1a386c07,0x31153fc4,0x280e0e85,0x674f9842,0x7e54a903,0x5579fac0,0x4c62cb81
    !dd 0x8138c51f,0x9823f45e,0xb30ea79d,0xaa1596dc,0xe554001b,0xfc4f315a,0xd7626299,0xce7953d8
    !dd 0x49e14f17,0x50fa7e56,0x7bd72d95,0x62cc1cd4,0x2d8d8a13,0x3496bb52,0x1fbbe891,0x06a0d9d0
    !dd 0x5e7ef3ec,0x4765c2ad,0x6c48916e,0x7553a02f,0x3a1236e8,0x230907a9,0x0824546a,0x113f652b
    !dd 0x96a779e4,0x8fbc48a5,0xa4911b66,0xbd8a2a27,0xf2cbbce0,0xebd08da1,0xc0fdde62,0xd9e6ef23
    !dd 0x14bce1bd,0x0da7d0fc,0x268a833f,0x3f91b27e,0x70d024b9,0x69cb15f8,0x42e6463b,0x5bfd777a
    !dd 0xdc656bb5,0xc57e5af4,0xee530937,0xf7483876,0xb809aeb1,0xa1129ff0,0x8a3fcc33,0x9324fd72
    ; 2
    !dd 0x00000000,0x01c26a37,0x0384d46e,0x0246be59,0x0709a8dc,0x06cbc2eb,0x048d7cb2,0x054f1685
    !dd 0x0e1351b8,0x0fd13b8f,0x0d9785d6,0x0c55efe1,0x091af964,0x08d89353,0x0a9e2d0a,0x0b5c473d
    !dd 0x1c26a370,0x1de4c947,0x1fa2771e,0x1e601d29,0x1b2f0bac,0x1aed619b,0x18abdfc2,0x1969b5f5
    !dd 0x1235f2c8,0x13f798ff,0x11b126a6,0x10734c91,0x153c5a14,0x14fe3023,0x16b88e7a,0x177ae44d
    !dd 0x384d46e0,0x398f2cd7,0x3bc9928e,0x3a0bf8b9,0x3f44ee3c,0x3e86840b,0x3cc03a52,0x3d025065
    !dd 0x365e1758,0x379c7d6f,0x35dac336,0x3418a901,0x3157bf84,0x3095d5b3,0x32d36bea,0x331101dd
    !dd 0x246be590,0x25a98fa7,0x27ef31fe,0x262d5bc9,0x23624d4c,0x22a0277b,0x20e69922,0x2124f315
    !dd 0x2a78b428,0x2bbade1f,0x29fc6046,0x283e0a71,0x2d711cf4,0x2cb376c3,0x2ef5c89a,0x2f37a2ad
    !dd 0x709a8dc0,0x7158e7f7,0x731e59ae,0x72dc3399,0x7793251c,0x76514f2b,0x7417f172,0x75d59b45
    !dd 0x7e89dc78,0x7f4bb64f,0x7d0d0816,0x7ccf6221,0x798074a4,0x78421e93,0x7a04a0ca,0x7bc6cafd
    !dd 0x6cbc2eb0,0x6d7e4487,0x6f38fade,0x6efa90e9,0x6bb5866c,0x6a77ec5b,0x68315202,0x69f33835
    !dd 0x62af7f08,0x636d153f,0x612bab66,0x60e9c151,0x65a6d7d4,0x6464bde3,0x662203ba,0x67e0698d
    !dd 0x48d7cb20,0x4915a117,0x4b531f4e,0x4a917579,0x4fde63fc,0x4e1c09cb,0x4c5ab792,0x4d98dda5
    !dd 0x46c49a98,0x4706f0af,0x45404ef6,0x448224c1,0x41cd3244,0x400f5873,0x4249e62a,0x438b8c1d
    !dd 0x54f16850,0x55330267,0x5775bc3e,0x56b7d609,0x53f8c08c,0x523aaabb,0x507c14e2,0x51be7ed5
    !dd 0x5ae239e8,0x5b2053df,0x5966ed86,0x58a487b1,0x5deb9134,0x5c29fb03,0x5e6f455a,0x5fad2f6d
    !dd 0xe1351b80,0xe0f771b7,0xe2b1cfee,0xe373a5d9,0xe63cb35c,0xe7fed96b,0xe5b86732,0xe47a0d05
    !dd 0xef264a38,0xeee4200f,0xeca29e56,0xed60f461,0xe82fe2e4,0xe9ed88d3,0xebab368a,0xea695cbd
    !dd 0xfd13b8f0,0xfcd1d2c7,0xfe976c9e,0xff5506a9,0xfa1a102c,0xfbd87a1b,0xf99ec442,0xf85cae75
    !dd 0xf300e948,0xf2c2837f,0xf0843d26,0xf1465711,0xf4094194,0xf5cb2ba3,0xf78d95fa,0xf64fffcd
    !dd 0xd9785d60,0xd8ba3757,0xdafc890e,0xdb3ee339,0xde71f5bc,0xdfb39f8b,0xddf521d2,0xdc374be5
    !dd 0xd76b0cd8,0xd6a966ef,0xd4efd8b6,0xd52db281,0xd062a404,0xd1a0ce33,0xd3e6706a,0xd2241a5d
    !dd 0xc55efe10,0xc49c9427,0xc6da2a7e,0xc7184049,0xc25756cc,0xc3953cfb,0xc1d382a2,0xc011e895
    !dd 0xcb4dafa8,0xca8fc59f,0xc8c97bc6,0xc90b11f1,0xcc440774,0xcd866d43,0xcfc0d31a,0xce02b92d
    !dd 0x91af9640,0x906dfc77,0x922b422e,0x93e92819,0x96a63e9c,0x976454ab,0x9522eaf2,0x94e080c5
    !dd 0x9fbcc7f8,0x9e7eadcf,0x9c381396,0x9dfa79a1,0x98b56f24,0x99770513,0x9b31bb4a,0x9af3d17d
    !dd 0x8d893530,0x8c4b5f07,0x8e0de15e,0x8fcf8b69,0x8a809dec,0x8b42f7db,0x89044982,0x88c623b5
    !dd 0x839a6488,0x82580ebf,0x801eb0e6,0x81dcdad1,0x8493cc54,0x8551a663,0x8717183a,0x86d5720d
    !dd 0xa9e2d0a0,0xa820ba97,0xaa6604ce,0xaba46ef9,0xaeeb787c,0xaf29124b,0xad6fac12,0xacadc625
    !dd 0xa7f18118,0xa633eb2f,0xa4755576,0xa5b73f41,0xa0f829c4,0xa13a43f3,0xa37cfdaa,0xa2be979d
    !dd 0xb5c473d0,0xb40619e7,0xb640a7be,0xb782cd89,0xb2cddb0c,0xb30fb13b,0xb1490f62,0xb08b6555
    !dd 0xbbd72268,0xba15485f,0xb853f606,0xb9919c31,0xbcde8ab4,0xbd1ce083,0xbf5a5eda,0xbe9834ed
    ; 3
    !dd 0x00000000,0xb8bc6765,0xaa09c88b,0x12b5afee,0x8f629757,0x37def032,0x256b5fdc,0x9dd738b9
    !dd 0xc5b428ef,0x7d084f8a,0x6fbde064,0xd7018701,0x4ad6bfb8,0xf26ad8dd,0xe0df7733,0x58631056
    !dd 0x5019579f,0xe8a530fa,0xfa109f14,0x42acf871,0xdf7bc0c8,0x67c7a7ad,0x75720843,0xcdce6f26
    !dd 0x95ad7f70,0x2d111815,0x3fa4b7fb,0x8718d09e,0x1acfe827,0xa2738f42,0xb0c620ac,0x087a47c9
    !dd 0xa032af3e,0x188ec85b,0x0a3b67b5,0xb28700d0,0x2f503869,0x97ec5f0c,0x8559f0e2,0x3de59787
    !dd 0x658687d1,0xdd3ae0b4,0xcf8f4f5a,0x7733283f,0xeae41086,0x525877e3,0x40edd80d,0xf851bf68
    !dd 0xf02bf8a1,0x48979fc4,0x5a22302a,0xe29e574f,0x7f496ff6,0xc7f50893,0xd540a77d,0x6dfcc018
    !dd 0x359fd04e,0x8d23b72b,0x9f9618c5,0x272a7fa0,0xbafd4719,0x0241207c,0x10f48f92,0xa848e8f7
    !dd 0x9b14583d,0x23a83f58,0x311d90b6,0x89a1f7d3,0x1476cf6a,0xaccaa80f,0xbe7f07e1,0x06c36084
    !dd 0x5ea070d2,0xe61c17b7,0xf4a9b859,0x4c15df3c,0xd1c2e785,0x697e80e0,0x7bcb2f0e,0xc377486b
    !dd 0xcb0d0fa2,0x73b168c7,0x6104c729,0xd9b8a04c,0x446f98f5,0xfcd3ff90,0xee66507e,0x56da371b
    !dd 0x0eb9274d,0xb6054028,0xa4b0efc6,0x1c0c88a3,0x81dbb01a,0x3967d77f,0x2bd27891,0x936e1ff4
    !dd 0x3b26f703,0x839a9066,0x912f3f88,0x299358ed,0xb4446054,0x0cf80731,0x1e4da8df,0xa6f1cfba
    !dd 0xfe92dfec,0x462eb889,0x549b1767,0xec277002,0x71f048bb,0xc94c2fde,0xdbf98030,0x6345e755
    !dd 0x6b3fa09c,0xd383c7f9,0xc1366817,0x798a0f72,0xe45d37cb,0x5ce150ae,0x4e54ff40,0xf6e89825
    !dd 0xae8b8873,0x1637ef16,0x048240f8,0xbc3e279d,0x21e91f24,0x99557841,0x8be0d7af,0x335cb0ca
    !dd 0xed59b63b,0x55e5d15e,0x47507eb0,0xffec19d5,0x623b216c,0xda874609,0xc832e9e7,0x708e8e82
    !dd 0x28ed9ed4,0x9051f9b1,0x82e4565f,0x3a58313a,0xa78f0983,0x1f336ee6,0x0d86c108,0xb53aa66d
    !dd 0xbd40e1a4,0x05fc86c1,0x1749292f,0xaff54e4a,0x322276f3,0x8a9e1196,0x982bbe78,0x2097d91d
    !dd 0x78f4c94b,0xc048ae2e,0xd2fd01c0,0x6a4166a5,0xf7965e1c,0x4f2a3979,0x5d9f9697,0xe523f1f2
    !dd 0x4d6b1905,0xf5d77e60,0xe762d18e,0x5fdeb6eb,0xc2098e52,0x7ab5e937,0x680046d9,0xd0bc21bc
    !dd 0x88df31ea,0x3063568f,0x22d6f961,0x9a6a9e04,0x07bda6bd,0xbf01c1d8,0xadb46e36,0x15080953
    !dd 0x1d724e9a,0xa5ce29ff,0xb77b8611,0x0fc7e174,0x9210d9cd,0x2aacbea8,0x38191146,0x80a57623
    !dd 0xd8c66675,0x607a0110,0x72cfaefe,0xca73c99b,0x57a4f122,0xef189647,0xfdad39a9,0x45115ecc
    !dd 0x764dee06,0xcef18963,0xdc44268d,0x64f841e8,0xf92f7951,0x41931e34,0x5326b1da,0xeb9ad6bf
    !dd 0xb3f9c6e9,0x0b45a18c,0x19f00e62,0xa14c6907,0x3c9b51be,0x842736db,0x96929935,0x2e2efe50
    !dd 0x2654b999,0x9ee8defc,0x8c5d7112,0x34e11677,0xa9362ece,0x118a49ab,0x033fe645,0xbb838120
    !dd 0xe3e09176,0x5b5cf613,0x49e959fd,0xf1553e98,0x6c820621,0xd43e6144,0xc68bceaa,0x7e37a9cf
    !dd 0xd67f4138,0x6ec3265d,0x7c7689b3,0xc4caeed6,0x591dd66f,0xe1a1b10a,0xf3141ee4,0x4ba87981
    !dd 0x13cb69d7,0xab770eb2,0xb9c2a15c,0x017ec639,0x9ca9fe80,0x241599e5,0x36a0360b,0x8e1c516e
    !dd 0x866616a7,0x3eda71c2,0x2c6fde2c,0x94d3b949,0x090481f0,0xb1b8e695,0xa30d497b,0x1bb12e1e
    !dd 0x43d23e48,0xfb6e592d,0xe9dbf6c3,0x516791a6,0xccb0a91f,0x740cce7a,0x66b96194,0xde0506f1
  EndDataSection
  
EndModule

Re: zlib crc32 error

Posted: Fri Mar 25, 2016 10:00 pm
by Keya
wilbert wrote:I guess the one from zlib uses the hardware crc32 instruction to speed things up.
i had a quick glance at https://github.com/madler/zlib/blob/master/crc32.c but couldnt see any asm or intrinsics, id be surprised/impressed if crc32 instruction was a result of compiler optimization! but it seems it uses TWO different table sets!
The first table is simply the CRC of all possible eight bit values. This is
all the information needed to generate CRCs on data a byte at a time for all
combinations of CRC register values and incoming bytes. The remaining tables
allow for word-at-a-time CRC calculation for both big-endian and little-
endian machines, where a word is four bytes.
Also specific notes on speed
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
* tables for updating the shift register in one step with three exclusive-ors
* instead of four steps with four exclusive-ors. This results in about a
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
actually i just realised they cant use crc32 asm instruction anyway as that uses Castagnoli polynomial

Re: zlib crc32 error

Posted: Sat Mar 26, 2016 5:48 am
by wilbert
Keya wrote:i had a quick glance at https://github.com/madler/zlib/blob/master/crc32.c but couldnt see any asm or intrinsics, id be surprised/impressed if crc32 instruction was a result of compiler optimization! but it seems it uses TWO different table sets!
I did my speed comparison on OSX since that is the main operating system I use. Since zlib on OSX is included with the OS and distributed by Apple, it's possible that it's an optimized version.
As for the multiple tables, the module code I posted also uses four tables for the slice by four approach.