home *** CD-ROM | disk | FTP | other *** search
- ;--------------------------------------------------------------------
- ; memcmp() -- a faster version
- ;--------------------------------------------------------------------
- ; x = memcmp( s1,s2,count)
-
- ; This routine compares the data pointed to by "s1" and "s2" for "count"
- ; bytes, and returns 0 if they are identical, a negative number if s1 < s2,
- ; or a positive number if s1 > s2.
-
- ; Robert Broughton
- ; 328-1027 Davie St.
- ; Vancouver, BC V6E 4L2
- ; Canada
- ; USENet: a1040@mindlink.UUCP
-
- MANX SET 1
- IFND MANX
- IDNT _memcmp
- CSECT _memcmp
- ENDC
- XDEF _memcmp
- _memcmp:
- link a5,#.127
- move.l 12(a5),a1 ;* s2
- move.l 8(a5),a0 ;* s1
- move.l 16(a5),d0 ;* count
-
- cmp.l #7,d0
- ble finish ;* too small, don't bother with optimization
-
- move.l a0,d1
- btst #0,d1 ;* even or odd
- beq ineven ;* it's even already
- subq.l #1,d0
- move.b (a0)+,d1
- cmp.b (a1)+,d1 ;* now it's even
- bne lowout
-
- ineven:
- move.l a1,d1
- btst #0,d1 ;*ááhow about output
- beq outeven
-
- outodd:
- ; unfortunately, the output address is not word-aligned, so we will
- ; load a long word from s1 into d1, load four bytes from s2 into d2,
- ; and compare the two registers
- cmp.l #3,d0
- ble finish
-
- move.l (a0)+,d1
- move.b (a1)+,d2
- ext.w d2
- swap d2
- move.w (a1)+,d2
- lsl.l #8,d2
- move.b (a1)+,d2
- subq.l #4,d0
- cmp.l d1,d2
- beq outodd
- sub.l d2,d1
- move.l d1,d0
- bra really
-
- outeven:
- ; ideal situation; we can load and compare longwords
- cmp.l #3,d0
- ble finish
-
- subq.l #4,d0
- cmp.l (a0)+,(a1)+
- beq outeven
- move.l -(a0),d0
- sub.l -(a1),d0
- bra really
-
- finish:
- cmp.b #0,d0
- ble really
- subq.l #1,d0
- finishloop:
- move.b (a0)+,d1
- cmp.b (a1)+,d1
- dbne d0,finishloop
- bra lowout
-
- really:
- unlk a5
- rts
-
- lowout:
- sub.b -(a1),d1
- ext.w d1
- ext.l d1
- move.l d1,d0
- bra really
-
- .127 equ 0
-
-