2055 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			2055 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| /************************************************************/
 | |
| /************************************************************/
 | |
| /*******					       ******/
 | |
| /*******   8 0 8 0    B A C K  E N D   T A B L E       ******/
 | |
| /*******					       ******/
 | |
| /************************************************************/
 | |
| /************************************************************/
 | |
| 
 | |
| 
 | |
| rcsid = "$Id$"
 | |
| 
 | |
| EM_WSIZE = 2
 | |
| EM_PSIZE = 2
 | |
| EM_BSIZE = 4
 | |
| 
 | |
| SL=4
 | |
| 
 | |
| PROPERTIES
 | |
| 
 | |
| areg			/* the a-register */
 | |
| lbreg			/* the registers used as localbase */
 | |
| reg			/* the free registers */
 | |
| regpair			/* register pairs bc, de and hl */
 | |
| regind			/* register indirect */
 | |
| dereg			/* de-register-pair */
 | |
| hlreg			/* hl-register-pair */
 | |
| hl_or_de		/* de- or hl-register-pair */
 | |
| localbase
 | |
| stackpointer
 | |
| psword
 | |
| 
 | |
| 
 | |
| REGISTERS
 | |
| 
 | |
| a			:areg,reg.
 | |
| b,c			:lbreg.
 | |
| d,e,h,l			:reg.
 | |
| lb("b")=b+c		:regpair, localbase, regind.
 | |
| de("d")=d+e		:regpair, regind, dereg, hl_or_de.
 | |
| hl("h")=h+l		:regpair, hlreg, hl_or_de.
 | |
| sp			:stackpointer.
 | |
| psw=a			:psword.     /* in fact psw also includes
 | |
| 					condition codes */
 | |
| 
 | |
| TOKENS
 | |
| 
 | |
| const1			= { INT num; } 1 num.
 | |
| const2			= { INT num; } 2 num.
 | |
| label			= { ADDR off; } 2 off.
 | |
| m			= { } 2 cost(0,3) "m".
 | |
| 
 | |
| SETS
 | |
| 
 | |
| reg1			= reg + lbreg + m.
 | |
| b_d_h_sp		= regpair + stackpointer.
 | |
| b_d_h_psw		= regpair + psword.
 | |
| immediate		= const2 + label.
 | |
| src1			= reg.
 | |
| src2			= hl_or_de + const2 + label.
 | |
| src1or2			= src1 + src2.
 | |
| 
 | |
| INSTRUCTIONS
 | |
| 
 | |
| /* aci	const1:ro	kills a:cc	cost(2, 7).	*/
 | |
|    adc	reg1:ro		kills a:cc	cost(1, 4).
 | |
|    add	reg1:ro 	kills a:cc	cost(1, 4).
 | |
| /* adi	const1:ro 	kills a:cc	cost(2, 7).	*/
 | |
|    ana	reg1:ro 	kills a:cc	cost(1, 4).
 | |
|    ani	const1:ro 	kills a:cc	cost(2, 7).
 | |
|    Call	"call" label:ro			cost(3,17).
 | |
| 			   /* 'call' is a reserved word */
 | |
| /* cc	label:ro			cost(3,14). 	*/
 | |
| /* cm	label:ro			cost(3,14).	*/
 | |
|    cma			kills a		cost(3,14).
 | |
|    cmc			kills:cc	cost(1, 4).
 | |
|    cmp	reg1:ro 	kills:cc	cost(1, 4).
 | |
| /* cnc	label:ro			cost(3,14).	*/
 | |
|    cnz	label:ro			cost(3,14).
 | |
| /* cp	label:ro			cost(3,14).	*/
 | |
| /* cpe	label:ro			cost(3,14).	*/
 | |
|    cpi	const1:ro 	kills:cc	cost(2, 7).
 | |
| /* cpo	label:ro			cost(3,14).	*/
 | |
| /* cz	label:ro			cost(3,14).	*/
 | |
| /* daa			kills a:cc	cost(1, 4).	*/
 | |
|    dad	b_d_h_sp:ro 	kills hl:cc	cost(1,10).
 | |
|    dcr	reg+lbreg:rw:cc			cost(1, 5).
 | |
|    dcr	m:rw:cc				cost(1, 7).
 | |
|    dcx	b_d_h_sp:rw			cost(1, 5).
 | |
| /* di					cost(1, 4).	*/
 | |
| /* ei					cost(1, 4).	*/
 | |
| /* hlt					cost(1, 4).	*/
 | |
| /* in	const1:ro			cost(2,10).	*/
 | |
|    inr	reg+lbreg:rw:cc			cost(1, 5).
 | |
|    inr	m:rw:cc				cost(1, 7).
 | |
|    inx	b_d_h_sp:rw			cost(1, 5).
 | |
|    jc	label:ro			cost(3,10).
 | |
|    jm	label:ro			cost(3,10).
 | |
|    jmp	label:ro			cost(3,10).
 | |
|    jnc	label:ro			cost(3,10).
 | |
|    jnz	label:ro			cost(3,10).
 | |
|    jp	label:ro			cost(3,10).
 | |
| /* jpe	label:ro			cost(3,10).	*/
 | |
| /* jpo	label:ro			cost(3,10).	*/
 | |
|    jz	label:ro			cost(3,10).
 | |
|    lda	label:ro 	kills a		cost(3,13).
 | |
|    ldax	regind:ro 	kills a		cost(1, 7).
 | |
|    lhld	label:ro 	kills hl	cost(3,16).
 | |
|    lxi	b_d_h_sp:wo,immediate:ro	cost(3,10).
 | |
|    mov	reg+lbreg:wo,reg+lbreg:ro	cost(1, 5).
 | |
|    mov  m:wo,reg1:ro			cost(1, 4).
 | |
|    mov  reg1:wo,m:ro			cost(1, 4).
 | |
|    mvi	reg1:wo,const1:ro		cost(2, 7).
 | |
| /* nop					cost(1, 3).	*/
 | |
|    ora	reg1:ro 	kills a:cc	cost(1, 4).
 | |
| /* ori	const1:ro 	kills a:cc	cost(2, 7).	*/
 | |
| /* out	const1:ro			cost(2,10).	*/
 | |
|    pchl					cost(1, 5).
 | |
|    pop	b_d_h_psw:wo			cost(1,10).
 | |
|    push	b_d_h_psw:ro			cost(1,10).
 | |
|    ral			kills a:cc	cost(1, 4).
 | |
|    rar			kills a:cc	cost(1, 4).
 | |
| /* rc					cost(1, 8).	*/
 | |
|    ret					cost(1,10).
 | |
|    rlc			kills a:cc	cost(1, 4).
 | |
| /* rm					cost(1, 8).	*/
 | |
| /* rnc					cost(1, 8).	*/
 | |
| /* rnz					cost(1, 8).	*/
 | |
| /* rp					cost(1, 8).	*/
 | |
| /* rpe					cost(1, 8).	*/
 | |
| /* rpo					cost(1, 8).	*/
 | |
|    rrc			kills a:cc	cost(1, 4).
 | |
| /* rst	const1:ro			cost(1,11).	*/
 | |
| /* rz					cost(1, 8).	*/
 | |
|    sbb	reg1:ro 	kills a:cc	cost(1, 4).
 | |
