speeding up compress on 286
David Hutchens
hutch at hubcap.UUCP
Tue Jul 26 04:21:50 AEST 1988
New improved version, now with assembly source.
Earlier I wrote:
>
> I don't know about Microport, but I have found that a LOT of time
> is spent doing long shifts on my Xenix system when I use a 16-bit
> compress. This is in part because the C compiler generates a call
> to a routine to do long shifts. What is worse, they coded the
> routine so that it is space efficient, rather than time efficient (It
> uses a total of 3 or 4 286 instructions looping through them as many
> times as the number of bits you wish to shift: i.e. it shifts one
> bit each time through the loop.) I found that I could write my
> own routine - using a grand total of 50 more bytes or so, and in doing
> so I decreased the time required to do a 16-bit compress by about 30%!
>
> I don't have the code in front of me but the basic idea was to use
> the 16-bit shift instructions and OR together the appropriate results.
> I suspect that for 1 and possibly 2 bit shifts the provided routine is
> faster, but compress does a lot of shifts of 10 bits or more, and with
> these, my routine wins by a BIG margin.
I received several replies requesting the source. Again, I must caution
that these routines are designed to work with Microsoft Xenix 2.0.
I don't have any idea whether they work with any other compiler/os.
It turns out that the Microsoft compiler uses a non-standard call
sequence to call its own built in routines, including the long shift
operations. These routines assume that the number to be shifted
is in the A (lower order bits) and D (higher order bits) registers at
entry (That is where the Microsoft C compiler I'm using puts them).
They assume that the number of bits to be shifted is in the CL register.
They distroy the CH register (I'm not positive if this is really safe, but
it works for the programs I have tried!). I assemble the following with 'as'
and link it with the compress source. Best of luck. Remember to test it
well before giving it any trust.
David Hutchens
hutch at hubcap.clemson.edu
...!gatech!hubcap!hutch
---------- CUT HERE -----------
; Static Name Aliases
;
TITLE shift
.287
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
_TEXT SEGMENT
PUBLIC __lshr
__lshr PROC FAR
cmp cl,15
jle $LSRSMALL
sub cl,16
xchg ax,dx
sar ax,cl
cwd
ret
$LSRSMALL:
mov ch,cl
push dx
shr ax,cl
sub cl,16
neg cl
shl dx,cl
or ax,dx
pop dx
mov cl,ch
sar dx,cl
ret
__lshr ENDP
PUBLIC __ulshr
__ulshr PROC FAR
cmp cl,15
jle $ULSRSMALL
sub cl,16
xchg ax,dx
shr ax,cl
sub dx,dx
ret
$ULSRSMALL:
mov ch,cl
push dx
shr ax,cl
sub cl,16
neg cl
shl dx,cl
or ax,dx
pop dx
mov cl,ch
shr dx,cl
ret
__ulshr ENDP
PUBLIC __lshl
__lshl PROC FAR
cmp cl,15
jle $LSLSMALL
sub cl,16
mov dx,ax
shl dx,cl
sub ax,ax
ret
$LSLSMALL:
mov ch,cl
push ax
shl dx,cl
sub cl,16
neg cl
shr ax,cl
or dx,ax
pop ax
mov cl,ch
shl ax,cl
ret
__lshl ENDP
_TEXT ENDS
END
More information about the Comp.unix.microport
mailing list