table 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055
  1. /************************************************************/
  2. /************************************************************/
  3. /******* ******/
  4. /******* 8 0 8 0 B A C K E N D T A B L E ******/
  5. /******* ******/
  6. /************************************************************/
  7. /************************************************************/
  8. rcsid = "$Header$"
  9. EM_WSIZE = 2
  10. EM_PSIZE = 2
  11. EM_BSIZE = 4
  12. SL=4
  13. PROPERTIES
  14. areg /* the a-register */
  15. lbreg /* the registers used as localbase */
  16. reg /* the free registers */
  17. regpair /* register pairs bc, de and hl */
  18. regind /* register indirect */
  19. dereg /* de-register-pair */
  20. hlreg /* hl-register-pair */
  21. hl_or_de /* de- or hl-register-pair */
  22. localbase
  23. stackpointer
  24. psword
  25. REGISTERS
  26. a :areg,reg.
  27. b,c :lbreg.
  28. d,e,h,l :reg.
  29. lb("b")=b+c :regpair, localbase, regind.
  30. de("d")=d+e :regpair, regind, dereg, hl_or_de.
  31. hl("h")=h+l :regpair, hlreg, hl_or_de.
  32. sp :stackpointer.
  33. psw=a :psword. /* in fact psw also includes
  34. condition codes */
  35. TOKENS
  36. const1 = { INT num; } 1 num.
  37. const2 = { INT num; } 2 num.
  38. label = { ADDR off; } 2 off.
  39. m = { } 2 cost(0,3) "m".
  40. SETS
  41. reg1 = reg + lbreg + m.
  42. b_d_h_sp = regpair + stackpointer.
  43. b_d_h_psw = regpair + psword.
  44. immediate = const2 + label.
  45. src1 = reg.
  46. src2 = hl_or_de + const2 + label.
  47. src1or2 = src1 + src2.
  48. INSTRUCTIONS
  49. /* aci const1:ro kills a:cc cost(2, 7). */
  50. adc reg1:ro kills a:cc cost(1, 4).
  51. add reg1:ro kills a:cc cost(1, 4).
  52. /* adi const1:ro kills a:cc cost(2, 7). */
  53. ana reg1:ro kills a:cc cost(1, 4).
  54. ani const1:ro kills a:cc cost(2, 7).
  55. Call "call" label:ro cost(3,17).
  56. /* 'call' is a reserved word */
  57. /* cc label:ro cost(3,14). */
  58. /* cm label:ro cost(3,14). */
  59. cma kills a cost(3,14).
  60. cmc kills:cc cost(1, 4).
  61. cmp reg1:ro kills:cc cost(1, 4).
  62. /* cnc label:ro cost(3,14). */
  63. cnz label:ro cost(3,14).
  64. /* cp label:ro cost(3,14). */
  65. /* cpe label:ro cost(3,14). */
  66. cpi const1:ro kills:cc cost(2, 7).
  67. /* cpo label:ro cost(3,14). */
  68. /* cz label:ro cost(3,14). */
  69. /* daa kills a:cc cost(1, 4). */
  70. dad b_d_h_sp:ro kills hl:cc cost(1,10).
  71. dcr reg+lbreg:rw:cc cost(1, 5).
  72. dcr m:rw:cc cost(1, 7).
  73. dcx b_d_h_sp:rw cost(1, 5).
  74. /* di cost(1, 4). */
  75. /* ei cost(1, 4). */
  76. /* hlt cost(1, 4). */
  77. /* in const1:ro cost(2,10). */
  78. inr reg+lbreg:rw:cc cost(1, 5).
  79. inr m:rw:cc cost(1, 7).
  80. inx b_d_h_sp:rw cost(1, 5).
  81. jc label:ro cost(3,10).
  82. jm label:ro cost(3,10).
  83. jmp label:ro cost(3,10).
  84. jnc label:ro cost(3,10).
  85. jnz label:ro cost(3,10).
  86. jp label:ro cost(3,10).
  87. /* jpe label:ro cost(3,10). */
  88. /* jpo label:ro cost(3,10). */
  89. jz label:ro cost(3,10).
  90. lda label:ro kills a cost(3,13).
  91. ldax regind:ro kills a cost(1, 7).
  92. lhld label:ro kills hl cost(3,16).
  93. lxi b_d_h_sp:wo,immediate:ro cost(3,10).
  94. mov reg+lbreg:wo,reg+lbreg:ro cost(1, 5).
  95. mov m:wo,reg1:ro cost(1, 4).
  96. mov reg1:wo,m:ro cost(1, 4).
  97. mvi reg1:wo,const1:ro cost(2, 7).
  98. /* nop cost(1, 3). */
  99. ora reg1:ro kills a:cc cost(1, 4).
  100. /* ori const1:ro kills a:cc cost(2, 7). */
  101. /* out const1:ro cost(2,10). */
  102. pchl cost(1, 5).
  103. pop b_d_h_psw:wo cost(1,10).
  104. push b_d_h_psw:ro cost(1,10).
  105. ral kills a:cc cost(1, 4).
  106. rar kills a:cc cost(1, 4).
  107. /* rc cost(1, 8). */
  108. ret cost(1,10).
  109. rlc kills a:cc cost(1, 4).
  110. /* rm cost(1, 8). */
  111. /* rnc cost(1, 8). */
  112. /* rnz cost(1, 8). */
  113. /* rp cost(1, 8). */
  114. /* rpe cost(1, 8). */
  115. /* rpo cost(1, 8). */
  116. rrc kills a:cc cost(1, 4).
  117. /* rst const1:ro cost(1,11). */
  118. /* rz cost(1, 8). */
  119. sbb reg1:ro kills a:cc cost(1, 4).
  120. /* sbi const1:ro kills a:cc cost(2, 7). */
  121. shld label:ro cost(3,16).
  122. sphl cost(1, 5).
  123. sta label:ro cost(3,13).
  124. stax regind:ro cost(1, 7).
  125. /* stc kills:cc cost(1, 4). */
  126. sub reg1:ro kills a:cc cost(1, 4).
  127. sui const1:ro kills a:cc cost(2, 7).
  128. xchg kills de hl cost(1, 4).
  129. xra reg1:ro kills a:cc cost(1, 4).
  130. /* xri const1:ro kills a:cc cost(2, 7). */
  131. xthl kills hl cost(1,18).
  132. MOVES
  133. from reg to reg
  134. gen mov %2,%1
  135. from const1 %num==0 to areg
  136. gen xra a
  137. from const1 to reg
  138. gen mvi %2,%1
  139. from immediate to b_d_h_sp
  140. gen lxi %2,%1
  141. from reg to regpair
  142. gen mov %2.2,%1
  143. mvi %2.1,{const1,0}
  144. from regpair to regpair
  145. gen mov %2.1,%1.1
  146. mov %2.2,%1.2
  147. TESTS
  148. to test areg /* dummy test, never used */
  149. gen ora a
  150. STACKINGRULES
  151. from regpair to STACK
  152. gen push %1
  153. from immediate + reg to STACK
  154. uses hl_or_de
  155. gen move %1,%a
  156. push %a
  157. from immediate + reg to STACK
  158. gen push hl
  159. move %1,hl
  160. xthl.
  161. COERCIONS
  162. from STACK
  163. uses regpair
  164. gen pop %a yields %a
  165. from STACK
  166. uses hl_or_de
  167. gen pop %a yields %a.2
  168. from STACK
  169. uses areg
  170. gen dcx sp
  171. pop psw
  172. inx sp yields a
  173. from immediate
  174. uses regpair
  175. gen move %1,%a yields %a
  176. from hl_or_de
  177. uses hl_or_de
  178. gen xchg. yields %a
  179. from regpair
  180. uses regpair
  181. gen move %1,%a yields %a
  182. from reg
  183. uses reusing %1, hl_or_de
  184. gen move %1,%a.2
  185. move {const1,0},%a.1 yields %a
  186. from hl_or_de yields %1.2
  187. from const2
  188. uses hl_or_de
  189. gen move %1,%a yields %a.2
  190. from hl_or_de
  191. uses areg
  192. gen move %1.2,a yields a
  193. PATTERNS
  194. /*********************************************/
  195. /* Group 1: Load instructions */
  196. /*********************************************/
  197. pat loc yields {const2,$1}
  198. pat ldc yields {const2,highw($1)}
  199. {const2,loww($1)}
  200. pat lol
  201. uses hlreg={const2,$1}, dereg
  202. gen dad lb
  203. mov e,{m}
  204. inx hl
  205. mov d,{m} yields de
  206. pat loe
  207. uses hlreg
  208. gen lhld {label,$1} yields hl
  209. pat lil
  210. uses hlreg={const2,$1}, dereg
  211. gen dad lb
  212. mov e,{m}
  213. inx hl
  214. mov h,{m}
  215. mov l,e
  216. mov e,{m}
  217. inx hl
  218. mov d,{m} yields de
  219. pat lof
  220. with hl_or_de
  221. kills hl_or_de
  222. uses hl_or_de={const2,$1}
  223. gen dad de
  224. mov e,{m}
  225. inx hl
  226. mov d,{m} yields de
  227. pat lal
  228. uses hlreg={const2,$1}
  229. gen dad lb yields hl
  230. pat lae yields {label,$1}
  231. pat lxl $1==0 yields lb
  232. pat lxl $1==1
  233. uses dereg, hlreg
  234. gen move {const2,SL},hl
  235. dad lb
  236. mov e,{m}
  237. inx hl
  238. mov d,{m} yields de
  239. pat lxl $1>1 && $1<256
  240. uses dereg, areg={const1,$1}, hlreg
  241. gen move lb,de
  242. 1:
  243. lxi hl,{const2,SL}
  244. dad de
  245. mov e,{m}
  246. inx hl
  247. mov d,{m}
  248. dcr a
  249. jnz {label,1b} yields de
  250. pat lxa $1==0
  251. uses hlreg
  252. gen move {const2,SL},hl
  253. dad lb yields hl
  254. pat lxa $1==1
  255. uses dereg, hlreg
  256. gen move {const2,SL},hl
  257. dad lb
  258. mov e,{m}
  259. inx hl
  260. mov d,{m}
  261. lxi hl,{const2,SL}
  262. dad de yields hl
  263. pat lxa $1>1 && $1<256
  264. uses dereg, hlreg, areg={const1,$1}
  265. gen move lb,de
  266. 1:
  267. lxi hl,{const2,SL}
  268. dad de
  269. mov e,{m}
  270. inx hl
  271. mov d,{m}
  272. dcr a
  273. jnz {label,1b}
  274. lxi hl,{const2,SL}
  275. dad de yields hl
  276. pat loi $1==1
  277. with exact label
  278. uses areg
  279. gen lda %1 yields a
  280. with dereg
  281. uses areg
  282. gen ldax de yields a
  283. with hlreg
  284. uses reusing %1, reg
  285. gen mov %a,{m} yields %a
  286. pat loi $1==2
  287. with exact label
  288. gen lhld %1 yields hl
  289. with hlreg
  290. uses dereg
  291. gen mov e,{m}
  292. inx %1
  293. mov d,{m} yields de
  294. pat loi $1==4
  295. with exact label
  296. gen lhld %1
  297. xchg.
  298. lhld {label,%1.off+2} yields hl de
  299. with exact label
  300. gen lhld {label,%1.off+2}
  301. xchg.
  302. lhld %1 yields de hl
  303. with hlreg
  304. uses dereg, areg
  305. gen mov e,{m}
  306. inx %1
  307. mov d,{m}
  308. inx hl
  309. mov a,{m}
  310. inx hl
  311. mov h,{m}
  312. mov l,a yields hl de
  313. pat loi $1<=510
  314. with hl_or_de STACK
  315. uses hl_or_de={const2,$1-1}, areg
  316. gen dad de
  317. mvi a,{const1,$1/2}
  318. 1:
  319. mov d,{m}
  320. dcx hl
  321. mov e,{m}
  322. dcx hl
  323. push de
  324. dcr a
  325. jnz {label,1b}
  326. pat loi $1>=512
  327. kills ALL
  328. uses dereg={const2,$1}
  329. gen Call {label,".loi"}
  330. pat los $1==2
  331. with dereg
  332. kills ALL
  333. gen Call {label,".loi"}
  334. pat ldl
  335. with STACK
  336. uses dereg, hlreg={const2,$1+3}
  337. gen dad lb
  338. mov d,{m}
  339. dcx hl
  340. mov e,{m}
  341. dcx hl
  342. push de
  343. mov d,{m}
  344. dcx hl
  345. mov e,{m} yields de
  346. pat lde
  347. with STACK
  348. gen lhld {label,$1+2}
  349. push hl
  350. lhld {label,$1} yields hl
  351. with
  352. uses dereg, hlreg
  353. gen lhld {label,$1}
  354. xchg.
  355. lhld {label,$1+2} yields hl de
  356. with
  357. uses dereg, hlreg
  358. gen lhld {label,$1+2}
  359. xchg.
  360. lhld {label,$1} yields de hl
  361. pat ldf
  362. with hl_or_de STACK
  363. uses hl_or_de={const2,$1+3}
  364. gen dad de
  365. mov d,{m}
  366. dcx hl
  367. mov e,{m}
  368. dcx hl
  369. push de
  370. mov d,{m}
  371. dcx hl
  372. mov e,{m} yields de
  373. pat lpi
  374. uses hl_or_de={label,$1} yields %a
  375. /******************************************/
  376. /* Group 2: Store instructions */
  377. /******************************************/
  378. pat stl lol $1==$2
  379. with dereg yields de de leaving stl $1
  380. pat stl
  381. with dereg
  382. uses hlreg={const2,$1}
  383. gen dad lb
  384. mov {m},e
  385. inx hl
  386. mov {m},d
  387. pat ste loe $1==$2
  388. with hlreg yields hl hl leaving ste $1
  389. pat ste
  390. with hlreg
  391. gen shld {label,$1}
  392. pat sil
  393. with dereg
  394. uses hlreg={const2,$1}, areg
  395. gen dad lb
  396. mov a,{m}
  397. inx hl
  398. mov h,{m}
  399. mov l,a
  400. mov {m},e
  401. inx hl
  402. mov {m},d
  403. pat sil lil $1==$2
  404. with dereg
  405. uses hlreg={const2,$1}, areg
  406. gen dad lb
  407. mov a,{m}
  408. inx hl
  409. mov h,{m}
  410. mov l,a
  411. mov {m},e
  412. inx hl
  413. mov {m},d yields de
  414. pat lil loc adi sil $1==$4 && $3==2
  415. uses hlreg={const2,$1}, dereg, areg
  416. gen dad lb
  417. mov e,{m}
  418. inx hl
  419. mov h,{m}
  420. mov l,e
  421. mov e,{m}
  422. inx hl
  423. mov d,{m}
  424. push hl
  425. lxi hl,{const2,$2}
  426. dad de
  427. xchg.
  428. pop hl
  429. mov {m},d
  430. dcx hl
  431. mov {m},e
  432. pat lil inc sil $1==$3
  433. uses hlreg={const2,$1}, areg
  434. gen dad lb
  435. mov a,{m}
  436. inx hl
  437. mov h,{m}
  438. mov l,a
  439. inr {m}
  440. jnz {label,1f}
  441. inx hl
  442. inr {m}
  443. 1:
  444. pat lil dec sil $1==$3
  445. uses hlreg={const2,$1}, dereg
  446. gen dad lb
  447. mov e,{m}
  448. inx hl
  449. mov h,{m}
  450. mov l,e
  451. mov e,{m}
  452. inx hl
  453. mov d,{m}
  454. dcx de
  455. mov {m},d
  456. dcx hl
  457. mov {m},e
  458. pat stf
  459. with hl_or_de
  460. uses hl_or_de={const2,$1}
  461. gen dad de
  462. pop de
  463. mov {m},e
  464. inx hl
  465. mov {m},d
  466. pat sti $1==1
  467. with label areg
  468. gen sta %1
  469. with dereg areg
  470. gen stax de
  471. with hlreg reg
  472. gen mov {m},%2
  473. pat sti $1==2
  474. with label hlreg
  475. gen shld %1
  476. with hlreg dereg
  477. gen mov {m},e
  478. inx %1
  479. mov {m},d
  480. with dereg hlreg
  481. gen xchg.
  482. mov {m},e
  483. inx %2
  484. mov {m},d
  485. pat sti $1==4
  486. with label hlreg dereg
  487. gen shld %1
  488. xchg.
  489. shld {label,%1.off+2}
  490. with label dereg hlreg
  491. gen shld {label,%1.off+2}
  492. xchg.
  493. shld %1
  494. with hlreg dereg
  495. kills ALL
  496. gen mov {m},e
  497. inx hl
  498. mov {m},d
  499. inx hl
  500. pop de
  501. mov {m},e
  502. inx hl
  503. mov {m},d
  504. pat sti $1<512
  505. with hlreg
  506. kills ALL
  507. uses areg={const1,$1/2}, dereg
  508. gen 1:
  509. pop de
  510. mov {m},e
  511. inx hl
  512. mov {m},d
  513. inx hl
  514. dcr a
  515. jnz {label,1b}
  516. pat sti
  517. kills ALL
  518. uses dereg={const2,$1}
  519. gen Call {label,".sti"}
  520. pat sts $1==2
  521. with dereg
  522. kills ALL
  523. gen Call {label,".sti"}
  524. pat sdl
  525. with dereg
  526. kills ALL
  527. uses hlreg={const2,$1}
  528. gen dad lb
  529. mov {m},e
  530. inx hl
  531. mov {m},d
  532. inx hl
  533. pop de
  534. mov {m},e
  535. inx hl
  536. mov {m},d
  537. pat sde
  538. with hlreg
  539. kills ALL
  540. gen shld {label,$1}
  541. pop hl
  542. shld {label,$1+2}
  543. with hlreg dereg
  544. kills ALL
  545. gen shld {label,$1}
  546. xchg.
  547. shld {label,$1+2}
  548. with dereg hlreg
  549. kills ALL
  550. gen shld {label,$1+2}
  551. xchg.
  552. shld {label,$1}
  553. pat sdf
  554. with hl_or_de
  555. kills ALL
  556. uses hl_or_de={const2,$1}
  557. gen dad de
  558. pop de
  559. mov {m},e
  560. inx hl
  561. mov {m},d
  562. inx hl
  563. pop de
  564. mov {m},e
  565. inx hl
  566. mov {m},d
  567. /****************************************/
  568. /* Group 3: Integer arithmetic */
  569. /****************************************/
  570. pat adi $1==2
  571. with hlreg dereg
  572. gen dad de yields hl
  573. with dereg hlreg
  574. gen dad de yields hl
  575. with hlreg hlreg
  576. gen dad hl yields hl
  577. with dereg dereg
  578. gen xchg.
  579. dad hl yields hl
  580. pat adi $1==4
  581. kills ALL
  582. gen Call {label,".adi4"}
  583. pat sbi $1==2
  584. with hl_or_de hl_or_de
  585. uses areg
  586. gen mov a,%2.2
  587. sub %1.2
  588. mov %1.2,a
  589. mov a,%2.1
  590. sbb %1.1
  591. mov %1.1,a yields %1
  592. with hl_or_de hl_or_de
  593. uses areg
  594. gen mov a,%2.2
  595. sub %1.2
  596. mov %2.2,a
  597. mov a,%2.1
  598. sbb %1.1
  599. mov %2.1,a yields %2
  600. pat sbi $1==4
  601. kills ALL
  602. gen Call {label,".sbi4"}
  603. pat mli $1==2
  604. kills ALL
  605. gen Call {label,".mli2"} yields de
  606. pat mli $1==4
  607. kills ALL
  608. gen Call {label,".mli4"}
  609. pat dvi $1==2
  610. kills ALL
  611. uses areg={const1,129}
  612. gen Call {label,".dvi2"} yields de
  613. pat dvi $1==4
  614. kills ALL
  615. uses areg={const1,129}
  616. gen Call {label,".dvi4"}
  617. pat rmi $1==2
  618. kills ALL
  619. uses areg={const1,128}
  620. gen Call {label,".dvi2"} yields de
  621. pat rmi $1==4
  622. kills ALL
  623. uses areg={const1,128}
  624. gen Call {label,".dvi4"}
  625. pat ngi $1==2
  626. with hl_or_de
  627. uses areg
  628. gen xra a
  629. sub %1.2
  630. mov %1.2,a
  631. mvi a,{const1,0}
  632. sbb %1.1
  633. mov %1.1,a yields %1
  634. pat ngi $1==4
  635. kills ALL
  636. gen Call {label,".ngi4"}
  637. pat sli $1==2
  638. kills ALL
  639. gen Call {label,".sli2"} yields de
  640. pat sli $1==4
  641. kills ALL
  642. gen Call {label,".sli4"}
  643. pat sri $1==2
  644. kills ALL
  645. uses areg={const1,1}
  646. gen Call {label,".sri2"} yields de
  647. pat sri $1==4
  648. kills ALL
  649. uses areg={const1,1}
  650. gen Call {label,".sri4"}
  651. /********************************************/
  652. /* Group 4: Unsigned arithmetic */
  653. /********************************************/
  654. pat adu leaving adi $1
  655. pat sbu leaving sbi $1
  656. pat mlu $1==2
  657. kills ALL
  658. gen Call {label,".mlu2"} yields de
  659. pat mlu $1==4
  660. kills ALL
  661. gen Call {label,".mli4"}
  662. pat dvu $1==2
  663. kills ALL
  664. uses areg={const1,1}
  665. gen Call {label,".dvi2"} yields de
  666. pat dvu $1==4
  667. kills ALL
  668. uses areg={const1,1}
  669. gen Call {label,".dvi4"}
  670. pat rmu $1==2
  671. kills ALL
  672. uses areg={const1,0}
  673. gen Call {label,".dvi2"} yields de
  674. pat rmu $1==4
  675. kills ALL
  676. uses areg={const1,0}
  677. gen Call {label,".dvi4"}
  678. pat slu leaving sli $1
  679. pat sru $1==2
  680. kills ALL
  681. uses areg={const1,0}
  682. gen Call {label,".sri2"} yields de
  683. pat sru $1==4
  684. kills ALL
  685. uses areg={const1,0}
  686. gen Call {label,".sri4"}
  687. /********************************************/
  688. /* Group 5: Floating point arithmetic */
  689. /********************************************/
  690. pat adf $1==4
  691. kills ALL
  692. gen Call {label,".adf4"}
  693. pat adf $1==8
  694. kills ALL
  695. gen Call {label,".adf8"}
  696. pat sbf $1==4
  697. kills ALL
  698. gen Call {label,".sbf4"}
  699. pat sbf $1==8
  700. kills ALL
  701. gen Call {label,".sbf8"}
  702. pat mlf $1==4
  703. kills ALL
  704. gen Call {label,".mlf4"}
  705. pat mlf $1==8
  706. kills ALL
  707. gen Call {label,".mlf8"}
  708. pat dvf $1==4
  709. kills ALL
  710. gen Call {label,".dvf4"}
  711. pat dvf $1==8
  712. kills ALL
  713. gen Call {label,".dvf8"}
  714. pat ngf $1==4
  715. kills ALL
  716. gen Call {label,".ngf4"}
  717. pat ngf $1==8
  718. kills ALL
  719. gen Call {label,".ngf8"}
  720. pat fif $1==4
  721. kills ALL
  722. gen Call {label,".fif4"}
  723. pat fif $1==8
  724. kills ALL
  725. gen Call {label,".fif8"}
  726. pat fef $1==4
  727. kills ALL
  728. gen Call {label,".fef4"}
  729. pat fef $1==8
  730. kills ALL
  731. gen Call {label,".fef8"}
  732. /********************************************/
  733. /* Group 6: Pointer arithmetic */
  734. /********************************************/
  735. pat adp $1==0 /* do nothing */
  736. pat adp $1==1
  737. with hl_or_de
  738. gen inx %1 yields %1
  739. pat adp $1==2
  740. with hl_or_de
  741. gen inx %1
  742. inx %1 yields %1
  743. pat adp $1==0-1
  744. with hl_or_de
  745. gen dcx %1 yields %1
  746. pat adp $1==0-2
  747. with hl_or_de
  748. gen dcx %1
  749. dcx %1 yields %1
  750. pat adp
  751. with hl_or_de
  752. uses hl_or_de={const2,$1}
  753. gen dad de yields hl
  754. pat ads $1==2 leaving adi 2
  755. pat sbs $1==2 leaving sbi 2
  756. /********************************************/
  757. /* Group 7: Increment/ decrement/ zero */
  758. /********************************************/
  759. pat inc
  760. with hl_or_de
  761. gen inx %1 yields %1
  762. pat inl
  763. uses hlreg={const2,$1}
  764. gen dad lb
  765. inr {m}
  766. jnz {label,1f}
  767. inx hl
  768. inr {m}
  769. 1:
  770. pat ine
  771. uses hlreg={label,$1}
  772. gen inr {m}
  773. jnz {label,1f}
  774. inx hl
  775. inr {m}
  776. 1:
  777. pat dec
  778. with hl_or_de
  779. gen dcx %1 yields %1
  780. pat del
  781. uses hlreg={const2,$1}, dereg
  782. gen dad lb
  783. mov e,{m}
  784. inx hl
  785. mov d,{m}
  786. dcx de
  787. mov {m},d
  788. dcx hl
  789. mov {m},e
  790. pat dee
  791. uses hlreg
  792. gen lhld {label,$1}
  793. dcx hl
  794. shld {label,$1}
  795. pat zrl
  796. uses hlreg={const2,$1}, areg
  797. gen dad lb
  798. xra a
  799. mov {m},a
  800. inx hl
  801. mov {m},a
  802. pat zre
  803. uses hlreg={const2,0}
  804. gen shld {label,$1}
  805. pat zrf $1==4
  806. kills ALL
  807. gen Call {label,".zrf4"}
  808. pat zrf $1==8
  809. kills ALL
  810. gen Call {label,".zrf8"}
  811. pat zer $1==2 yields {const2,0}
  812. pat zer $1==4 yields {const2,0} {const2,0}
  813. pat zer $1<511
  814. kills ALL
  815. uses reg={const1,$1/2}, hl_or_de={const2,0}
  816. gen 1:
  817. push %b
  818. dcr %a
  819. jnz {label,1b}
  820. pat zer
  821. kills ALL
  822. uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
  823. gen xra a
  824. 1:
  825. push %b
  826. dcx %a
  827. cmp %a.2
  828. jnz {label,1b}
  829. cmp %a.1
  830. jnz {label,1b}
  831. /*****************************************/
  832. /* Group 8: Convert instructions */
  833. /*****************************************/
  834. pat loc loc cii $1==$2
  835. pat loc loc cii $1==2 && $2==4
  836. with hl_or_de
  837. uses hl_or_de={const2,0}, areg
  838. gen mov a,%1.1
  839. ora a
  840. jp {label,1f}
  841. lxi %a,{const2,0-1}
  842. 1: yields %a %1
  843. pat loc loc cii $1==4 && $2==2
  844. with hl_or_de hl_or_de yields %1
  845. pat loc loc cii $1==1 && $2==2
  846. with reg
  847. uses reusing %1, areg=%1, hl_or_de
  848. gen move {const1,0},%b.1
  849. move a,%b.2
  850. ora a
  851. jp {label,1f}
  852. mvi %b.1,{const1,255}
  853. 1: yields %b
  854. with hl_or_de
  855. uses areg=%1.2
  856. gen move {const1,0},%1.1
  857. ora a
  858. jp {label,1f}
  859. mvi %1.1,{const1,255}
  860. 1: yields %1
  861. pat loc loc cii $1==1 && $2==4
  862. with reg
  863. uses hlreg
  864. gen move %1,l yields hl
  865. leaving loc $1 loc $2 cii
  866. with hlreg
  867. uses dereg, areg
  868. gen move {const1,0},%1.1
  869. move l,a
  870. ora a
  871. jp {label,1f}
  872. mvi h,{const1,255}
  873. 1:
  874. mov e,h
  875. mov d,h yields de hl
  876. pat cii
  877. kills ALL
  878. uses areg={const1,1}
  879. gen Call {label,".cii"}
  880. pat loc loc ciu leaving loc $1 loc $2 cuu
  881. pat loc loc cui leaving loc $1 loc $2 cuu
  882. pat cui leaving cuu $1
  883. pat ciu leaving cuu $1
  884. pat loc loc cuu $1==$2
  885. pat loc loc cuu $1==2 && $2==4
  886. with src1or2 yields {const2,0} %1
  887. pat loc loc cuu $1==4 && $1==2
  888. with src1or2 src1or2 yields %1
  889. pat loc loc cuu $1==1 && $2==2
  890. with reg
  891. uses reusing %1, hl_or_de
  892. gen move %1,%a yields %a
  893. with hl_or_de
  894. gen move {const1,0},%1.1 yields %1
  895. pat loc loc cuu $1==1 && $2==4
  896. with reg
  897. uses reusing %1, hl_or_de
  898. gen move %1,%a yields {const2,0} %a
  899. with hl_or_de
  900. gen move {const1,0},%1.1 yields {const2,0} %1
  901. pat cuu
  902. kills ALL
  903. uses areg={const1,0}
  904. gen Call {label,".cii"}
  905. pat cfi
  906. kills ALL
  907. gen Call {label,".cfi"}
  908. pat cif
  909. kills ALL
  910. gen Call {label,".cif"}
  911. pat cuf
  912. kills ALL
  913. gen Call {label,".cuf"}
  914. pat cff
  915. kills ALL
  916. gen Call {label,".cff"}
  917. pat cfu
  918. kills ALL
  919. gen Call {label,".cfu"}
  920. /*****************************************/
  921. /* Group 9: Logical instructions */
  922. /*****************************************/
  923. pat and $1==2
  924. with hl_or_de hl_or_de
  925. uses areg
  926. gen mov a,%1.2
  927. ana %2.2
  928. mov %2.2,a
  929. mov a,%1.1
  930. ana %2.1
  931. mov %2.1,a yields %2
  932. with hl_or_de hl_or_de
  933. uses areg
  934. gen mov a,%1.2
  935. ana %2.2
  936. mov %1.2,a
  937. mov a,%1.1
  938. ana %2.1
  939. mov %1.1,a yields %1
  940. pat and defined($1)
  941. kills ALL
  942. uses dereg={const2,$1}
  943. gen Call {label,".and"}
  944. pat and !defined($1)
  945. with dereg
  946. kills ALL
  947. gen Call {label,".and"}
  948. pat ior $1==2
  949. with hl_or_de hl_or_de
  950. uses areg
  951. gen mov a,%1.2
  952. ora %2.2
  953. mov %2.2,a
  954. mov a,%1.1
  955. ora %2.1
  956. mov %2.1,a yields %2
  957. with hl_or_de hl_or_de
  958. uses areg
  959. gen mov a,%1.2
  960. ora %2.2
  961. mov %1.2,a
  962. mov a,%1.1
  963. ora %2.1
  964. mov %1.1,a yields %1
  965. pat ior defined($1)
  966. kills ALL
  967. uses dereg={const2,$1}
  968. gen Call {label,".ior"}
  969. pat ior !defined($1)
  970. with dereg
  971. kills ALL
  972. gen Call {label,".ior"}
  973. pat xor $1==2
  974. with hl_or_de hl_or_de
  975. uses areg
  976. gen mov a,%1.2
  977. xra %2.2
  978. mov %2.2,a
  979. mov a,%1.1
  980. xra %2.1
  981. mov %2.1,a yields %2
  982. with hl_or_de hl_or_de
  983. uses areg
  984. gen mov a,%1.2
  985. xra %2.2
  986. mov %1.2,a
  987. mov a,%1.1
  988. xra %2.1
  989. mov %1.1,a yields %1
  990. pat xor defined($1)
  991. kills ALL
  992. uses dereg={const2,$1}
  993. gen Call {label,".xor"}
  994. pat xor !defined($1)
  995. with dereg
  996. kills ALL
  997. gen Call {label,".xor"}
  998. pat com $1==2
  999. with hl_or_de
  1000. uses areg
  1001. gen mov a,%1.2
  1002. cma.
  1003. mov %1.2,a
  1004. mov a,%1.1
  1005. cma.
  1006. mov %1.1,a yields %1
  1007. pat com defined($1)
  1008. kills ALL
  1009. uses dereg={const2,$1}
  1010. gen Call {label,".com"}
  1011. pat com !defined($1)
  1012. with dereg
  1013. kills ALL
  1014. gen Call {label,".com"}
  1015. pat rol $1==2
  1016. with dereg hlreg
  1017. kills ALL
  1018. uses areg
  1019. gen mov a,e
  1020. ani {const1,15}
  1021. jz {label,3f}
  1022. 1:
  1023. dad hl
  1024. jnc {label,2f}
  1025. inr l
  1026. 2:
  1027. dcr a
  1028. jnz {label,1b}
  1029. 3: yields hl
  1030. pat rol $1==4
  1031. with dereg
  1032. kills ALL
  1033. gen Call {label,".rol4"}
  1034. pat ror $1==2
  1035. with dereg hlreg
  1036. kills ALL
  1037. uses areg
  1038. gen mov a,e
  1039. ani {const1,15}
  1040. jz {label,2f}
  1041. mov e,a
  1042. mov a,l
  1043. 1:
  1044. rar.
  1045. mov a,h
  1046. rar.
  1047. mov h,a
  1048. mov a,l
  1049. rar.
  1050. mov l,a
  1051. dcr e
  1052. jnz {label,1b}
  1053. 2: yields hl
  1054. pat ror $1==4
  1055. with dereg
  1056. kills ALL
  1057. gen Call {label,".ror4"}
  1058. /***********************************************/
  1059. /* Group 10: Set instructions */
  1060. /***********************************************/
  1061. pat inn $1==2
  1062. kills ALL
  1063. gen Call {label,".inn2"} yields de
  1064. pat inn defined($1)
  1065. kills ALL
  1066. uses dereg={const2,$1}
  1067. gen Call {label,".inn"} yields de
  1068. pat inn !defined($1)
  1069. with dereg
  1070. kills ALL
  1071. gen Call {label,".inn"} yields de
  1072. pat set $1==2
  1073. with dereg
  1074. kills ALL
  1075. gen Call {label,".set2"} yields de
  1076. pat set defined($1)
  1077. kills ALL
  1078. uses dereg={const2,$1}
  1079. gen Call {label,".set"}
  1080. pat set !defined($1)
  1081. with dereg
  1082. kills ALL
  1083. gen Call {label,".set"}
  1084. /***********************************************/
  1085. /* Group 11: Array instructions */
  1086. /***********************************************/
  1087. pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
  1088. pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
  1089. pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
  1090. with hlreg
  1091. gen dad hl yields hl leaving adi 2
  1092. pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
  1093. with hlreg
  1094. uses dereg={const2,0-rom($1,1)}
  1095. gen dad de
  1096. dad hl yields hl leaving adi 2
  1097. pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
  1098. with hlreg
  1099. gen dad hl
  1100. dad hl yields hl leaving adi 2
  1101. pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
  1102. with hlreg
  1103. uses dereg={const2,0-rom($1,1)}
  1104. gen dad de
  1105. dad hl
  1106. dad hl yields hl leaving adi 2
  1107. pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
  1108. with hlreg
  1109. gen dad hl
  1110. dad hl
  1111. dad hl yields hl leaving adi 2
  1112. pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
  1113. with hlreg
  1114. uses dereg={const2,0-rom($1,1)}
  1115. gen dad de
  1116. dad hl
  1117. dad hl
  1118. dad hl yields hl leaving adi 2
  1119. pat lar $1==2
  1120. kills ALL
  1121. gen Call {label,".lar2"}
  1122. pat lar defined($1)
  1123. gen Call {label,"eunimpl"}
  1124. pat lar !defined($1)
  1125. with hl_or_de
  1126. kills ALL
  1127. uses areg
  1128. gen mov a,%1.2
  1129. cpi {const1,2}
  1130. cnz {label,"eunimpl"}
  1131. mov a,%1.1
  1132. ora a
  1133. cnz {label,"eunimpl"}
  1134. Call {label,".lar2"}
  1135. pat sar $1==2
  1136. kills ALL
  1137. gen Call {label,".sar2"}
  1138. pat sar defined($1)
  1139. kills ALL
  1140. gen Call {label,"eunimpl"}
  1141. pat sar !defined($1)
  1142. with hl_or_de
  1143. kills ALL
  1144. uses areg
  1145. gen mov a,%1.2
  1146. cpi {const1,2}
  1147. cnz {label,"eunimpl"}
  1148. mov a,%1.1
  1149. ora a
  1150. cnz {label,"eunimpl"}
  1151. Call {label,".sar2"}
  1152. pat aar $1==2
  1153. kills ALL
  1154. gen Call {label,".aar2"}
  1155. pat aar defined($1)
  1156. kills ALL
  1157. gen Call {label,"eunimpl"}
  1158. pat aar !defined($1)
  1159. with hl_or_de
  1160. kills ALL
  1161. uses areg
  1162. gen mov a,%1.2
  1163. cpi {const1,2}
  1164. cnz {label,"eunimpl"}
  1165. mov a,%1.1
  1166. ora a
  1167. cnz {label,"eunimpl"}
  1168. Call {label,".aar2"}
  1169. /***********************************************/
  1170. /* Group 12: Compare instructions */
  1171. /***********************************************/
  1172. pat cmi $1==2 leaving sbi 2
  1173. pat cmi $1==4
  1174. kills ALL
  1175. uses areg={const1,1}
  1176. gen Call {label,".cmi4"} yields de
  1177. pat cmf $1==4
  1178. kills ALL
  1179. gen Call {label,".cmf4"}
  1180. pat cmf $1==8
  1181. kills ALL
  1182. gen Call {label,".cmf8"}
  1183. pat cmu $1==2
  1184. with hl_or_de hl_or_de
  1185. uses areg
  1186. gen mov a,%2.1
  1187. cmp %1.1
  1188. jz {label,2f}
  1189. jc {label,1f}
  1190. 0:
  1191. lxi %2,{const2,1}
  1192. jmp {label,3f}
  1193. 1:
  1194. lxi %2,{const2,0-1}
  1195. jmp {label,3f}
  1196. 2:
  1197. mov a,%2.2
  1198. cmp %1.2
  1199. jc {label,1b}
  1200. jnz {label,0b}
  1201. lxi %2,{const2,0}
  1202. 3: yields %2
  1203. pat cmu $1==4
  1204. kills ALL
  1205. uses areg={const1,0}
  1206. gen Call {label,".cmi4"} yields de
  1207. pat cms $1==2 leaving cmi 2
  1208. pat cms defined($1)
  1209. kills ALL
  1210. uses dereg={const2,$1}
  1211. gen Call {label,".cms"} yields de
  1212. pat cms !defined($1)
  1213. with dereg
  1214. kills ALL
  1215. gen Call {label,".cms"} yields de
  1216. pat cmp leaving cmu 2
  1217. pat tlt
  1218. with hl_or_de
  1219. uses areg
  1220. gen mov a,%1.1
  1221. ral.
  1222. mvi a,{const1,0}
  1223. mov %1.1,a
  1224. adc a
  1225. mov %1.2,a yields %1
  1226. pat tle
  1227. with hl_or_de
  1228. uses hl_or_de={const2,1}, areg
  1229. gen xra a
  1230. add %1.1
  1231. jm {label,2f}
  1232. jnz {label,1f}
  1233. xra a
  1234. add %1.2
  1235. jz {label,2f}
  1236. 1:
  1237. dcx %a
  1238. 2: yields %a
  1239. pat teq
  1240. with hl_or_de
  1241. uses areg
  1242. gen mov a,%1.1
  1243. ora %1.2
  1244. move {const2,0},%1
  1245. jnz {label,1f}
  1246. inx %1
  1247. 1: yields %1
  1248. pat tne
  1249. with hl_or_de
  1250. uses areg
  1251. gen mov a,%1.1
  1252. ora %1.2
  1253. move {const2,0},%1
  1254. jz {label,1f}
  1255. inx %1
  1256. 1: yields %1
  1257. pat tge
  1258. with hl_or_de
  1259. uses areg
  1260. gen mov a,%1.1
  1261. ral.
  1262. cmc.
  1263. mvi a,{const1,0}
  1264. mov %1.1,a
  1265. adc a
  1266. mov %1.2,a yields %1
  1267. pat tgt
  1268. with hl_or_de
  1269. uses hl_or_de={const2,0}, areg
  1270. gen xra a
  1271. add %1.1
  1272. jm {label,2f}
  1273. jnz {label,1f}
  1274. xra a
  1275. add %1.2
  1276. jz {label,2f}
  1277. 1:
  1278. inx %a
  1279. 2: yields %a
  1280. pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
  1281. with exact areg hl_or_de
  1282. gen cpi {const1,$1}
  1283. jz {label,1f}
  1284. move {const2,0},%2
  1285. 1: yields %2
  1286. with hl_or_de hl_or_de
  1287. uses areg
  1288. gen mov a,%1.2
  1289. cpi {const1,$1}
  1290. jnz {label,1f}
  1291. mov a,%1.1
  1292. ora a
  1293. jz {label,2f}
  1294. 1:
  1295. move {const2,0},%2
  1296. 2: yields %2
  1297. pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
  1298. with exact areg hl_or_de
  1299. gen cpi {const1,$1}
  1300. jnz {label,1f}
  1301. move {const2,0},%2
  1302. 1: yields %2
  1303. with hl_or_de hl_or_de
  1304. uses areg
  1305. gen mov a,%1.2
  1306. cpi {const1,$1}
  1307. jnz {label,1f}
  1308. mov a,%1.1
  1309. ora a
  1310. jnz {label,1f}
  1311. move {const2,0},%2
  1312. 1: yields %2
  1313. pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
  1314. with exact areg hl_or_de
  1315. gen cpi {const1,$1}
  1316. jnz {label,1f}
  1317. move {const2,1},%2
  1318. 1: yields %2
  1319. with hl_or_de hl_or_de
  1320. uses areg
  1321. gen mov a,%1.2
  1322. cpi {const1,$1}
  1323. jnz {label,1f}
  1324. mov a,%1.1
  1325. ora a
  1326. jnz {label,1f}
  1327. move {const2,1},%2
  1328. 1: yields %2
  1329. pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
  1330. with exact areg hl_or_de
  1331. gen cpi {const1,$1}
  1332. jz {label,1f}
  1333. move {const2,1},%2
  1334. 1: yields %2
  1335. with hl_or_de hl_or_de
  1336. uses areg
  1337. gen mov a,%1.2
  1338. cpi {const1,$1}
  1339. jnz {label,1f}
  1340. mov a,%1.1
  1341. ora a
  1342. jz {label,2f}
  1343. 1:
  1344. move {const2,1},%2
  1345. 2: yields %2
  1346. pat loc cmi teq $1>=0 && $1<=255 && $2==2
  1347. with exact areg
  1348. uses hl_or_de={const2,0}
  1349. gen cpi {const1,$1}
  1350. jnz {label,1f}
  1351. inx %a
  1352. 1: yields %a
  1353. with hl_or_de
  1354. uses hl_or_de={const2,0}, areg
  1355. gen mov a,%1.2
  1356. cpi {const1,$1}
  1357. jnz {label,1f}
  1358. mov a,%1.1
  1359. ora a
  1360. jnz {label,1f}
  1361. inx %a
  1362. 1: yields %a
  1363. pat loc cmi tne $1>=0 && $1<=255 && $2==2
  1364. with exact areg
  1365. uses hl_or_de={const2,0}
  1366. gen cpi {const1,$1}
  1367. jz {label,1f}
  1368. inx %a
  1369. 1: yields %a
  1370. with hl_or_de
  1371. uses hl_or_de={const2,1}, areg
  1372. gen mov a,%1.2
  1373. cpi {const1,$1}
  1374. jnz {label,1f}
  1375. mov a,%1.1
  1376. ora a
  1377. jnz {label,1f}
  1378. dcx %a
  1379. 1: yields %a
  1380. pat loc cmi $1>=0 && $1<=255 && $2==2
  1381. with exact areg
  1382. uses hl_or_de
  1383. gen sui {const1,$1}
  1384. mov %a.2,a
  1385. rar.
  1386. mov %a.1,a yields %a
  1387. with yields {const2,$1}
  1388. leaving cmi 2
  1389. pat loc cmi $1<0 && $2==2
  1390. with exact areg yields {const2,0-1}
  1391. with yields {const2,$1}
  1392. leaving cmi 2
  1393. /*******************************************/
  1394. /* Group 13: Branch instructions */
  1395. /*******************************************/
  1396. pat loc beq $1>=0 && $1<=255
  1397. with exact reg
  1398. uses reusing %1, areg=%1
  1399. gen cpi {const1,$1}
  1400. jz {label,$2}
  1401. with yields {const2,$1}
  1402. leaving beq $2
  1403. pat loc bne $1>=0 && $1<=255
  1404. with exact reg
  1405. uses reusing %1, areg=%1
  1406. gen cpi {const1,$1}
  1407. jnz {label,$2}
  1408. with yields {const2,$1}
  1409. leaving bne $2
  1410. pat bra
  1411. with STACK
  1412. gen jmp {label,$1}
  1413. pat blt
  1414. with hl_or_de hl_or_de STACK
  1415. uses areg
  1416. gen mov a,%2.2
  1417. sub %1.2
  1418. mov a,%2.1
  1419. sbb %1.1
  1420. jm {label,$1}
  1421. pat ble
  1422. with hl_or_de hl_or_de STACK
  1423. uses areg
  1424. gen mov a,%1.2
  1425. sub %2.2
  1426. mov a,%1.1
  1427. sbb %2.1
  1428. jp {label,$1}
  1429. pat beq
  1430. with hl_or_de hl_or_de STACK
  1431. uses areg
  1432. gen mov a,%2.2
  1433. cmp %1.2
  1434. jnz {label,1f}
  1435. mov a,%2.1
  1436. cmp %1.1
  1437. jz {label,$1}
  1438. 1:
  1439. pat bne
  1440. with hl_or_de hl_or_de STACK
  1441. uses areg
  1442. gen mov a,%2.2
  1443. cmp %1.2
  1444. jnz {label,$1}
  1445. mov a,%2.1
  1446. cmp %1.1
  1447. jnz {label,$1}
  1448. pat bge
  1449. with hl_or_de hl_or_de STACK
  1450. uses areg
  1451. gen mov a,%2.2
  1452. sub %1.2
  1453. mov a,%2.1
  1454. sbb %1.1
  1455. jp {label,$1}
  1456. pat bgt
  1457. with hl_or_de hl_or_de STACK
  1458. uses areg
  1459. gen mov a,%1.2
  1460. sub %2.2
  1461. mov a,%1.1
  1462. sbb %2.1
  1463. jm {label,$1}
  1464. pat zlt
  1465. with STACK
  1466. gen pop psw
  1467. ora a
  1468. jm {label,$1}
  1469. with hl_or_de STACK
  1470. gen mov a,%1.1
  1471. ora a
  1472. jm {label,$1}
  1473. pat zle
  1474. with hl_or_de STACK
  1475. uses areg
  1476. gen xra a
  1477. add %1.1
  1478. jm {label,$1}
  1479. jnz {label,1f}
  1480. xra a
  1481. add %1.2
  1482. jz {label,$1}
  1483. 1:
  1484. pat zeq
  1485. with hl_or_de STACK
  1486. uses areg
  1487. gen mov a,%1.1
  1488. ora %1.2
  1489. jz {label,$1}
  1490. pat zne
  1491. with hl_or_de STACK
  1492. uses areg
  1493. gen mov a,%1.1
  1494. ora %1.2
  1495. jnz {label,$1}
  1496. pat zge
  1497. with STACK
  1498. gen pop psw
  1499. ral.
  1500. jnc {label,$1}
  1501. with hl_or_de STACK
  1502. gen mov a,%1.1
  1503. ora a
  1504. jp {label,$1}
  1505. pat zgt
  1506. with hl_or_de STACK
  1507. uses areg
  1508. gen xra a
  1509. add %1.1
  1510. jm {label,1f}
  1511. jnz {label,$1}
  1512. xra a
  1513. add %1.2
  1514. jnz {label,$1}
  1515. 1:
  1516. pat lol zeq
  1517. with STACK
  1518. uses hlreg={const2,$1}, areg
  1519. gen dad lb
  1520. mov a,{m}
  1521. inx hl
  1522. ora {m}
  1523. jz {label,$2}
  1524. pat lol zne
  1525. with STACK
  1526. uses hlreg={const2,$1}, areg
  1527. gen dad lb
  1528. mov a,{m}
  1529. inx hl
  1530. ora {m}
  1531. jnz {label,$2}
  1532. pat ior zeq $1==2
  1533. with hl_or_de hl_or_de STACK
  1534. uses areg
  1535. gen mov a,%1.1
  1536. ora %1.2
  1537. ora %2.1
  1538. ora %2.2
  1539. jz {label,$2}
  1540. pat ior zne $1==2
  1541. with hl_or_de hl_or_de STACK
  1542. uses areg
  1543. gen mov a,%1.1
  1544. ora %1.2
  1545. ora %2.1
  1546. ora %2.2
  1547. jnz {label,$2}
  1548. /*********************************************/
  1549. /* Group 14: Procedure call instructions */
  1550. /*********************************************/
  1551. pat cal
  1552. kills ALL
  1553. gen Call {label,$1}
  1554. pat cai
  1555. with hlreg
  1556. kills ALL
  1557. uses dereg
  1558. gen lxi de,{label,1f}
  1559. push de
  1560. pchl.
  1561. 1:
  1562. pat lfr $1==2 yields de
  1563. pat lfr $1<=8
  1564. with STACK
  1565. uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
  1566. gen 1:
  1567. dcx hl
  1568. mov d,{m}
  1569. dcx hl
  1570. mov e,{m}
  1571. push de
  1572. dcr a
  1573. jnz {label,1b}
  1574. pat lfr ret $1==$2 leaving ret 0
  1575. pat ret $1==0
  1576. with STACK
  1577. uses hlreg
  1578. gen move lb,hl
  1579. sphl.
  1580. pop lb
  1581. ret.
  1582. pat ret $1==2
  1583. with dereg STACK
  1584. uses hlreg
  1585. gen move lb,hl
  1586. sphl.
  1587. pop lb
  1588. ret.
  1589. pat ret $1<=8
  1590. with STACK
  1591. uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
  1592. gen 1:
  1593. pop de
  1594. mov {m},e
  1595. inx hl
  1596. mov {m},d
  1597. inx hl
  1598. dcr a
  1599. jnz {label,1b}
  1600. move lb,hl
  1601. sphl.
  1602. pop lb
  1603. ret.
  1604. /******************************************/
  1605. /* Group 15: Miscellaneous */
  1606. /******************************************/
  1607. pat asp $1<=0-6
  1608. with STACK
  1609. uses hlreg={const2,$1}
  1610. gen dad sp
  1611. sphl.
  1612. pat asp $1==0-4
  1613. with STACK
  1614. gen dcx sp
  1615. dcx sp
  1616. dcx sp
  1617. dcx sp
  1618. pat asp $1==0-2
  1619. with STACK
  1620. gen dcx sp
  1621. dcx sp
  1622. pat asp $1==0 /* do nothing */
  1623. pat asp $1==2
  1624. with exact src1or2
  1625. with STACK
  1626. gen inx sp
  1627. inx sp
  1628. pat asp $1==4
  1629. with exact src1or2 leaving asp 2
  1630. with STACK
  1631. gen inx sp
  1632. inx sp
  1633. inx sp
  1634. inx sp
  1635. pat asp $1>=6
  1636. with exact src1or2 leaving asp $1-2
  1637. with STACK
  1638. uses hlreg={const2,$1}
  1639. gen dad sp
  1640. sphl.
  1641. pat ass $1==2
  1642. with hlreg STACK
  1643. gen dad sp
  1644. sphl.
  1645. pat blm
  1646. kills ALL
  1647. uses dereg={const2,$1}
  1648. gen Call {label,".blm"}
  1649. pat bls
  1650. with dereg
  1651. kills ALL
  1652. gen Call {label,".blm"}
  1653. pat csa
  1654. kills ALL
  1655. gen jmp {label,".csa"}
  1656. pat csb
  1657. kills ALL
  1658. gen jmp {label,".csb"}
  1659. pat dch leaving loi 2
  1660. pat dup $1==2
  1661. with src1or2 yields %1 %1
  1662. pat dup $1==4
  1663. with src1or2 src1or2 yields %2 %1 %2 %1
  1664. pat dup
  1665. kills ALL
  1666. uses dereg={const2,$1}
  1667. gen Call {label,".dup"}
  1668. pat dus $1==2
  1669. with dereg
  1670. kills ALL
  1671. gen Call {label,".dup"}
  1672. pat exg $1==2
  1673. with src1or2 src1or2 yields %1 %2
  1674. pat exg defined($1)
  1675. kills ALL
  1676. uses dereg={const2,1}
  1677. gen Call {label,".exg"}
  1678. pat fil
  1679. uses hlreg={label,$1}
  1680. gen shld {label,"hol0"+4}
  1681. pat gto
  1682. with STACK
  1683. gen lhld {label,$1+2}
  1684. sphl.
  1685. lhld {label,$1+4}
  1686. move hl,lb
  1687. lhld {label,$1}
  1688. pchl.
  1689. pat lim
  1690. uses hlreg
  1691. gen lhld {label,".ignmask"} yields hl
  1692. pat lin
  1693. uses hlreg={const2,$1}
  1694. gen shld {label,"hol0"}
  1695. pat lni
  1696. uses hlreg
  1697. gen lhld {label,"hol0"}
  1698. inx hl
  1699. shld {label,"hol0"}
  1700. pat lor $1==0 yields lb
  1701. pat lor $1==1
  1702. with STACK
  1703. uses hlreg={const2,0}
  1704. gen dad sp yields hl
  1705. pat lor $1==2
  1706. uses hlreg
  1707. gen lhld {label,".reghp"} yields hl
  1708. pat lpb leaving adp SL
  1709. pat mon
  1710. kills ALL
  1711. gen Call {label,".mon"}
  1712. pat nop
  1713. kills ALL
  1714. #ifdef DEBUG
  1715. gen Call {label,".nop"}
  1716. #endif
  1717. pat rck
  1718. with hl_or_de STACK
  1719. pat rtt leaving ret 0
  1720. pat sig
  1721. with dereg
  1722. uses hlreg
  1723. gen lhld {label,".trapproc"}
  1724. xchg.
  1725. shld {label,".trapproc"} yields de
  1726. with STACK
  1727. uses hlreg
  1728. gen lhld {label,".trapproc"}
  1729. xthl.
  1730. shld {label,".trapproc"}
  1731. pat sim
  1732. with hlreg
  1733. gen shld {label,".ignmask"}
  1734. pat str $1==0
  1735. with localbase
  1736. pat str $1==1
  1737. with hlreg
  1738. gen sphl.
  1739. pat str $1==2
  1740. with hlreg
  1741. gen shld {label,".reghp"}
  1742. pat trp
  1743. kills ALL
  1744. gen Call {label,".trp"}