| /* sbi	const1:ro 	kills a:cc	cost(2, 7).	*/
 | |
|    shld	label:ro			cost(3,16).
 | |
|    sphl					cost(1, 5).
 | |
|    sta	label:ro			cost(3,13).
 | |
|    stax	regind:ro			cost(1, 7).
 | |
| /* stc			kills:cc	cost(1, 4).	*/
 | |
|    sub	reg1:ro 	kills a:cc	cost(1, 4).
 | |
|    sui	const1:ro 	kills a:cc	cost(2, 7).
 | |
|    xchg			kills de hl	cost(1, 4).
 | |
|    xra	reg1:ro 	kills a:cc	cost(1, 4).
 | |
| /* xri	const1:ro 	kills a:cc	cost(2, 7).	*/
 | |
|    xthl			kills hl	cost(1,18).
 | |
|    
 | |
| 
 | |
| MOVES
 | |
| 
 | |
| from reg to reg
 | |
| gen mov %2,%1
 | |
| 
 | |
| from const1 %num==0 to areg
 | |
| gen xra a
 | |
| 
 | |
| from const1 to reg
 | |
| gen mvi %2,%1
 | |
| 
 | |
| from immediate to b_d_h_sp
 | |
| gen lxi %2,%1
 | |
| 
 | |
| from reg to regpair
 | |
| gen mov %2.2,%1
 | |
|     mvi %2.1,{const1,0}
 | |
| 
 | |
| from regpair to regpair
 | |
| gen mov %2.1,%1.1
 | |
|     mov %2.2,%1.2
 | |
| 
 | |
| TESTS
 | |
| 
 | |
| to test areg		/* dummy test, never used */
 | |
| gen ora a
 | |
| 
 | |
| STACKINGRULES
 | |
| 
 | |
| from regpair to STACK
 | |
| gen push %1
 | |
| 
 | |
| from immediate + reg to STACK
 | |
| uses hl_or_de
 | |
| gen move %1,%a
 | |
|     push %a
 | |
| 
 | |
| from immediate + reg to STACK
 | |
| gen push hl
 | |
|     move %1,hl
 | |
|     xthl.
 | |
| 
 | |
| COERCIONS
 | |
| 
 | |
| from STACK
 | |
| uses regpair
 | |
| gen pop %a				yields %a
 | |
| 
 | |
| from STACK
 | |
| uses hl_or_de
 | |
| gen pop %a				yields %a.2
 | |
| 
 | |
| from STACK
 | |
| uses areg
 | |
| gen dcx sp
 | |
|     pop psw
 | |
|     inx sp				yields a
 | |
| 
 | |
| from immediate
 | |
| uses regpair
 | |
| gen move %1,%a				yields %a
 | |
| 
 | |
| from hl_or_de
 | |
| uses hl_or_de
 | |
| gen xchg.				yields %a
 | |
| 
 | |
| from regpair
 | |
| uses regpair
 | |
| gen move %1,%a				yields %a
 | |
| 
 | |
| from reg
 | |
| uses reusing %1, hl_or_de
 | |
| gen move %1,%a.2
 | |
|     move {const1,0},%a.1		yields %a
 | |
| 
 | |
| from hl_or_de				yields %1.2
 | |
| 
 | |
| from const2
 | |
| uses hl_or_de
 | |
| gen move %1,%a				yields %a.2
 | |
| 
 | |
| from hl_or_de
 | |
| uses areg
 | |
| gen move %1.2,a				yields a
 | |
| 
 | |
| PATTERNS
 | |
| 
 | |
| /*********************************************/
 | |
| /* Group 1: Load instructions                */
 | |
| /*********************************************/
 | |
| 
 | |
| pat loc					yields {const2,$1}
 | |
| pat ldc					yields {const2,highw($1)}
 | |
| 					       {const2,loww($1)}
 | |
| 
 | |
| pat lol
 | |
| uses hlreg={const2,$1}, dereg
 | |
| gen dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}				yields de
 | |
| 
 | |
| pat loe
 | |
| uses hlreg
 | |
| gen lhld {label,$1}			yields hl
 | |
| 
 | |
| pat lil
 | |
| uses hlreg={const2,$1}, dereg
 | |
| gen dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,e
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}				yields de
 | |
| 
 | |
| pat lof
 | |
| with hl_or_de
 | |
| kills hl_or_de
 | |
| uses hl_or_de={const2,$1}
 | |
| gen dad de
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}				yields de
 | |
| 
 | |
| pat lal
 | |
| uses hlreg={const2,$1}
 | |
| gen dad lb				yields hl
 | |
| 
 | |
| pat lae					yields {label,$1}
 | |
| 
 | |
| pat lxl $1==0				yields lb
 | |
| 
 | |
| pat lxl $1==1
 | |
| uses dereg, hlreg
 | |
| gen move {const2,SL},hl
 | |
|     dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}				yields de
 | |
| 
 | |
| pat lxl $1>1 && $1<256
 | |
| uses dereg, areg={const1,$1}, hlreg
 | |
| gen move lb,de
 | |
|     1:
 | |
|     lxi hl,{const2,SL}
 | |
|     dad de
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     dcr a
 | |
|     jnz {label,1b}			yields de
 | |
| 
 | |
| pat lxa $1==0
 | |
| uses hlreg
 | |
| gen move {const2,SL},hl
 | |
|     dad lb				yields hl
 | |
| 
 | |
| pat lxa $1==1
 | |
| uses dereg, hlreg
 | |
| gen move {const2,SL},hl
 | |
|     dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     lxi hl,{const2,SL}
 | |
|     dad de				yields hl
 | |
| 
 | |
| pat lxa $1>1 && $1<256
 | |
| uses dereg, hlreg, areg={const1,$1}
 | |
| gen move lb,de
 | |
|     1:
 | |
|     lxi hl,{const2,SL}
 | |
|     dad de
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
|     lxi hl,{const2,SL}
 | |
|     dad de				yields hl
 | |
| 
 | |
| pat loi $1==1
 | |
| with exact label
 | |
|   uses areg
 | |
|   gen lda %1				yields a
 | |
| with dereg
 | |
|   uses areg
 | |
|   gen ldax de				yields a
 | |
| with hlreg
 | |
|   uses reusing %1, reg
 | |
|   gen mov %a,{m}			yields %a
 | |
| 
 | |
| pat loi $1==2
 | |
| with exact label
 | |
|    gen lhld %1				yields hl
 | |
| with hlreg
 | |
|    uses dereg
 | |
|    gen mov e,{m}
 | |
|        inx %1
 | |
|        mov d,{m}			yields de
 | |
| 
 | |
| pat loi $1==4
 | |
| with exact label
 | |
|    gen lhld %1
 | |
|        xchg.
 | |
|        lhld {label,%1.off+2}		yields hl de
 | |
| with exact label
 | |
|    gen lhld {label,%1.off+2}
 | |
|        xchg.
 | |
|        lhld %1				yields de hl
 | |
| with hlreg
 | |
|    uses dereg, areg
 | |
|    gen mov e,{m}
 | |
|        inx %1
 | |
|        mov d,{m}
 | |
|        inx hl
 | |
|        mov a,{m}
 | |
|        inx hl
 | |
|        mov h,{m}
 | |
