291 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/*
 | 
						|
 * $Xorg: stipsparc.s,v 1.4 2001/02/09 02:04:39 xorgcvs Exp $
 | 
						|
 * $XdotOrg:	$
 | 
						|
 *
 | 
						|
Copyright 1990, 1998  The Open Group
 | 
						|
 | 
						|
Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
documentation for any purpose is hereby granted without fee, provided that
 | 
						|
the above copyright notice appear in all copies and that both that
 | 
						|
copyright notice and this permission notice appear in supporting
 | 
						|
documentation.
 | 
						|
 | 
						|
The above copyright notice and this permission notice shall be included in
 | 
						|
all copies or substantial portions of the Software.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | 
						|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
						|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
						|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
 | 
						|
Except as contained in this notice, the name of The Open Group shall not be
 | 
						|
used in advertising or otherwise to promote the sale, use or other dealings
 | 
						|
in this Software without prior written authorization from The Open Group.
 | 
						|
 *
 | 
						|
 * Author:  Keith Packard, MIT X Consortium
 | 
						|
 */
 | 
						|
/* $XFree86: xc/programs/Xserver/cfb/stipsparc.s,v 1.4 2001/01/17 22:36:38 dawes Exp $ */
 | 
						|
 | 
						|
/*
 | 
						|
 * SPARC assembly code for optimized text rendering.
 | 
						|
 *
 | 
						|
 * Other stippling could be done in assembly, but the payoff is
 | 
						|
 * not nearly as large.  Mostly because large areas are heavily
 | 
						|
 * optimized already.
 | 
						|
 */
 | 
						|
 | 
						|
/* not that I expect to ever see an LSB SPARC, but ... */
 | 
						|
#ifdef LITTLE_ENDIAN
 | 
						|
# define BitsR		sll
 | 
						|
# define BitsL		srl
 | 
						|
# define BO(o)		o
 | 
						|
# define HO(o)		o
 | 
						|
# define WO(o)		o
 | 
						|
# define FourBits(dest,bits)	and	bits, 0xf, dest
 | 
						|
#else
 | 
						|
# define BitsR		srl
 | 
						|
# define BitsL		sll
 | 
						|
# define BO(o)		3-o
 | 
						|
# define HO(o)		2-o
 | 
						|
# define WO(o)		o
 | 
						|
# define FourBits(dest,bits)	srl	bits, 28, dest
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * cfbStippleStack(addr, stipple, value, stride, Count, Shift)
 | 
						|
 *               4       5       6      7     16(sp) 20(sp)
 | 
						|
 *
 | 
						|
 *  Apply successive 32-bit stipples starting at addr, addr+stride, ...
 | 
						|
 *
 | 
						|
 *  Used for text rendering, but only when no data could be lost
 | 
						|
 *  when the stipple is shifted left by Shift bits
 | 
						|
 */
 | 
						|
/* arguments */
 | 
						|
#define addr	%i0
 | 
						|
#define stipple	%i1
 | 
						|
#define value	%i2
 | 
						|
#define stride	%i3
 | 
						|
#define count	%i4
 | 
						|
#define shift	%i5
 | 
						|
 | 
						|
/* local variables */
 | 
						|
#define atemp	%l0
 | 
						|
#define bits	%l1
 | 
						|
#define lshift	%l2
 | 
						|
#define sbase	%l3
 | 
						|
#define stemp	%l4
 | 
						|
 | 
						|
#define CASE_SIZE	5	/* case blocks are 2^5 bytes each */
 | 
						|
#define CASE_MASK	0x1e0	/* first case mask */
 | 
						|
 | 
						|
#define ForEachLine	LY1
 | 
						|
#define NextLine	LY2
 | 
						|
#define CaseBegin	LY3
 | 
						|
#define ForEachBits	LY4
 | 
						|
#define NextBits	LY5
 | 
						|
 | 
						|
#if defined(SVR4) || defined(__ELF__)
 | 
						|
#ifdef TETEXT
 | 
						|
#define	_cfbStippleStack	cfbStippleStackTE
 | 
						|
#else
 | 
						|
#define	_cfbStippleStack	cfbStippleStack
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef TETEXT
 | 
						|
#define	_cfbStippleStack	_cfbStippleStackTE
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
	.seg	"text"
 | 
						|
	.proc	16
 | 
						|
	.globl	_cfbStippleStack
 | 
						|
