table 32 KB

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