|        mov l,a				yields hl de
 | |
| 
 | |
| pat loi $1<=510
 | |
| with hl_or_de STACK
 | |
| uses hl_or_de={const2,$1-1}, areg
 | |
| gen dad de
 | |
|     mvi a,{const1,$1/2}
 | |
|     1:
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}
 | |
|     dcx hl
 | |
|     push de
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
| 
 | |
| pat loi $1>=512
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".loi"}
 | |
| 
 | |
| pat los $1==2
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".loi"}
 | |
| 
 | |
| pat ldl
 | |
| with STACK
 | |
| uses dereg, hlreg={const2,$1+3}
 | |
| gen dad lb
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}
 | |
|     dcx hl
 | |
|     push de
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}				yields de
 | |
| 
 | |
| pat lde
 | |
| with STACK
 | |
| gen lhld {label,$1+2}
 | |
|     push hl
 | |
|     lhld {label,$1}			yields hl
 | |
| with
 | |
| uses dereg, hlreg
 | |
| gen lhld {label,$1}
 | |
|     xchg.
 | |
|     lhld {label,$1+2}			yields hl de
 | |
| with 
 | |
| uses dereg, hlreg
 | |
| gen lhld {label,$1+2}
 | |
|     xchg.
 | |
|     lhld {label,$1}			yields de hl
 | |
| 
 | |
| pat ldf
 | |
| with hl_or_de STACK
 | |
| uses hl_or_de={const2,$1+3}
 | |
| gen dad de
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}
 | |
|     dcx hl
 | |
|     push de
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}				yields de
 | |
| 
 | |
| pat lpi
 | |
| uses hl_or_de={label,$1}		yields %a
 | |
| 
 | |
| /******************************************/
 | |
| /* Group 2: Store instructions            */
 | |
| /******************************************/
 | |
| 
 | |
| pat stl lol $1==$2
 | |
| with dereg				yields de de leaving stl $1
 | |
| 
 | |
| pat stl
 | |
| with dereg
 | |
| uses hlreg={const2,$1}
 | |
| gen dad lb
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
| 
 | |
| pat ste loe $1==$2
 | |
| with hlreg				yields hl hl leaving ste $1
 | |
| 
 | |
| pat ste
 | |
| with hlreg
 | |
| gen shld {label,$1}
 | |
| 
 | |
| pat sil
 | |
| with dereg
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     mov a,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,a
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
| 
 | |
| pat sil lil $1==$2
 | |
| with dereg
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     mov a,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,a
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d				yields de
 | |
| 
 | |
| pat lil loc adi sil $1==$4 && $3==2
 | |
| uses hlreg={const2,$1}, dereg, areg
 | |
| gen dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,e
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     push hl
 | |
|     lxi hl,{const2,$2}
 | |
|     dad de
 | |
|     xchg.
 | |
|     pop hl
 | |
|     mov {m},d
 | |
|     dcx hl
 | |
|     mov {m},e
 | |
| 
 | |
| pat lil inc sil $1==$3
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     mov a,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,a
 | |
|     inr {m}
 | |
|     jnz {label,1f}
 | |
|     inx hl
 | |
|     inr {m}
 | |
|     1:
 | |
| 
 | |
| pat lil dec sil $1==$3
 | |
| uses hlreg={const2,$1}, dereg
 | |
| gen dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov h,{m}
 | |
|     mov l,e
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     dcx de
 | |
|     mov {m},d
 | |
|     dcx hl
 | |
|     mov {m},e
 | |
| 
 | |
| pat stf
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,$1}
 | |
| gen dad de
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
| 
 | |
| pat sti $1==1
 | |
| with label areg
 | |
|    gen sta %1
 | |
| with dereg areg
 | |
|    gen stax de
 | |
| with hlreg reg
 | |
|    gen mov {m},%2
 | |
| 
 | |
| 
 | |
| pat sti $1==2
 | |
| with label hlreg
 | |
|    gen shld %1
 | |
| with hlreg dereg
 | |
|    gen mov {m},e
 | |
|        inx %1
 | |
|        mov {m},d
 | |
| with dereg hlreg
 | |
|    gen xchg.
 | |
|        mov {m},e
 | |
|        inx %2
 | |
|        mov {m},d
 | |
| 
 | |
| pat sti $1==4
 | |
| with label hlreg dereg
 | |
|    gen shld %1
 | |
|        xchg.
 | |
|        shld {label,%1.off+2}
 | |
| with label dereg hlreg
 | |
|    gen shld {label,%1.off+2}
 | |
|        xchg.
 | |
|        shld %1
 | |
| with hlreg dereg
 | |
| kills ALL
 | |
|    gen mov {m},e
 | |
|        inx hl
 | |
|        mov {m},d
 | |
|        inx hl
 | |
|        pop de
 | |
|        mov {m},e
 | |
|        inx hl
 | |
|        mov {m},d
 | |
| 
 | |
| pat sti $1<512
 | |
| with hlreg
 | |
| kills ALL
 | |
| uses areg={const1,$1/2}, dereg
 | |
| gen 1:
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
|     inx hl
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
| 
 | |
| pat sti
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".sti"}
 | |
| 
 | |
| pat sts $1==2
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".sti"}
 | |
| 
 | |
| pat sdl
 | |
| with dereg
 | |
| kills ALL
 | |
| uses hlreg={const2,$1}
 | |
| gen dad lb
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
|     inx hl
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
| 
 | |
| pat sde
 | |
| with hlreg
 | |
| kills ALL
 | |
| gen shld {label,$1}
 | |
|     pop hl
 | |
|     shld {label,$1+2}
 | |
| with hlreg dereg
 | |
| kills ALL
 | |
| gen shld {label,$1}
 | |
|     xchg.
 | |
|     shld {label,$1+2}
 | |
| with dereg hlreg
 | |
| kills ALL
 | |
| gen shld {label,$1+2}
 | |
|     xchg.
 | |
|     shld {label,$1}
 | |
| 
 | |
| pat sdf
 | |
| with hl_or_de
 | |
| kills ALL
 | |
| uses hl_or_de={const2,$1}
 | |
| gen dad de
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
|     inx hl
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
| 
 | |
| /****************************************/
 | |
| /* Group 3: Integer arithmetic          */
 | |
| /****************************************/
 | |
| 
 | |
| pat adi $1==2
 | |
| with hlreg dereg
 | |
|    gen dad de				yields hl
 | |
| with dereg hlreg
 | |
|    gen dad de				yields hl
 | |
| with hlreg hlreg
 | |
|    gen dad hl				yields hl
 | |
| with dereg dereg
 | |
|    gen xchg.
 | |
|        dad hl				yields hl
 | |
| 
 | |
| pat adi $1==4
 | |
| kills ALL
 | |
| gen Call {label,".adi4"}
 | |
| 
 | |
| pat sbi $1==2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     sub %1.2
 | |
|     mov %1.2,a
 | |
|     mov a,%2.1
 | |
|     sbb %1.1
 | |
|     mov %1.1,a				yields %1
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     sub %1.2
 | |
|     mov %2.2,a
 | |
|     mov a,%2.1
 | |
|     sbb %1.1
 | |
|     mov %2.1,a				yields %2
 | |
| 
 | |
| pat sbi $1==4
 | |
