sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
#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