#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