| kills ALL
 | |
| gen Call {label,".sbi4"}
 | |
| 
 | |
| pat mli $1==2
 | |
| kills ALL
 | |
| gen Call {label,".mli2"}		yields de
 | |
| 
 | |
| pat mli $1==4
 | |
| kills ALL
 | |
| gen Call {label,".mli4"}
 | |
| 
 | |
| pat dvi $1==2
 | |
| kills ALL
 | |
| uses areg={const1,129}
 | |
| gen Call {label,".dvi2"}		yields de
 | |
| 
 | |
| pat dvi $1==4
 | |
| kills ALL
 | |
| uses areg={const1,129}
 | |
| gen Call {label,".dvi4"}
 | |
| 
 | |
| pat rmi $1==2
 | |
| kills ALL
 | |
| uses areg={const1,128}
 | |
| gen Call {label,".dvi2"}		yields de
 | |
| 
 | |
| pat rmi $1==4
 | |
| kills ALL
 | |
| uses areg={const1,128}
 | |
| gen Call {label,".dvi4"}
 | |
| 
 | |
| pat ngi $1==2
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen xra a
 | |
|     sub %1.2
 | |
|     mov %1.2,a
 | |
|     mvi a,{const1,0}
 | |
|     sbb %1.1
 | |
|     mov %1.1,a				yields %1
 | |
| 
 | |
| pat ngi $1==4
 | |
| kills ALL
 | |
| gen Call {label,".ngi4"}
 | |
| 
 | |
| pat sli $1==2
 | |
| kills ALL
 | |
| gen Call {label,".sli2"}		yields de
 | |
| 
 | |
| pat sli $1==4
 | |
| kills ALL
 | |
| gen Call {label,".sli4"}
 | |
| 
 | |
| pat sri $1==2
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".sri2"}		yields de
 | |
| 
 | |
| pat sri $1==4
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".sri4"}
 | |
| 
 | |
| /********************************************/
 | |
| /* Group 4: Unsigned arithmetic		    */
 | |
| /********************************************/
 | |
| 
 | |
| pat adu						leaving adi $1
 | |
| 
 | |
| pat sbu						leaving sbi $1
 | |
| 
 | |
| pat mlu $1==2
 | |
| kills ALL
 | |
| gen Call {label,".mlu2"}		yields de
 | |
| 
 | |
| pat mlu $1==4
 | |
| kills ALL
 | |
| gen Call {label,".mli4"}
 | |
| 
 | |
| pat dvu $1==2
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".dvi2"}		yields de
 | |
| 
 | |
| pat dvu $1==4
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".dvi4"}
 | |
| 
 | |
| pat rmu $1==2
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".dvi2"}		yields de
 | |
| 
 | |
| pat rmu $1==4
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".dvi4"}
 | |
| 
 | |
| pat slu						leaving sli $1
 | |
| 
 | |
| pat sru $1==2
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".sri2"}		yields de
 | |
| 
 | |
| pat sru $1==4
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".sri4"}
 | |
| 
 | |
| 
 | |
| /********************************************/
 | |
| /* Group 5: Floating point arithmetic	    */
 | |
| /********************************************/
 | |
| 
 | |
| pat adf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".adf4"}
 | |
| 
 | |
| pat adf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".adf8"}
 | |
| 
 | |
| pat sbf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".sbf4"}
 | |
| 
 | |
| pat sbf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".sbf8"}
 | |
| 
 | |
| pat mlf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".mlf4"}
 | |
| 
 | |
| pat mlf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".mlf8"}
 | |
| 
 | |
| pat dvf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".dvf4"}
 | |
| 
 | |
| pat dvf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".dvf8"}
 | |
| 
 | |
| pat ngf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".ngf4"}
 | |
| 
 | |
| pat ngf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".ngf8"}
 | |
| 
 | |
| pat fif $1==4
 | |
| kills ALL
 | |
| gen Call {label,".fif4"}
 | |
| 
 | |
| pat fif $1==8
 | |
| kills ALL
 | |
| gen Call {label,".fif8"}
 | |
| 
 | |
| pat fef $1==4
 | |
| kills ALL
 | |
| gen Call {label,".fef4"}
 | |
| 
 | |
| pat fef $1==8
 | |
| kills ALL
 | |
| gen Call {label,".fef8"}
 | |
| 
 | |
| /********************************************/
 | |
| /* Group 6: Pointer arithmetic              */
 | |
| /********************************************/
 | |
| 
 | |
| pat adp $1==0			/* do nothing */
 | |
| 
 | |
| pat adp $1==1
 | |
| with hl_or_de
 | |
| gen inx %1				yields %1
 | |
| 
 | |
| pat adp $1==2
 | |
| with hl_or_de
 | |
| gen inx %1
 | |
|     inx %1				yields %1
 | |
| 
 | |
| pat adp $1==0-1
 | |
| with hl_or_de
 | |
| gen dcx %1				yields %1
 | |
| 
 | |
| pat adp $1==0-2
 | |
| with hl_or_de
 | |
| gen dcx %1
 | |
|     dcx %1				yields %1
 | |
| 
 | |
| pat adp
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,$1}
 | |
| gen dad de				yields hl
 | |
| 
 | |
| pat ads $1==2					leaving adi 2
 | |
| 
 | |
| pat sbs $1==2					leaving sbi 2
 | |
| 
 | |
| /********************************************/
 | |
| /* Group 7: Increment/ decrement/ zero      */
 | |
| /********************************************/
 | |
| 
 | |
| pat inc
 | |
| with hl_or_de
 | |
| gen inx %1				yields %1
 | |
| 
 | |
| pat inl
 | |
| uses hlreg={const2,$1}
 | |
| gen dad lb
 | |
|     inr {m}
 | |
|     jnz {label,1f}
 | |
|     inx hl
 | |
|     inr {m}
 | |
|     1:
 | |
| 
 | |
| pat ine
 | |
| uses hlreg={label,$1}
 | |
| gen inr {m}
 | |
|     jnz {label,1f}
 | |
|     inx hl
 | |
|     inr {m}
 | |
|     1:
 | |
| 
 | |
| pat dec
 | |
| with hl_or_de
 | |
| gen dcx %1				yields %1
 | |
| 
 | |
| pat del
 | |
| uses hlreg={const2,$1}, dereg
 | |
| gen dad lb
 | |
|     mov e,{m}
 | |
|     inx hl
 | |
|     mov d,{m}
 | |
|     dcx de
 | |
|     mov {m},d
 | |
|     dcx hl
 | |
|     mov {m},e
 | |
| 
 | |
| pat dee
 | |
| uses hlreg
 | |
| gen lhld {label,$1}
 | |
|     dcx hl
 | |
|     shld {label,$1}
 | |
| 
 | |
| pat zrl
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     xra a
 | |
|     mov {m},a
 | |
|     inx hl
 | |
|     mov {m},a
 | |
| 
 | |
| pat zre
 | |
| uses hlreg={const2,0}
 | |
| gen shld {label,$1}
 | |
| 
 | |
| pat zrf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".zrf4"}
 | |
| 
 | |
| pat zrf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".zrf8"}
 | |
| 
 | |
| pat zer $1==2				yields {const2,0}
 | |
| 
 | |
