diff options
Diffstat (limited to 'strings/bfill.c')
-rw-r--r-- | strings/bfill.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/strings/bfill.c b/strings/bfill.c new file mode 100644 index 00000000000..ac5d3096b14 --- /dev/null +++ b/strings/bfill.c @@ -0,0 +1,81 @@ +/* File : bfill.c + Author : Richard A. O'Keefe. + Michael Widenius; ifdef MC68000 + Updated: 23 April 1984 + Defines: bfill() + + bfill(dst, len, fill) moves "len" fill characters to "dst". + Thus to set a buffer to 80 spaces, do bfill(buff, 80, ' '). + + Note: the "b" routines are there to exploit certain VAX order codes, + but the MOVC5 instruction will only move 65535 characters. The asm + code is presented for your interest and amusement. +*/ + +#include <global.h> +#include "m_string.h" + +#if !defined(bfill) && !defined(HAVE_BFILL) + +#if VaxAsm + +void bfill(dst, len, fill) +char *dst; +uint len; +int fill; /* actually char */ +{ + asm("movc5 $0,*4(ap),12(ap),8(ap),*4(ap)"); +} + +#elif defined(MC68000) && defined(DS90) + +void bfill(dst, len,fill) /* Optimized with long-fill */ +char *dst; +uint len; +pchar fill; +{ +asm(" movl 8.(a7),d1 "); +asm(" jeq .L9 "); +asm(" movl 4.(a7),a0 "); +asm(" moveq #0,d0 "); +asm(" movb 15.(a7),d0 "); +asm(" movl d2,a1 "); +asm(" movw d0,d2 "); +asm(" aslw #8,d0 "); +asm(" orw d2,d0 "); +asm(" movl d0,d2 "); +asm(" swap d0 "); +asm(" orl d2,d0 "); +asm(" movl a0,d2 "); +asm(" btst #0,d2 "); +asm(" jeq .L1 "); +asm(" movb d0,(a0)+ "); +asm(" subql #1,d1 "); +asm(".L1: movl d1,d2 "); +asm(" lsrl #2,d2 "); +asm(" jcc .L2 "); +asm(" movw d0,(a0)+ "); +asm(" jra .L2 "); +asm(".L3: movl d0,(a0)+ "); +asm(".L2: dbra d2,.L3 "); +asm(" addqw #1,d2 "); +asm(" subql #1,d2 "); +asm(" jcc .L3 "); +asm(" andl #1,d1 "); +asm(" jeq .L8 "); +asm(" movb d0,(a0) "); +asm(".L8: movl a1,d2 "); +asm(".L9: rts "); +} +#else + +void bfill(dst, len, fill) +register byte *dst; +register uint len; +register pchar fill; +{ + while (len-- != 0) *dst++ = fill; +} + +#endif +#endif |