2198 lines
		
	
	
	
		
			50 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			2198 lines
		
	
	
	
		
			50 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| rcsid = "$Header$"
 | |
| 
 | |
| /*****************************************************************
 | |
|  *								 *
 | |
|  *       N S  1 6 0 3 2    B A C K - E N D  T A B L E		 *
 | |
|  *								 *
 | |
|  *								 *
 | |
|  *	Author: Annita Wilschut.				 *
 | |
|  *								 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Deze tabel implementeert, naast gewone, ook floating point
 | |
|  * instructies. Bij gebrek aan een floating point processor
 | |
|  * is het betreffende onderdeel van de tabel echter niet 
 | |
|  * getest. Wanneer NOFLOAT "aan" is worden er zeker geen
 | |
|  * floating point instructies gegenereerd. Na verwijdering van
 | |
|  * alle ifdef's worden er bij de vertaling van een programma dat
 | |
|  * geen floating point gebruikt, hoogst waarschhijnlijk ook
 | |
|  * geen floating point instructies gegenereerd. Dit is echter niet 
 | |
|  * uitgebreid getest.
 | |
|  */
 | |
| 
 | |
| EM_WSIZE=4
 | |
| EM_PSIZE=4
 | |
| EM_BSIZE=8
 | |
| 
 | |
| #define NOFLOAT
 | |
| 
 | |
| PROPERTIES
 | |
| 
 | |
| USELESS			/* Bug circumvention */
 | |
| REG			/* Normal registers */
 | |
| FREG			/* Floating point registers */
 | |
| DFREG(8)		/* double floating reg for double precision */
 | |
| MEMREG			/* sp, fp en sb */
 | |
| REGPAIR(8)		/* register pair for extended integer instr */
 | |
| PROGRAMCOUNTER
 | |
| STACKPOINTER
 | |
| STATICBASE
 | |
| LOCALBASE
 | |
| 
 | |
| 
 | |
| REGISTERS
 | |
| 
 | |
| r0,r1,r2,r7		: REG.
 | |
| r3,r4,r5,r6		: REG regvar .
 | |
| f0,f1,f2,f3,f4,f5,f6,f7		: FREG.
 | |
| f01("f0")=f0+f1,
 | |
| f23("f2")=f2+f3,
 | |
| f45("f4")=f4+f5,
 | |
| f67("f6")=f6+f7			: DFREG.
 | |
| r01("r0")=r0+r1,r23("r2")=r2+r3 : REGPAIR.
 | |
| sp				: STACKPOINTER, MEMREG.
 | |
| pc				: PROGRAMCOUNTER.
 | |
| fp				: LOCALBASE, MEMREG.
 | |
| sb				: STATICBASE, MEMREG.
 | |
| 
 | |
| 
 | |
| TOKENS
 | |
| 
 | |
| const4		= { INT num; } 4 num .
 | |
| LOCAL		= { INT ind;}  4 ind "(fp)" .
 | |
| DLOCAL		= { INT ind;} 8 ind "(fp)".
 | |
| 
 | |
| 
 | |
| addr_local	= { INT ind; } 4 .
 | |
| addr_external	= { ADDR disp; } 4 disp .
 | |
| 
 | |