| pat zer $1==4				yields {const2,0} {const2,0}
 | |
| 
 | |
| pat zer $1<511
 | |
| kills ALL
 | |
| uses reg={const1,$1/2}, hl_or_de={const2,0}
 | |
| gen 1:
 | |
|     push %b
 | |
|     dcr %a
 | |
|     jnz {label,1b}
 | |
| 
 | |
| pat zer
 | |
| kills ALL
 | |
| uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
 | |
| gen xra a
 | |
|     1:
 | |
|     push %b
 | |
|     dcx %a
 | |
|     cmp %a.2
 | |
|     jnz {label,1b}
 | |
|     cmp %a.1
 | |
|     jnz {label,1b}
 | |
| 
 | |
| /*****************************************/
 | |
| /* Group 8: Convert instructions	 */
 | |
| /*****************************************/
 | |
| 
 | |
| pat loc loc cii $1==$2
 | |
| 
 | |
| pat loc loc cii $1==2 && $2==4
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,0}, areg
 | |
| gen mov a,%1.1
 | |
|     ora a
 | |
|     jp {label,1f}
 | |
|     lxi %a,{const2,0-1}
 | |
|     1:					yields %a %1
 | |
| 
 | |
| pat loc loc cii $1==4 && $2==2
 | |
| with hl_or_de hl_or_de			yields %1
 | |
| 
 | |
| pat loc loc cii $1==1 && $2==2
 | |
| with reg
 | |
| uses reusing %1, areg=%1, hl_or_de
 | |
| gen move {const1,0},%b.1
 | |
|     move a,%b.2
 | |
|     ora a
 | |
|     jp {label,1f}
 | |
|     mvi %b.1,{const1,255}
 | |
|     1:					yields %b
 | |
| with hl_or_de
 | |
| uses areg=%1.2
 | |
| gen move {const1,0},%1.1
 | |
|     ora a
 | |
|     jp {label,1f}
 | |
|     mvi %1.1,{const1,255}
 | |
|     1:					yields %1
 | |
| 
 | |
| pat loc loc cii $1==1 && $2==4
 | |
| with reg
 | |
|    uses hlreg
 | |
|    gen move %1,l			yields hl
 | |
| 						leaving loc $1 loc $2 cii
 | |
| with hlreg
 | |
|    uses dereg, areg
 | |
|    gen move {const1,0},%1.1
 | |
|        move l,a
 | |
|        ora a
 | |
|        jp {label,1f}
 | |
|        mvi h,{const1,255}
 | |
|        1:
 | |
|        mov e,h
 | |
|        mov d,h				yields de hl
 | |
| 
 | |
| pat cii
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".cii"}
 | |
| 
 | |
| pat loc loc ciu					leaving loc $1 loc $2 cuu
 | |
| pat loc loc cui					leaving loc $1 loc $2 cuu
 | |
| 
 | |
| pat cui						leaving cuu $1
 | |
| 
 | |
| pat ciu						leaving cuu $1
 | |
| 
 | |
| pat loc loc cuu $1==$2
 | |
| 
 | |
| pat loc loc cuu $1==2 && $2==4
 | |
| with src1or2				yields {const2,0} %1
 | |
| 
 | |
| pat loc loc cuu $1==4 && $1==2
 | |
| with src1or2 src1or2			yields %1
 | |
| 
 | |
| pat loc loc cuu $1==1 && $2==2
 | |
| with reg
 | |
|    uses reusing %1, hl_or_de
 | |
|    gen move %1,%a			yields %a
 | |
| with hl_or_de
 | |
|    gen move {const1,0},%1.1		yields %1
 | |
| 
 | |
| pat loc loc cuu $1==1 && $2==4
 | |
| with reg
 | |
|    uses reusing %1, hl_or_de
 | |
|    gen move %1,%a			yields {const2,0} %a
 | |
| with hl_or_de
 | |
|    gen move {const1,0},%1.1		yields {const2,0} %1
 | |
| 
 | |
| pat cuu
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".cii"}
 | |
| 
 | |
| pat cfi
 | |
| kills ALL
 | |
| gen Call {label,".cfi"}
 | |
| 
 | |
| pat cif
 | |
| kills ALL
 | |
| gen Call {label,".cif"}
 | |
| 
 | |
| pat cuf
 | |
| kills ALL
 | |
| gen Call {label,".cuf"}
 | |
| 
 | |
| pat cff
 | |
| kills ALL
 | |
| gen Call {label,".cff"}
 | |
| 
 | |
| pat cfu
 | |
| kills ALL
 | |
| gen Call {label,".cfu"}
 | |
| 
 | |
| /*****************************************/
 | |
| /* Group 9: Logical instructions         */
 | |
| /*****************************************/
 | |
| 
 | |
| pat and $1==2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     ana %2.2
 | |
|     mov %2.2,a
 | |
|     mov a,%1.1
 | |
|     ana %2.1
 | |
|     mov %2.1,a				yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     ana %2.2
 | |
|     mov %1.2,a
 | |
|     mov a,%1.1
 | |
|     ana %2.1
 | |
|     mov %1.1,a				yields %1
 | |
| 
 | |
| pat and defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".and"}
 | |
| 
 | |
| pat and !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".and"}
 | |
| 
 | |
| pat ior $1==2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     ora %2.2
 | |
|     mov %2.2,a
 | |
|     mov a,%1.1
 | |
|     ora %2.1
 | |
|     mov %2.1,a				yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     ora %2.2
 | |
|     mov %1.2,a
 | |
|     mov a,%1.1
 | |
|     ora %2.1
 | |
|     mov %1.1,a				yields %1
 | |
| 
 | |
| pat ior defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".ior"}
 | |
| 
 | |
| pat ior !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".ior"}
 | |
| 
 | |
| pat xor $1==2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     xra %2.2
 | |
|     mov %2.2,a
 | |
|     mov a,%1.1
 | |
|     xra %2.1
 | |
|     mov %2.1,a				yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     xra %2.2
 | |
|     mov %1.2,a
 | |
|     mov a,%1.1
 | |
|     xra %2.1
 | |
|     mov %1.1,a				yields %1
 | |
| 
 | |
| pat xor defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".xor"}
 | |
| 
 | |
| pat xor !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".xor"}
 | |
| 
 | |
| pat com $1==2
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cma.
 | |
|     mov %1.2,a
 | |
|     mov a,%1.1
 | |
|     cma.
 | |
|     mov %1.1,a				yields %1
 | |
| 
 | |
| pat com defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".com"}
 | |
| 
 | |
| pat com !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".com"}
 | |
| 
 | |
| pat rol $1==2
 | |
| with dereg hlreg
 | |
| kills ALL
 | |
| uses areg
 | |
| gen mov a,e
 | |
|     ani {const1,15}
 | |
|     jz {label,3f}
 | |
|     1:
 | |
|     dad hl
 | |
|     jnc {label,2f}
 | |
|     inr l
 | |
|     2:
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
|     3:					yields hl
 | |
| 
 | |
| pat rol $1==4
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".rol4"}
 | |
| 
 | |
| pat ror $1==2
 | |
| with dereg hlreg
 | |
| kills ALL
 | |
| uses areg
 | |
| gen mov a,e
 | |
|     ani {const1,15}
 | |
|     jz {label,2f}
 | |
