#include "../../config.h" #define ACTUAL_HASHMAX (((HASHMAX + 6) & -8) + 4) .data /* T[] is based on Peter K. Pearson's article in CACM 33-6, pp. 677. */ _T: .byte 1, 87, 49, 12, 176, 178, 102, 166 .byte 121, 193, 6, 84, 249, 230, 44, 163 .byte 14, 197, 213, 181, 161, 85, 218, 80 .byte 64, 239, 24, 226, 236, 142, 38, 200 .byte 110, 177, 104, 103, 141, 253, 255, 50 .byte 77, 101, 81, 18, 45, 96, 31, 222 .byte 25, 107, 190, 70, 86, 237, 240, 34 .byte 72, 242, 20, 214, 244, 227, 149, 235 .byte 97, 234, 57, 22, 60, 250, 82, 175 .byte 208, 5, 127, 199, 111, 62, 135, 248 .byte 174, 169, 211, 58, 66, 154, 106, 195 .byte 245, 171, 17, 187, 182, 179, 0, 243 .byte 132, 56, 148, 75, 128, 133, 158, 100 .byte 130, 126, 91, 13, 153, 246, 216, 219 .byte 119, 68, 223, 78, 83, 88, 201, 99 .byte 122, 11, 92, 32, 136, 114, 52, 10 .byte 138, 30, 48, 183, 156, 35, 61, 26 .byte 143, 74, 251, 94, 129, 162, 63, 152 .byte 170, 7, 115, 167, 241, 206, 3, 150 .byte 55, 59, 151, 220, 90, 53, 23, 131 .byte 125, 173, 15, 238, 79, 95, 89, 16 .byte 105, 137, 225, 224, 217, 160, 37, 123 .byte 118, 73, 2, 157, 46, 116, 9, 145 .byte 134, 228, 207, 212, 202, 215, 69, 229 .byte 27, 188, 67, 124, 168, 252, 42, 4 .byte 29, 108, 21, 247, 19, 205, 39, 203 .byte 233, 40, 186, 147, 198, 192, 155, 33 .byte 164, 191, 98, 204, 165, 180, 117, 76 .byte 140, 36, 210, 172, 41, 54, 159, 8 .byte 185, 232, 113, 196, 231, 47, 146, 120 .byte 51, 65, 28, 144, 254, 221, 93, 189 .byte 194, 139, 112, 43, 71, 109, 184, 209 .text /* Copyright 1995 Joern Rennecke */ /* * take a 4-byte aligned string, pad it and hash it. * caller is expected to test for 0 length. */ .globl _aphash .align 4 _aphash: movl 4(%esp),%edx /* addr */ movl 8(%esp),%ecx /* length */ pushl %ebx xorl %eax,%eax subl $4,%ecx movl %ecx,%ebx jle L20 subl $(ACTUAL_HASHMAX-7),%ebx jl L21 addl %edx,%ecx andb $252,%ebx addl %ebx,%edx jmp L22 .align 2,0x90 L21: addl %edx,%ecx testb $4,%ebx je L22 movl (%edx),%eax roll $1,%eax addl $4,%edx cmpl %ecx,%edx jae L23 .align 2,0x90 L22: xorl (%edx),%eax roll $1,%eax xorl 4(%edx),%eax roll $1,%eax addl $8,%edx cmpl %ecx,%edx jb L22 L23: subl %edx,%ecx L20: negl %ecx shlb $3,%cl movl (%edx),%ebx shll %cl,%ebx roll %cl,%eax xorl %ebx,%eax shrl %cl,%ebx roll $8,%eax movl %ebx,(%edx) /* pad string in memory to allow easy compare */ popl %ebx movb %al,%cl movb _T(%ecx),%cl xorb %ah,%cl shrl $16,%eax xorb _T(%ecx),%ah movb %ah,%cl xorb _T(%ecx),%al ret /* ahash: hash aligned string; uhash: hash unaligned string */ .globl _ahash .globl _uhash .align 4 _ahash: _uhash: movl 4(%esp),%edx /* addr */ movl 8(%esp),%ecx /* length */ subl $4,%ecx movl %ecx,%eax jle Lhash4 subl $(ACTUAL_HASHMAX-7),%eax jg L31 addl %edx,%ecx andb $4,%eax je L32 movl (%edx),%eax roll $1,%eax addl $4,%edx cmpl %ecx,%edx jae L33 .align 2,0x90 L32: xorl (%edx),%eax roll $1,%eax xorl 4(%edx),%eax roll $1,%eax addl $8,%edx cmpl %ecx,%edx jb L32 L33: subl %edx,%ecx L30: negl %ecx shlb $3,%cl movl (%edx),%edx shll %cl,%edx roll %cl,%eax xorl %edx,%eax roll $8,%eax movb %al,%cl movb _T(%ecx),%cl xorb %ah,%cl shrl $16,%eax xorb _T(%ecx),%ah movb %ah,%cl xorb _T(%ecx),%al ret .align 2,0x90 L31: addl %edx,%ecx andb $252,%eax addl %eax,%edx xorl %eax,%eax jmp L32 .align 2,0x90 Lhash4: xorl %eax,%eax jmp L30 .align 4 .globl _idhash _idhash: movl 4(%esp),%eax movzbl (%eax),%edx incl %eax movzbl (%eax),%ecx jmp L7 .align 4,0x90 .align 2,0x90 L8: roll $25,%edx addl $4,%eax xorl %ecx,%edx movb (%eax),%cl L7: cmpb $0,__my_ctype(%ecx) jge L12 roll $24,%edx xorl %ecx,%edx movb 1(%eax),%ecx cmpb $0,__my_ctype(%ecx) jge L14 roll $24,%edx xorl %ecx,%edx movb 2(%eax),%ecx cmpb $0,__my_ctype(%ecx) jge L16 roll $24,%edx xorl %ecx,%edx movb 3(%eax),%ecx cmpb $0,__my_ctype(%ecx) jl L8 incl %eax L16: incl %eax L14: incl %eax L12: movb %dl,%cl movb _T(%ecx),%cl xorb %dh,%cl shrl $16,%edx xorb _T(%ecx),%dh movb %dh,%cl xorb _T(%ecx),%dl /* returning eax: p, edx: hash */ ret