chris@umcp-cs.UUCP (Chris Torek) (10/09/86)
In article <1023@kuling.UUCP> thomas@kuling.UUCP (Thomas H{meenaho) writes: >In sysV for the 68K this technique [word at a time copies] is used for >bcopy inside the kernel. bcopy is easier as one knows how many bytes >are to be moved. bzero is even smarter, it clears a set of registers >and uses movem to copy them to memory. I recently had occasion to write a bzero subroutine for a 68010 CPU board (Heurikon CPU, part of McMob). The original (monitor) code had carefully arranged to use moveml's. I was amused to discover that the simpler code below runs at least four times faster. This is, of course, due to the loop mode on the 68010. The moveml loop is no doubt faster on a 68000. And *that* sort of thing is why these belong in your support library in the first place! (In my case, I was *writing* the support library routine. . . .) | | C-callable subroutines | | bzero(addr, count) char *addr; int count; | clear `count' bytes at location `addr' _bzero: .globl _bzero moveq #0,d0 | get a handy zero movl sp@(4),a0 | grab addr movl a0,d1 | test low bit. btst sucks btst #0,d1 beqs bzeven | branch if even | make even: movb d0,a0@+ | clear one byte subql #1,sp@(8) | and adjust count bzeven: movl sp@(8),d1 | grab count asrl #2,d1 | divide by four to get longwords beqs bzlast | and go handle last bytes if none subql #1,d1 | adjust for dbra -1 crap bzloop: movl d0,a0@+ | clear one longword dbra d1,bzloop | and count it and repeat until d1=-1 subl #0x10000,d1 | decrement high word bges bzloop | if result is nonnegative, do it all again bzlast: movw sp@(0xa),d1 | restore (low word of) count andw #3,d1 | need only low two bits subqw #2,d1 | is it at least two? blts bzl3 movw d0,a0@+ | clear one word if so bzl3: btst #0,d1 | need one last byte? beqs bzret | return if not movb d0,a0@ | clear that last byte bzret: rts -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 1516) UUCP: seismo!umcp-cs!chris CSNet: chris@umcp-cs ARPA: chris@mimsy.umd.edu