|     mov e,a
 | |
|     mov a,l
 | |
|     1:
 | |
|     rar.
 | |
|     mov a,h
 | |
|     rar.
 | |
|     mov h,a
 | |
|     mov a,l
 | |
|     rar.
 | |
|     mov l,a
 | |
|     dcr e
 | |
|     jnz {label,1b}
 | |
|     2:					yields hl
 | |
| 
 | |
| pat ror $1==4
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".ror4"}
 | |
| 
 | |
| /***********************************************/
 | |
| /* Group 10: Set instructions		       */
 | |
| /***********************************************/
 | |
| 
 | |
| pat inn $1==2
 | |
| kills ALL
 | |
| gen Call {label,".inn2"}		yields de
 | |
| 
 | |
| pat inn defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".inn"}			yields de
 | |
| 
 | |
| pat inn !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".inn"}			yields de
 | |
| 
 | |
| pat set $1==2
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".set2"}		yields de
 | |
| 
 | |
| pat set defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".set"}
 | |
| 
 | |
| pat set !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".set"}
 | |
| 
 | |
| /***********************************************/
 | |
| /* Group 11: Array instructions  	       */
 | |
| /***********************************************/
 | |
| 
 | |
| 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 hlreg
 | |
| gen dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
 | |
| with hlreg
 | |
| uses dereg={const2,0-rom($1,1)}
 | |
| gen dad de
 | |
|     dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
 | |
| with hlreg
 | |
| gen dad hl
 | |
|     dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
 | |
| with hlreg
 | |
| uses dereg={const2,0-rom($1,1)}
 | |
| gen dad de
 | |
|     dad hl
 | |
|     dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
 | |
| with hlreg
 | |
| gen dad hl
 | |
|     dad hl
 | |
|     dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
 | |
| with hlreg
 | |
| uses dereg={const2,0-rom($1,1)}
 | |
| gen dad de
 | |
|     dad hl
 | |
|     dad hl
 | |
|     dad hl				yields hl leaving adi 2
 | |
| 
 | |
| pat lar $1==2
 | |
| kills ALL
 | |
| gen Call {label,".lar2"}
 | |
| 
 | |
| pat lar defined($1)
 | |
| gen Call {label,"eunimpl"}
 | |
| 
 | |
| pat lar !defined($1)
 | |
| with hl_or_de
 | |
| kills ALL
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,2}
 | |
|     cnz {label,"eunimpl"}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     cnz {label,"eunimpl"}
 | |
|     Call {label,".lar2"}
 | |
| 
 | |
| pat sar $1==2
 | |
| kills ALL
 | |
| gen Call {label,".sar2"}
 | |
| 
 | |
| pat sar defined($1)
 | |
| kills ALL
 | |
| gen Call {label,"eunimpl"}
 | |
| 
 | |
| pat sar !defined($1)
 | |
| with hl_or_de
 | |
| kills ALL
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,2}
 | |
|     cnz {label,"eunimpl"}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     cnz {label,"eunimpl"}
 | |
|     Call {label,".sar2"}
 | |
| 
 | |
| pat aar $1==2
 | |
| kills ALL
 | |
| gen Call {label,".aar2"}
 | |
| 
 | |
| pat aar defined($1)
 | |
| kills ALL
 | |
| gen Call {label,"eunimpl"}
 | |
| 
 | |
| pat aar !defined($1)
 | |
| with hl_or_de
 | |
| kills ALL
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,2}
 | |
|     cnz {label,"eunimpl"}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     cnz {label,"eunimpl"}
 | |
|     Call {label,".aar2"}
 | |
| 
 | |
| /***********************************************/
 | |
| /* Group 12: Compare instructions              */
 | |
| /***********************************************/
 | |
| 
 | |
| pat cmi $1==2					leaving sbi 2
 | |
| 
 | |
| pat cmi $1==4
 | |
| kills ALL
 | |
| uses areg={const1,1}
 | |
| gen Call {label,".cmi4"}		yields de
 | |
| 
 | |
| pat cmf $1==4
 | |
| kills ALL
 | |
| gen Call {label,".cmf4"}
 | |
| 
 | |
| pat cmf $1==8
 | |
| kills ALL
 | |
| gen Call {label,".cmf8"}
 | |
|  
 | |
| pat cmu $1==2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%2.1
 | |
|     cmp %1.1
 | |
|     jz {label,2f}
 | |
|     jc {label,1f}  
 | |
|     0:
 | |
|     lxi %2,{const2,1}
 | |
|     jmp {label,3f}
 | |
|     1:
 | |
|     lxi %2,{const2,0-1}
 | |
|     jmp {label,3f}
 | |
|     2:
 | |
|     mov a,%2.2
 | |
|     cmp %1.2
 | |
|     jc {label,1b}
 | |
|     jnz {label,0b}
 | |
|     lxi %2,{const2,0}
 | |
|     3:					yields %2
 | |
| 
 | |
| pat cmu $1==4
 | |
| kills ALL
 | |
| uses areg={const1,0}
 | |
| gen Call {label,".cmi4"}		yields de
 | |
| 
 | |
| pat cms $1==2					leaving cmi 2
 | |
| 
 | |
| pat cms defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".cms"}			yields de
 | |
| 
 | |
| pat cms !defined($1)
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".cms"}			yields de
 | |
| 
 | |
| pat cmp						leaving cmu 2
 | |
| 
 | |
| pat tlt
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ral.
 | |
|     mvi a,{const1,0}
 | |
|     mov %1.1,a
 | |
|     adc a
 | |
|     mov %1.2,a				yields %1
 | |
| 
 | |
| pat tle
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,1}, areg
 | |
| gen xra a
 | |
|     add %1.1
 | |
|     jm {label,2f}
 | |
|     jnz {label,1f}
 | |
|     xra a
 | |
|     add %1.2
 | |
|     jz {label,2f}
 | |
|     1:
 | |
|     dcx %a
 | |
|     2:					yields %a
 | |
| 
 | |
| pat teq
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     move {const2,0},%1
 | |
|     jnz {label,1f}
 | |
|     inx %1
 | |
|     1:					yields %1
 | |
| 
 | |
| pat tne
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     move {const2,0},%1
 | |
|     jz {label,1f}
 | |
|     inx %1
 | |
|     1:					yields %1
 | |
| 
 | |
| pat tge
 | |
| with hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ral.
 | |
|     cmc.
 | |
|     mvi a,{const1,0}
 | |
|     mov %1.1,a
 | |
|     adc a
 | |
|     mov %1.2,a				yields %1
 | |
| 
 | |
| pat tgt
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,0}, areg
 | |
| gen xra a
 | |
|     add %1.1
 | |
|     jm {label,2f}
 | |
|     jnz {label,1f}
 | |
|     xra a
 | |
|     add %1.2
 | |
|     jz {label,2f}
 | |
|     1:
 | |
|     inx %a
 | |
|     2:					yields %a
 | |
| 
 | |
| pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
 | |
| with exact areg hl_or_de
 | |
| gen cpi {const1,$1}
 | |
|     jz {label,1f}
 | |
|     move {const2,0},%2
 | |
|     1:					yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jz {label,2f}
 | |
|     1:
 | |
|     move {const2,0},%2
 | |
