home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 9 Archive
/
09-Archive.zip
/
zip22.zip
/
qdos
/
match.s
< prev
next >
Wrap
Text File
|
1996-12-14
|
3KB
|
131 lines
; match.a -- optional optimized asm version of longest match in deflate.c
; Copyright (C) 1992-1993 Jean-loup Gailly
;
; Adapted for the Amiga by Carsten Steger <stegerc@informatik.tu-muenchen.de>
; using the code in match.S.
; The major change in this code consists of removing all unaligned
; word accesses, because they cause 68000-based Amigas to crash.
; For maximum speed, UNALIGNED_OK can be defined in Makefile.sasc.
; The program will then only run on 68020-based Amigas, though.
;
; This code will run with registerized parameters too, unless SAS
; changes parameter passing conventions between new releases of SAS/C.
;;Cur_Match equr d0 ; Must be in d0!
;;Best_Len equr d1
;;Loop_Counter equr d2
;;Scan_Start equr d3
;;Scan_End equr d4
;;Limit equr d5
;;Chain_Length equr d6
;;Scan_Test equr d7
;;Scan equr a0
;;Match equr a1
;;Prev_Address equr a2
;;Scan_Ini equr a3
;;Match_Ini equr a4
MAX_MATCH equ 258
MIN_MATCH equ 3
WSIZE equ 32768
MAX_DIST equ WSIZE-MAX_MATCH-MIN_MATCH-1
.globl _max_chain_length
.globl _prev_length
.globl _prev
.globl _window
.globl _strstart
.globl _good_match
.globl _match_start
.globl _nice_match
.text
.globl _match_init
.globl _longest_match
_match_init:
rts
_longest_match:
move.l 4(sp),d0
movem.l d2-d7/a2-a4,-(sp)
move.l _max_chain_length,d6
move.l _prev_length,d1
lea _prev,a2
lea _window+MIN_MATCH,a4
move.l _strstart,d5
move.l a4,a3
add.l d5,a3
subi.w #MAX_DIST,d5
bhi limit_ok
moveq #0,d5
limit_ok:
cmp.l _good_match,d1
bcs length_ok
lsr.l #2,d6
length_ok:
subq.l #1,d6
move.b -MIN_MATCH(a3),d3
lsl.w #8,d3
move.b -MIN_MATCH+1(a3),d3
move.b -MIN_MATCH-1(a3,d1),d4
lsl.w #8,d4
move.b -MIN_MATCH(a3,d1),d4
bra do_scan
long_loop:
move.b -MIN_MATCH-1(a3,d1),d4
lsl.w #8,d4
move.b -MIN_MATCH(a3,d1),d4
short_loop:
lsl.w #1,d0
move.w 0(a2,d0.l),d0
cmp.w d5,d0
dbls d6,do_scan
bra return
do_scan:
move.l a4,a1
add.l d0,a1
move.b -MIN_MATCH-1(a1,d1),d7
lsl.w #8,d7
move.b -MIN_MATCH(a1,d1),d7
cmp.w d7,d4
bne short_loop
move.b -MIN_MATCH(a1),d7
lsl.w #8,d7
move.b -MIN_MATCH+1(a1),d7
cmp.w d7,d3
bne short_loop
move.w #(MAX_MATCH-MIN_MATCH),d2
move.l a3,a0
scan_loop:
cmpm.b (a1)+,(a0)+
dbne d2,scan_loop
sub.l a3,a0
addq.l #(MIN_MATCH-1),a0
cmp.l d1,a0
bls short_loop
move.l a0,d1
move.l d0,_match_start
cmp.l _nice_match,d1
bcs long_loop
return:
move.l d1,d0
movem.l (sp)+,d2-d7/a2-a4
rts
end