| regrel1		= { REG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| regrel2		= { REG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| regrel4		= { REG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| regrel8		= { REG reg; ADDR disp; } 8 disp "(" reg ")" .
 | |
| memregrel1	= { MEMREG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| memregrel2	= { MEMREG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| memregrel4	= { MEMREG reg; ADDR disp; } 4 disp "(" reg ")" .
 | |
| memregrel8	= { MEMREG reg; ADDR disp; } 8 disp "(" reg ")" .
 | |
| memrel1		= { MEMREG reg; ADDR disp1; ADDR disp2; } 4 disp2 "("
 | |
| 			disp1 "(" reg "))" .
 | |
| memrel2		= { MEMREG reg; ADDR disp1; ADDR disp2; } 4 disp2 "("
 | |
| 			disp1 "(" reg "))" .
 | |
| memrel4		= { MEMREG reg; ADDR disp1; ADDR disp2; } 4 disp2 "("
 | |
| 			disp1 "(" reg "))" .
 | |
| memrel8		= { MEMREG reg; ADDR disp1; ADDR disp2; } 8 disp2 "("
 | |
| 			disp1 "(" reg "))" .
 | |
| absolute1	= { ADDR disp; } 4 "@" disp .
 | |
| absolute2	= { ADDR disp; } 4 "@" disp .
 | |
| absolute4	= { ADDR disp; } 4 "@" disp .
 | |
| absolute8	= { ADDR disp; } 8 "@" disp .
 | |
| TOS		= {} 4 "tos" .
 | |
| 
 | |
| regcon4		= { REG reg; ADDR disp; } 4 .
 | |
| memregcon4	= { MEMREG reg; ADDR disp; } 4 .
 | |
| memregrelcon4	= { MEMREG reg; ADDR disp1; ADDR disp2;} 4 .
 | |
| 
 | |
| label		= {ADDR disp; } 4 disp .
 | |
| 
 | |
| memregrelsid	= {INT ind; MEMREG reg1; REG reg2; } 4 ind "(" reg1 
 | |
| 			")[" reg2 ":d]" .
 | |
| abssid		= {ADDR disp; REG reg; } 4 "@" disp "[" reg ":d]" .
 | |
| fprelsid	= {ADDR disp1; ADDR disp2; REG reg; } 4
 | |
| 			disp2 "(" disp1 "(fp))[" reg ":d]" .
 | |
| sprelsid	= {ADDR disp1; ADDR disp2; REG reg; } 4
 | |
| 			disp2 "(" disp1 "(sp))[" reg ":d]" .
 | |
| 
 | |
| SETS
 | |
| 
 | |
| src1		= regrel1 + memregrel1 + memrel1 + absolute1 .
 | |
| src2		= regrel2 + memregrel2 + memrel2 + absolute2 .
 | |
| src4		= REG + const4 + LOCAL + regrel4 + memrel4 + 
 | |
| 	       	  memregrel4 + memregrelsid + abssid + absolute4 + 
 | |
| 		  addr_external.
 | |
| con4		= regcon4 + memregcon4 + memregrelcon4 .
 | |
| tossrc4		= TOS + src4 .
 | |
| consrc4		= con4 + src4 .
 | |
| fsrc4		= FREG + LOCAL + regrel4 + memrel4 + 
 | |
| 	       	  memregrel4 + memregrelsid + abssid + absolute4 . 
 | |
| tosfsrc4	= TOS + fsrc4 .
 | |
| fsrc8		= DFREG + DLOCAL + regrel8 + memrel8 + 
 | |
| 	       	  memregrel8 + absolute8 . 
 | |
| tosfsrc8	= TOS + fsrc8 .
 | |
| dst1		= src1 .
 | |
| tosdst1		= TOS + dst1 .
 | |
| dst2		= src2 .
 | |
| tosdst2		= TOS + dst2 .
 | |
| dst4		= REG + LOCAL + regrel4 + memregrel4 + memrel4 + 
 | |
| 		  absolute4 + memregrelsid + abssid .
 | |
| tosdst4		= TOS + dst4 .
 | |
| fdst4		= FREG + LOCAL + regrel4 + memregrel4 + memrel4 + 
 | |
| 		  absolute4 + memregrelsid + abssid .
 | |
| tosfdst4	= TOS + fdst4 .
 | |
| fdst8		= fsrc8 .
 | |
| tosfdst8	= tosfsrc8 .
 | |
| regrel		= regrel1 + regrel2 + regrel4 +regrel8 .
 | |
| memregrel	= memregrel1 + memregrel2 + memregrel4 +memregrel8 .
 | |
| memrel		= memrel1 + memrel2 + memrel4 +memrel8 .
 | |
| rel		= regrel + memregrel + memrel + memregrelsid 
 | |
| 		   + fprelsid + sprelsid .
 | |
| absolute	= absolute1 + absolute2 + absolute4 + absolute8 + abssid .
 | |
| regs		= REG + FREG + DFREG + MEMREG + REGPAIR .
 | |
| allmincon	= ALL - (regs + const4 + addr_local + addr_external
 | |
| 		  + regcon4 + memregcon4) .
 | |
| src24		= src2 + src4 .
 | |
| src124		= src1 + src2 + src4 .
 | |
| tossrc24	= TOS + src24 .
 | |
| tossrc124	= TOS + src124 .
 | |
| 
 | |
| 
 | |
| INSTRUCTIONS
 | |
| 
 | |
| 
 | |
| movb tossrc124:ro, tosdst1:wo .
 | |
| movw tossrc24:ro, tosdst2:wo .
 | |
| movd tossrc4:ro, tosdst4:wo .
 | |
| movf tosfsrc4:ro, tosfdst4:wo .
 | |
| movl tosfsrc8:ro, tosfdst8:wo .
 | |
| movdf tossrc4:ro, tosfdst4:wo .
 | |
| movdl tossrc4:ro, tosfdst8:wo .
 | |
| movfl tosfsrc4:ro, tosfdst8:wo .
 | |
| movlf tosfsrc8:ro, tosfdst4:wo .
 | |
| truncfd tosfsrc4:ro, tosdst4:wo .
 | |
| truncld tosfsrc8:ro, tosdst4:wo .
 | |
| cmpb tossrc124:ro, src1:ro .
 | |
| cmpw tossrc24:ro, src2:ro .
 | |
| cmpd tossrc4:ro, tossrc4:ro .
 | |
| cmpf tosfsrc4:ro, tosfsrc4:ro .
 | |
| cmpl tosfsrc8:ro, tosfsrc8:ro .
 | |
| addd tossrc4:ro, tosdst4:rw .
 | |
| addcd tossrc4:ro, tosdst4:rw .
 | |
| addf tosfsrc4:ro, tosfdst4:rw .
 | |
| addl tosfsrc8:ro, tosfdst8:rw .
 | |
| subd tossrc4:ro, tosdst4:rw .
 | |
| subcd tossrc4:ro, tosdst4:rw .
 | |
| subf tosfsrc4:ro, tosfdst4:rw .
 | |
| subl tosfsrc8:ro, tosfdst8:rw .
 | |
| muld tossrc4:ro, tosdst4:rw .
 | |
| mulf tosfsrc4:ro, tosfdst4:rw .
 | |
| mull tosfsrc8:ro, tosfdst8:rw .
 | |
| quod tossrc4:ro, tosdst4:rw .
 | |
| divd tossrc4:ro, tosdst4:rw .
 | |
| divf tosfsrc4:ro, tosfdst4:rw .
 | |
| divl tosfsrc8:ro, tosfdst8:rw .
 | |
| remd tossrc4:ro, tosdst4:rw .
 | |
| modd tossrc4:ro, tosdst4:rw .
 | |
| negd tossrc4:ro, tosdst4:wo .
 | |
| negf tosfsrc4:ro, tosfdst4:wo .
 | |
| negl tosfsrc8:ro, tosfdst8:wo .
 | |
| roundfd tosfsrc4:ro, tosdst4:wo .
 | |
| roundld tosfsrc8:ro, tosdst4:wo .
 | |
| andd tossrc4:ro, tosdst4:wo .
 | |
| ord tossrc4:ro, tosdst4:wo .
 | |
| xord tossrc4:ro, tosdst4:rw .
 | |
| comd tossrc4:ro, tosdst4:rw .
 | |
| ashd tossrc124:ro, tosdst4:rw .
 | |
| lshd tossrc124:ro, tosdst4:rw .
 | |
| rotd tossrc124:ro, tosdst4:rw .
 | |
| movzbd tossrc124:ro, tosdst4:wo .
 | |
| movzwd tossrc24:ro, tosdst4:wo .
 | |
| movxbd tossrc124:ro, tosdst4:wo .
 | |
| movxwd tossrc124:ro, tosdst4:wo .
 | |
| addr tosdst4:ro, tosdst4:wo .
 | |
| movqd const4:ro, tosdst4:wo .
 | |
| cmpqd const4:ro, tossrc4:ro .
 | |
| meid tossrc4:ro, REGPAIR:rw .
 | |
| sxx tosdst4:wo .
 | |
| seqd tosdst4:wo .
 | |
| sned tosdst4:wo .
 | |
| sltd tosdst4:wo .
 | |
| sled tosdst4:wo .
 | |
| sgtd tosdst4:wo .
 | |
| sged tosdst4:wo .
 | |
| shid tosdst4:wo .
 | |
| sfsd tosdst4:wo .
 | |
| tbitd tossrc4:ro, tosdst4:ro .
 | |
| cbitd tossrc4:ro, tosdst4:rw .
 | |
| sbitd tossrc4:ro, tosdst4:rw .
 | |
| movmd tosdst4:ro, tosdst4:rw, const4 .
 | |
| indexd REG, tossrc4:ro, tossrc4:ro .
 | |
| brxx label .
 | |
| beq label .
 | |
| bne label .
 | |
| ble label .
 | |
| blt label .
 | |
| bge label .
 | |
| bgt label .
 | |
| bfc label .
 | |
| bfs label .
 | |
| blo label .
 | |
| bls label .
 | |
| bhs label .
 | |
| bhi label .
 | |
| br label .
 | |
| acbd const4:ro, tosdst4:rw, label .
 | |
| jsr tosdst4+label .
 | |
| ret const4:ro .
 | |
| adjspd tossrc4:ro .
 | |
| exit label .
 | |
| sprd tossrc4:ro, MEMREG:rw .
 | |
| 
 | |
| 
 | |
| 
 | |
| MOVES
 | |
| 
 | |
| 
 | |
| from memregrelcon4 to tosdst4
 | |
| gen addr {memrel4, %1.reg, %1.disp1, %1.disp2}, %2
 | |
| 
 | |
| from regcon4 to tosdst4
 | |
| gen addr {regrel4, %1.reg, %1.disp}, %2
 | |
| 
 | |
| from memregcon4 to tosdst4
 | |
| gen addr {memregrel4, %1.reg, %1.disp}, %2
 | |
| 
 | |
| from tossrc4 to tosdst4
 | |
| gen movd %1, %2
 | |
| 
 | |
| from tossrc124 to tosdst1
 | |
| gen movb %1, %2
 | |
| 
 | |
| from tossrc24 to tosdst2
 | |
| gen movw %1, %2
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| from tosfsrc4 to FREG
 | |
| gen movf %1, %2
 | |
| 
 | |
| from FREG to tosfdst4
 | |
| gen movf %1, %2
 | |
| 
 | |
| from tosfsrc8 to DFREG
 | |
| gen movl %1, %2
 | |
| 
 | |
| from DFREG to tosfdst8
 | |
| gen movl %1, %2
 | |
| #endif
 | |
| 
 | |
| 
 | |
| STACKINGRULES
 | |
| 
 | |
| 
 | |
| from src1 to STACK
 | |
| gen movzbd %1, {TOS}
 | |
| 
 | |
| from src2 to STACK
 | |
| gen movzwd %1, {TOS}
 | |
| 
 | |
| from src4 to STACK
 | |
| gen movd %1, {TOS}
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| from FREG to STACK
 | |
| gen movf %1, {TOS}
 | |
| 
 | |
| from DFREG to STACK
 | |
| gen movl %1, {TOS}
 | |
| #endif
 | |
| 
 | |
| from MEMREG to STACK
 | |
| gen addr {memregrel4, %1, 0}, {TOS}
 | |
| 
 | |
| from addr_local to STACK
 | |
| gen addr {memregrel4, fp, %1.ind}, {TOS}
 | |
|  
 | |
| from regcon4 to STACK
 | |
| gen addr {regrel4, %1.reg, %1.disp}, {TOS}
 | |
| 
 | |
| from memregcon4 to STACK
 | |
| gen addr {memregrel4, %1.reg, %1.disp}, {TOS}
 | |
| 
 | |
| from memregrelcon4 to STACK
 | |
| gen addr {memrel4, %1.reg, %1.disp1, %1.disp2}, {TOS}
 | |
| 
 | |
| from DLOCAL to STACK
 | |
| gen movd {LOCAL,  %1.ind+4}, {TOS}
 | |
|     movd {LOCAL, %1.ind}, {TOS}
 | |
| 
 | |
| from absolute8 to STACK
 | |
| gen movd {absolute4, %1.disp+4}, {TOS}
 | |
|     movd {absolute4, %1.disp}, {TOS}
 | |
| 
 | |
| from memrel8 to STACK
 | |
| gen movd {memrel4, %1.reg, %1.disp1, %1.disp2+4}, {TOS}
 | |
|     movd {memrel4, %1.reg, %1.disp1, %1.disp2}, {TOS}
 | |
| 
 | |
| from regrel8 to STACK
 | |
| gen movd {regrel4, %1.reg, %1.disp+4}, {TOS}
 | |
|     movd {regrel4, %1.reg, %1.disp}, {TOS}
 | |
| 
 | |
| from memregrel8 to STACK
 | |
| gen movd {memregrel4, %1.reg, %1.disp+4}, {TOS}
 | |
|     movd {memregrel4, %1.reg, %1.disp}, {TOS}
 | |
| 
 | |
| COERCIONS
 | |
| 
 | |
| 
 | |
| from STACK
 | |
| uses REG
 | |
| gen move {TOS}, %a			yields %a
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| from STACK
 | |
| uses FREG
 | |
| gen move {TOS}, %a			yields %a
 | |
| 
 | |
| from STACK
 | |
| uses DFREG
 | |
| gen move {TOS}, %a			yields %a
 | |
| #endif
 | |
| 
 | |
| from STACK
 | |
| uses REG
 | |
| gen move {TOS}, %a			yields {regcon4, %a, 0}
 | |
| 
 | |
| from MEMREG				yields {memregcon4, %1, 0}
 | |
| 
 | |
| from MEMREG
 | |
| uses REG
 | |
| gen addr {memregrel4, %1, 0}, %a	yields %a
 | |
| 
 | |
| from REG				yields {regcon4, %1, 0}
 | |
| 
 | |
| from regcon4
 | |
| gen addr {regrel4, %1.reg, %1.disp}, %1.reg
 | |
| 					yields %1.reg
 | |
| 
 | |
| from memregcon4
 | |
| uses REG
 | |
| gen addr {memregrel4, %1.reg, %1.disp}, %a
 | |
| 					yields %a
 | |
| 
 | |
| from LOCAL 				yields {memregrel4, fp, %1.ind}
 | |
| 
 | |
| from addr_local
 | |
| uses REG
 | |
| gen addr {LOCAL, %1.ind}, %a		yields %a
 | |
| 
 | |
| from src4
 | |
| uses reusing %1, REG=%1			yields %a
 | |
| 
 | |
| from src4
 | |
| uses reusing %1, REG=%1			yields {regcon4, %a, 0}
 | |
| 
 | |
| from memregrelcon4
 | |
| uses REG
 | |
| gen addr {memrel4, %1.reg, %1.disp1, %1.disp2}, %a
 | |
| 					yields %a
 | |
| 
 | |
| from memregrel4				yields {memregrelcon4, %1.reg,
 | |
|                                                     %1.disp, 0}
 | |
| 
 | |
| from src1
 | |
| uses REG
 | |
|     gen movzbd %1, %a			yields %a
 | |
| 
 | |
| from src2
 | |
| uses REG
 | |
|     gen movzwd %1, %a			yields %a
 | |
| 
 | |
| from DLOCAL				yields {LOCAL, %1.ind+4}
 | |
| 					       {LOCAL, %1.ind}
 | |
| 
 | |
| from absolute8				yields {absolute4, %1.disp+4}
 | |
| 					       {absolute4, %1.disp}
 | |
| 
 | |
| from memrel8				yields {memrel4, %1.reg, 
 | |
| 					%1.disp1, %1.disp1+4}
 | |
| 					       {memrel4, %1.reg,
 | |
| 					%1.disp1, %1.disp1}
 | |
| 
 | |
| from regrel8				yields {regrel4, %1.reg, %1.disp+4}
 | |
|              				       {regrel4, %1.reg, %1.disp}
 | |
| 
 | |
| from memregrel8				yields {memregrel4, %1.reg, %1.disp+4}
 | |
| 					       {memregrel4, %1.reg, %1.disp}
 | |
| 
 | |
| PATTERNS
 | |
| 
 | |
| /**********************************************************************
 | |
|  * Group1 : load instructions                                         *
 | |
|  **********************************************************************/
 | |
| 
 | |
| pat loc					yields {const4, $1}
 | |
| 
 | |
| pat ldc					leaving loc 18
 | |
| 						trp
 | |
| 
 | |
| pat lol					yields {LOCAL, $1}
 | |
| 
 | |
| pat loe					yields {absolute4, $1}
 | |
| 
 | |
| pat lil					yields {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol lof				yields {memrel4, fp, $1, $2}
 | |
| 
 | |
| pat lal lof				yields {LOCAL, $1+$2}
 | |
| 
 | |
| pat lae lof				yields {absolute4, $1+$2}
 | |
| 
 | |
| pat lof
 | |
| with exact MEMREG			yields {memregrel4, %1, 0}
 | |
| with REG				yields {regrel4, %1, $1}
 | |
| with exact addr_external		yields {absolute4, %1.disp+$1}
 | |
| with exact addr_local			yields {LOCAL, %1.ind+$1}
 | |
| with exact memregrel4			yields {memrel4, %1.reg,
 | |
| 					  %1.disp, $1}
 | |
| with exact memregrelcon4		yields {memrel4, %1.reg,
 | |
| 					  %1.disp1, $1+%1.disp2}
 | |
| with exact memregcon4			yields {memregrel4, %1.reg, %1.disp+$1}
 | |
| with exact regcon4			yields {regrel4, %1.reg, %1.disp+$1}
 | |
| with exact LOCAL			yields {memrel4, fp, %1.ind, $1}
 | |
| 
 | |
| pat lxl $1==0				yields fp
 | |
| 
 | |
| pat lxl $1==1				yields {LOCAL, 8}
 | |
| 
 | |
| pat lxl $1==2				yields {memrel4, fp, 8, 8}
 | |
| 
 | |
| pat lxl $1>2
 | |
|     uses REG={memrel4, fp, 8, 8},
 | |
| 	 REG={const4, $1-2}
 | |
|     gen 1:
 | |
| 	move {regrel4, %a, 8}, %a
 | |
| 	acbd {const4, 0-1}, %b, {label, "1b"}
 | |
| 					yields %a
 | |
| 
 | |
| pat lxa $1==0				yields {addr_local, 8}
 | |
| 
 | |
| pat lxa $1==1				yields {memregrelcon4, fp, 8, 8}
 | |
| 
 | |
| pat lxa $1==2
 | |
|     uses REG={memrel4, fp, 8, 8}	yields {regcon4, %a, 8}
 | |
| 
 | |
| pat lxa $1>2
 | |
|     uses REG={memrel4, fp, 8, 8},
 | |
| 	 REG={const4, $1-2}
 | |
|     gen 1:
 | |
| 	move {regrel4, %a, 8}, %a
 | |
| 	acbd {const4, 0-1}, %b, {label, "1b"}
 | |
| 					yields {regcon4, %a, 8}
 | |
| 
 | |
| pat lol loi $2==1			yields {memrel1, fp, $1, 0}
 | |
| 
 | |
| pat lal loi $2==1			yields {memregrel1, fp, $1}
 | |
| 
 | |
| pat lae loi $2==1			yields {absolute1, $1}
 | |
| 
 | |
| pat lol loi $2==4			yields {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lal loi $2==4			yields {LOCAL, $1}
 | |
| 
 | |
| pat lae loi $2==4			yields {absolute4, $1}
 | |
| 
 | |
| pat lal					yields {addr_local, $1}
 | |
| 
 | |
| pat lae					yields {addr_external, $1}
 | |
| 
 | |
| pat loi	$1==1
 | |
| with exact MEMREG			yields {memregrel1, %1, 0}
 | |
| with REG				yields {regrel1, %1, 0}
 | |
| with exact memregcon4			yields {memregrel1, %1.reg, %1.disp}
 | |
| with exact regcon4			yields {regrel1, %1.reg, %1.disp}
 | |
| with exact memregrel4			yields {memrel1, %1.reg, %1.disp, 0}
 | |
| with exact memregrelcon4		yields {memrel1, %1.reg,
 | |
| 					  %1.disp1, %1.disp2}
 | |
| with exact addr_local			yields {memregrel1, fp, %1.ind}
 | |
| with exact addr_external		yields {absolute1, %1.disp}
 | |
| with exact LOCAL			yields {memrel1, fp, %1.ind, 0}
 | |
| 
 | |
| pat loi $1==2
 | |
| with exact MEMREG			yields {memregrel2, %1, 0}
 | |
| with REG				yields {regrel2, %1, 0}
 | |
| with exact memregcon4			yields {memregrel2, %1.reg, %1.disp}
 | |
| with exact regcon4			yields {regrel2, %1.reg, %1.disp}
 | |
| with exact memregrel4			yields {memrel2, %1.reg, %1.disp, 0}
 | |
| with exact memregrelcon4		yields {memrel2, %1.reg,
 | |
| 					  %1.disp1, %1.disp2}
 | |
| with exact addr_local			yields {memregrel2, fp, %1.ind}
 | |
| with exact addr_external		yields {absolute2, %1.disp}
 | |
| with exact LOCAL			yields {memrel2, fp, %1.ind, 0}
 | |
| 
 | |
| pat loi $1==4
 | |
| with exact MEMREG			yields {memregrel4, %1, 0}
 | |
| with REG				yields {regrel4, %1, 0}
 | |
| with exact memregcon4			yields {memregrel4, %1.reg, %1.disp}
 | |
| with exact regcon4			yields {regrel4, %1.reg, %1.disp}
 | |
| with exact memregrel4			yields {memrel4,%1.reg,%1.disp,0}
 | |
| with exact memregrelcon4		yields {memrel4, %1.reg,
 | |
| 					  %1.disp1,%1.disp2}
 | |
| with exact addr_local			yields {LOCAL, %1.ind}
 | |
| with exact addr_external		yields {absolute4, %1.disp}
 | |
| with exact LOCAL			yields {memrel4, fp, %1.ind, 0}
 | |
| 
 | |
| pat loi $1==8
 | |
| with REG				yields {regrel8, %1, 0}
 | |
| with exact addr_local			yields {DLOCAL, %1.ind}
 | |
| with exact addr_external		yields {absolute8, %1.disp}
 | |
| with exact LOCAL			yields {memrel8, fp, %1.ind, 0}
 | |
| 
 | |
| pat loi defined($1)
 | |
| with USELESS
 | |
| with REG STACK
 | |
|     uses REG = {const4, $1}
 | |
|     gen addd %a, %1
 | |
|         1:
 | |
|         subd {const4, 4}, %1
 | |
|         movd {regrel4, %1, 0}, {TOS}
 | |
|         acbd {const4, 0-4}, %a, {label, "1b"}
 | |
| 
 | |
| pat los $1==4
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".los"}
 | |
| 
 | |
| pat ldl					yields {DLOCAL, $1}
 | |
| 
 | |
| pat lde					yields {absolute8, $1}
 | |
| 
 | |
| pat ldf
 | |
| with exact addr_local			yields {DLOCAL, %1.ind+$1}
 | |
| with exact addr_external		yields {absolute8, %1.disp+$1}
 | |
| with regcon4				yields {regrel8, %1.reg, 
 | |
| 						%1.disp+$1}
 | |
| 
 | |
| pat lpi					yields {addr_external, $1}
 | |
| 
 | |
| 			
 | |
| /*****************************************************************
 | |
|  * Group2 : store instructions					 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat stl
 | |
| with src4 + con4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen move %1, {LOCAL, $1}
 | |
| with exact STACK
 | |
| gen move {TOS}, {LOCAL, $1}
 | |
| with exact src1
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen movzbd %1, {LOCAL, $1}
 | |
| #ifndef NOFLOAT
 | |
| with FREG
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen move %1, {LOCAL, $1}
 | |
| #endif
 | |
| 
 | |
| pat ste
 | |
| with src4 + con4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen move %1, {absolute4, $1}
 | |
| with exact src1
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen movzbd %1, {absolute4, $1}
 | |
| #ifndef NOFLOAT
 | |
| with FREG
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen move %1, {absolute4, $1}
 | |
| #endif
 | |
| 
 | |
| pat sil
 | |
| with src4 + con4
 | |
| kills allmincon
 | |
| gen move %1, {memrel4, fp, $1, 0}
 | |
| with exact src1
 | |
| kills allmincon
 | |
| gen movzbd %1, {memrel4, fp, $1, 0}
 | |
| #ifndef NOFLOAT
 | |
| with FREG
 | |
| kills allmincon
 | |
| gen move %1, {memrel4, fp, $1, 0}
 | |
| #endif
 | |
| 
 | |
| pat stf
 | |
| with exact MEMREG src4 + con4
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel4, %1, $1}
 | |
| with REG src4 + con4
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1, $1}
 | |
| with exact memregcon4 src4 + con4
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel4, %1.reg, $1 + %1.disp}
 | |
| with exact regcon4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1.reg, $1 + %1.disp}
 | |
| with exact memregrel4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel4, %1.reg, %1.disp, $1}
 | |
| with exact memregrelcon4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel4, %1.reg, %1.disp1, %1.disp2 + $1}
 | |
| with exact addr_external consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute4, %1.disp + $1}
 | |
| with exact addr_local consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {LOCAL,%1.ind + $1}
 | |
| #ifndef NOFLOAT
 | |
| with REG FREG
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1, $1}
 | |
| #endif
 | |
| 
 | |
| pat lal sti $2==4
 | |
| with consrc4
 | |
|     kills allmincon
 | |
|     gen move %1, {LOCAL, $1}
 | |
| 
 | |
| pat lae sti $2==4
 | |
| with consrc4
 | |
|     kills allmincon
 | |
|     gen move %1, {absolute4, $1}
 | |
| 
 | |
| pat lol sti $2==4
 | |
| with consrc4
 | |
|     kills allmincon
 | |
|     gen move %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol sti $2==1
 | |
| with src124
 | |
|     kills allmincon
 | |
|     gen move %1, {memrel1, fp, $1, 0}
 | |
| 
 | |
| pat sti $1 == 4
 | |
| with exact MEMREG consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel4, %1, 0}
 | |
| with REG consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1, 0}
 | |
| #ifndef NOFLOAT
 | |
| with REG FREG
 | |
|     kills allmincon
 | |
|     gen movf %2, {regrel4, %1, 0}
 | |
| #endif
 | |
| with exact memregcon4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel4, %1.reg, %1.disp}
 | |
| with exact regcon4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1.reg, %1.disp}
 | |
| with exact memregrel4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel4, %1.reg, %1.disp, 0}
 | |
| with exact memregrelcon4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel4, %1.reg, %1.disp1, %1.disp2}
 | |
| with exact addr_external consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute4, %1.disp}
 | |
| with exact addr_local consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {LOCAL, %1.ind}
 | |
| with exact LOCAL consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel4, fp, %1.ind, 0}
 | |
| 
 | |
| pat sti $1 == 2
 | |
| with regcon4 src24
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel2, %1.reg, %1.disp}
 | |
| with exact addr_external src24
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute2, %1.disp}
 | |
| with exact addr_local src24
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel2, fp, %1.ind}
 | |
| 
 | |
| pat sti $1 == 1
 | |
| with exact MEMREG src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel1, %1, 0}
 | |
| with REG src124
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel1, %1, 0}
 | |
| with exact memregcon4 src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel1, %1.reg, %1.disp}
 | |
| with exact regcon4 src124
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel1, %1.reg, %1.disp}
 | |
| with exact memregrel4 src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel1, %1.reg, %1.disp, 0}
 | |
| with exact memregrelcon4 src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel1, %1.reg, %1.disp1, %1.disp2}
 | |
| with exact addr_external src124
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute1, %1.disp}
 | |
| with exact addr_local src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel1, fp, %1.ind}
 | |
| with exact LOCAL src124
 | |
|     kills allmincon
 | |
|     gen move %2, {memrel1, fp, %1.ind, 0}
 | |
| 
 | |
| pat sti $1==8
 | |
| #ifndef NOFLOAT
 | |
| with regcon4 DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel8, %1.reg, %1.disp}
 | |
| with exact addr_external DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute8, %1.disp}
 | |
| with exact addr_local DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {memregrel8, fp, %1.ind}
 | |
| #endif
 | |
| with regcon4 consrc4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %1, {regrel4, %1.reg, %1.disp}
 | |
| 	move %2, {regrel4, %1.reg, %1.disp+4}
 | |
| 
 | |
| pat sti defined($1)
 | |
| with USELESS
 | |
| with REG STACK
 | |
|     uses REG={const4, $1}
 | |
|     gen 1:
 | |
| 	movd {TOS}, {regrel4, %1, 0}
 | |
| 	addr {regrel4, %1, 4}, %1
 | |
| 	acbd {const4, 0-4}, %a, {label, "1b"}
 | |
| 
 | |
| pat sts
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".sts"}
 | |
| 
 | |
| pat sdl
 | |
| with consrc4 consrc4
 | |
| kills rel, LOCAL %ind-8 < $1 && %ind+8 > $1
 | |
| gen move %1, {LOCAL, $1}
 | |
|     move %2, {LOCAL, $1+4}
 | |
| #ifndef NOFLOAT
 | |
| with DFREG
 | |
| kills rel, LOCAL %ind-8 < $1 && %ind+8 > $1
 | |
| gen move %1, {DLOCAL, $1}
 | |
| #endif
 | |
| 
 | |
| pat sde
 | |
| with consrc4 consrc4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen move %1, {absolute4, $1}
 | |
|     move %2, {absolute4, $1+4}
 | |
| #ifndef NOFLOAT
 | |
| with DFREG
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen move %1, {absolute8, $1}
 | |
| #endif
 | |
| 
 | |
| pat sdf
 | |
| with exact addr_local consrc4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {LOCAL, %1.ind+$1}
 | |
| 	move %3, {LOCAL, %1.ind+4+$1}
 | |
| with exact addr_external consrc4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute4, %1.disp+$1}
 | |
| 	move %3, {absolute4, %1.disp+4+$1}
 | |
| with  regcon4 consrc4 consrc4
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel4, %1.reg, %1.disp+$1}
 | |
|         move %3, {regrel4, %1.reg, %1.disp+$1+4}
 | |
| #ifndef NOFLOAT
 | |
| with exact addr_local DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {DLOCAL, %1.ind+$1}
 | |
| with exact addr_external DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {absolute8, %1.disp+$1}
 | |
| with exact regcon4 DFREG
 | |
|     kills allmincon
 | |
|     gen move %2, {regrel8, %1.reg, %1.disp+$1}
 | |
| #endif
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group3 : integer arithmetic					 *
 | |
|  *****************************************************************/
 | |
| pat loe loc adi ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc adi stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc adi sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen addd {const4, $2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol adi stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd %1, {LOCAL, $1}
 | |
| 
 | |
| pat lil adi sil $1==$3 && $2==4
 | |
| with src4
 | |
| kills allmincon
 | |
| gen addd %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat loe adi ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd %1, {absolute4, $1}
 | |
| 
 | |
| pat adi $1 == 4
 | |
| with exact MEMREG const4		yields {memregcon4, %1, %2.num}
 | |
| with exact REG const4		yields {regcon4, %1, %2.num}
 | |
| with exact const4 REG 		yields {regcon4, %2, %1.num}
 | |
| with exact memregrel4 const4		yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp, %2.num}
 | |
| with exact memregcon4 const4		yields {memregcon4, %1.reg,
 | |
| 					%1.disp + %2.num}
 | |
| with exact regcon4 const4		yields {regcon4, %1.reg,
 | |
| 					%1.disp + %2.num}
 | |
| with exact memregrelcon4 const4		yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp1, %1.disp2+%2.num}
 | |
| with exact addr_local const4		yields {addr_local, %1.ind+%2.num}
 | |
| with exact LOCAL const4			yields {memregrelcon4, fp,
 | |
| 					%1.ind, %2.num}
 | |
| with exact const4 LOCAL 		yields {memregrelcon4, fp,
 | |
| 					%2.ind, %1.num}
 | |
| with exact const4 addr_local		yields {addr_local, %2.ind+%1.num}
 | |
| with exact MEMREG addr_external		yields {memregcon4, %1, %2.disp}
 | |
| with exact REG addr_external		yields {regcon4, %1, %2.disp}
 | |
| with exact memregrel4 addr_external	yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp, %2.disp}
 | |
| with exact memregcon4 addr_external	yields {memregcon4, %1.reg,
 | |
| 					%1.disp + %2.disp}
 | |
| with exact regcon4 addr_external	yields {regcon4, %1.reg,
 | |
| 					%1.disp + %2.disp}
 | |
| with exact memregrelcon4 addr_external	yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp1, %1.disp2+%2.disp}
 | |
| with src4 REG
 | |
|     gen addd %1, %2			yields %2
 | |
| with REG src4
 | |
|     gen addd %2, %1			yields %1
 | |
| 
 | |
| pat loe loc sbi ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd {const4, 0-$2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc sbi stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd {const4, 0-$2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc sbi sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen addd {const4, 0-$2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat sbi $1 == 4
 | |
| with src4 REG
 | |
|     gen subd %1, %2			yields %2
 | |
| with const4 REG
 | |
|     gen addd {const4, 0-%1.num}, %2	yields %2
 | |
| with exact addr_local addr_local
 | |
|     uses REG={const4, %2.ind}
 | |
|     gen subd {const4, %1.ind}, %a	yields %a
 | |
| 
 | |
| pat mli $1 == 4
 | |
| with src4 REG
 | |
|     gen muld %1, %2			yields %2
 | |
| with REG src4
 | |
|     gen muld %2, %1			yields %1
 | |
| 
 | |
| pat dvi $1 == 4
 | |
| with src4 REG
 | |
|     gen quod %1,%2			yields %2
 | |
| 
 | |
| pat rmi $1 == 4
 | |
| with src4 REG
 | |
|     gen remd %1, %2			yields %2
 | |
| 
 | |
| pat ngi $1 == 4
 | |
| with src4
 | |
|     uses reusing %1, REG
 | |
|     gen negd %1, %a			yields %a
 | |
| 
 | |
| pat lol ngi stl $1==$3 && $2==4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen negd {LOCAL, $1}, {LOCAL, $1}
 | |
| 
 | |
| pat loe ngi ste $1==$3 && $2==4
 | |
| kills absolute + rel + memregrelcon4
 | |
|     gen negd {absolute4, $1}, {absolute4, $1}
 | |
| 
 | |
| pat lil ngi sil $1==$3 && $2==4
 | |
| kills allmincon
 | |
|     gen negd {memrel4, fp, $1, 0}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat sli $1 == 4
 | |
| with src124 REG
 | |
|     gen ashd %1, %2			yields %2
 | |
| 
 | |
| pat lol loc sli stl $1==$4 && $3==4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen ashd {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat loe loc sli ste $1==$4 && $3==4
 | |
| kills absolute + rel + memregrelcon4
 | |
|     gen ashd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat loc sri $2 == 4
 | |
| with USELESS
 | |
| with REG
 | |
|     gen ashd {const4,0-$1}, %1		yields %1
 | |
| 
 | |
| pat sri $1 == 4
 | |
| with USELESS
 | |
| with REG REG
 | |
| gen negd %1, %1
 | |
|     ashd %1, %2				yields %2
 | |
| 
 | |
| pat lol loc sri stl $1==$4 && $3==4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen ashd {const4, 0-$2}, {LOCAL, $1}
 | |
| 
 | |
| pat loe loc sri ste $1==$4 && $3==4
 | |
| kills absolute + rel + memregrelcon4
 | |
|     gen ashd {const4, 0-$2}, {absolute4, $1}
 | |
| 
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group4 : unsigned arithmetic					 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat loe loc adu ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc adu stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc adu sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen addd {const4, $2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol adu stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd %1, {LOCAL, $1}
 | |
| 
 | |
| pat lil adu sil $1==$3 && $2==4
 | |
| with src4
 | |
| kills allmincon
 | |
| gen addd %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat loe adu ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd %1, {absolute4, $1}
 | |
| 
 | |
| pat adu						leaving adi $1
 | |
| 
 | |
| pat loe loc sbu ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd {const4, 0-$2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc sbu stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd {const4, 0-$2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc sbu sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen addd {const4, 0-$2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat sbu						leaving sbi $1
 | |
| 
 | |
| pat mlu $1 == 4
 | |
| with src4 src4
 | |
|     uses reusing %1, REGPAIR
 | |
|     gen move %1, %a.1
 | |
|         meid %2, %a			yields %a.1
 | |
|  
 | |
| pat dvu $1 == 4
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".dvu"}		yields r0
 | |
| 
 | |
| pat rmu $1 == 4
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".rmu"}		yields r0
 | |
| 
 | |
| pat slu						leaving sli $1
 | |
| 
 | |
| pat loc sru $2 == 4
 | |
| with USELESS
 | |
| with REG
 | |
|     gen lshd {const4, 0-$1}, %1		yields %1
 | |
| 
 | |
| pat sru $1 == 4
 | |
| with USELESS
 | |
| with REG REG
 | |
|     gen negd %1, %1
 | |
|         lshd %1, %2			yields %2
 | |
| 
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group5 : floating point arithmetic				 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| pat adf $1==4
 | |
| with fsrc4 FREG
 | |
|     gen addf %1, %2			yields %2
 | |
| 
 | |
| pat adf $1==8
 | |
| with fsrc8 DFREG
 | |
|     gen addl %1, %2			yields %2
 | |
| 
 | |
| pat sbf $1==4
 | |
| with fsrc4 FREG
 | |
|     gen subf %1, %2			yields %2
 | |
| 
 | |
| pat sbf $1==8
 | |
| with fsrc8 DFREG
 | |
|     gen subl %1, %2			yields %2
 | |
| 
 | |
| pat mlf $1==4
 | |
| with fsrc4 FREG
 | |
|     gen mulf %1, %2			yields %2
 | |
| 
 | |
| pat mlf $1==8
 | |
| with fsrc8 DFREG
 | |
|     gen mull %1, %2			yields %2
 | |
| 
 | |
| pat dvf $1==4
 | |
| with fsrc4 FREG
 | |
|     gen divf %1, %2			yields %2
 | |
| 
 | |
| pat dvf $1==8
 | |
| with fsrc8 DFREG
 | |
|     gen divl %1, %2			yields %2
 | |
| 
 | |
| pat ngf $1==4
 | |
| with FREG
 | |
|     gen negf %1, %1			yields %1
 | |
| 
 | |
| pat ngf $1==8
 | |
| with DFREG
 | |
|     gen negl %1, %1			yields %1
 | |
| 
 | |
| pat fif $1==4
 | |
| with fsrc4 FREG
 | |
| uses FREG, REG
 | |
|     gen mulf %1, %2
 | |
| 	truncfd %2, %b
 | |
| 	movdf %b, %a
 | |
| 	subf %a, %2			yields %a %2
 | |
| 
 | |
| pat fif $1==8
 | |
| with fsrc8 DFREG
 | |
| uses DFREG, REG
 | |
|     gen mull %1, %2
 | |
| 	truncld %2, %b
 | |
| 	movdl %b, %a
 | |
| 	subl %a, %2			yields %a %2
 | |
| 
 | |
| pat fef $1==4
 | |
| with FREG
 | |
| uses REG
 | |
|     gen movf %1, {TOS}
 | |
| 	movf %1, {TOS}
 | |
| 	lshd {const4, 1}, {TOS}
 | |
| 	lshd {const4, 0-24}, {TOS}
 | |
| 	movd {TOS}, %a
 | |
| 	subd {const4, 127}, %a
 | |
| 	ord {const4, 0x3F000000}, {TOS}
 | |
| 	lshd {const4,2},{TOS}
 | |
| 	lshd {const4,0-2},{TOS}
 | |
| 	cbitd {const4, 23},{TOS}
 | |
| 	movf {TOS}, %1			yields %1 %a
 | |
| 
 | |
| pat fef $1==8
 | |
| with DFREG
 | |
| uses REG
 | |
|     gen movl %1, {TOS}
 | |
| 	movl %1, {TOS}
 | |
| 	adjspd {const4, 0-4}
 | |
| 	lshd {const4, 1}, {TOS}
 | |
| 	lshd {const4, 0-21}, {TOS}
 | |
| 	movd {TOS}, %a
 | |
| 	subd {const4, 1023}, %a
 | |
| 	ord {const4, 0x3FE00000}, {memregrel4, sp, 4}
 | |
| 	lshd {const4,2},{memregrel4, sp, 4}
 | |
| 	lshd {const4,0-2},{memregrel4, sp, 4}
 | |
| 	cbitd {const4, 52},{TOS}
 | |
| 	movl {TOS}, %1			yields %1 %a
 | |
| 
 | |
| #else
 | |
| 
 | |
| pat adf					leaving loc 18 trp
 | |
| pat sbf					leaving loc 18 trp
 | |
| pat mlf					leaving loc 18 trp
 | |
| pat dvf					leaving loc 18 trp
 | |
| pat ngf					leaving loc 18 trp
 | |
| pat fif					leaving loc 18 trp
 | |
| pat fef					leaving loc 18 trp
 | |
| 
 | |
| #endif
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group6 : pointer arithmetic					 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat lol lol adp stl $1==$2 && $2==$4
 | |
| kills allmincon
 | |
| uses REG={LOCAL, $1}
 | |
| gen addr {memrel4, fp, $1, $3}, {LOCAL, $1}	yields %a
 | |
| 
 | |
| pat loe loe adp ste $1==$2 && $2==$4
 | |
| kills allmincon
 | |
| uses REG={absolute4, $1}
 | |
| gen addd {const4, $3}, {absolute4, $1}
 | |
| 
 | |
| pat lol adp stl $1==$3
 | |
| kills allmincon
 | |
| gen addr {memrel4, fp, $1, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat loe adp ste $1==$3
 | |
| kills allmincon
 | |
| gen addd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat adp
 | |
| with exact MEMREG			yields {memregcon4, %1, $1}
 | |
| with REG				yields {regcon4, %1, $1}
 | |
| with exact memregcon4			yields {memregcon4, %1.reg,
 | |
| 					%1.disp + $1}
 | |
| with exact regcon4			yields {regcon4, %1.reg,
 | |
| 					%1.disp + $1}
 | |
| with exact memregrel4			yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp, $1}
 | |
| with exact memregrelcon4		yields {memregrelcon4, %1.reg,
 | |
| 					%1.disp1, %1.disp2 + $1}
 | |
| with exact addr_external		yields {addr_external, $1+%1.disp}
 | |
| with exact addr_local			yields {addr_local, %1.ind + $1}
 | |
| with exact LOCAL			yields {memregrelcon4, fp, 
 | |
| 					%1.ind, $1}
 | |
| 
 | |
| pat loe loc ads ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc ads stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lol ads stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen addd %1, {LOCAL, $1}
 | |
| 
 | |
| pat loe ads ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen addd %1, {absolute4, $1}
 | |
| 
 | |
| pat ads $1==4					leaving adi 4
 | |
| 
 | |
| pat sbs $1==4					leaving sbi 4
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group7 : increment/decrement/zero 				 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat inc
 | |
| with USELESS
 | |
| with REG
 | |
|     gen addd {const4,1}, %1		yields %1
 | |
| with exact STACK
 | |
|     gen addd {const4, 1},{TOS}
 | |
| 
 | |
| pat loc inc				yields {const4, $1+1}
 | |
| 
 | |
| pat lol inc stl $1==$3
 | |
| kills allmincon
 | |
| gen addd {const4, 1}, {LOCAL, $1}
 | |
| 
 | |
| pat lol dec stl $1==$3
 | |
| kills allmincon
 | |
| gen addd {const4, 0-1}, {LOCAL, $1}
 | |
| 
 | |
| pat lil inc sil $1==$3
 | |
| kills allmincon
 | |
| gen addd {const4, 1}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lil dec sil $1==$3
 | |
| kills allmincon
 | |
| gen addd {const4, 0-1}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat inl
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen addd {const4,1},{LOCAL, $1}
 | |
| 
 | |
| pat ine
 | |
| kills absolute, rel, memregrelcon4
 | |
|     gen addd {const4,1},{absolute4, $1}
 | |
| 
 | |
| pat dec
 | |
| with USELESS
 | |
| with  REG
 | |
|     gen addd {const4,0-1}, %1		yields %1
 | |
| with exact STACK
 | |
|     gen addd {const4,0-1}, {TOS}
 | |
| 
 | |
| pat loc dec				yields {const4, $1-1}
 | |
| 
 | |
| pat del
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen addd {const4,0-1},{LOCAL, $1}
 | |
| 
 | |
| pat dee
 | |
| kills absolute, rel, memregrelcon4
 | |
|     gen addd {const4,0-1},{absolute4, $1}
 | |
| 
 | |
| pat zrl
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
|     gen move {const4, 0}, {LOCAL, $1}
 | |
| 
 | |
| pat zre
 | |
| kills absolute, rel, memregrelcon4
 | |
|     gen move {const4, 0}, {absolute4, $1}
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| pat zrf $1==4
 | |
| with STACK
 | |
| gen movd {const4, 0}, {TOS}
 | |
| 
 | |
| pat zrf $1==8
 | |
| with STACK
 | |
| gen movd {const4, 0}, {TOS}
 | |
|     movd {const4, 0}, {TOS}
 | |
| #else
 | |
| pat zrf					leaving loc 18 trp
 | |
| #endif
 | |
| 
 | |
| pat zer $1==4				yields {const4, 0}
 | |
| 
 | |
| pat zer $1==8				yields {const4, 0}
 | |
| 					       {const4, 0}
 | |
| 
 | |
| pat zer $1==12				yields {const4, 0}
 | |
| 			                       {const4, 0}
 | |
| 					       {const4, 0}
 | |
| 
 | |
| pat zer $1>12
 | |
| with STACK
 | |
|     uses REG={const4, $1/4}
 | |
|     gen 1:
 | |
| 	movqd {const4, 0}, {TOS}
 | |
| 	acbd {const4, 0-1}, %a, {label, "1b"}
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group8 : convert 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat loc loc cii $1==4 && $2==4
 | |
| 
 | |
| pat loc loc cii $1==1 && $2==4
 | |
| with src124
 | |
| uses reusing %1, REG
 | |
|     gen movxbd %1, %a				yields %a
 | |
| 
 | |
| pat loc loc cii $1==2 && $2==4
 | |
| with src24
 | |
| uses reusing %1, REG
 | |
|     gen movxwd %1, %a				yields %a
 | |
| 
 | |
| pat cii
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".cii"}
 | |
| 
 | |
| pat cui
 | |
| with src4 src4
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| pat loc loc cfi $1==8 && $2==4
 | |
| with fsrc8
 | |
| uses REG
 | |
|     gen roundld %1, %a				yields %a
 | |
| 
 | |
| pat loc loc cfi $1==4 && $2==4
 | |
| with fsrc4
 | |
| uses REG
 | |
|     gen roundfd %1, %a				yields %a
 | |
| 
 | |
| pat cfi
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".cfi"}
 | |
| 
 | |
| pat loc loc cif $1==4 && $2==8
 | |
| with src4
 | |
| uses DFREG
 | |
|     gen movdl %1, %a				yields %a
 | |
| 
 | |
| pat loc loc cif $1==4 && $2==4
 | |
| with src4
 | |
| uses FREG
 | |
|     gen movdf %1, %a				yields %a
 | |
| 
 | |
| pat cif
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".cif"}
 | |
| 
 | |
| pat cuf
 | |
| 					leaving loc 18 trp
 | |
| 
 | |
| pat loc loc cff $1==4 && $2==4
 | |
| 
 | |
| pat loc loc cff $1==8 && $2==8
 | |
| 
 | |
| pat loc loc cff $1==4 && $2==8
 | |
| with fsrc4
 | |
| uses DFREG
 | |
|     gen movfl %1, %a				yields %a
 | |
| 
 | |
| pat loc loc cff $1==8 && $2==4
 | |
| with fsrc8
 | |
| uses FREG
 | |
|     gen movlf %1, %a				yields %a
 | |
| 
 | |
| pat cff
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".cff"}
 | |
|  
 | |
| #else
 | |
| 
 | |
| pat cif					leaving loc 18 trp
 | |
| pat cfi					leaving loc 18 trp
 | |
| pat cuf					leaving loc 18 trp
 | |
| pat cfu					leaving loc 18 trp
 | |
| pat cff					leaving loc 18 trp
 | |
| 
 | |
| #endif
 | |
| pat ciu
 | |
| with src4 src4
 | |
| 
 | |
| pat cuu
 | |
| with src4 src4
 | |
| 
 | |
| pat cfu
 | |
| 					leaving loc 18 trp
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group9 : logical 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat loe loc and ste $3==4 && $1==$4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen andd {const4, $2}, {absolute4, $1}
 | |
| 
 | |
| pat lol loc and stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen andd {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc and sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen andd {const4, $2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol and stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen andd %1, {LOCAL, $1}
 | |
| 
 | |
| pat lil and sil $1==$3 && $2==4
 | |
| with src4
 | |
| kills allmincon
 | |
| gen andd %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat loe and ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen andd %1, {absolute4, $1}
 | |
| 
 | |
| pat and $1==4
 | |
| with src4 REG
 | |
|     gen andd %1, %2				yields %2
 | |
| with REG src4
 | |
|     gen andd %2, %1				yields %1
 | |
| 
 | |
| pat and $1>4
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
|         addr {memregrel4, sp, $1}, r1
 | |
| 	1:
 | |
| 	andd {TOS}, {regrel4, r1, 0}
 | |
| 	addr {regrel4, r1, 4}, r1
 | |
| 	acbd {const4, 0-4}, r0, {label, "1b"}
 | |
| 
 | |
| pat lol ior stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen ord %1, {LOCAL, $1}
 | |
| 
 | |
| pat lol loc ior stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen ord {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc ior sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen ord {const4, $2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lil ior sil $1==$3 && $2==4
 | |
| with src4
 | |
| kills allmincon
 | |
| gen ord %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat loe ior ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen ord %1, {absolute4, $1}
 | |
| 
 | |
| pat lol loc xor stl $3==4 && $1==$4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen xord {const4, $2}, {LOCAL, $1}
 | |
| 
 | |
| pat lil loc xor sil $3==4 && $1==$4
 | |
| kills allmincon
 | |
| gen xord {const4, $2}, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat lol xor stl $1==$3 && $2==4
 | |
| with src4
 | |
| kills rel, LOCAL %ind-4 < $1 && %ind+4 > $1
 | |
| gen xord %1, {LOCAL, $1}
 | |
| 
 | |
| pat lil xor sil $1==$3 && $2==4
 | |
| with src4
 | |
| kills allmincon
 | |
| gen xord %1, {memrel4, fp, $1, 0}
 | |
| 
 | |
| pat loe xor ste $1==$3 && $2==4
 | |
| with src4
 | |
| kills absolute + rel + memregrelcon4
 | |
| gen xord %1, {absolute4, $1}
 | |
| 
 | |
| pat ior $1==4
 | |
| with src4 REG
 | |
|     gen ord %1, %2				yields %2
 | |
| with REG src4
 | |
|     gen ord %2, %1				yields %1
 | |
| 
 | |
| pat ior $1>4
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
|         addr {memregrel4, sp, $1}, r1
 | |
| 	1:
 | |
| 	ord {TOS}, {regrel4, r1, 0}
 | |
| 	addr {regrel4, r1, 4}, r1
 | |
| 	acbd {const4, 0-4}, r0, {label, "1b"}
 | |
| 
 | |
| pat xor $1==4
 | |
| with src4 REG
 | |
|     gen xord %1, %2				yields %2
 | |
| with REG src4
 | |
|     gen xord %2, %1				yields %1
 | |
| 
 | |
| pat xor $1>4
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
|         addr {memregrel4, sp, $1}, r1
 | |
| 	1:
 | |
| 	xord {TOS}, {regrel4, r1, 0}
 | |
| 	addr {regrel4, r1, 4}, r1
 | |
| 	acbd {const4, 0-4}, r0, {label, "1b"}
 | |
| 
 | |
| pat com $1==4
 | |
| with USELESS
 | |
| with REG
 | |
|     gen comd %1, %1				yields %1
 | |
| 
 | |
| pat com $1>4
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
| 	addr {memregrel4, sp, 0}, r1
 | |
| 	1:
 | |
| 	comd {regrel4, r1, 0}, {regrel4, r1, 0}
 | |
| 	addr {regrel4, r1, 4}, r1
 | |
| 	acbd {const4, 0-4}, r0, {label, "1b"}
 | |
| 
 | |
| pat rol $1 == 4
 | |
| with src124 REG
 | |
|     gen rotd %1, %2			yields %2
 | |
| 
 | |
| pat loc ror $2 == 4
 | |
| with USELESS
 | |
| with REG
 | |
|     gen rotd {const4, 0-$1}, %1		yields %1
 | |
| 
 | |
| pat ror $1 == 4
 | |
| with USELESS
 | |
| with REG REG
 | |
|     gen negd %1, %1
 | |
| 	rotd %1, %2			yields %2
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group10 : sets 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat inn zeq $1==4
 | |
| with src4 REG
 | |
|     gen cmpd {const4, 0}, %1
 | |
| 	bgt {label, $2}
 | |
| 	tbitd %1, %2
 | |
| 	bfc {label, $2}
 | |
| 
 | |
| pat inn zne $1==4
 | |
| with src4 REG
 | |
|     gen cmpd {const4, 0}, %1
 | |
| 	bgt {label, "1f"}
 | |
| 	tbitd %1, %2
 | |
| 	bfs {label, $2}
 | |
| 	1:
 | |
| 
 | |
| pat inn $1==4
 | |
| with src4 REG
 | |
|     uses REG
 | |
|     gen	tbitd %1, %2
 | |
| 	sfsd %a				
 | |
|         cmpd {const4,0}, %1
 | |
| 	ble {label, "1f"}
 | |
| 	xord %a, %a	
 | |
| 	1:					yields %a
 | |
| 
 | |
| pat inn $1>4
 | |
| with src4 STACK
 | |
|     uses REG
 | |
|     gen tbitd %1, {TOS}
 | |
| 	adjspd {const4, 0-4}
 | |
|         sfsd %a
 | |
|         cmpd {const4,0}, %1
 | |
| 	ble {label, "1f"}
 | |
| 	xord %a, %a	
 | |
| 	1:					yields %a
 | |
| 
 | |
| pat inn !defined($1)
 | |
| with src4 src4 STACK
 | |
|     uses REG
 | |
|     gen tbitd %2, {TOS}
 | |
| 	adjspd {const4, 0-4}
 | |
|         sfsd %a
 | |
|         cmpd {const4,0}, %2
 | |
| 	ble {label, "1f"}
 | |
| 	xord %a, %a	
 | |
| 	1:					yields %a
 | |
| 
 | |
| pat set $1==4
 | |
| with src4
 | |
|     uses REG={const4, 0}
 | |
|     gen sbitd %1, %a			yields %a
 | |
| 
 | |
| pat set $1>4
 | |
| with src4 STACK
 | |
|     uses REG={const4, $1/4}
 | |
|     gen 1:
 | |
| 	movqd {const4, 0}, {TOS}
 | |
| 	acbd {const4, 0-1}, %a, {label, "1b"}
 | |
| 	sbitd %1, {TOS}
 | |
| 
 | |
| pat set !defined($1)
 | |
| with src4 src4 STACK
 | |
|     uses reusing %1, REG=%1
 | |
|     gen quod {const4, 4}, %a
 | |
| 	1:
 | |
| 	movqd {const4, 0}, {TOS}
 | |
| 	acbd {const4, 0-1}, %a, {label, "1b"}
 | |
| 	sbitd %2, {TOS}
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group11 : array 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 
 | |
| 					leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 
 | |
| 					leaving adi 2
 | |
| 						adp 0-rom($1,1)
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0 
 | |
| with USELESS
 | |
| with REG
 | |
|     gen ashd {const4, 1}, %1		yields %1
 | |
| 					leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0 
 | |
| with USELESS
 | |
| with REG
 | |
|     gen ashd {const4, 1}, %1		yields {regcon4, %1,(0-2)*rom($1,1)}
 | |
| 					leaving adi 2
 | |
| 
 | |
| pat lae aar $2==4 && rom($1,3)==4 && rom($1,1)==0
 | |
| with USELESS
 | |
| with REG addr_local
 | |
| uses REG
 | |
|     gen addr {memregrelsid, %2.ind, fp, %1}, %a	
 | |
| 					yields %a
 | |
| with REG addr_external
 | |
| uses REG
 | |
|     gen addr {abssid, %2.disp, %1}, %a	
 | |
| 					yields %a
 | |
| with					leaving lae $1 aar $2
 | |
| 
 | |
| pat lae aar $2==4 && rom($1,3)==4 && rom($1,1)!=0
 | |
| with USELESS
 | |
| with REG addr_local
 | |
| uses REG
 | |
|     gen subd {const4, rom($1,1)}, %1
 | |
|         addr {memregrelsid, %2.ind, fp, %1}, %a	
 | |
| 					yields %a
 | |
| with REG addr_external
 | |
| uses REG
 | |
|     gen subd {const4, rom($1,1)}, %1
 | |
|         addr {abssid, %2.disp, %1}, %a	
 | |
| 					yields %a
 | |
| with 					leaving lae $1 aar $2
 | |
| 
 | |
| pat lae lar $2==4 && rom($1,3)==4 && rom($1,1)==0
 | |
| with USELESS
 | |
| with REG addr_local		yields {memregrelsid, %2.ind, fp, %1}
 | |
| with REG addr_external		yields {abssid, %2.disp, %1}
 | |
| with 					leaving lae $1 lar $2
 | |
| 
 | |
| pat lae lar $2==4 && rom($1,3)==4 && rom($1,1)!=0
 | |
| with USELESS
 | |
| with REG addr_local
 | |
|     gen subd {const4, rom($1,1)}, %1
 | |
| 				yields {memregrelsid, %2.ind, fp, %1}
 | |
| with REG addr_external
 | |
|     gen subd {const4, rom($1,1)}, %1
 | |
| 				yields {abssid, %2.disp, %1}
 | |
| with 					leaving lae $1 lar $2
 | |
| 
 | |
| pat lae sar $2==4 && rom($1,3)==4 && rom($1,1)==0
 | |
| with src4 REG addr_local
 | |
| kills allmincon
 | |
|     gen move %1, {memregrelsid, %3.ind, fp, %2}
 | |
| with src4 REG addr_external
 | |
| kills allmincon
 | |
|     gen move %1, {abssid, %3.disp, %2}
 | |
| with					leaving lae $1 sar $2
 | |
| 
 | |
| pat lae lar $2==4 && rom($1,3)==4 && rom($1,1)!=0
 | |
| with src4 REG addr_local
 | |
| kills allmincon
 | |
|     gen subd {const4, rom($1,1)}, %2
 | |
| 	move %1, {memregrelsid, %3.ind, fp, %2}
 | |
| with src4 REG addr_external
 | |
| kills allmincon
 | |
|     gen subd {const4, rom($1,1)}, %2
 | |
| 	move %1, {abssid, %3.disp, %2}
 | |
| with					leaving lae $1 sar $2
 | |
| 
 | |
| pat lae aar $2==4 && rom($1,1)==0
 | |
| with src4 REG
 | |
|     gen indexd %2, {const4, rom($1,3)-1}, %1	yields %2
 | |
| 
 | |
| pat lae aar $2==4 && rom($1,1)!=0
 | |
| with USELESS
 | |
| with REG REG
 | |
|     gen subd {const4,rom($1,1)}, %1
 | |
| 	indexd %2, {const4, rom($1,3)-1}, %1	yields %2
 | |
| 
 | |
| pat lae sar defined(rom($1,3))
 | |
| 				leaving	lae $1
 | |
| 					aar $2
 | |
| 					sti rom($1,3)
 | |
| 
 | |
| pat lae lar defined(rom($1,3))
 | |
| 				leaving lae $1
 | |
| 					aar $2
 | |
| 					loi rom($1,3)
 | |
| 
 | |
| pat aar defined($1)
 | |
| with STACK
 | |
| gen jsr {absolute4, ".aar"}
 | |
| 
 | |
| pat lar defined($1)
 | |
| with STACK
 | |
| gen jsr {absolute4, ".lar"}
 | |
| 
 | |
| pat sar defined($1)
 | |
| with STACK
 | |
| gen jsr {absolute4, ".sar"}
 | |
| 
 | |
| pat aar !defined($1)
 | |
| with src4 STACK
 | |
| gen jsr {absolute4, ".aar"}
 | |
| 
 | |
| pat lar !defined($1)
 | |
| with src4 STACK
 | |
| gen jsr {absolute4, ".lar"}
 | |
| 
 | |
| pat sar !defined($1)
 | |
| with src4 STACK
 | |
| gen jsr {absolute4, ".sar"}
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group12 : compare 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| proc cmitxxand
 | |
| with src4 src4 REG
 | |
| gen cmpd %2, %1
 | |
|     brxx* {label, "1f"}
 | |
|     xord %3, %3
 | |
|     1:
 | |
| 
 | |
| proc cmitxxior
 | |
| with src4 src4 REG
 | |
| gen cmpd %2, %1
 | |
|     brxx* {label, "1f"}
 | |
|     sbitd {const4, 0}, %3
 | |
|     1:
 | |
| 
 | |
| proc txxand
 | |
| with src4 REG
 | |
| gen cmpd {const4, 0}, %1
 | |
|     brxx* {label, "1f"}
 | |
|     xord %2, %2
 | |
|     1:
 | |
| 
 | |
| proc txxior
 | |
| with src4 REG
 | |
| gen cmpd {const4, 0}, %1
 | |
|     brxx* {label, "1f"}
 | |
|     sbitd {const4, 0}, %2
 | |
|     1:
 | |
| 
 | |
| pat cmi tlt and $1==4 && $3==4	call cmitxxand("blt")
 | |
| pat cmi tle and $1==4 && $3==4	call cmitxxand("ble")
 | |
| pat cmi teq and $1==4 && $3==4	call cmitxxand("beq")
 | |
| pat cmi tne and $1==4 && $3==4	call cmitxxand("bne")
 | |
| pat cmi tge and $1==4 && $3==4	call cmitxxand("bge")
 | |
| pat cmi tgt and $1==4 && $3==4	call cmitxxand("bgt")
 | |
| 
 | |
| pat cmi tlt ior $1==4 && $3==4	call cmitxxior("blt")
 | |
| pat cmi tle ior $1==4 && $3==4	call cmitxxior("ble")
 | |
| pat cmi teq ior $1==4 && $3==4	call cmitxxior("beq")
 | |
| pat cmi tne ior $1==4 && $3==4	call cmitxxior("bne")
 | |
| pat cmi tge ior $1==4 && $3==4	call cmitxxior("bge")
 | |
| pat cmi tgt ior $1==4 && $3==4	call cmitxxior("bgt")
 | |
| 
 | |
| pat tlt and $2==4		call txxand("bgt")
 | |
| pat tle and $2==4		call txxand("bge")
 | |
| pat teq and $2==4		call txxand("beq")
 | |
| pat tne and $2==4		call txxand("bne")
 | |
| pat tge and $2==4		call txxand("ble")
 | |
| pat tgt and $2==4		call txxand("blt")
 | |
| 
 | |
| pat tlt ior $2==4		call txxior("bgt")
 | |
| pat tle ior $2==4		call txxior("bge")
 | |
| pat teq ior $2==4		call txxior("beq")
 | |
| pat tne ior $2==4		call txxior("bne")
 | |
| pat tge ior $2==4		call txxior("ble")
 | |
| pat tgt ior $2==4		call txxior("blt")
 | |
| 
 | |
| pat cmi $1==4
 | |
| with src4 REG
 | |
|     gen subd %1, %2			yields %2
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| pat cmf $1==4
 | |
| with fsrc4 fsrc4
 | |
| uses REG = {const4, 0}
 | |
|     gen cmpf %1, %2
 | |
| 	beq {label, "1f"}
 | |
| 	bgt {label, "2f"}
 | |
| 	movd {const4, 1}, %a
 | |
| 	br {label, "1f"}
 | |
| 	2:
 | |
| 	movd {const4, 0-1}, %a
 | |
| 	1:				yields %a
 | |
| 
 | |
| pat cmf $1==8
 | |
| with fsrc8 fsrc8
 | |
| uses REG = {const4, 0}
 | |
|     gen cmpl %1, %2
 | |
| 	beq {label, "1f"}
 | |
| 	bgt {label, "2f"}
 | |
| 	movd {const4, 1}, %a
 | |
| 	br {label, "1f"}
 | |
| 	2:
 | |
| 	movd {const4, 0-1}, %a
 | |
| 	1:				yields %a
 | |
| 
 | |
| #else
 | |
| 
 | |
| pat cmf					leaving loc 18 trp
 | |
| 
 | |
| #endif
 | |
| pat cmu $1==4
 | |
| with src4 src4
 | |
|     uses REG={const4, 0}
 | |
|     gen cmpd %2, %1
 | |
| 	blo {label, "1f"}
 | |
| 	shid %a
 | |
| 	br {label, "2f"}
 | |
| 	1:
 | |
| 	addd {const4, 0-1}, %a
 | |
| 	2:				yields %a
 | |
| 
 | |
| pat cmu defined($1)
 | |
| with STACK
 | |
|     gen move {const4, $1}, {TOS}
 | |
| 	jsr {absolute4, ".cmu"}		yields r1
 | |
| 
 | |
| pat cms $1==4				leaving cmi $1
 | |
| 
 | |
| pat cms $1!=4
 | |
| with STACK
 | |
| gen move {const4, $1}, {TOS}
 | |
|     jsr {absolute4, ".cms"}		yields r1
 | |
| 
 | |
| pat cms !defined($1)
 | |
| with STACK
 | |
| gen jsr {absolute4, ".cms"}		yields r1
 | |
| 
 | |
| pat cmp
 | |
| with exact addr_local addr_local	yields {const4, %2.ind}
 | |
| 					       {const4, %1.ind}
 | |
| 					leaving sbi 4
 | |
| with					leaving cmu 4
 | |
| 
 | |
| proc txx
 | |
| with src4
 | |
|     uses REG
 | |
|     gen cmpqd {const4, 0}, %1
 | |
| 	sxx* %a					yields %a
 | |
| 
 | |
| pat tlt	       			call txx("sgtd")
 | |
| pat tle	       			call txx("sged")
 | |
| pat teq	       			call txx("seqd")
 | |
| pat tne	       			call txx("sned")
 | |
| pat tge	       			call txx("sled")
 | |
| pat tgt	       			call txx("sltd")
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group13 : branch 						 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| proc bxx example beq
 | |
| with src4 src4 STACK
 | |
| 	gen cmpd %2, %1
 | |
| 	    brxx* {label, $1}
 | |
| with exact src4 STACK
 | |
|     gen cmpd {TOS}, %1
 | |
| 	brxx* {label, $1}
 | |
| 
 | |
| pat blt				call bxx("blt")
 | |
| pat ble				call bxx("ble")
 | |
| pat beq				call bxx("beq")
 | |
| pat bne				call bxx("bne")
 | |
| pat bge				call bxx("bge")
 | |
| pat bgt				call bxx("bgt")
 | |
| 
 | |
| pat bra
 | |
| with STACK
 | |
|     gen br {label, $1}
 | |
| 
 | |
| pat loc beq $1>=0 && $1<=127
 | |
| with exact src1
 | |
| kills ALL
 | |
| gen cmpb {const4, $1}, %1
 | |
|     beq {label, $2}
 | |
| with					yields {const4, $1}
 | |
| 					leaving beq $2
 | |
| 
 | |
| pat loc bne $1>=0 && $1<=127
 | |
| with exact src1
 | |
| kills ALL
 | |
| gen cmpb {const4, $1}, %1
 | |
|     bne {label, $2}
 | |
| with					yields {const4, $1}
 | |
| 					leaving bne $2
 | |
| 
 | |
| proc cmpzxx example cmp zeq
 | |
| with src4 src4 STACK
 | |
|     gen cmpd %2,%1
 | |
| 	brxx* {label, $2}
 | |
| with exact src4 STACK
 | |
|     gen cmpd {TOS}, %1
 | |
| 	brxx* {label, $2}
 | |
| with exact addr_local addr_local
 | |
|     kills ALL
 | |
|     gen cmpd {const4, %2.ind}, {const4, %1.ind}
 | |
| 	brxx* {label, $2}
 | |
| 
 | |
| pat cmp zlt			call cmpzxx("blo")
 | |
| pat cmp zle			call cmpzxx("bls")
 | |
| pat cmp zeq			call cmpzxx("beq")
 | |
| pat cmp zne			call cmpzxx("bne")
 | |
| pat cmp zge			call cmpzxx("bhs")
 | |
| pat cmp zgt			call cmpzxx("bhi")
 | |
| 
 | |
| #ifndef NOFLOAT
 | |
| proc cmf4zxx example cmf zeq
 | |
| with fsrc4 fsrc4 STACK
 | |
|     gen cmpf %2,%1
 | |
| 	brxx* {label, $2}
 | |
| with exact fsrc4 STACK
 | |
|     gen cmpf {TOS}, %1
 | |
| 	brxx* {label, $2}
 | |
| 
 | |
| pat cmf zlt $1==4			call cmf4zxx("blo")
 | |
| pat cmf zle $1==4			call cmf4zxx("bls")
 | |
| pat cmf zeq $1==4			call cmf4zxx("beq")
 | |
| pat cmf zne $1==4			call cmf4zxx("bne")
 | |
| pat cmf zge $1==4			call cmf4zxx("bhs")
 | |
| pat cmf zgt $1==4			call cmf4zxx("bhi")
 | |
| 
 | |
| proc cmf8zxx example cmf zeq
 | |
| with fsrc8 fsrc8 STACK
 | |
|     gen cmpl %2,%1
 | |
| 	brxx* {label, $2}
 | |
| with exact fsrc8 STACK
 | |
|     gen cmpl {TOS}, %1
 | |
| 	brxx* {label, $2}
 | |
| 
 | |
| pat cmf zlt $1==8			call cmf8zxx("blo")
 | |
| pat cmf zle $1==8			call cmf8zxx("bls")
 | |
| pat cmf zeq $1==8			call cmf8zxx("beq")
 | |
| pat cmf zne $1==8			call cmf8zxx("bne")
 | |
| pat cmf zge $1==8			call cmf8zxx("bhs")
 | |
| pat cmf zgt $1==8			call cmf8zxx("bhi")
 | |
| #endif
 | |
| 
 | |
| proc zxx example zeq
 | |
| with src4 STACK
 | |
|     gen cmpqd {const4,0}, %1
 | |
| 	brxx* {label, $1}
 | |
| with exact STACK
 | |
|     gen cmpqd {const4,0}, {TOS}
 | |
| 	brxx* {label, $1}
 | |
| 
 | |
| pat zlt				call zxx("bgt")
 | |
| pat zle				call zxx("bge")
 | |
| pat zeq				call zxx("beq")
 | |
| pat zne				call zxx("bne")
 | |
| pat zge				call zxx("ble")
 | |
| pat zgt				call zxx("blt")
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group14 : procedure call 					 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat cal
 | |
| with STACK
 | |
|     gen jsr {absolute4, $1}
 | |
| 
 | |
| pat cai
 | |
| with USELESS
 | |
| with REG STACK
 | |
|     gen jsr %1
 | |
| 
 | |
| pat ret $1==0
 | |
| with STACK
 | |
|     gen exit {label, "[]"}
 | |
| 	ret {const4, 0}
 | |
| 
 | |
| pat ret $1==4
 | |
| with src4 STACK
 | |
|     gen move %1, r0
 | |
| 	exit {label, "[]"}
 | |
| 	ret {const4, 0}
 | |
| 
 | |
| pat ret $1==8
 | |
| with STACK
 | |
|     gen move {TOS}, r0
 | |
| 	move {TOS}, r1
 | |
| 	exit {label, "[]"}
 | |
| 	ret {const4, 0}
 | |
| 
 | |
| pat lfr $1==4				yields r0
 | |
| 
 | |
| pat lfr $1==8				yields r1 r0
 | |
| 
 | |
| /*****************************************************************
 | |
|  * Group15 : miscellaneous 					 *
 | |
|  *****************************************************************/
 | |
| 
 | |
| pat asp
 | |
| with STACK
 | |
|     gen adjspd {const4,0-$1}
 | |
| 
 | |
| pat ass $1==4
 | |
| with USELESS
 | |
| with REG STACK
 | |
|     gen negd %1, %1
 | |
| 	adjspd %1
 | |
| with const4 STACK
 | |
|     gen adjspd {const4,0-%1.num}
 | |
| 
 | |
| pat blm $1==0
 | |
| 
 | |
| pat blm $1==4
 | |
| with USELESS
 | |
| with REG REG
 | |
| kills allmincon
 | |
|     gen move {regrel4, %2, 0}, {regrel4, %1, 0}
 | |
| 
 | |
| pat blm $1>4 && $1<=16
 | |
| with USELESS
 | |
| with REG REG
 | |
| kills allmincon
 | |
|     gen movmd %2, %1, {const4, $1}
 | |
| with exact addr_external addr_external
 | |
| kills allmincon
 | |
|     gen movmd {absolute4, %2.disp}, {absolute4, %1.disp}, {const4, $1}
 | |
| with exact addr_external addr_local
 | |
| kills allmincon
 | |
|     gen movmd {LOCAL, %2.ind}, {absolute4, %1.disp}, {const4, $1}
 | |
| with exact addr_local addr_external
 | |
| kills allmincon
 | |
|     gen movmd {absolute4, %2.disp}, {LOCAL, %1.ind}, {const4, $1}
 | |
| with exact addr_local addr_local
 | |
| kills allmincon
 | |
|     gen movmd {LOCAL, %2.ind}, {LOCAL, %1.ind}, {const4, $1}
 | |
| 
 | |
| pat blm $1>16
 | |
| with USELESS
 | |
| with REG REG
 | |
| kills allmincon
 | |
|     uses REG={const4,$1}
 | |
|     gen 1:
 | |
| 	movd {regrel4, %2, 0}, {regrel4, %1, 0}
 | |
| 	addr {regrel4, %1, 4}, %1
 | |
| 	addr {regrel4, %2, 4}, %2
 | |
| 	acbd {const4, 0-4}, %a, {label, "1b"}
 | |
| 
 | |
| pat bls $1==4
 | |
| with USELESS
 | |
| with REG
 | |
| kills ALL
 | |
|     gen 1:
 | |
| 	movd {memrel4, sp, 4, 0}, {memrel4, sp, 0, 0}
 | |
| 	addr {memrel4, sp, 0, 4}, {memregrel4, sp, 0}
 | |
| 	addr {memrel4, sp, 4, 4}, {memregrel4, sp, 4}
 | |
| 	acbd {const4, 0-4}, %1, {label, "1b"}
 | |
| 	adjspd {const4, 0-8}
 | |
| 
 | |
| pat lae csa $2==4
 | |
| with src4 STACK
 | |
|     gen move %1, r0
 | |
| 	move {addr_external, $1}, r1
 | |
| 	jsr {absolute4, ".csa"}
 | |
| 
 | |
| pat csa
 | |
| with STACK
 | |
|     gen movd {TOS}, r1
 | |
| 	movd {TOS}, r0
 | |
| 	jsr {absolute4, ".csa"}
 | |
| 
 | |
| pat lae csb $2==4
 | |
| with src4 STACK
 | |
|     gen move %1, r0
 | |
| 	move {addr_external, $1}, r1
 | |
| 	jsr {absolute4, ".csb"}
 | |
| 
 | |
| pat csb
 | |
| with STACK
 | |
|     gen movd {TOS}, r1
 | |
| 	movd {TOS}, r0
 | |
| 	jsr {absolute4, ".csb"}
 | |
| 
 | |
| pat dch					leaving loi 2
 | |
| 
 | |
| pat dup $1==4
 | |
| with src4				yields %1 %1
 | |
| 
 | |
| pat dup $1==8
 | |
| with src4 src4				yields %2 %1 %2 %1
 | |
| with exact DLOCAL			yields %1 %1
 | |
| with exact absolute8			yields %1 %1
 | |
| 
 | |
| pat dup $1>8
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
| 	jsr {absolute4, ".dup"}
 | |
| 
 | |
| pat dus $1==4
 | |
| with src4 STACK
 | |
|     gen move %1, r0
 | |
| 	jsr {absolute4, ".dup"}
 | |
| 
 | |
| pat exg $1==4
 | |
| with src4 src4				yields %1 %2
 | |
| 
 | |
| pat exg $1==8
 | |
| with src4 src4 src4 src4		yields %2 %1 %4 %3
 | |
| 
 | |
| pat exg
 | |
| with STACK
 | |
|     gen move {const4, $1}, r0
 | |
| 	jsr {absolute4, ".exg"}
 | |
| 
 | |
| pat fil
 | |
| gen move {addr_external, $1}, {absolute4, "hol0"+4}
 | |
| 
 | |
| pat gto
 | |
| with STACK
 | |
|     gen move {addr_external, $1}, r0
 | |
| 	br {label, ".gto"}
 | |
| 
 | |
| pat lim					yields {absolute2, ".ignmask"}
 | |
| 
 | |
| pat lin
 | |
| gen move {const4, $1}, {absolute4, "hol0"}
 | |
| 
 | |
| pat lni
 | |
| gen addd {const4, 1}, {absolute4, "hol0"}
 | |
| 
 | |
| pat lor $1==0				yields fp
 | |
| 
 | |
| pat lor $1==1
 | |
| with STACK				yields sp
 | |
| 
 | |
| pat lor $1==2				yields {absolute4, ".reghp"}
 | |
| 
 | |
| pat lpb					leaving adp 8
 | |
| 
 | |
| pat mon
 | |
| with STACK
 | |
| gen jsr {absolute4, ".mon"}
 | |
| 
 | |
| pat nop
 | |
| with STACK
 | |
|     gen move {absolute4, "hol0"}, {TOS}
 | |
| 	jsr {absolute4, ".print"}
 | |
| 	jsr {absolute4, ".prnl"}
 | |
| 
 | |
| pat rck $1==4
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".rck"}
 | |
| 
 | |
| pat rtt					leaving ret 0
 | |
| 
 | |
| pat sig
 | |
| with src4
 | |
| uses REG
 | |
|     gen move {absolute4, ".trpreg"}, %a
 | |
| 	move %1, {absolute4, ".trpreg"}		yields %a
 | |
| 
 | |
| pat sim
 | |
| with src24
 | |
|     gen movw %1, {absolute2, ".ignmask"}
 | |
| 
 | |
| pat str $1==0
 | |
| with src4
 | |
| gen sprd %1, fp
 | |
| 
 | |
| pat str $1==1
 | |
| with src4
 | |
| gen sprd %1, sp
 | |
| 
 | |
| pat str $1==2
 | |
| with src4
 | |
| gen move %1, {absolute4, ".reghp"}
 | |
| 
 | |
| pat trp
 | |
| with STACK
 | |
|     gen jsr {absolute4, ".trp"}
 |