|     2:					yields %2
 | |
| 
 | |
| pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
 | |
| with exact areg hl_or_de
 | |
| gen cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     move {const2,0},%2
 | |
|     1:					yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jnz {label,1f}
 | |
|     move {const2,0},%2
 | |
|     1:					yields %2
 | |
| 
 | |
| pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
 | |
| with exact areg hl_or_de
 | |
| gen cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     move {const2,1},%2
 | |
|     1:					yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jnz {label,1f}
 | |
|     move {const2,1},%2
 | |
|     1:					yields %2
 | |
| 
 | |
| pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
 | |
| with exact areg hl_or_de
 | |
| gen cpi {const1,$1}
 | |
|     jz {label,1f}
 | |
|     move {const2,1},%2
 | |
|     1:					yields %2
 | |
| with hl_or_de hl_or_de
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jz {label,2f}
 | |
|     1:
 | |
|     move {const2,1},%2
 | |
|     2:					yields %2
 | |
| 
 | |
| pat loc cmi teq $1>=0 && $1<=255 && $2==2
 | |
| with exact areg
 | |
| uses hl_or_de={const2,0}
 | |
| gen cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     inx %a
 | |
|     1:					yields %a
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,0}, areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jnz {label,1f}
 | |
|     inx %a
 | |
|     1:					yields %a
 | |
| 
 | |
| 
 | |
| pat loc cmi tne $1>=0 && $1<=255 && $2==2
 | |
| with exact areg
 | |
| uses hl_or_de={const2,0}
 | |
| gen cpi {const1,$1}
 | |
|     jz {label,1f}
 | |
|     inx %a
 | |
|     1:					yields %a
 | |
| with hl_or_de
 | |
| uses hl_or_de={const2,1}, areg
 | |
| gen mov a,%1.2
 | |
|     cpi {const1,$1}
 | |
|     jnz {label,1f}
 | |
|     mov a,%1.1
 | |
|     ora a
 | |
|     jnz {label,1f}
 | |
|     dcx %a
 | |
|     1:					yields %a
 | |
| 
 | |
| pat loc cmi $1>=0 && $1<=255 && $2==2
 | |
| with exact areg
 | |
| uses hl_or_de
 | |
| gen sui {const1,$1}
 | |
|     mov %a.2,a
 | |
|     rar.
 | |
|     mov %a.1,a				yields %a
 | |
| with					yields {const2,$1}
 | |
| 						leaving cmi 2
 | |
| 
 | |
| pat loc cmi $1<0 && $2==2
 | |
| with exact areg				yields {const2,0-1}
 | |
| with 					yields {const2,$1}
 | |
| 						leaving cmi 2
 | |
| 
 | |
| /*******************************************/
 | |
| /* Group 13: Branch instructions           */
 | |
| /*******************************************/
 | |
| 
 | |
| pat loc beq $1>=0 && $1<=255
 | |
| with exact reg
 | |
| uses reusing %1, areg=%1
 | |
| gen cpi {const1,$1}
 | |
|     jz {label,$2}
 | |
| with					yields {const2,$1}
 | |
| 						leaving beq $2
 | |
|  
 | |
| pat loc bne $1>=0 && $1<=255
 | |
| with exact reg
 | |
| uses reusing %1, areg=%1
 | |
| gen cpi {const1,$1}
 | |
|     jnz {label,$2}
 | |
| with					yields {const2,$1}
 | |
| 						leaving bne $2
 | |
|  
 | |
| pat bra
 | |
| with STACK
 | |
| gen jmp {label,$1}
 | |
| 
 | |
| pat blt
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     sub %1.2
 | |
|     mov a,%2.1
 | |
|     sbb %1.1
 | |
|     jm {label,$1}
 | |
| 
 | |
| pat ble
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     sub %2.2
 | |
|     mov a,%1.1
 | |
|     sbb %2.1
 | |
|     jp {label,$1}
 | |
| 
 | |
| pat beq
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     cmp %1.2
 | |
|     jnz {label,1f}
 | |
|     mov a,%2.1
 | |
|     cmp %1.1
 | |
|     jz {label,$1}
 | |
|     1:
 | |
| 
 | |
| pat bne
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     cmp %1.2
 | |
|     jnz {label,$1}
 | |
|     mov a,%2.1
 | |
|     cmp %1.1
 | |
|     jnz {label,$1}
 | |
| 
 | |
| pat bge
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%2.2
 | |
|     sub %1.2
 | |
|     mov a,%2.1
 | |
|     sbb %1.1
 | |
|     jp {label,$1}
 | |
| 
 | |
| pat bgt
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.2
 | |
|     sub %2.2
 | |
|     mov a,%1.1
 | |
|     sbb %2.1
 | |
|     jm {label,$1}
 | |
| 
 | |
| pat zlt
 | |
| with STACK
 | |
| gen pop psw
 | |
|     ora a
 | |
|     jm {label,$1}
 | |
| with hl_or_de STACK
 | |
| gen mov a,%1.1
 | |
|     ora a
 | |
|     jm {label,$1}
 | |
| 
 | |
| pat zle
 | |
| with hl_or_de STACK
 | |
| uses areg
 | |
| gen xra a
 | |
|     add %1.1
 | |
|     jm {label,$1}
 | |
|     jnz {label,1f}
 | |
|     xra a
 | |
|     add %1.2
 | |
|     jz {label,$1}
 | |
|     1:
 | |
| 
 | |
| pat zeq
 | |
| with hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     jz {label,$1}
 | |
| 
 | |
| pat zne
 | |
| with hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     jnz {label,$1}
 | |
| 
 | |
| pat zge
 | |
| with STACK
 | |
| gen pop psw
 | |
|     ral.
 | |
|     jnc {label,$1}
 | |
| with hl_or_de STACK
 | |
| gen mov a,%1.1
 | |
|     ora a
 | |
|     jp {label,$1}
 | |
| 
 | |
| pat zgt
 | |
| with hl_or_de STACK
 | |
| uses areg
 | |
| gen xra a
 | |
|     add %1.1
 | |
|     jm {label,1f}
 | |
|     jnz {label,$1}
 | |
|     xra a
 | |
|     add %1.2
 | |
|     jnz {label,$1}
 | |
|     1:
 | |
| 
 | |
| pat lol zeq
 | |
| with STACK
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     mov a,{m}
 | |
|     inx hl
 | |
|     ora {m}
 | |
|     jz {label,$2}
 | |
| 
 | |
| pat lol zne
 | |
| with STACK
 | |
| uses hlreg={const2,$1}, areg
 | |
| gen dad lb
 | |
|     mov a,{m}
 | |
|     inx hl
 | |
|     ora {m}
 | |
|     jnz {label,$2}
 | |
| 
 | |
| pat ior zeq $1==2
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     ora %2.1
 | |
|     ora %2.2
 | |
|     jz {label,$2}
 | |
| 
 | |
| pat ior zne $1==2
 | |
| with hl_or_de hl_or_de STACK
 | |
| uses areg
 | |
| gen mov a,%1.1
 | |
|     ora %1.2
 | |
|     ora %2.1
 | |
|     ora %2.2
 | |
|     jnz {label,$2}
 | |
| 
 | |
| /*********************************************/
 | |
| /* Group 14: Procedure call instructions     */
 | |
