1 /************************************************************/
2 /************************************************************/
4 /******* 8 0 8 0 B A C K E N D T A B L E ******/
6 /************************************************************/
7 /************************************************************/
10 rcsid = "$Id: table,v 1.12 1994/06/24 12:58:11 ceriel Exp $"
20 areg /* the a-register */
21 lbreg /* the registers used as localbase */
22 reg /* the free registers */
23 regpair /* register pairs bc, de and hl */
24 regind /* register indirect */
25 dereg /* de-register-pair */
26 hlreg /* hl-register-pair */
27 hl_or_de /* de- or hl-register-pair */
38 lb("b")=b+c :regpair, localbase, regind.
39 de("d")=d+e :regpair, regind, dereg, hl_or_de.
40 hl("h")=h+l :regpair, hlreg, hl_or_de.
42 psw=a :psword. /* in fact psw also includes
47 const1 = { INT num; } 1 num.
48 const2 = { INT num; } 2 num.
49 label = { ADDR off; } 2 off.
50 m = { } 2 cost(0,3) "m".
54 reg1 = reg + lbreg + m.
55 b_d_h_sp = regpair + stackpointer.
56 b_d_h_psw = regpair + psword.
57 immediate = const2 + label.
59 src2 = hl_or_de + const2 + label.
60 src1or2 = src1 + src2.
64 /* aci const1:ro kills a:cc cost(2, 7). */
65 adc reg1:ro kills a:cc cost(1, 4).
66 add reg1:ro kills a:cc cost(1, 4).
67 /* adi const1:ro kills a:cc cost(2, 7). */
68 ana reg1:ro kills a:cc cost(1, 4).
69 ani const1:ro kills a:cc cost(2, 7).
70 Call "call" label:ro cost(3,17).
71 /* 'call' is a reserved word */
72 /* cc label:ro cost(3,14). */
73 /* cm label:ro cost(3,14). */
74 cma kills a cost(3,14).
75 cmc kills:cc cost(1, 4).
76 cmp reg1:ro kills:cc cost(1, 4).
77 /* cnc label:ro cost(3,14). */
78 cnz label:ro cost(3,14).
79 /* cp label:ro cost(3,14). */
80 /* cpe label:ro cost(3,14). */
81 cpi const1:ro kills:cc cost(2, 7).
82 /* cpo label:ro cost(3,14). */
83 /* cz label:ro cost(3,14). */
84 /* daa kills a:cc cost(1, 4). */
85 dad b_d_h_sp:ro kills hl:cc cost(1,10).
86 dcr reg+lbreg:rw:cc cost(1, 5).
87 dcr m:rw:cc cost(1, 7).
88 dcx b_d_h_sp:rw cost(1, 5).
92 /* in const1:ro cost(2,10). */
93 inr reg+lbreg:rw:cc cost(1, 5).
94 inr m:rw:cc cost(1, 7).
95 inx b_d_h_sp:rw cost(1, 5).
96 jc label:ro cost(3,10).
97 jm label:ro cost(3,10).
98 jmp label:ro cost(3,10).
99 jnc label:ro cost(3,10).
100 jnz label:ro cost(3,10).
101 jp label:ro cost(3,10).
102 /* jpe label:ro cost(3,10). */
103 /* jpo label:ro cost(3,10). */
104 jz label:ro cost(3,10).
105 lda label:ro kills a cost(3,13).
106 ldax regind:ro kills a cost(1, 7).
107 lhld label:ro kills hl cost(3,16).
108 lxi b_d_h_sp:wo,immediate:ro cost(3,10).
109 mov reg+lbreg:wo,reg+lbreg:ro cost(1, 5).
110 mov m:wo,reg1:ro cost(1, 4).
111 mov reg1:wo,m:ro cost(1, 4).
112 mvi reg1:wo,const1:ro cost(2, 7).
113 /* nop cost(1, 3). */
114 ora reg1:ro kills a:cc cost(1, 4).
115 /* ori const1:ro kills a:cc cost(2, 7). */
116 /* out const1:ro cost(2,10). */
118 pop b_d_h_psw:wo cost(1,10).
119 push b_d_h_psw:ro cost(1,10).
120 ral kills a:cc cost(1, 4).
121 rar kills a:cc cost(1, 4).
124 rlc kills a:cc cost(1, 4).
126 /* rnc cost(1, 8). */
127 /* rnz cost(1, 8). */
129 /* rpe cost(1, 8). */
130 /* rpo cost(1, 8). */
131 rrc kills a:cc cost(1, 4).
132 /* rst const1:ro cost(1,11). */
134 sbb reg1:ro kills a:cc cost(1, 4).
135 /* sbi const1:ro kills a:cc cost(2, 7). */
136 shld label:ro cost(3,16).
138 sta label:ro cost(3,13).
139 stax regind:ro cost(1, 7).
140 /* stc kills:cc cost(1, 4). */
141 sub reg1:ro kills a:cc cost(1, 4).
142 sui const1:ro kills a:cc cost(2, 7).
143 xchg kills de hl cost(1, 4).
144 xra reg1:ro kills a:cc cost(1, 4).
145 /* xri const1:ro kills a:cc cost(2, 7). */
146 xthl kills hl cost(1,18).
154 from const1 %num==0 to areg
160 from immediate to b_d_h_sp
167 from regpair to regpair
173 to test areg /* dummy test, never used */
178 from regpair to STACK
181 from immediate + reg to STACK
186 from immediate + reg to STACK
199 gen pop %a yields %a.2
209 gen move %1,%a yields %a
217 gen move %1,%a yields %a
220 uses reusing %1, hl_or_de
222 move {const1,0},%a.1 yields %a
224 from hl_or_de yields %1.2
228 gen move %1,%a yields %a.2
232 gen move %1.2,a yields a
236 /*********************************************/
237 /* Group 1: Load instructions */
238 /*********************************************/
240 pat loc yields {const2,$1}
241 pat ldc yields {const2,highw($1)}
245 uses hlreg={const2,$1}, dereg
253 gen lhld {label,$1} yields hl
256 uses hlreg={const2,$1}, dereg
269 uses hl_or_de={const2,$1}
276 uses hlreg={const2,$1}
279 pat lae yields {label,$1}
281 pat lxl $1==0 yields lb
285 gen move {const2,SL},hl
291 pat lxl $1>1 && $1<256
292 uses dereg, areg={const1,$1}, hlreg
301 jnz {label,1b} yields de
305 gen move {const2,SL},hl
310 gen move {const2,SL},hl
318 pat lxa $1>1 && $1<256
319 uses dereg, hlreg, areg={const1,$1}
341 gen mov %a,{m} yields %a
345 gen lhld %1 yields hl
356 lhld {label,%1.off+2} yields hl de
358 gen lhld {label,%1.off+2}
374 uses hl_or_de={const2,$1-1}, areg
388 uses dereg={const2,$1}
389 gen Call {label,".loi"}
394 gen Call {label,".loi"}
398 uses dereg, hlreg={const2,$1+3}
411 gen lhld {label,$1+2}
413 lhld {label,$1} yields hl
418 lhld {label,$1+2} yields hl de
421 gen lhld {label,$1+2}
423 lhld {label,$1} yields de hl
427 uses hl_or_de={const2,$1+3}
439 uses hl_or_de={label,$1} yields %a
441 /******************************************/
442 /* Group 2: Store instructions */
443 /******************************************/
446 with dereg yields de de leaving stl $1
450 uses hlreg={const2,$1}
457 with hlreg yields hl hl leaving ste $1
465 uses hlreg={const2,$1}, areg
477 uses hlreg={const2,$1}, areg
487 pat lil loc adi sil $1==$4 && $3==2
488 uses hlreg={const2,$1}, dereg, areg
506 pat lil inc sil $1==$3
507 uses hlreg={const2,$1}, areg
519 pat lil dec sil $1==$3
520 uses hlreg={const2,$1}, dereg
536 uses hl_or_de={const2,$1}
566 with label hlreg dereg
569 shld {label,%1.off+2}
570 with label dereg hlreg
571 gen shld {label,%1.off+2}
588 uses areg={const1,$1/2}, dereg
600 uses dereg={const2,$1}
601 gen Call {label,".sti"}
606 gen Call {label,".sti"}
611 uses hlreg={const2,$1}
635 gen shld {label,$1+2}
642 uses hl_or_de={const2,$1}
654 /****************************************/
655 /* Group 3: Integer arithmetic */
656 /****************************************/
671 gen Call {label,".adi4"}
674 with hl_or_de hl_or_de
682 with hl_or_de hl_or_de
693 gen Call {label,".sbi4"}
697 gen Call {label,".mli2"} yields de
701 gen Call {label,".mli4"}
705 uses areg={const1,129}
706 gen Call {label,".dvi2"} yields de
710 uses areg={const1,129}
711 gen Call {label,".dvi4"}
715 uses areg={const1,128}
716 gen Call {label,".dvi2"} yields de
720 uses areg={const1,128}
721 gen Call {label,".dvi4"}
735 gen Call {label,".ngi4"}
739 gen Call {label,".sli2"} yields de
743 gen Call {label,".sli4"}
748 gen Call {label,".sri2"} yields de
753 gen Call {label,".sri4"}
755 /********************************************/
756 /* Group 4: Unsigned arithmetic */
757 /********************************************/
759 pat adu leaving adi $1
761 pat sbu leaving sbi $1
765 gen Call {label,".mlu2"} yields de
769 gen Call {label,".mli4"}
774 gen Call {label,".dvi2"} yields de
779 gen Call {label,".dvi4"}
784 gen Call {label,".dvi2"} yields de
789 gen Call {label,".dvi4"}
791 pat slu leaving sli $1
796 gen Call {label,".sri2"} yields de
801 gen Call {label,".sri4"}
804 /********************************************/
805 /* Group 5: Floating point arithmetic */
806 /********************************************/
810 gen Call {label,".adf4"}
814 gen Call {label,".adf8"}
818 gen Call {label,".sbf4"}
822 gen Call {label,".sbf8"}
826 gen Call {label,".mlf4"}
830 gen Call {label,".mlf8"}
834 gen Call {label,".dvf4"}
838 gen Call {label,".dvf8"}
842 gen Call {label,".ngf4"}
846 gen Call {label,".ngf8"}
850 gen Call {label,".fif4"}
854 gen Call {label,".fif8"}
858 gen Call {label,".fef4"}
862 gen Call {label,".fef8"}
864 /********************************************/
865 /* Group 6: Pointer arithmetic */
866 /********************************************/
868 pat adp $1==0 /* do nothing */
890 uses hl_or_de={const2,$1}
893 pat ads $1==2 leaving adi 2
895 pat sbs $1==2 leaving sbi 2
897 /********************************************/
898 /* Group 7: Increment/ decrement/ zero */
899 /********************************************/
906 uses hlreg={const2,$1}
915 uses hlreg={label,$1}
927 uses hlreg={const2,$1}, dereg
944 uses hlreg={const2,$1}, areg
952 uses hlreg={const2,0}
957 gen Call {label,".zrf4"}
961 gen Call {label,".zrf8"}
963 pat zer $1==2 yields {const2,0}
965 pat zer $1==4 yields {const2,0} {const2,0}
969 uses reg={const1,$1/2}, hl_or_de={const2,0}
977 uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
987 /*****************************************/
988 /* Group 8: Convert instructions */
989 /*****************************************/
991 pat loc loc cii $1==$2
993 pat loc loc cii $1==2 && $2==4
995 uses hl_or_de={const2,0}, areg
1002 pat loc loc cii $1==4 && $2==2
1003 with hl_or_de hl_or_de yields %1
1005 pat loc loc cii $1==1 && $2==2
1007 uses reusing %1, areg=%1, hl_or_de
1008 gen move {const1,0},%b.1
1012 mvi %b.1,{const1,255}
1016 gen move {const1,0},%1.1
1019 mvi %1.1,{const1,255}
1022 pat loc loc cii $1==1 && $2==4
1025 gen move %1,l yields hl
1026 leaving loc $1 loc $2 cii
1029 gen move {const1,0},%1.1
1036 mov d,h yields de hl
1040 uses areg={const1,1}
1041 gen Call {label,".cii"}
1043 pat loc loc ciu leaving loc $1 loc $2 cuu
1044 pat loc loc cui leaving loc $1 loc $2 cuu
1046 pat cui leaving cuu $1
1048 pat ciu leaving cuu $1
1050 pat loc loc cuu $1==$2
1052 pat loc loc cuu $1==2 && $2==4
1053 with src1or2 yields {const2,0} %1
1055 pat loc loc cuu $1==4 && $1==2
1056 with src1or2 src1or2 yields %1
1058 pat loc loc cuu $1==1 && $2==2
1060 uses reusing %1, hl_or_de
1061 gen move %1,%a yields %a
1063 gen move {const1,0},%1.1 yields %1
1065 pat loc loc cuu $1==1 && $2==4
1067 uses reusing %1, hl_or_de
1068 gen move %1,%a yields {const2,0} %a
1070 gen move {const1,0},%1.1 yields {const2,0} %1
1074 uses areg={const1,0}
1075 gen Call {label,".cii"}
1079 gen Call {label,".cfi"}
1083 gen Call {label,".cif"}
1087 gen Call {label,".cuf"}
1091 gen Call {label,".cff"}
1095 gen Call {label,".cfu"}
1097 /*****************************************/
1098 /* Group 9: Logical instructions */
1099 /*****************************************/
1102 with hl_or_de hl_or_de
1109 mov %2.1,a yields %2
1110 with hl_or_de hl_or_de
1117 mov %1.1,a yields %1
1121 uses dereg={const2,$1}
1122 gen Call {label,".and"}
1124 pat and !defined($1)
1127 gen Call {label,".and"}
1130 with hl_or_de hl_or_de
1137 mov %2.1,a yields %2
1138 with hl_or_de hl_or_de
1145 mov %1.1,a yields %1
1149 uses dereg={const2,$1}
1150 gen Call {label,".ior"}
1152 pat ior !defined($1)
1155 gen Call {label,".ior"}
1158 with hl_or_de hl_or_de
1165 mov %2.1,a yields %2
1166 with hl_or_de hl_or_de
1173 mov %1.1,a yields %1
1177 uses dereg={const2,$1}
1178 gen Call {label,".xor"}
1180 pat xor !defined($1)
1183 gen Call {label,".xor"}
1193 mov %1.1,a yields %1
1197 uses dereg={const2,$1}
1198 gen Call {label,".com"}
1200 pat com !defined($1)
1203 gen Call {label,".com"}
1224 gen Call {label,".rol4"}
1250 gen Call {label,".ror4"}
1252 /***********************************************/
1253 /* Group 10: Set instructions */
1254 /***********************************************/
1258 gen Call {label,".inn2"} yields de
1262 uses dereg={const2,$1}
1263 gen Call {label,".inn"} yields de
1265 pat inn !defined($1)
1268 gen Call {label,".inn"} yields de
1273 gen Call {label,".set2"} yields de
1277 uses dereg={const2,$1}
1278 gen Call {label,".set"}
1280 pat set !defined($1)
1283 gen Call {label,".set"}
1285 /***********************************************/
1286 /* Group 11: Array instructions */
1287 /***********************************************/
1289 pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
1290 pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
1292 pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
1294 gen dad hl yields hl leaving adi 2
1296 pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
1298 uses dereg={const2,0-rom($1,1)}
1300 dad hl yields hl leaving adi 2
1302 pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
1305 dad hl yields hl leaving adi 2
1307 pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
1309 uses dereg={const2,0-rom($1,1)}
1312 dad hl yields hl leaving adi 2
1314 pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
1318 dad hl yields hl leaving adi 2
1320 pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
1322 uses dereg={const2,0-rom($1,1)}
1326 dad hl yields hl leaving adi 2
1330 gen Call {label,".lar2"}
1333 gen Call {label,"eunimpl"}
1335 pat lar !defined($1)
1341 cnz {label,"eunimpl"}
1344 cnz {label,"eunimpl"}
1345 Call {label,".lar2"}
1349 gen Call {label,".sar2"}
1353 gen Call {label,"eunimpl"}
1355 pat sar !defined($1)
1361 cnz {label,"eunimpl"}
1364 cnz {label,"eunimpl"}
1365 Call {label,".sar2"}
1369 gen Call {label,".aar2"}
1373 gen Call {label,"eunimpl"}
1375 pat aar !defined($1)
1381 cnz {label,"eunimpl"}
1384 cnz {label,"eunimpl"}
1385 Call {label,".aar2"}
1387 /***********************************************/
1388 /* Group 12: Compare instructions */
1389 /***********************************************/
1391 pat cmi $1==2 leaving sbi 2
1395 uses areg={const1,1}
1396 gen Call {label,".cmi4"} yields de
1400 gen Call {label,".cmf4"}
1404 gen Call {label,".cmf8"}
1407 with hl_or_de hl_or_de
1429 uses areg={const1,0}
1430 gen Call {label,".cmi4"} yields de
1432 pat cms $1==2 leaving cmi 2
1436 uses dereg={const2,$1}
1437 gen Call {label,".cms"} yields de
1439 pat cms !defined($1)
1442 gen Call {label,".cms"} yields de
1444 pat cmp leaving cmu 2
1454 mov %1.2,a yields %1
1458 uses hl_or_de={const2,1}, areg
1499 mov %1.2,a yields %1
1503 uses hl_or_de={const2,0}, areg
1515 pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
1516 with exact areg hl_or_de
1521 with hl_or_de hl_or_de
1533 pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
1534 with exact areg hl_or_de
1539 with hl_or_de hl_or_de
1550 pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
1551 with exact areg hl_or_de
1556 with hl_or_de hl_or_de
1567 pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
1568 with exact areg hl_or_de
1573 with hl_or_de hl_or_de
1585 pat loc cmi teq $1>=0 && $1<=255 && $2==2
1587 uses hl_or_de={const2,0}
1593 uses hl_or_de={const2,0}, areg
1604 pat loc cmi tne $1>=0 && $1<=255 && $2==2
1606 uses hl_or_de={const2,0}
1612 uses hl_or_de={const2,1}, areg
1622 pat loc cmi $1>=0 && $1<=255 && $2==2
1628 mov %a.1,a yields %a
1629 with yields {const2,$1}
1632 pat loc cmi $1<0 && $2==2
1633 with exact areg yields {const2,0-1}
1634 with yields {const2,$1}
1637 /*******************************************/
1638 /* Group 13: Branch instructions */
1639 /*******************************************/
1641 pat loc beq $1>=0 && $1<=255
1643 uses reusing %1, areg=%1
1646 with yields {const2,$1}
1649 pat loc bne $1>=0 && $1<=255
1651 uses reusing %1, areg=%1
1654 with yields {const2,$1}
1662 with hl_or_de hl_or_de STACK
1671 with hl_or_de hl_or_de STACK
1680 with hl_or_de hl_or_de STACK
1691 with hl_or_de hl_or_de STACK
1701 with hl_or_de hl_or_de STACK
1710 with hl_or_de hl_or_de STACK
1778 uses hlreg={const2,$1}, areg
1787 uses hlreg={const2,$1}, areg
1795 with hl_or_de hl_or_de STACK
1804 with hl_or_de hl_or_de STACK
1812 /*********************************************/
1813 /* Group 14: Procedure call instructions */
1814 /*********************************************/
1824 gen lxi de,{label,1f}
1829 pat lfr $1==2 yields de
1833 uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
1843 pat lfr ret $1==$2 leaving ret 0
1863 uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
1877 /******************************************/
1878 /* Group 15: Miscellaneous */
1879 /******************************************/
1883 uses hlreg={const2,$1}
1899 pat asp $1==0 /* do nothing */
1908 with exact src1or2 leaving asp 2
1916 with exact src1or2 leaving asp $1-2
1918 uses hlreg={const2,$1}
1929 uses dereg={const2,$1}
1930 gen Call {label,".blm"}
1935 gen Call {label,".blm"}
1939 gen jmp {label,".csa"}
1943 gen jmp {label,".csb"}
1945 pat dch leaving loi 2
1948 with src1or2 yields %1 %1
1951 with src1or2 src1or2 yields %2 %1 %2 %1
1955 uses dereg={const2,$1}
1956 gen Call {label,".dup"}
1961 gen Call {label,".dup"}
1964 with src1or2 src1or2 yields %1 %2
1968 uses dereg={const2,1}
1969 gen Call {label,".exg"}
1972 uses hlreg={label,$1}
1973 gen shld {label,"hol0"+4}
1977 gen lhld {label,$1+2}
1986 gen lhld {label,".ignmask"} yields hl
1989 uses hlreg={const2,$1}
1990 gen shld {label,"hol0"}
1994 gen lhld {label,"hol0"}
1998 pat lor $1==0 yields lb
2002 uses hlreg={const2,0}
2003 gen dad sp yields hl
2007 gen lhld {label,".reghp"} yields hl
2009 pat lpb leaving adp SL
2013 gen Call {label,".mon"}
2018 gen Call {label,".nop"}
2024 pat rtt leaving ret 0
2029 gen lhld {label,".trapproc"}
2031 shld {label,".trapproc"} yields de
2034 gen lhld {label,".trapproc"}
2036 shld {label,".trapproc"}
2040 gen shld {label,".ignmask"}
2051 gen shld {label,".reghp"}
2055 gen Call {label,".trp"}