summaryrefslogtreecommitdiff
path: root/strings/bfill.c
blob: e0e22a7023e060251c4457eacedd8df2fb06c42c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* Copyright (C) 2000 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/*  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 <my_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