282 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/*
 | 
						|
 * $Xorg: stipmips.s,v 1.4 2001/02/09 02:04:39 xorgcvs Exp $
 | 
						|
 *
 | 
						|
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
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * MIPS 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.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef MIPSEL
 | 
						|
# define BitsR		sll
 | 
						|
# define BitsL		srl
 | 
						|
# define BO(o)		o
 | 
						|
# define HO(o)		o
 | 
						|
# define WO(o)		o
 | 
						|
# define FourBits(dest,bits)	and	dest, bits, 0xf
 | 
						|
#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	dest, bits, 28
 | 
						|
#endif
 | 
						|
 | 
						|
/* reordering instructions would be fatal here */
 | 
						|
	.set	noreorder
 | 
						|
 | 
						|
	
 | 
						|
/*
 | 
						|
 * 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	$4
 | 
						|
#define stipple	$5
 | 
						|
#define value	$6
 | 
						|
#define stride	$7
 | 
						|
#define Count	16($sp)
 | 
						|
#define Shift	20($sp)
 | 
						|
 | 
						|
/* local variables */
 | 
						|
#define count	$14
 | 
						|
#define shift	$13
 | 
						|
#define atemp	$12
 | 
						|
#define bits	$11
 | 
						|
#define lshift	$9
 | 
						|
#define sbase	$8
 | 
						|
#define stemp	$2
 | 
						|
 | 
						|
#define CASE_SIZE	5	/* case blocks are 2^5 bytes each */
 | 
						|
#define CASE_MASK	0x1e0	/* first case mask */
 | 
						|
 | 
						|
#define ForEachLine	$200
 | 
						|
#define NextLine	$201
 | 
						|
#define NextLine1	$202
 | 
						|
#define CaseBegin	$203
 | 
						|
#define ForEachBits	$204
 | 
						|
#define ForEachBits1	$205
 | 
						|
#define NextBits	$206
 | 
						|
 | 
						|
#ifdef TETEXT
 | 
						|
#define	cfbStippleStack	cfbStippleStackTE
 | 
						|
#endif
 | 
						|
 | 
						|
	.globl	cfbStippleStack
 | 
						|
	.ent	cfbStippleStack 2
 | 
						|
cfbStippleStack:
 | 
						|
	.frame	$sp, 0, $31
 | 
						|
	lw	count, Count			/* fetch stack params */
 | 
						|
	la	sbase,CaseBegin			/* load up switch table */
 | 
						|
	lw	shift, Shift
 | 
						|
	li	lshift, 4			/* compute offset within */
 | 
						|
	subu	lshift, lshift, shift		/*  stipple of remaining bits */
 | 
						|
#ifdef MIPSEL
 | 
						|
	addu	shift, shift, CASE_SIZE		/* first shift for LSB */
 | 
						|
#else
 | 
						|
	addu	shift, shift, 28-CASE_SIZE	/* first shift for MSB */
 | 
						|
#endif
 | 
						|
	/* do ... while (--count > 0); */
 | 
						|
ForEachLine:
 | 
						|
	lw	bits, 0(stipple)		/* get stipple bits */
 | 
						|
	move	atemp, addr			/* set up for this line */
 | 
						|
#ifdef TETEXT
 | 
						|
	/* Terminal emulator fonts are expanded and have many 0 rows */
 | 
						|
	beqz	bits, NextLine			/* skip out early on 0 */
 | 
						|
#endif
 | 
						|
	addu	addr, addr, stride		/* step for the loop */
 | 
						|
	BitsR	stemp, bits, shift		/* get first bits */
 | 
						|
	and	stemp, stemp, CASE_MASK		/* compute first branch */
 | 
						|
	addu	stemp, stemp, sbase		/*  ... */
 | 
						|
	j	stemp				/*  ... */
 | 
						|
	BitsL	bits, bits, lshift		/* set remaining bits */
 | 
						|
 | 
						|
ForEachBits:
 | 
						|
	addu	atemp, atemp, 4
 | 
						|
ForEachBits1:
 | 
						|
	FourBits(stemp, bits)			/* compute jump for */
 | 
						|
	sll	stemp, stemp, CASE_SIZE		/*  next four bits */
 | 
						|
	addu	stemp, stemp, sbase		/*  ... */
 | 
						|
	j	stemp				/*  ... */
 | 
						|
	BitsL	bits, bits, 4			/* step for remaining bits */
 | 
						|
CaseBegin:
 | 
						|
	bnez	bits, ForEachBits1		/* 0 */
 | 
						|
	addu	atemp, atemp, 4
 | 
						|
NextLine:
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
 | 
						|
	bnez	bits, ForEachBits		/* 1 */
 | 
						|
	sb	value, BO(0)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* 2 */
 | 
						|
	sb	value, BO(1)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* 3 */
 | 
						|
	sh	value, HO(0)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* 4 */
 | 
						|
	sb	value, BO(2)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	sb	value, BO(0)(atemp)		/* 5 */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sb	value, BO(2)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
					
 | 
						|
	sb	value, BO(1)(atemp)		/* 6 */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sb	value, BO(2)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* 7 */
 | 
						|
	swl	value, BO(2)(atemp)		/* untested on MSB */
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* 8 */
 | 
						|
	sb	value, BO(3)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	sb	value, BO(0)(atemp)		/* 9 */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sb	value, BO(3)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
					
 | 
						|
	sb	value, BO(1)(atemp)		/* a */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sb	value, BO(3)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
 | 
						|
	sh	value, HO(0)(atemp)		/* b */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sb	value, BO(3)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* c */
 | 
						|
	sh	value, HO(2)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	sb	value, BO(0)(atemp)		/* d */
 | 
						|
	bnez	bits, ForEachBits
 | 
						|
	sh	value, HO(2)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
 | 
						|
	bnez	bits, ForEachBits		/* e */
 | 
						|
	swr	value, BO(1)(atemp)		/* untested on MSB */
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	bnez	bits, ForEachBits		/* f */
 | 
						|
	sw	value, WO(0)(atemp)
 | 
						|
 	addu	count, count, -1
 | 
						|
	bnez	count, ForEachLine
 | 
						|
	addu	stipple, stipple, 4
 | 
						|
	j	$31
 | 
						|
	nop
 | 
						|
	nop
 | 
						|
					
 | 
						|
	.end	cfbStippleStack
 |