1838 lines
55 KiB
Plaintext
1838 lines
55 KiB
Plaintext
|
#define SL 6
|
|||
|
#define SSL "6"
|
|||
|
/* savsize is 6 because size of LB is 2 and size of z8000-PC is 4 */
|
|||
|
#define NC nocoercions:
|
|||
|
|
|||
|
/*********************************************************
|
|||
|
** Back end tables for z8000 **
|
|||
|
** Author: Jan Voors **
|
|||
|
** **
|
|||
|
** wordsize = 2 bytes, pointersize = 2 bytes. **
|
|||
|
** **
|
|||
|
** Register R13 is used as LB, RR14 is the normal **
|
|||
|
** z8000-stackpointer. Some global variables are used: **
|
|||
|
** - reghp : the heap pointer **
|
|||
|
** - trpim : trap ignore mask **
|
|||
|
** - trppc : address of user defined trap handler **
|
|||
|
** **
|
|||
|
** Floating point arithmetic and constants are not **
|
|||
|
** implemented. **
|
|||
|
** **
|
|||
|
*********************************************************/
|
|||
|
|
|||
|
/*
|
|||
|
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|||
|
*
|
|||
|
* This product is part of the Amsterdam Compiler Kit.
|
|||
|
*
|
|||
|
* Permission to use, sell, duplicate or disclose this software must be
|
|||
|
* obtained in writing. Requests for such permissions may be sent to
|
|||
|
*
|
|||
|
* Dr. Andrew S. Tanenbaum
|
|||
|
* Wiskundig Seminarium
|
|||
|
* Vrije Universiteit
|
|||
|
* Postbox 7161
|
|||
|
* 1007 MC Amsterdam
|
|||
|
* The Netherlands
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
EM_WSIZE = 2
|
|||
|
EM_PSIZE = 2
|
|||
|
EM_BSIZE = SL
|
|||
|
|
|||
|
TIMEFACTOR = 3/4
|
|||
|
|
|||
|
REGISTERS:
|
|||
|
R0 = ("R0", 2), REG, B2REG.
|
|||
|
R1 = ("R1", 2), REG, B2REG, XREG.
|
|||
|
R2 = ("R2", 2), REG, B2REG, XREG.
|
|||
|
R3 = ("R3", 2), REG, B2REG, XREG.
|
|||
|
R4 = ("R4", 2), REG, B2REG, XREG.
|
|||
|
R5 = ("R5", 2), REG, B2REG, XREG.
|
|||
|
R6 = ("R6", 2), REG, B2REG, XREG.
|
|||
|
R7 = ("R7", 2), REG, B2REG, XREG.
|
|||
|
R8 = ("R8", 2), REG, XREG.
|
|||
|
R9 = ("R9", 2), REG, XREG.
|
|||
|
R10 = ("R10", 2), REG, XREG.
|
|||
|
R11 = ("R11", 2), REG, XREG.
|
|||
|
R12 = ("R12", 2), REG, XREG.
|
|||
|
LB = ("R13", 2), localbase.
|
|||
|
|
|||
|
RR0 = ("RR0", 4, R0, R1), LWREG, LWB2REG.
|
|||
|
RR2 = ("RR2", 4, R2, R3), LWREG, LWB2REG, LWXREG.
|
|||
|
RR4 = ("RR4", 4, R4, R5), LWREG, LWB2REG, LWXREG.
|
|||
|
RR6 = ("RR6", 4, R6, R7), LWREG, LWB2REG, LWXREG.
|
|||
|
RR8 = ("RR8", 4, R8, R9), LWREG, LWXREG.
|
|||
|
RR10 = ("RR10", 4, R10, R11), LWREG, LWXREG.
|
|||
|
|
|||
|
RQ0 = ("RQ0", 8, RR0, RR2), DLWREG.
|
|||
|
RQ4 = ("RQ4", 8, RR4, RR6), DLWREG.
|
|||
|
RQ8 = ("RQ8", 8, RR8, RR10), DLWREG.
|
|||
|
|
|||
|
/**/
|
|||
|
TOKENS:
|
|||
|
/* z8000-addressing-modes 'ra', 'ba' and 'bx' never used so far,
|
|||
|
** so there are no tokens for them (yet).
|
|||
|
*/
|
|||
|
ir1 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]"
|
|||
|
ir2 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]"
|
|||
|
ir4 = { REGISTER lwxreg; } 4 cost=(0,5) "*%[lwxreg]"
|
|||
|
ir4_hi = { REGISTER lwreg; } 2
|
|||
|
|
|||
|
da1 = { STRING ind; } 2 cost=(4,4) "%[ind]"
|
|||
|
da2 = { STRING ind; } 2 cost=(4,4) "%[ind]"
|
|||
|
da4 = { STRING ind; } 4 cost=(4,7) "%[ind]"
|
|||
|
|
|||
|
im2 = { INT num; } 2 cost=(2,2) "$%[num]"
|
|||
|
im4 = { INT num; } 4 cost=(4,5) "$%[num]"
|
|||
|
double = { STRING ind; } 4 cost=(4,5) "$%[ind]"
|
|||
|
|
|||
|
x1 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])"
|
|||
|
x2 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])"
|
|||
|
x4 = { REGISTER xreg; INT ind; } 4 cost=(4,8) "%[ind](%[xreg])"
|
|||
|
|
|||
|
ADDR_LOCAL = { INT ind; } 2
|
|||
|
ADDR_EXTERNAL = { STRING ind; } 2 cost=(2,3) "$%[ind]"
|
|||
|
regconst2 = { REGISTER xreg; INT ind; } 2
|
|||
|
|
|||
|
TOKENEXPRESSIONS:
|
|||
|
REGS = REG + LWREG + DLWREG
|
|||
|
SCR_REG = REG * SCRATCH
|
|||
|
SCR_XREG = XREG * SCRATCH
|
|||
|
SCR_LWREG = LWREG * SCRATCH
|
|||
|
SCR_DLWREG = DLWREG * SCRATCH
|
|||
|
src1 = ir1 + da1 + x1
|
|||
|
src2 = REG + ir2 + im2 + da2 + x2 + localbase + ADDR_EXTERNAL
|
|||
|
src4 = LWREG + ir4 + im4 + da4 + x4 + double
|
|||
|
indexed = x1 + x2 + x4
|
|||
|
ind_access = ir1 + ir2 + ir4
|
|||
|
da = da1 + da2 + da4
|
|||
|
const2 = im2 + ADDR_EXTERNAL
|
|||
|
const4 = im4 + double
|
|||
|
allexceptcon = ALL - REGS - im2 - im4 - double - ADDR_LOCAL
|
|||
|
- ADDR_EXTERNAL
|
|||
|
|
|||
|
src2a = ir2 + da2 + x2
|
|||
|
src4a = ir4 + da4 + x4
|
|||
|
src2b = REG + im2 + localbase + ADDR_EXTERNAL
|
|||
|
src4b = LWREG
|
|||
|
src2c = REG + ir2 + da2 + x2
|
|||
|
|
|||
|
CODE:
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 1 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
loc | | | {im2, $1} | |
|
|||
|
ldc | | allocate( LWREG )
|
|||
|
move( {im2, highw(1)}, %[a.1] )
|
|||
|
move( {im2, loww(1)}, %[a.2] ) | %[a] | |
|
|||
|
lol | | | {x2, LB, $1} | |
|
|||
|
ldl | | | {x4, LB, $1} | |
|
|||
|
loe | | | {da2, $1} | |
|
|||
|
lde | | | {da4, $1} | |
|
|||
|
lil | | allocate( LWXREG )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] ) | {ir2,%[a]} | |
|
|||
|
lof | XREG | | {x2, %[1], $1} | |
|
|||
|
... | NC regconst2 | | {x2, %[1.xreg], $1+%[1.ind]} | |
|
|||
|
... | NC ADDR_EXTERNAL | | {da2, tostring($1)+"+"+%[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL | | {x2, LB, %[1.ind]+$1} | |
|
|||
|
ldf | XREG | | {x4, %[1], $1} | |
|
|||
|
... | NC regconst2 | | {x4, %[1.xreg], $1+%[1.ind]} | |
|
|||
|
... | NC ADDR_EXTERNAL | | {da4, tostring($1)+"+"+%[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL | | {x4, LB, %[1.ind]+$1} | |
|
|||
|
lal | | | { ADDR_LOCAL, $1 } | |
|
|||
|
lae | | | { ADDR_EXTERNAL, $1 } | |
|
|||
|
lxl $1==0 | | | LB | |
|
|||
|
lxl $1==1 | | | {x2, LB, SL} | |
|
|||
|
lxl $1==2 | | allocate( XREG = {x2, LB, SL} ) | {x2, %[a], SL}| |
|
|||
|
lxl $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
|
|||
|
"1:\tld %[a], 6(%[a])"
|
|||
|
"djnz %[b], 1b"
|
|||
|
erase(%[a]) erase(%[b]) samecc | %[a] | |
|
|||
|
lxa $1==0 | | | {ADDR_LOCAL, SL} | |
|
|||
|
lxa $1==1 | | allocate( XREG = {x2, LB, SL} ) |
|
|||
|
{regconst2, %[a], SL} | |
|
|||
|
lxa $1==2 | | allocate( XREG = {x2, LB, SL} )
|
|||
|
move( {x2, %[a], SL }, %[a] ) |
|
|||
|
{regconst2, %[a], SL} | |
|
|||
|
lxa $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
|
|||
|
"1:\tld %[a], 6(%[a])"
|
|||
|
"djnz %[b], 1b"
|
|||
|
erase(%[a]) erase(%[b]) samecc |
|
|||
|
{regconst2, %[a], SL} | |
|
|||
|
loi $1==1 | NC regconst2 | | {x1, %[1.xreg], %[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL| | {x1, LB, %[1.ind]} | |
|
|||
|
... | NC ADDR_EXTERNAL | | {da1, %[1.ind]} | |
|
|||
|
... | src2 | allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
| {ir1, %[a]} | |
|
|||
|
loi $1==2 | NC regconst2 | | {x2, %[1.xreg], %[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL| | {x2, LB, %[1.ind]} | |
|
|||
|
... | NC ADDR_EXTERNAL | | {da2, %[1.ind]} | |
|
|||
|
... | src2 | allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
| {ir2, %[a]} | |
|
|||
|
loi $1==4 | NC regconst2 | | {x4, %[1.xreg], %[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL| | {x4, LB, %[1.ind]} | |
|
|||
|
... | NC ADDR_EXTERNAL | | {da4, %[1.ind]} | |
|
|||
|
... | src2 | allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
| {ir4, %[a]} | |
|
|||
|
loi $1>4 | src2 STACK | allocate( REG = {im2, $1/2} )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[b.2] )
|
|||
|
move( {im2, 0}, %[b.1] )
|
|||
|
"add %[b.2], $$$1-2"
|
|||
|
"dec R15, $$2"
|
|||
|
"lddr *RR14, *%[b], %[a]"
|
|||
|
"inc R15, $$2"
|
|||
|
erase(%[a]) erase(%[b]) nocc | | |
|
|||
|
lal loi $2==6 | STACK | "push *RR14, $1+4(R13)"
|
|||
|
"pushl *RR14, $1(R13)" | | |
|
|||
|
lal loi $2==8 | STACK | "pushl *RR14, $1+4(R13)"
|
|||
|
"pushl *RR14, $1(R13)" | | |
|
|||
|
lae loi $2==6 | STACK | "push *RR14, $1+4"
|
|||
|
"pushl *RR14, $1" | | |
|
|||
|
lae loi $2==8 | STACK | "pushl *RR14, $1+4"
|
|||
|
"pushl *RR14, $1" | | |
|
|||
|
los $1==2 | STACK | "calr los2" | | |
|
|||
|
los !defined($1)| src2c STACK | "cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
"calr los2" | | |
|
|||
|
lpi | | | {ADDR_EXTERNAL, $1} | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 2 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
stl | src2b | remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
move( %[1], {x2, LB, $1} ) | | |
|
|||
|
ste | src2b | remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
move( %[1], {da2, $1} ) | | |
|
|||
|
sil | src2b | remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
move( %[1], {ir2, %[a]} ) | | |
|
|||
|
stf | regconst2 src2b |
|
|||
|
remove( allexceptcon )
|
|||
|
move( %[2], {x2, %[1.xreg], $1+%[1.ind]} ) | | |
|
|||
|
... | ADDR_EXTERNAL src2b |
|
|||
|
remove( allexceptcon )
|
|||
|
move( %[2], {da2, tostring($1)+"+"+%[1.ind]} ) | | |
|
|||
|
sti $1==1 | regconst2 const2 | remove( allexceptcon )
|
|||
|
move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
|
|||
|
... | regconst2 B2REG | remove( allexceptcon )
|
|||
|
move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
|
|||
|
... | NC ADDR_LOCAL const2 | remove( allexceptcon )
|
|||
|
move( %[2], {x1, LB, %[1.ind]} ) | | |
|
|||
|
... | ADDR_LOCAL B2REG | remove( allexceptcon )
|
|||
|
move( %[2], {x1, LB, %[1.ind]} ) | | |
|
|||
|
... | NC ADDR_EXTERNAL const2 | remove( allexceptcon )
|
|||
|
move( %[2], {da1, %[1.ind]} ) | | |
|
|||
|
... | ADDR_EXTERNAL B2REG | remove( allexceptcon )
|
|||
|
move( %[2], {da1, %[1.ind]} ) | | |
|
|||
|
... | src2 const2 | remove( allexceptcon )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
move( %[2], {ir1, %[a]} ) | | |
|
|||
|
... | src2 B2REG | remove( allexceptcon )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
move( %[2], {ir1, %[a]} ) | | |
|
|||
|
sti $1==2 | regconst2 src2b | remove( allexceptcon )
|
|||
|
move( %[2], {x2, %[1.xreg], %[1.ind]} ) | | |
|
|||
|
... | ADDR_LOCAL src2b | remove( allexceptcon )
|
|||
|
move( %[2], {x2, LB, %[1.ind]} ) | | |
|
|||
|
... | ADDR_EXTERNAL src2b | remove( allexceptcon )
|
|||
|
move( %[2], {da2, %[1.ind]} ) | | |
|
|||
|
... | src2 src2b | remove( allexceptcon )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
move( %[2], {ir2, %[a]} ) | | |
|
|||
|
sti $1==4 | regconst2 src4b | remove( allexceptcon )
|
|||
|
move( %[2], {x4, %[1.xreg], %[1.ind]} ) | | |
|
|||
|
... | ADDR_LOCAL src4b | remove( allexceptcon )
|
|||
|
move( %[2], {x4, LB, %[1.ind]} ) | | |
|
|||
|
... | ADDR_EXTERNAL src4b | remove( allexceptcon )
|
|||
|
move( %[2], {da4, %[1.ind]} ) | | |
|
|||
|
... | src2 src4b | remove( allexceptcon )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
move( %[2], {ir4, %[a]} ) | | |
|
|||
|
sti $1>4 | src2 STACK |
|
|||
|
allocate( REG = {im2, $1/2} )
|
|||
|
allocate( %[1], LWXREG )
|
|||
|
move( %[1], %[b.2] )
|
|||
|
move( {im2, 0}, %[b.1] )
|
|||
|
"ldir *%[b], *RR14, %[a]"
|
|||
|
erase(%[a]) erase(%[b]) nocc | | |
|
|||
|
lal sti $2>4 && $2<=8 | NC src2b | | %[1] |
|
|||
|
stl $1 lal $1+2 sti $2-2 |
|
|||
|
... | | | {ADDR_LOCAL, $1} | sti $2 |
|
|||
|
sts $1==2 | STACK | "calr sts2" | | |
|
|||
|
sts !defined($1)| src2c STACK | "cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
"calr sts2" | | |
|
|||
|
sdl | src4b | remove( x2, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+2 ))
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]>=$1-2 && %[ind]<=$1+2 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]>=$1 && %[ind]<=$1+3 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
move( %[1], {x4, LB, $1} ) | | |
|
|||
|
sde | src4b | remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
move( %[1], {da4, $1} ) | | |
|
|||
|
sdf | regconst2 src4b |
|
|||
|
remove( allexceptcon )
|
|||
|
move( %[2], {x4, %[1.xreg], $1+%[1.ind]} ) | | |
|
|||
|
... | ADDR_EXTERNAL src4b |
|
|||
|
remove( allexceptcon )
|
|||
|
move( %[2], {da4, tostring($1)+"+"+%[1.ind]} ) | | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 3 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
adi $1==2 | NC SCR_XREG im2 | |
|
|||
|
{regconst2, %[1], %[2.num]} | |
|
|||
|
... | NC SCR_XREG ADDR_LOCAL |
|
|||
|
"add %[1], R13"
|
|||
|
erase(%[1]) |
|
|||
|
{regconst2, %[1], %[2.ind]} | |
|
|||
|
... | NC REG ADDR_LOCAL |
|
|||
|
allocate( XREG )
|
|||
|
"ld %[a], R13"
|
|||
|
"add %[a], %[1]"
|
|||
|
erase(%[a]) |
|
|||
|
{regconst2, %[a], %[2.ind]} | |
|
|||
|
... | NC SCR_XREG regconst2 |
|
|||
|
"add %[1], %[2.xreg]"
|
|||
|
erase(%[1]) |
|
|||
|
{regconst2, %[1], %[2.ind]} | |
|
|||
|
... | NC im2 ADDR_LOCAL | |
|
|||
|
{ADDR_LOCAL, %[1.num]+%[2.ind]} | |
|
|||
|
... | NC src2 im2+ADDR_LOCAL |
|
|||
|
allocate( %[1], XREG = %[1] ) |
|
|||
|
%[2] %[a] | adi 2 |
|
|||
|
... | NC src2 regconst2 |
|
|||
|
"add %[2.xreg], %[1]"
|
|||
|
erase(%[2.xreg]) | %[2] | |
|
|||
|
... | NC regconst2 im2 | |
|
|||
|
{regconst2, %[1.xreg], %[2.num]+%[1.ind]} | |
|
|||
|
... | NC regconst2 ADDR_LOCAL |
|
|||
|
"add %[1.xreg], R13"
|
|||
|
erase(%[1.xreg]) |
|
|||
|
{regconst2, %[1.xreg],
|
|||
|
%[2.ind]+%[1.ind]} | |
|
|||
|
... | NC regconst2 regconst2 |
|
|||
|
"add %[1.xreg],%[2.xreg]"
|
|||
|
erase(%[1.xreg]) |
|
|||
|
{regconst2, %[1.xreg],
|
|||
|
%[2.ind]+%[1.ind]} | |
|
|||
|
... | NC regconst2 src2-im2 |
|
|||
|
"add %[1.xreg], %[2]"
|
|||
|
erase(%[1.xreg]) | %[1] | |
|
|||
|
... | NC ADDR_LOCAL regconst2 |
|
|||
|
"add %[2.xreg], R13"
|
|||
|
erase(%[2.xreg]) |
|
|||
|
{regconst2, %[2.xreg],
|
|||
|
%[1.ind]+%[2.ind]} | |
|
|||
|
... | NC ADDR_LOCAL src2 | | %[1] %[2] | adi 2 |
|
|||
|
... | NC SCR_REG src2-im2 | "add %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
... | src2 SCR_REG | "add %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | |
|
|||
|
adi $1==4 | src4 SCR_LWREG |
|
|||
|
"addl %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,8)+%[1]
|
|||
|
... | SCR_LWREG src4 |
|
|||
|
"addl %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | | (2,8)+%[2]
|
|||
|
sbi $1==2 | src2 SCR_REG | "sub %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,4)+%[1]
|
|||
|
... | SCR_REG src2 | "sub %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
| %[1] | ngi 2 | (2,4)+%[2]
|
|||
|
sbi $1==4 | src4 SCR_LWREG |
|
|||
|
"subl %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,8)+%[1]
|
|||
|
... | SCR_LWREG src4 |
|
|||
|
"subl %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
| %[1] | ngi 4 | (2,8)+%[2]
|
|||
|
mli $1==2 | src2 src2 | allocate( %[2], LWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"mult %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
setcc(%[a.2]) | %[a.2] | |
|
|||
|
mli $1==4 | src4 src4 | allocate( %[2], DLWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"multl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
setcc(%[a.2]) | %[a.2] | |
|
|||
|
dvi $1==2 | src2 src2 | allocate( %[2], LWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"exts %[a]"
|
|||
|
"div %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
nocc | %[a.2] | |
|
|||
|
dvi $1==4 | src4 src4 | allocate( %[2], DLWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"extsl %[a]"
|
|||
|
"divl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
nocc | %[a.2] | |
|
|||
|
rmi $1==2 | src2 src2 | allocate( %[2], LWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"exts %[a]"
|
|||
|
"div %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
nocc | %[a.1] | |
|
|||
|
rmi $1==4 | src4 src4 | allocate( %[2], DLWREG )
|
|||
|
move( %[2], %[a.2] )
|
|||
|
"extsl %[a]"
|
|||
|
"divl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
nocc | %[a.1] | |
|
|||
|
ngi $1==2 | SCR_REG | "neg %[1]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | | (2,7)
|
|||
|
ngi $1==4 | src4 | allocate( LWREG = {im4, 0} )
|
|||
|
"subl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
setcc(%[a]) | %[a] | | (2,8)+%[1]
|
|||
|
sli $1==2 | im2 SCR_REG | "sla %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,0)
|
|||
|
... | REG SCR_REG | "sda %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
sli $1==4 | im2 SCR_LWREG | "slal %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,0)
|
|||
|
... | REG SCR_LWREG | "sdal %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
sri $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} )
|
|||
|
"sda %[2], %[a]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
... | REG SCR_REG | "neg %[1]"
|
|||
|
"sda %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (6,9)
|
|||
|
sri $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
|
|||
|
"sdal %[2], %[a]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
... | REG SCR_LWREG | "neg %[1]"
|
|||
|
"sdal %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (6,9)
|
|||
|
lol loc adi stl $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
|
|||
|
loc $2 lol $1 adi $3 stl $4 |
|
|||
|
loc lol adi stl $2==$4 && $3==2 && $1>0 && $1<=16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$2 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$2-2 || %[ind]==$2 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$2 || %[ind]==$2+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $2(R13), $$$1"
|
|||
|
setcc({x2, LB, $2}) | | |
|
|||
|
loc lol adi stl $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$2 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$2-2 || %[ind]==$2 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$2 || %[ind]==$2+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $2(R13), $$$1"
|
|||
|
setcc({x2, LB, $2}) | | |
|
|||
|
loe loc adi ste $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
|
|||
|
loc $2 loe $1 adi $3 ste $4 |
|
|||
|
loc loe adi ste $2==$4 && $3==2 && $1>0 && $1<=16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $2, $$$1"
|
|||
|
setcc({da2, $2}) | | |
|
|||
|
loc loe adi ste $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $2, $$$1"
|
|||
|
setcc({da2, $2}) | | |
|
|||
|
lil loc adi sil $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
|
|||
|
loc $2 lil $1 adi $3 sil $4 |
|
|||
|
loc lil adi sil $2==$4 && $3==2 && $1>0 && $1<=16 | |
|
|||
|
remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $2}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"inc *%[a], $$$1"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
loc lil adi sil $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
|
|||
|
remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $2}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"dec *%[a], $$$1"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lol loc sbi stl $1==$4 && $3==2 && $2>0 && $2<=16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1(R13), $$$2"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
lol loc sbi stl $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1(R13), $$$2"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
loe loc sbi ste $1==$4 && $3==2 && $2>0 && $2<=16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1, $$$2"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
loe loc sbi ste $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1, $$$2"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
lil loc sbi sil $1==$4 && $3==2 && $2>0 && $2<=16 | |
|
|||
|
remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"dec *%[a], $$$2"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lil loc sbi sil $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
|
|||
|
remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"inc *%[a], $$$2"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lol ngi stl $1==$3 && $2==2 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
remove( allexceptcon )
|
|||
|
"neg $1(R13)"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
loe ngi ste $1==$3 && $2==2 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"neg $1"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
lil ngi sil $1==$3 && $2==2 | |
|
|||
|
remove( allexceptcon )
|
|||
|
allocate( LWXREG )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"neg *%[a]"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
loc sli $1>=0 && $1<=16 && $2==2 | SCR_REG |
|
|||
|
"sla %[1], $$$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
loc sli $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
|
|||
|
"slal %[1], $$$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
loc sri $1>=0 && $1<=16 && $2==2 | SCR_REG |
|
|||
|
"sra %[1], $$-$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
loc sri $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
|
|||
|
"sral %[1], $$-$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
loc sru $1>=0 && $1<=16 && $2==2 | SCR_REG |
|
|||
|
"srl %[1], $$-$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
loc sru $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
|
|||
|
"srll %[1], $$-$1"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 4 ********
|
|||
|
***************************************/
|
|||
|
/* adu = adi
|
|||
|
** sbu = sbi
|
|||
|
** mlu = mli
|
|||
|
** slu = sli
|
|||
|
*/
|
|||
|
|
|||
|
adu | | | | adi $1 |
|
|||
|
sbu | | | | sbi $1 |
|
|||
|
mlu | | | | mli $1 |
|
|||
|
slu | | | | sli $1 |
|
|||
|
dvu $1==2 | STACK | "calr dvu2" | R1 | |
|
|||
|
dvu $1==4 | STACK | "calr dvu4" | R3 R2 | |
|
|||
|
rmu $1==2 | STACK | "calr rmu2" | R0 | |
|
|||
|
rmu $1==4 | STACK | "calr rmu4" | R1 R0 | |
|
|||
|
sru $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} )
|
|||
|
"sdl %[2], %[a]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
... | REG SCR_REG | "neg %[1]"
|
|||
|
"sdl %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (6,9)
|
|||
|
sru $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
|
|||
|
"sdll %[2], %[a]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (4,2)
|
|||
|
... | REG SCR_LWREG | "neg %[1]"
|
|||
|
"sdll %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (6,9)
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 6 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
adp | SCR_XREG | | {regconst2, %[1], $1} | |
|
|||
|
... | NC regconst2 | | {regconst2, %[1.xreg], $1+%[1.ind]} | |
|
|||
|
... | NC ADDR_LOCAL | | {ADDR_LOCAL, %[1.ind]+$1 } | |
|
|||
|
... | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL,
|
|||
|
tostring($1)+"+"+%[1.ind]} | |
|
|||
|
lil adp sil $1==$3 && $2>0 && $2<=16 | | allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"inc *%[a], $$$2"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lil adp sil $1==$3 && $2<0 && $2>=0-16 | | allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"dec *%[a], $$$2"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lil adp dup sil adp $1==$4 && $3==2 && $2==1 && $5==0-1 | |
|
|||
|
allocate( LWXREG, XREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"ld %[b], *%[a]"
|
|||
|
"inc *%[a]" | {regconst2, %[b], 0} | |
|
|||
|
/* because the next EM-instruction
|
|||
|
** will be `loi'.
|
|||
|
*/
|
|||
|
lil adp dup sil $1==$4 && $3==2 && $2==1 | |
|
|||
|
allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"inc *%[a]"
|
|||
|
setcc({ir2, %[a]}) | {ir2,%[a]} | |
|
|||
|
lol lol adp stl $1==$2 && $2==$4 && $3>0 && $3<=16 | |
|
|||
|
allocate( REG = {x2, LB, $1} )
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1(R13), $$$3"
|
|||
|
setcc({x2, LB, $1}) | %[a] | |
|
|||
|
lol lol adp stl $1==$2 && $2==$4 && $3<0 && $3>=0-16 | |
|
|||
|
allocate( REG = {x2, LB, $1} )
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1(R13), $$$3"
|
|||
|
setcc({x2, LB, $1}) | %[a] | |
|
|||
|
loe loe adp ste $1==$2 && $2==$4 && $3>0 && $3<=16 | |
|
|||
|
allocate( REG = {da2, $1} )
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1, $$$3"
|
|||
|
setcc({da2, $1}) | %[a] | |
|
|||
|
loe loe adp ste $1==$2 && $2==$4 && $3<0 && $3>=0-16 | |
|
|||
|
allocate( REG = {da2, $1} )
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1, $$$3"
|
|||
|
setcc({da2, $1}) | %[a] | |
|
|||
|
lol adp stl $1==$3 && $2>0 && $2<=16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1(R13), $$$2"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
lol adp stl $1==$3 && $2<0 && $2>=0-16 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1(R13), $$$2"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
loe adp ste $1==$3 && $2>0 && $2<=16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1, $$$2"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
loe adp ste $1==$3 && $2<0 && $2>=0-16 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1, $$$2"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
ads $1==2 | | | | adi $1 |
|
|||
|
ads $1==4 | | | | adi $1 |
|
|||
|
sbs $1==2 | | | | sbi $1 |
|
|||
|
sbs $1==4 | | | | sbi $1 |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 7 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
inc | SCR_REG | "inc %[1]"
|
|||
|
erase(%[1]) setcc(%[1]) | %[1] | |
|
|||
|
lil inc sil $1==$3 | | allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"inc *%[a]"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
dec | SCR_REG | "dec %[1]"
|
|||
|
erase(%[1]) setcc(%[1]) | %[1] | |
|
|||
|
lil dec sil $1==$3 | | allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"dec *%[a]"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
lil dec dup sil $1==$4 && $3==2 | | allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"dec *%[a]"
|
|||
|
setcc({ir2, %[a]}) | {ir2,%[a]} | |
|
|||
|
inl | | remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
|
|||
|
remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1(R13)"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
del | | remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
|
|||
|
remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1(R13)"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
zrl | | remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
|
|||
|
remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"clr $1(R13)"
|
|||
|
samecc | | |
|
|||
|
ine | | remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"inc $1"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
dee | | remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"dec $1"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
zre | | remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"clr $1"
|
|||
|
samecc | | |
|
|||
|
zer $1==2 | | | {im2, 0} | |
|
|||
|
zer $1==4 | | | {im4, 0} | |
|
|||
|
zer $1==6 | | | {im4, 0} {im2, 0} | |
|
|||
|
zer $1==8 | | | {im4, 0} {im4, 0} | |
|
|||
|
zer $1>8 | | remove( ALL )
|
|||
|
allocate( REG = {im2, $1/2} ) /*nr of words*/
|
|||
|
"1:\tpush *RR14, $$0"
|
|||
|
"djnz %[a], 1b"
|
|||
|
erase(%[a]) samecc | | |
|
|||
|
zer !defined($1)| SCR_REG | remove( ALL )
|
|||
|
"sra %[1]"
|
|||
|
"1:\tpush *RR14, $$0"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[1]) nocc | | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 8 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
cii | STACK | "calr cii" | | |
|
|||
|
loc loc cii $1==1 && $2==2 | NC src1 |
|
|||
|
allocate( %[1], B2REG = %[1] ) | %[a] | |
|
|||
|
... | src2 | allocate( %[1], REG = %[1] )
|
|||
|
"extsb %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
loc loc cii $1==1 && $2==4 | NC src1 |
|
|||
|
allocate( %[1], LWB2REG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
"exts %[a]"
|
|||
|
samecc | %[a] | |
|
|||
|
... | src2 | allocate( %[1], LWREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
"exts %[a]"
|
|||
|
samecc | %[a] | |
|
|||
|
loc loc cii $1==2 && $2==4 | src2 | allocate( %[1], LWREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
"exts %[a]"
|
|||
|
samecc | %[a] | |
|
|||
|
loc loc loc cii $1>=0 && $2==2 && $3==4 | | | | loc $1 loc 0 |
|
|||
|
loc loc loc cii $1< 0 && $2==2 && $3==4 | | | | loc $1 loc 0-1 |
|
|||
|
loc loc cii $1==4 && $2==2 | src2 src2 | | %[2] | |
|
|||
|
loc loc cuu $1==2 && $2==4 | | | {im2, 0} | |
|
|||
|
loc loc cuu $1==4 && $2==2 | src2 | | | |
|
|||
|
cuu | STACK | "calr cuu" | | |
|
|||
|
ciu | | | | cuu |
|
|||
|
cui | | | | cuu |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 9 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
and $1==2 | SCR_REG src2 | "and %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | | (2,4)+%[2]
|
|||
|
... | src2 SCR_REG | "and %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,4)+%[1]
|
|||
|
and $1>2 | | remove( ALL )
|
|||
|
allocate( LWXREG, REG, REG = {im2, $1/2} )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"and %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[c], 1b"
|
|||
|
erase(%[c]) nocc | | |
|
|||
|
and !defined($1)| SCR_REG | remove( ALL )
|
|||
|
allocate( LWXREG, REG )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"sra %[1]"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"and %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[1]) nocc | | |
|
|||
|
ior $1==2 | SCR_REG src2 | "or %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | | (2,4)+%[2]
|
|||
|
... | src2 SCR_REG | "or %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,4)+%[1]
|
|||
|
ior $1>2 | | remove( ALL )
|
|||
|
allocate( LWXREG, REG, REG = {im2, $1/2} )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"or %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[c], 1b"
|
|||
|
erase(%[c]) nocc | | |
|
|||
|
ior !defined($1)| SCR_REG | remove( ALL )
|
|||
|
allocate( LWXREG, REG )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"sra %[1]"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"or %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[1]) nocc | | |
|
|||
|
xor $1==2 | SCR_REG src2 | "xor %[1], %[2]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | | (2,4)+%[2]
|
|||
|
... | src2 SCR_REG | "xor %[2], %[1]"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | | (2,4)+%[1]
|
|||
|
xor $1>2 | | remove( ALL )
|
|||
|
allocate( LWXREG, REG, REG = {im2, $1/2} )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"xor %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[c], 1b"
|
|||
|
erase(%[c]) nocc | | |
|
|||
|
xor !defined($1)| SCR_REG | remove( ALL )
|
|||
|
allocate( LWXREG, REG )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"addl %[a], $$$1"
|
|||
|
"sra %[1]"
|
|||
|
"1:\tpop %[b], *RR14"
|
|||
|
"xor %[b], *%[a]"
|
|||
|
"ld *%[a], %[b]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[1]) nocc | | |
|
|||
|
com $1==2 | SCR_REG | "com %[1]"
|
|||
|
erase(%[1])
|
|||
|
setcc(%[1]) | %[1] | |
|
|||
|
com defined($1) | STACK | allocate( LWXREG, REG = {im2, $1/2} )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"1:\tcom *%[a]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[b], 1b"
|
|||
|
erase(%[b]) nocc | | |
|
|||
|
com !defined($1)| SCR_REG STACK | allocate( LWXREG )
|
|||
|
"ldl %[a], RR14"
|
|||
|
"1:\tcom *%[a]"
|
|||
|
"inc %[a.2], $$2"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[1]) nocc | | |
|
|||
|
lil and sil $1==$3 && $2==2 | SCR_REG |
|
|||
|
allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"and %[1], *%[a]"
|
|||
|
"ld *%[a], %[1]" | | |
|
|||
|
lil ior sil $1==$3 && $2==2 | SCR_REG |
|
|||
|
allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"or %[1], *%[a]"
|
|||
|
"ld *%[a], %[1]" | | |
|
|||
|
lil xor sil $1==$3 && $2==2 | SCR_REG |
|
|||
|
allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"xor %[1], *%[a]"
|
|||
|
"ld *%[a], %[1]" | | |
|
|||
|
lol com stl $1==$3 && $2==2 | |
|
|||
|
remove( x2, %[xreg]==LB && %[ind]==$1 )
|
|||
|
remove( x4, %[xreg]==LB &&
|
|||
|
( %[ind]==$1-2 || %[ind]==$1 ))
|
|||
|
remove( x1, %[xreg]==LB &&
|
|||
|
( %[ind]==$1 || %[ind]==$1+1 ))
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
remove( allexceptcon )
|
|||
|
"com $1(R13)"
|
|||
|
setcc({x2, LB, $1}) | | |
|
|||
|
loe com ste $1==$3 && $2==2 | |
|
|||
|
remove( da )
|
|||
|
remove( indexed, %[xreg]!=LB )
|
|||
|
remove( ind_access )
|
|||
|
"com $1"
|
|||
|
setcc({da2, $1}) | | |
|
|||
|
lil com sil $1==$3 && $2==2 | |
|
|||
|
allocate( LWXREG )
|
|||
|
remove( allexceptcon )
|
|||
|
move( {x2, LB, $1}, %[a.2] )
|
|||
|
move( {im2, 0}, %[a.1] )
|
|||
|
"com *%[a]"
|
|||
|
setcc({ir2, %[a]}) | | |
|
|||
|
rol $1==2 | SCR_REG SCR_REG | "1:\trl %[2]"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | |
|
|||
|
ror $1==2 | SCR_REG SCR_REG | "1:\trr %[2]"
|
|||
|
"djnz %[1], 1b"
|
|||
|
erase(%[2])
|
|||
|
setcc(%[2]) | %[2] | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 10 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
inn $1==2 | REG SCR_REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[1], $$15"
|
|||
|
"jr UGT, 1f"
|
|||
|
"bit %[2], %[1]"
|
|||
|
"tcc NE, %[a]\n1:"
|
|||
|
erase(%[a]) nocc | %[a] | |
|
|||
|
inn defined($1) | src2 STACK | move( %[1], R1 )
|
|||
|
move( {im2, $1}, R2 )
|
|||
|
"calr inn"
|
|||
|
erase(R1)
|
|||
|
erase(R2) | R0 | |
|
|||
|
inn !defined($1)| src2 src2 STACK | move( %[1], R2 )
|
|||
|
move( %[2], R1 )
|
|||
|
"calr inn"
|
|||
|
erase(R1)
|
|||
|
erase(R2) | R0 | |
|
|||
|
loc inn $2==2 && $1==0 | SCR_REG |
|
|||
|
"and %[1], $$1"
|
|||
|
erase(%[1]) setcc(%[1]) | %[1] | |
|
|||
|
loc inn $2==2 && $1==1 | SCR_REG |
|
|||
|
"srl %[1]"
|
|||
|
"and %[1], $$1"
|
|||
|
erase(%[1]) setcc(%[1]) | %[1] | |
|
|||
|
loc inn $2==2 && $1>1 && $1<=16 | SCR_REG |
|
|||
|
"srl %[1], $$%(0-$1%)"
|
|||
|
"and %[1], $$1"
|
|||
|
erase(%[1]) setcc(%[1]) | %[1] | |
|
|||
|
loc inn zeq $2==2 | | | {im2, 1<<$1} | and 2 zeq $3 |
|
|||
|
inn zeq $1==2 | REG | allocate( REG = {im2, 1} )
|
|||
|
"sdl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
setcc(%[a]) | %[a] | and 2 zeq $2 |
|
|||
|
loc inn zne $2==2 | | | {im2, 1<<$1} | and 2 zne $3 |
|
|||
|
inn zne $1==2 | REG | allocate( REG = {im2, 1} )
|
|||
|
"sdl %[a], %[1]"
|
|||
|
erase(%[a])
|
|||
|
setcc(%[a]) | %[a] | and 2 zne $2 |
|
|||
|
set $1==2 | REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[1], $$15"
|
|||
|
"jr ULE, 1f"
|
|||
|
"push *RR14, $$ESET"
|
|||
|
"calr trp"
|
|||
|
"jr 2f"
|
|||
|
"1:\tset %[a], %[1]\n2:"
|
|||
|
erase(%[a]) nocc | %[a] | |
|
|||
|
set defined($1) | src2 STACK | move( %[1], R1 )
|
|||
|
move( {im2, $1}, R0 )
|
|||
|
"calr xset"
|
|||
|
erase(R0)
|
|||
|
erase(R1) | | |
|
|||
|
set !defined($1)| src2 src2 STACK | move( %[1], R0 )
|
|||
|
move( %[2], R1 )
|
|||
|
"calr xset"
|
|||
|
erase(R0)
|
|||
|
erase(R1) | | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 11 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
aar $1==2 | src2 src2 STACK | move( %[1], R1 )
|
|||
|
move( %[2], R3 )
|
|||
|
"calr aar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
aar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
|
|||
|
move( %[3], R3 )
|
|||
|
"cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
"calr aar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
sar $1==2 | src2 src2 STACK | move( %[1], R1 )
|
|||
|
move( %[2], R3 )
|
|||
|
"calr sar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
sar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
|
|||
|
move( %[3], R3 )
|
|||
|
"cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
"calr sar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
lar $1==2 | src2 src2 STACK | move( %[1], R1 )
|
|||
|
move( %[2], R3 )
|
|||
|
"calr lar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
lar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
|
|||
|
move( %[3], R3 )
|
|||
|
"cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
"calr lar"
|
|||
|
erase(R1)
|
|||
|
erase(R3) | | |
|
|||
|
lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0 | | | | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0 | | | |
|
|||
|
adi 2 adp 0-rom(1,1) |
|
|||
|
lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0 | SCR_REG |
|
|||
|
"sla %[1]"
|
|||
|
erase(%[1]) | %[1] | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | SCR_XREG |
|
|||
|
"sla %[1]"
|
|||
|
erase(%[1])
|
|||
|
| {regconst2, %[1], (0-2)*rom(1,1)} | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==4 && rom(1,1)==0 | SCR_REG |
|
|||
|
"sla %[1], $$2"
|
|||
|
erase(%[1]) | %[1] | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0 | SCR_XREG |
|
|||
|
"sla %[1], $$2"
|
|||
|
erase(%[1])
|
|||
|
| {regconst2, %[1], (0-4)*rom(1,1)} | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==8 && rom(1,1)==0 | SCR_REG |
|
|||
|
"sla %[1], $$3"
|
|||
|
erase(%[1]) | %[1] | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0 | SCR_XREG |
|
|||
|
"sla %[1], $$3"
|
|||
|
erase(%[1])
|
|||
|
| {regconst2, %[1], (0-8)*rom(1,1)} | adi 2 |
|
|||
|
lae aar $2==2 && rom(1,1)==0 | src2 |
|
|||
|
allocate( %[1], LWREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
"mult %[a], $$%(rom(1,3)%)"
|
|||
|
erase(%[a]) | %[a.2] | adi 2 |
|
|||
|
lae aar $2==2 && defined(rom(1,1)) | src2 |
|
|||
|
allocate( %[1], LWREG )
|
|||
|
move( %[1], %[a.2] )
|
|||
|
"mult %[a], $$%(rom(1,3)%)"
|
|||
|
erase(%[a])
|
|||
|
| {regconst2, %[a.2], (0-rom(1,3))*rom(1,1)} | adi 2 |
|
|||
|
lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) |
|
|||
|
lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 12 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
cmi $1==2 | | | | sbi $1 |
|
|||
|
cmi $1==4 | STACK | "calr cmi4" | R0 | |
|
|||
|
cmi !defined($1)| src2 STACK | move( %[1], R0 )
|
|||
|
"calr cmi"
|
|||
|
erase(R0) | R0 | |
|
|||
|
cmu $1==2 | | | | cmp |
|
|||
|
cmu $1==4 | STACK | "calr cmu4" | R0 | |
|
|||
|
cmu !defined($1)| src2 STACK | move( %[1], R0 )
|
|||
|
"calr cmu"
|
|||
|
erase(R0) | R0 | |
|
|||
|
cms $1==2 | | | | sbi $1 |
|
|||
|
cms defined($1) | STACK | move( {im2, $1}, R0 )
|
|||
|
"calr cms"
|
|||
|
erase(R0) | R0 | |
|
|||
|
cms !defined($1)| src2 STACK | move( %[1], R0 )
|
|||
|
"calr cms"
|
|||
|
erase(R0) | R0 | |
|
|||
|
cmp | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr EQ, 2f"
|
|||
|
"jr ULT, 1f"
|
|||
|
"inc %[a]"
|
|||
|
"jr 2f"
|
|||
|
"1:\tdec %[a]\n2:"
|
|||
|
erase(%[a]) nocc | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr EQ, 2f"
|
|||
|
"jr ULT, 1f"
|
|||
|
"inc %[a]"
|
|||
|
"jr 2f"
|
|||
|
"1:\tdec %[a]\n2:"
|
|||
|
erase(%[a]) nocc | %[a] | |
|
|||
|
tlt | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc LT, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
tle | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc LE, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
teq | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc EQ, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
tne | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc NE, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
tge | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc GE, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
tgt | src2c | allocate( REG = {im2, 0} )
|
|||
|
test(%[1])
|
|||
|
"tcc GT, %[a]"
|
|||
|
erase(%[a]) samecc | %[a] | |
|
|||
|
cmp tlt | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc ULT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc ULT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmp tle | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc ULE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc ULE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmp teq | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc EQ, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc EQ, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmp tne | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc NE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc NE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmp tge | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc UGE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc UGE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmp tgt | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc UGT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc UGT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
tlt and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr LT, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tlt ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc LT, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tle and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr LE, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tle ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc LE, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
teq and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr EQ, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
teq ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc EQ, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tne and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr NE, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tne ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc NE, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tgt and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr GT, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tgt ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc GT, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tge and $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"jr GE, 1f"
|
|||
|
"ldk %[2], $$0\n1:"
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
tge ior $2==2 | src2c SCR_REG | test(%[1])
|
|||
|
"tcc GE, %[2]"
|
|||
|
samecc
|
|||
|
erase(%[2]) | %[2] | |
|
|||
|
cmi tlt and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LT, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr LT, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tlt ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LT, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc LT, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tlt $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmi tle and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr LE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tle ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc LE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tle $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc LE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmi teq and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr EQ, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr EQ, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi teq ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc EQ, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc EQ, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi teq $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc EQ, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc EQ, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmi tne and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr NE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr NE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tne ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc NE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc NE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tne $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc NE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc NE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmi tge and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr GE, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tge ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc GE, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tge $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GE, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
cmi tgt and $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GT, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"jr GT, 1f"
|
|||
|
"ldk %[3], $$0\n1:"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tgt ior $1==2 && $3==2 | src2 REG SCR_REG |
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GT, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
|
|||
|
"tcc GT, %[3]"
|
|||
|
erase(%[3]) | %[3] | |
|
|||
|
cmi tgt $1==2 | src2 REG | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
... | NC im2 src2a | allocate( REG = {im2, 0} )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"tcc GT, %[a]"
|
|||
|
erase(%[a]) | %[a] | |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 13 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
bra | STACK | "jr $1" samecc | | |
|
|||
|
blt | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LT, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LT, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr GT, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr GT, $1" | | |
|
|||
|
ble | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LE, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr LE, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr GE, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr GE, $1" | | |
|
|||
|
beq | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr EQ, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr EQ, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr EQ, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr EQ, $1" | | |
|
|||
|
bne | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr NE, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr NE, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr NE, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr NE, $1" | | |
|
|||
|
bge | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GE, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GE, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr LE, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr LE, $1" | | |
|
|||
|
bgt | src2 REG | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GT, $1" | | | (4,10)+%[1]
|
|||
|
... | NC im2 src2a | remove( ALL )
|
|||
|
"cp %[2], %[1]"
|
|||
|
"jr GT, $1" | | |
|
|||
|
... | REG src2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr LT, $1" | | | (4,10)+%[2]
|
|||
|
... | NC src2a im2 | remove( ALL )
|
|||
|
"cp %[1], %[2]"
|
|||
|
"jr LT, $1" | | |
|
|||
|
zlt | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr LT, $1"
|
|||
|
samecc | | |
|
|||
|
zle | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr LE, $1"
|
|||
|
samecc | | |
|
|||
|
zeq | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr EQ, $1"
|
|||
|
samecc | | |
|
|||
|
zne | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr NE, $1"
|
|||
|
samecc | | |
|
|||
|
zge | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr GE, $1"
|
|||
|
samecc | | |
|
|||
|
zgt | src2c | remove( ALL )
|
|||
|
test(%[1])
|
|||
|
"jr GT, $1"
|
|||
|
samecc | | |
|
|||
|
cmp zlt | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr ULT, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr ULT, $2" | | |
|
|||
|
cmp zle | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr ULE, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr ULE, $2" | | |
|
|||
|
cmp zeq | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr EQ, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr EQ, $2" | | |
|
|||
|
cmp zne | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr NE, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr NE, $2" | | |
|
|||
|
cmp zgt | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr UGT, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr UGT, $2" | | |
|
|||
|
cmp zge | src2 REG STACK | "cp %[2], %[1]"
|
|||
|
"jr UGE, $2" | | |
|
|||
|
... | NC im2 src2a STACK | "cp %[2], %[1]"
|
|||
|
"jr UGE, $2" | | |
|
|||
|
and zeq $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
|
|||
|
"jr EQ, $2"
|
|||
|
erase(%[2]) | | | (4,10)+%[1]
|
|||
|
... | SCR_REG src2 STACK | "and %[1], %[2]"
|
|||
|
"jr EQ, $2"
|
|||
|
erase(%[1]) | | | (4,10)+%[2]
|
|||
|
and zne $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
|
|||
|
"jr NE, $2"
|
|||
|
erase(%[2]) | | | (4,10)+%[1]
|
|||
|
... | SCR_REG src2 STACK | "and %[1], %[2]"
|
|||
|
"jr NE, $2"
|
|||
|
erase(%[1]) | | | (4,10)+%[2]
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 14 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
cal | STACK | "calr $1" | | |
|
|||
|
cai | NC src2a-x2 STACK | "call %[1]" | | |
|
|||
|
... | NC x2 STACK | allocate( %[1], XREG = %[1] )
|
|||
|
"call 0(%[a])" | | |
|
|||
|
... | XREG STACK | "call 0(%[1])" | | |
|
|||
|
lfr $1==0 | | | | |
|
|||
|
lfr $1==2 | | | R0 | |
|
|||
|
lfr $1==4 | | | RR0 | |
|
|||
|
lfr $1==6 | | | R2 R1 R0 | |
|
|||
|
lfr $1==8 | | | RR2 RR0 | |
|
|||
|
ret $1==0 | STACK | "ldk R14, $$0\nld R15, R13"
|
|||
|
"pop R13, *RR14"
|
|||
|
"ret" | | |
|
|||
|
ret $1==2 | src2 STACK | move( %[1], R0 )
|
|||
|
"ldk R14, $$0\nld R15, R13"
|
|||
|
"pop R13, *RR14"
|
|||
|
"ret" | | |
|
|||
|
ret $1==4 | src4 STACK | move( %[1], RR0 )
|
|||
|
"ldk R14, $$0\nld R15, R13"
|
|||
|
"pop R13, *RR14"
|
|||
|
"ret" | | |
|
|||
|
ret $1==6 | src2 src2 src2 STACK | move( %[1], R0 )
|
|||
|
move( %[2], R1 )
|
|||
|
move( %[3], R2 )
|
|||
|
"ldk R14, $$0\nld R15, R13"
|
|||
|
"pop R13, *RR14"
|
|||
|
"ret" | | |
|
|||
|
ret $1==8 | src4 src4 STACK | move( %[1], RR0 )
|
|||
|
move( %[2], RR2 )
|
|||
|
"ldk R14, $$0\nld R15, R13"
|
|||
|
"pop R13, *RR14"
|
|||
|
"ret" | | |
|
|||
|
lfr ret $1==$2 | | | | ret 0 |
|
|||
|
asp lfr ret $2==$3 | | | | ret 0 |
|
|||
|
asp ret $2==0 | | | | ret 0 |
|
|||
|
/**/
|
|||
|
/***************************************
|
|||
|
******** GROUP 15 ********
|
|||
|
***************************************/
|
|||
|
|
|||
|
asp | STACK | "add R15, $$$1" | | |
|
|||
|
ass $1==2 | src2 STACK | "add R15, %[1]" | | |
|
|||
|
blm | STACK | move( {im2, $1}, R0 )
|
|||
|
"calr blm"
|
|||
|
erase(R0) | | |
|
|||
|
bls $1==2 | src2 STACK | move( %[1], R0 )
|
|||
|
"calr blm"
|
|||
|
erase(R0) | | |
|
|||
|
csa $1==2 | STACK | "pop R1, *RR14"
|
|||
|
"pop R2, *RR14"
|
|||
|
"jr csa" | | |
|
|||
|
lae csa $2==2 | src2 STACK | move( %[1], R2 )
|
|||
|
move( {ADDR_EXTERNAL, $1}, R1 )
|
|||
|
"jr csa" | | |
|
|||
|
csb $1==2 | STACK | "pop R1, *RR14"
|
|||
|
"pop R2, *RR14"
|
|||
|
"jr csb" | | |
|
|||
|
lae csb $2==2 | src2 STACK | move( %[1], R2 )
|
|||
|
move( {ADDR_EXTERNAL, $1}, R1 )
|
|||
|
"jr csb" | | |
|
|||
|
dup $1==2 | src2 | | %[1] %[1] | |
|
|||
|
dup $1==4 | src2 src2 | | %[2] %[1] %[2] %[1] | |
|
|||
|
dup | STACK | move( {im2, $1}, R0 )
|
|||
|
"calr dup"
|
|||
|
erase(R0) | | |
|
|||
|
dus $1==2 | src2 STACK | move( %[1], R0 )
|
|||
|
"calr dup"
|
|||
|
erase(R0) | | |
|
|||
|
exg $1==2 | src2 src2 | | %[1] %[2] | |
|
|||
|
exg $1==2 | STACK | move( {im2, $1}, R0 )
|
|||
|
"calr exg"
|
|||
|
erase(R0) | | |
|
|||
|
lor $1==0 | | | LB | |
|
|||
|
lor $1==1 | STACK | allocate( REG )
|
|||
|
"ld %[a], R15"
|
|||
|
samecc | %[a] | |
|
|||
|
lor $1==2 | | | {da2, "reghp"} | |
|
|||
|
rck $1==2 | src2 STACK | move( %[1], R1 )
|
|||
|
"calr rck" | | |
|
|||
|
rck !defined($1)| src2 src2 STACK | "cp %[1], $$2"
|
|||
|
"jr NE, unknown"
|
|||
|
move( %[2], R1 )
|
|||
|
"calr rck" | | |
|
|||
|
str $1==0 | src2 | "ld R13, %[1]" samecc | | |
|
|||
|
str $1==1 | src2 STACK | "ldk R14, $$0\nld R15, %[1]"
|
|||
|
samecc | | |
|
|||
|
str $1==2 | STACK | "calr strhp" | | |
|
|||
|
dch | | | | loi 2 |
|
|||
|
fil | | "ld hol0+4, $$$1" samecc | | |
|
|||
|
gto | STACK | "push *RR14, $$$1"
|
|||
|
"jr gto" | | |
|
|||
|
lim | | | {da2, "trpim"} | |
|
|||
|
lin | | "ld hol0, $$$1" samecc | | |
|
|||
|
lni | | "inc hol0" | | |
|
|||
|
lpb | | | | adp SL |
|
|||
|
mon | STACK | "calr mon" | | |
|
|||
|
nop | STACK | "calr noop" | | |
|
|||
|
rtt | | | | ret 0 |
|
|||
|
sig | REG | allocate(REG)
|
|||
|
move( {da2, "trppc"}, %[a] )
|
|||
|
"ld trppc, %[1]"
|
|||
|
samecc | %[a] | |
|
|||
|
sim | STACK | "pop trpim, *RR14"
|
|||
|
samecc | | |
|
|||
|
trp | STACK | "calr trp" | | |
|
|||
|
|
|||
|
/* For several floating point instructions we generate an illegal
|
|||
|
** instruction trap
|
|||
|
*/
|
|||
|
adf | | | | loc 18 trp |
|
|||
|
sbf | | | | loc 18 trp |
|
|||
|
mlf | | | | loc 18 trp |
|
|||
|
dvf | | | | loc 18 trp |
|
|||
|
ngf | | | | loc 18 trp |
|
|||
|
fef | | | | loc 18 trp |
|
|||
|
fif | | | | loc 18 trp |
|
|||
|
zrf | | | | loc 18 trp |
|
|||
|
cfi | | | | loc 18 trp |
|
|||
|
cif | | | | loc 18 trp |
|
|||
|
cfu | | | | loc 18 trp |
|
|||
|
cuf | | | | loc 18 trp |
|
|||
|
cff | | | | loc 18 trp |
|
|||
|
cmf | | | | loc 18 trp |
|
|||
|
/**/
|
|||
|
/* COERCIONS */
|
|||
|
/*********************************
|
|||
|
** From source2 to register **
|
|||
|
*********************************/
|
|||
|
| regconst2 | allocate( %[1], XREG = %[1.xreg] )
|
|||
|
"add %[a], $$%[1.ind]"
|
|||
|
setcc(%[a]) | %[a] | | (4,7)
|
|||
|
| ADDR_LOCAL | allocate( REG )
|
|||
|
"ld %[a], R13"
|
|||
|
"add %[a], $$%[1.ind]"
|
|||
|
setcc(%[a]) | %[a] | | (6,10)
|
|||
|
| REG | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | |
|
|||
|
| src2 | allocate( %[1], REG = %[1] ) | %[a] | |
|
|||
|
| src2 | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | |
|
|||
|
|
|||
|
|
|||
|
/*********************************
|
|||
|
** From source2 to source2 **
|
|||
|
*********************************/
|
|||
|
| ADDR_EXTERNAL | | {da2, %[1.ind]} | |
|
|||
|
|
|||
|
|
|||
|
/*********************************
|
|||
|
** From source1 to source2 **
|
|||
|
*********************************/
|
|||
|
| src1 | allocate( %[1], B2REG = %[1] ) | %[a] | |
|
|||
|
|
|||
|
|
|||
|
/*********************************
|
|||
|
** From source4 to register **
|
|||
|
*********************************/
|
|||
|
| src4 | allocate( %[1], LWREG = %[1] ) | %[a] | |
|
|||
|
|
|||
|
|
|||
|
/*********************************
|
|||
|
** From source4 to source2 **
|
|||
|
*********************************/
|
|||
|
| LWREG | | %[1.2] %[1.1] | |
|
|||
|
| x4 | | {x2, %[1.xreg], 2+%[1.ind]} {x2, %[1.xreg], %[1.ind]} | |
|
|||
|
| da4 | | {da2, "2+"+%[1.ind]} {da2, %[1.ind]} | |
|
|||
|
| ir4 | | {ir4_hi, %[1.lwxreg]} {ir2, %[1.lwxreg]} | |
|
|||
|
| ir4_hi | allocate( LWREG = %[1.lwreg] ) | {x2, %[a.2], 2} | |
|
|||
|
|
|||
|
|
|||
|
/*********************************
|
|||
|
** From STACK **
|
|||
|
*********************************/
|
|||
|
| STACK | allocate( REG )
|
|||
|
"pop %[a], *RR14"
|
|||
|
samecc | %[a] | | (2,8)
|
|||
|
| STACK | allocate( XREG )
|
|||
|
"pop %[a], *RR14"
|
|||
|
samecc | {regconst2, %[a], 0} | | (2,8)
|
|||
|
| STACK | allocate( LWREG )
|
|||
|
"popl %[a], *RR14"
|
|||
|
samecc | %[a] | | (2,12)
|
|||
|
|
|||
|
|
|||
|
MOVES:
|
|||
|
/* move( src, dst ) --> ld dst, src */
|
|||
|
(im2 (%[num]>=0 && %[num]<=15), REG, "ldk %[2], %[1]" samecc, (2,5))
|
|||
|
(im2 %[num]==0, src2a, "clr %[2]" samecc, (2,7)+%[2])
|
|||
|
(im2 %[num]==0, src1, "clrb %[2]" samecc, (2,7)+%[2])
|
|||
|
(im2, src1, "ldb %[2], $$[%[1.num]-[%[1.num]&0xFFFFFF00]+128]%%256-128"
|
|||
|
samecc, (4,9)+%[2])
|
|||
|
(src1, B2REG, "ldk %[2], $$0\nldb L%[2], %[1]" samecc, (4,8)+%[1])
|
|||
|
(src2, REG, "ld %[2], %[1]" samecc, (2,3)+%[1])
|
|||
|
(src4, LWREG, "ldl %[2], %[1]" samecc, (2,5)+%[1])
|
|||
|
(const2, src1, "ldb %[2], %[1]" samecc, (4,9)+%[2])
|
|||
|
(B2REG, src1, "ldb %[2], L%[1]" samecc, (2,6)+%[2])
|
|||
|
(src2b, src2a, "ld %[2], %[1]" samecc, (2,6)+%[1]+%[2])
|
|||
|
(src4b, src4a, "ldl %[2], %[1]" samecc, (2,6)+%[2])
|
|||
|
|
|||
|
|
|||
|
TESTS:
|
|||
|
(src2c, "test %[1]", (2,7)+%[1])
|
|||
|
|
|||
|
|
|||
|
STACKS:
|
|||
|
(src1, B2REG, move( %[1], %[a] )
|
|||
|
"push *RR14, %[a]"
|
|||
|
"clrb *RR14"
|
|||
|
samecc, (4,17) )
|
|||
|
(src1,, ".data\n1:\t.word 0\n.text"
|
|||
|
"ld 1b, R0"
|
|||
|
"ldk R0, $$0"
|
|||
|
"ldb RL0, %[1]"
|
|||
|
"push *RR14, R0"
|
|||
|
"ld R0, 1b"
|
|||
|
samecc, (18,37)+%[1] )
|
|||
|
(src2,, "push *RR14, %[1]"
|
|||
|
samecc, (2,9)+%[1] )
|
|||
|
(const4, LWREG, move( %[1], %[a] )
|
|||
|
"pushl *RR14, %[a]"
|
|||
|
samecc, (2,12) )
|
|||
|
(im4,, "push *RR14, %[1]"
|
|||
|
"push *RR14, $$0"
|
|||
|
samecc, (8,24) ) /* there is no pushl ir,im */
|
|||
|
(double,, ".data\n1:\t.long %[1]\n.text"
|
|||
|
"pushl *RR14, 1b"
|
|||
|
samecc, (6,20) )
|
|||
|
(src4,, "pushl *RR14, %[1]"
|
|||
|
samecc, (2,12)+%[1] )
|
|||
|
(regconst2,, "add %[1.xreg], $$%[1.ind]"
|
|||
|
"push *RR14, %[1.xreg]"
|
|||
|
nocc, (6,16) )
|
|||
|
(ADDR_LOCAL, REG,
|
|||
|
move( LB, %[a] )
|
|||
|
"add %[a], $$%[1.ind]"
|
|||
|
"push *RR14, %[a]"
|
|||
|
setcc(%[a]), (6,16) )
|
|||
|
(ADDR_LOCAL,, "add R13, $$%[1.ind]"
|
|||
|
"push *RR14, R13"
|
|||
|
"sub R13, $$%[1.ind]"
|
|||
|
nocc, (10,23) )
|