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
|