File: HashWord.a

package info (click to toggle)
chktex 1.5-7
  • links: PTS
  • area: main
  • in suites: woody
  • size: 716 kB
  • ctags: 546
  • sloc: ansic: 4,517; makefile: 277; sh: 178; perl: 92; lisp: 24
file content (122 lines) | stat: -rw-r--r-- 2,879 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
*
*  ChkTeX v1.5, hashes a NULL-terminated string.
*  Copyright (C) 1995-96 Jens T. Berger Thielemann
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*  Contact the author at:
*      Jens Berger
*      Spektrumvn. 4
*      N-0666 Oslo
*      Norway
*      E-mail: <jensthi@ifi.uio.no>
*
*

******* HashWord() ****************************************************
*
* NAME
*     HashWord() - hashes a NULL-terminated string
*
* SYNOPSIS
*
*     HashVal = @HashWord(char *String)
*     D0.W                A0
*
*     HashVal = _HashWord(char *String)
*     D0.W                4(SP)
*
* FUNCTION
*     Hashes a NULL-terminated string.
*
*     Well optimized (I believe), should be near optimal for this 
*     approach to hashing. Optimized for caches, loops and pipelines.
*     Inner loop size: 12 bytes.
*
*
* INPUTS
*     String - a NULL-terminated 8-bit C string. May be passed on
*              stack or in A0, depending on entry point.
*
* RETURNS
*     HashVal - the hashed value of the string.
*
* NOTES
*     Registers a0 and d1 are destroyed.
*
*     This function works best when there's a slight difference in
*     the length of the strings.
*
*     On non-Amiga machines a similar routine is implemented in
*     "Utility.c" in the ChkTeX distribution.
*
*     It should be possible to adopt this to other 680x0 computers,
*     too.
*
* BUGS
*     None known.
*
***********************************************************************
*
*
*
*
*

	SECTION text,code
	XDEF	_HashWord
	XDEF	@HashWord

HashShift	EQU     5		* Experiments show this to be best;
					* reasonable, as most TeX commands
					* only use lowercase letters.

REG_HashVal	EQUR	d0
REG_TmpChar	EQUR	d1
REG_StrLen	EQUR	d2
REG_String	EQUR	a0

Len_Incr	EQU	6

CLRD	MACRO	\1      		* Clears data reg
	moveq	#0,\1
	ENDM

_HashWord				* Stack entry
	move.l	4(sp),REG_String
@HashWord				* Register entry
	CLRD	REG_HashVal
	CLRD	REG_TmpChar

	move.b	(REG_String)+,REG_TmpChar
	beq.b   return

	move.l	REG_StrLen,-(sp)
	CLRD	REG_StrLen

loop
	eor.w	REG_TmpChar,REG_HashVal
	addq.w	#Len_Incr,REG_StrLen
	ror.w   #HashShift,REG_HashVal
	eor.w	REG_StrLen,REG_HashVal

	move.b	(REG_String)+,REG_TmpChar
	bne.b	loop

	move.l	(sp)+,REG_StrLen
return
	rts

	END