sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
.data
_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
	.align 4
.globl _hash
_hash:
	movl 8(%esp),%edx /* length */
/* %ebp: addr   */
/* %edx: length */

	cmpl $2,%edx
	jle small
	pushl %ebp
	movl 8(%esp),%ebp /* addr */
	cmpl $76,%edx
	jg large
	movl %edx,%ecx
	andb $3,%cl
	shlb $3,%cl
	movl -4(%ebp,%edx),%eax
	shll %cl,%eax
	decl %edx
	sarl $2,%edx
	je L2
	.align 4,0x90
L1:
	roll $1,%eax
	xorl (%ecx),%eax
	addl $4,%ecx
	decl %edx
	jne L1
L2:
	movb %al,%dl
	movb _T(%edx),%dl
	xorb %ah,%dl
	shrl $16,%eax
	xorb _T(%edx),%ah
	movb %ah,%dl
	xorb _T(%edx),%al

	popl %ebp
	ret

	.align 2,0x90
small:
	movl 4(%esp),%ecx /* addr */
	xorl %eax,%eax
	decl %edx
	je len1
	jl len0
	movb (%ecx),%eax
	incl %ebp
	movb _T(%eax),%al
len1:
	movb (%ecx),%ah
	xorb %ah,%al
len0:
	ret



	.align 4,0x90
large:
/*
 *	%ebp : addr (old value pushed)
 *	%edx : length
 */
	pushl %edi
	pushl %esi
	pushl %ebx
	movl (%ebp),%ecx
	movl 4(%ebp),%ebx
	movl 8(%ebp),%esi
	movl 12(%ebp),%edi
	cmpl $127,%edx
	jle L3
	sarl $3,%edx
	andb $252,%dl	/* %edx : offset */
	movl $7,%eax	/* %eax : count */
	addl %edx,%ebp
	jmp L4
	.align 4,0x90
L3:
	addl $-4,%edx
	movl %edx,%eax
	sarl $4,%eax	/* eax : count */
	andl $12,%edx
	leal 4(%edx,%ebp),%ebp
	movl $16,%edx	/* %edx : offset */
	.align 2,0x90
L4:
	addl %ecx,%ecx
	adcl %ebx,%ebx
	adcl %esi,%esi
	adcl %edi,%edi
	adcl $0,%ecx
	xorl (%ebp),%ecx
	xorl 4(%ebp),%ebx
	xorl 8(%ebp),%esi
	xorl 12(%ebp),%edi
	addl %edx,%ebp
	decl %eax
	jne L4

	/* benchmarks showed that shifts are faster than xchgb on a 486dx2 */
	xorl %edx,%edx
	movl $4,%ebp
L5:
	xorb %cl,%al
	movb _T(%eax),%al
	rorl $8,%ecx
	xorb %bl,%dl
	movb _T(%edx),%dl
	rorl $8,%ebx
	xorb %esi,%eax
	movb _T(%eax),%al
	rorl $8,%esi
	xorb %edi,%eax
	movb _T(%eax),%al
	rorl $8,%edi
	decl %ebp
	jne L5

	movb %dl,%ah

	popl %ebx
	popl %esi
	popl %edi
	popl %ebp
	ret