| /*********************************************/
 | |
| 
 | |
| pat cal
 | |
| kills ALL
 | |
| gen Call {label,$1}
 | |
| 
 | |
| pat cai
 | |
| with hlreg
 | |
| kills ALL
 | |
| uses dereg
 | |
| gen lxi de,{label,1f}
 | |
|     push de
 | |
|     pchl.
 | |
|     1:
 | |
| 
 | |
| pat lfr $1==2				yields de
 | |
| 
 | |
| pat lfr	$1<=8
 | |
| with STACK
 | |
| uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
 | |
| gen 1:
 | |
|     dcx hl
 | |
|     mov d,{m}
 | |
|     dcx hl
 | |
|     mov e,{m}
 | |
|     push de
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
| 
 | |
| pat lfr ret $1==$2				leaving ret 0
 | |
| 
 | |
| pat ret $1==0
 | |
| with STACK
 | |
| uses hlreg
 | |
| gen move lb,hl
 | |
|     sphl.
 | |
|     pop lb
 | |
|     ret.
 | |
| 
 | |
| pat ret $1==2
 | |
| with dereg STACK
 | |
| uses hlreg
 | |
| gen move lb,hl
 | |
|     sphl.
 | |
|     pop lb
 | |
|     ret.
 | |
| 
 | |
| pat ret $1<=8
 | |
| with STACK
 | |
| uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
 | |
| gen 1:
 | |
|     pop de
 | |
|     mov {m},e
 | |
|     inx hl
 | |
|     mov {m},d
 | |
|     inx hl
 | |
|     dcr a
 | |
|     jnz {label,1b}
 | |
|     move lb,hl
 | |
|     sphl.
 | |
|     pop lb
 | |
|     ret.
 | |
| 
 | |
| /******************************************/
 | |
| /* Group 15: Miscellaneous		  */
 | |
| /******************************************/
 | |
| 
 | |
| pat asp $1<=0-6
 | |
| with STACK
 | |
| uses hlreg={const2,$1}
 | |
| gen dad sp
 | |
|     sphl.
 | |
| 
 | |
| pat asp $1==0-4
 | |
| with STACK
 | |
| gen dcx sp
 | |
|     dcx sp
 | |
|     dcx sp
 | |
|     dcx sp
 | |
| 
 | |
| pat asp $1==0-2
 | |
| with STACK
 | |
| gen dcx sp
 | |
|     dcx sp
 | |
| 
 | |
| pat asp $1==0			/* do nothing */
 | |
| 
 | |
| pat asp $1==2
 | |
| with exact src1or2
 | |
| with STACK
 | |
|    gen inx sp
 | |
|        inx sp
 | |
| 
 | |
| pat asp $1==4
 | |
| with exact src1or2				leaving asp 2
 | |
| with STACK
 | |
|    gen inx sp
 | |
|        inx sp
 | |
|        inx sp
 | |
|        inx sp
 | |
| 
 | |
| pat asp $1>=6
 | |
| with exact src1or2				leaving asp $1-2
 | |
| with STACK
 | |
|   uses hlreg={const2,$1}
 | |
|   gen dad sp
 | |
|       sphl.
 | |
| 
 | |
| pat ass $1==2
 | |
| with hlreg STACK
 | |
| gen dad sp
 | |
|     sphl.
 | |
| 
 | |
| pat blm
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".blm"}
 | |
| 
 | |
| pat bls
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".blm"}
 | |
| 
 | |
| pat csa
 | |
| kills ALL
 | |
| gen jmp {label,".csa"}
 | |
| 
 | |
| pat csb
 | |
| kills ALL
 | |
| gen jmp {label,".csb"}
 | |
| 
 | |
| pat dch						leaving loi 2
 | |
| 
 | |
| pat dup $1==2
 | |
| with src1or2				yields %1 %1
 | |
| 
 | |
| pat dup $1==4
 | |
| with src1or2 src1or2			yields %2 %1 %2 %1
 | |
| 
 | |
| pat dup
 | |
| kills ALL
 | |
| uses dereg={const2,$1}
 | |
| gen Call {label,".dup"}
 | |
| 
 | |
| pat dus $1==2
 | |
| with dereg
 | |
| kills ALL
 | |
| gen Call {label,".dup"}
 | |
| 
 | |
| pat exg $1==2
 | |
| with src1or2 src1or2			yields %1 %2
 | |
| 
 | |
| pat exg defined($1)
 | |
| kills ALL
 | |
| uses dereg={const2,1}
 | |
| gen Call {label,".exg"}
 | |
| 
 | |
| pat fil
 | |
| uses hlreg={label,$1}
 | |
| gen shld {label,"hol0"+4}
 | |
| 
 | |
| pat gto
 | |
| with STACK
 | |
| gen lhld {label,$1+2}
 | |
|     sphl.
 | |
|     lhld {label,$1+4}
 | |
|     move hl,lb
 | |
|     lhld {label,$1}
 | |
|     pchl.
 | |
| 
 | |
| pat lim
 | |
| uses hlreg
 | |
| gen lhld {label,".ignmask"}		yields hl
 | |
| 
 | |
| pat lin
 | |
| uses hlreg={const2,$1}
 | |
| gen shld {label,"hol0"}
 | |
| 
 | |
| pat lni
 | |
| uses hlreg
 | |
| gen lhld {label,"hol0"}
 | |
|     inx hl
 | |
|     shld {label,"hol0"}
 | |
| 
 | |
| pat lor $1==0				yields lb
 | |
| 
 | |
| pat lor $1==1
 | |
| with STACK
 | |
| uses hlreg={const2,0}
 | |
| gen dad sp				yields hl
 | |
| 
 | |
| pat lor $1==2
 | |
| uses hlreg
 | |
| gen lhld {label,".reghp"}		yields hl
 | |
| 
 | |
| pat lpb						leaving adp SL
 | |
| 
 | |
| pat mon
 | |
| kills ALL
 | |
| gen Call {label,".mon"}
 | |
| 
 | |
| pat nop
 | |
| kills ALL
 | |
| #ifdef DEBUG
 | |
| gen Call {label,".nop"}
 | |
| #endif
 | |
| 
 | |
| pat rck
 | |
| with hl_or_de STACK
 | |
| 
 | |
| pat rtt						leaving ret 0
 | |
| 
 | |
| pat sig
 | |
| with dereg
 | |
| uses hlreg
 | |
|    gen lhld {label,".trapproc"}
 | |
|        xchg.
 | |
|        shld {label,".trapproc"}		yields de
 | |
| with STACK
 | |
| uses hlreg
 | |
|    gen lhld {label,".trapproc"}
 | |
|        xthl.
 | |
|        shld {label,".trapproc"}
 | |
| 
 | |
| pat sim
 | |
| with hlreg
 | |
| gen shld {label,".ignmask"}
 | |
| 
 | |
| pat str $1==0
 | |
| with localbase
 | |
| 
 | |
| pat str $1==1
 | |
| with hlreg
 | |
| gen sphl.
 | |
| 
 | |
| pat str $1==2
 | |
| with hlreg
 | |
| gen shld {label,".reghp"}
 | |
| 
 | |
| pat trp
 | |
| kills ALL
 | |
| gen Call {label,".trp"}
 |