"$Id$"
#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), $$0-$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, $$0-$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], $$0-$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), $$0-$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, $$0-$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], $$0-$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], $$0-$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 dup adp stl $1==$4 && $2==2 && $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 dup adp stl $1==$4 && $2==2 && $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), $$0-$3"
			setcc({x2, LB, $1})		| %[a]	| |
loe dup adp ste $1==$4 && $2==2 && $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 dup adp ste $1==$4 && $2==2 && $3<0 && $3>=0-16	| |
			allocate( REG = {da2, $1} )
			remove( da )
			remove( indexed, %[xreg]!=LB )
			remove( ind_access )
			"dec $1, $$0-$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), $$0-$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, $$0-$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 | src2  REG	| allocate( REG = {im2, 0} )
			  "cp %[2], %[1]"
			  "jr EQ, 2f"
			  "jr LT, 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 LT, 1f"
			  "inc %[a]"
			  "jr 2f"
			  "1:\tdec %[a]\n2:"
			  erase(%[a])  nocc	| %[a]	| |
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	|
#ifdef DEBUG
	"calr noop"
#endif
					| | |
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,,		".sect data\n1:\t.data2 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,,	".sect .data\n1:\t.data4 %[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)		)