_cfbStippleStack:
 | 
						|
	save	%sp,-64,%sp
 | 
						|
#ifdef SHAREDCODE
 | 
						|
1:
 | 
						|
        call    2f
 | 
						|
        nop
 | 
						|
2:
 | 
						|
        mov     %o7,sbase                       /* sbase = 1b(1:) */
 | 
						|
        add     sbase, CaseBegin-1b, sbase
 | 
						|
#else /* !SHAREDCODE */
 | 
						|
	sethi	%hi(CaseBegin),sbase		/* load up switch table */
 | 
						|
	or	sbase,%lo(CaseBegin),sbase
 | 
						|
#endif /* SHAREDCODE */
 | 
						|
	mov	4,lshift			/* compute offset within */
 | 
						|
	sub	lshift, shift, lshift		/*  stipple of remaining bits */
 | 
						|
#ifdef LITTLE_ENDIAN
 | 
						|
	inc	CASE_SIZE, shift		/* first shift for LSB */
 | 
						|
#else
 | 
						|
	inc	28-CASE_SIZE, shift		/* first shift for MSB */
 | 
						|
#endif
 | 
						|
	/* do ... while (--count > 0); */
 | 
						|
ForEachLine:
 | 
						|
	ld	[stipple],bits			/* get stipple bits */
 | 
						|
	mov	addr,atemp			/* set up for this line */
 | 
						|
#ifdef TETEXT
 | 
						|
	/* Terminal emulator fonts are expanded and have many 0 rows */
 | 
						|
	tst	bits
 | 
						|
	bz	NextLine			/* skip out early on 0 */
 | 
						|
#endif
 | 
						|
	add	addr, stride, addr		/* step for the loop */
 | 
						|
	BitsR	bits, shift, stemp		/* get first bits */
 | 
						|
	and	stemp, CASE_MASK, stemp		/* compute first jump */
 | 
						|
	BitsL	bits, lshift, bits		/* set remaining bits */
 | 
						|
	jmp	sbase+stemp			/*  ... */
 | 
						|
	tst	bits
 | 
						|
 | 
						|
ForEachBits:
 | 
						|
	inc	4, atemp
 | 
						|
ForEachBits1:
 | 
						|
	FourBits(stemp, bits)			/* compute jump for */
 | 
						|
	sll	stemp, CASE_SIZE, stemp		/*  these four bits */
 | 
						|
	BitsL	bits, 4, bits			/* step for remaining bits */
 | 
						|
	jmp	sbase+stemp			/* jump */
 | 
						|
	tst	bits
 | 
						|
CaseBegin:
 | 
						|
	bnz,a	ForEachBits1			/* 0 */
 | 
						|
	inc	4, atemp
 | 
						|
NextLine:
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
 | 
						|
	bnz	ForEachBits			/* 1 */
 | 
						|
	stb	value, [atemp+BO(0)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* 2 */
 | 
						|
	stb	value, [atemp+BO(1)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* 3 */
 | 
						|
	sth	value, [atemp+HO(0)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* 4 */
 | 
						|
	stb	value, [atemp+BO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(0)]		/* 5 */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(1)]		/* 6 */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	sth	value, [atemp+HO(0)]		/* 7 */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* 8 */
 | 
						|
	stb	value, [atemp+BO(3)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(0)]		/* 9 */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(3)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(1)]		/* a */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(3)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	sth	value, [atemp+HO(0)]		/* b */
 | 
						|
	bnz	ForEachBits
 | 
						|
	stb	value, [atemp+BO(3)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* c */
 | 
						|
	sth	value, [atemp+HO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
	nop
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(0)]		/* d */
 | 
						|
	bnz	ForEachBits
 | 
						|
	sth	value, [atemp+HO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	stb	value, [atemp+BO(1)]		/* e */
 | 
						|
	bnz	ForEachBits
 | 
						|
	sth	value, [atemp+HO(2)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 | 
						|
					
 | 
						|
	bnz	ForEachBits			/* f */
 | 
						|
	st	value, [atemp+WO(0)]
 | 
						|
	deccc	1, count
 | 
						|
	bnz,a	ForEachLine
 | 
						|
	inc	4, stipple
 | 
						|
	ret
 | 
						|
	restore
 |