table 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065
  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 = "$Id$"
  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 STACK
  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 loc sli ($1 == 8) && ($2 == 2)
  638. with hl_or_de
  639. gen move %1.2, %1.1
  640. mvi %1.2, {const1,0} yields %1
  641. pat sli $1==2
  642. kills ALL
  643. gen Call {label,".sli2"} yields de
  644. pat sli $1==4
  645. kills ALL
  646. gen Call {label,".sli4"}
  647. pat sri $1==2
  648. kills ALL
  649. uses areg={const1,1}
  650. gen Call {label,".sri2"} yields de
  651. pat sri $1==4
  652. kills ALL
  653. uses areg={const1,1}
  654. gen Call {label,".sri4"}
  655. /********************************************/
  656. /* Group 4: Unsigned arithmetic */
  657. /********************************************/
  658. pat adu leaving adi $1
  659. pat sbu leaving sbi $1
  660. pat mlu $1==2
  661. kills ALL
  662. gen Call {label,".mlu2"} yields de
  663. pat mlu $1==4
  664. kills ALL
  665. gen Call {label,".mli4"}
  666. pat dvu $1==2
  667. kills ALL
  668. uses areg={const1,1}
  669. gen Call {label,".dvi2"} yields de
  670. pat dvu $1==4
  671. kills ALL
  672. uses areg={const1,1}
  673. gen Call {label,".dvi4"}
  674. pat rmu $1==2
  675. kills ALL
  676. uses areg={const1,0}
  677. gen Call {label,".dvi2"} yields de
  678. pat rmu $1==4
  679. kills ALL
  680. uses areg={const1,0}
  681. gen Call {label,".dvi4"}
  682. pat slu leaving sli $1
  683. pat loc sru ($1 == 8) && ($2 == 2)
  684. with hl_or_de
  685. gen move %1.1, %1.2
  686. mvi %1.1, {const1,0} yields %1
  687. pat sru $1==2
  688. kills ALL
  689. uses areg={const1,0}
  690. gen Call {label,".sri2"} yields de
  691. pat sru $1==4
  692. kills ALL
  693. uses areg={const1,0}
  694. gen Call {label,".sri4"}
  695. /********************************************/
  696. /* Group 5: Floating point arithmetic */
  697. /********************************************/
  698. pat adf $1==4
  699. kills ALL
  700. gen Call {label,".adf4"}
  701. pat adf $1==8
  702. kills ALL
  703. gen Call {label,".adf8"}
  704. pat sbf $1==4
  705. kills ALL
  706. gen Call {label,".sbf4"}
  707. pat sbf $1==8
  708. kills ALL
  709. gen Call {label,".sbf8"}
  710. pat mlf $1==4
  711. kills ALL
  712. gen Call {label,".mlf4"}
  713. pat mlf $1==8
  714. kills ALL
  715. gen Call {label,".mlf8"}
  716. pat dvf $1==4
  717. kills ALL
  718. gen Call {label,".dvf4"}
  719. pat dvf $1==8
  720. kills ALL
  721. gen Call {label,".dvf8"}
  722. pat ngf $1==4
  723. kills ALL
  724. gen Call {label,".ngf4"}
  725. pat ngf $1==8
  726. kills ALL
  727. gen Call {label,".ngf8"}
  728. pat fif $1==4
  729. kills ALL
  730. gen Call {label,".fif4"}
  731. pat fif $1==8
  732. kills ALL
  733. gen Call {label,".fif8"}
  734. pat fef $1==4
  735. kills ALL
  736. gen Call {label,".fef4"}
  737. pat fef $1==8
  738. kills ALL
  739. gen Call {label,".fef8"}
  740. /********************************************/
  741. /* Group 6: Pointer arithmetic */
  742. /********************************************/
  743. pat adp $1==0 /* do nothing */
  744. pat adp $1==1
  745. with hl_or_de
  746. gen inx %1 yields %1
  747. pat adp $1==2
  748. with hl_or_de
  749. gen inx %1
  750. inx %1 yields %1
  751. pat adp $1==0-1
  752. with hl_or_de
  753. gen dcx %1 yields %1
  754. pat adp $1==0-2
  755. with hl_or_de
  756. gen dcx %1
  757. dcx %1 yields %1
  758. pat adp
  759. with hl_or_de
  760. uses hl_or_de={const2,$1}
  761. gen dad de yields hl
  762. pat ads $1==2 leaving adi 2
  763. pat sbs $1==2 leaving sbi 2
  764. /********************************************/
  765. /* Group 7: Increment/ decrement/ zero */
  766. /********************************************/
  767. pat inc
  768. with hl_or_de
  769. gen inx %1 yields %1
  770. pat inl
  771. uses hlreg={const2,$1}
  772. gen dad lb
  773. inr {m}
  774. jnz {label,1f}
  775. inx hl
  776. inr {m}
  777. 1:
  778. pat ine
  779. uses hlreg={label,$1}
  780. gen inr {m}
  781. jnz {label,1f}
  782. inx hl
  783. inr {m}
  784. 1:
  785. pat dec
  786. with hl_or_de
  787. gen dcx %1 yields %1
  788. pat del
  789. uses hlreg={const2,$1}, dereg
  790. gen dad lb
  791. mov e,{m}
  792. inx hl
  793. mov d,{m}
  794. dcx de
  795. mov {m},d
  796. dcx hl
  797. mov {m},e
  798. pat dee
  799. uses hlreg
  800. gen lhld {label,$1}
  801. dcx hl
  802. shld {label,$1}
  803. pat zrl
  804. uses hlreg={const2,$1}, areg
  805. gen dad lb
  806. xra a
  807. mov {m},a
  808. inx hl
  809. mov {m},a
  810. pat zre
  811. uses hlreg={const2,0}
  812. gen shld {label,$1}
  813. pat zrf $1==4
  814. kills ALL
  815. gen Call {label,".zrf4"}
  816. pat zrf $1==8
  817. kills ALL
  818. gen Call {label,".zrf8"}
  819. pat zer $1==2 yields {const2,0}
  820. pat zer $1==4 yields {const2,0} {const2,0}
  821. pat zer $1<511
  822. kills ALL
  823. uses reg={const1,$1/2}, hl_or_de={const2,0}
  824. gen 1:
  825. push %b
  826. dcr %a
  827. jnz {label,1b}
  828. pat zer
  829. kills ALL
  830. uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
  831. gen xra a
  832. 1:
  833. push %b
  834. dcx %a
  835. cmp %a.2
  836. jnz {label,1b}
  837. cmp %a.1
  838. jnz {label,1b}
  839. /*****************************************/
  840. /* Group 8: Convert instructions */
  841. /*****************************************/
  842. pat loc loc cii $1==$2
  843. pat loc loc cii $1==2 && $2==4
  844. with hl_or_de
  845. uses hl_or_de={const2,0}, areg
  846. gen mov a,%1.1
  847. ora a
  848. jp {label,1f}
  849. lxi %a,{const2,0-1}
  850. 1: yields %a %1
  851. pat loc loc cii $1==4 && $2==2
  852. with hl_or_de hl_or_de yields %1
  853. pat loc loc cii $1==1 && $2==2
  854. with reg
  855. uses reusing %1, areg=%1, hl_or_de
  856. gen move {const1,0},%b.1
  857. move a,%b.2
  858. ora a
  859. jp {label,1f}
  860. mvi %b.1,{const1,255}
  861. 1: yields %b
  862. with hl_or_de
  863. uses areg=%1.2
  864. gen move {const1,0},%1.1
  865. ora a
  866. jp {label,1f}
  867. mvi %1.1,{const1,255}
  868. 1: yields %1
  869. pat loc loc cii $1==1 && $2==4
  870. with reg
  871. uses hlreg
  872. gen move %1,l yields hl
  873. leaving loc $1 loc $2 cii
  874. with hlreg
  875. uses dereg, areg
  876. gen move {const1,0},%1.1
  877. move l,a
  878. ora a
  879. jp {label,1f}
  880. mvi h,{const1,255}
  881. 1:
  882. mov e,h
  883. mov d,h yields de hl
  884. pat cii
  885. kills ALL
  886. uses areg={const1,1}
  887. gen Call {label,".cii"}
  888. pat loc loc ciu leaving loc $1 loc $2 cuu
  889. pat loc loc cui leaving loc $1 loc $2 cuu
  890. pat cui leaving cuu $1
  891. pat ciu leaving cuu $1
  892. pat loc loc cuu $1==$2
  893. pat loc loc cuu $1==2 && $2==4
  894. with src1or2 yields {const2,0} %1
  895. pat loc loc cuu $1==4 && $1==2
  896. with src1or2 src1or2 yields %1
  897. pat loc loc cuu $1==1 && $2==2
  898. with reg
  899. uses reusing %1, hl_or_de
  900. gen move %1,%a yields %a
  901. with hl_or_de
  902. gen move {const1,0},%1.1 yields %1
  903. pat loc loc cuu $1==1 && $2==4
  904. with reg
  905. uses reusing %1, hl_or_de
  906. gen move %1,%a yields {const2,0} %a
  907. with hl_or_de
  908. gen move {const1,0},%1.1 yields {const2,0} %1
  909. pat cuu
  910. kills ALL
  911. uses areg={const1,0}
  912. gen Call {label,".cii"}
  913. pat cfi
  914. kills ALL
  915. gen Call {label,".cfi"}
  916. pat cif
  917. kills ALL
  918. gen Call {label,".cif"}
  919. pat cuf
  920. kills ALL
  921. gen Call {label,".cuf"}
  922. pat cff
  923. kills ALL
  924. gen Call {label,".cff"}
  925. pat cfu
  926. kills ALL
  927. gen Call {label,".cfu"}
  928. /*****************************************/
  929. /* Group 9: Logical instructions */
  930. /*****************************************/
  931. pat and $1==2
  932. with hl_or_de hl_or_de
  933. uses areg
  934. gen mov a,%1.2
  935. ana %2.2
  936. mov %2.2,a
  937. mov a,%1.1
  938. ana %2.1
  939. mov %2.1,a yields %2
  940. with hl_or_de hl_or_de
  941. uses areg
  942. gen mov a,%1.2
  943. ana %2.2
  944. mov %1.2,a
  945. mov a,%1.1
  946. ana %2.1
  947. mov %1.1,a yields %1
  948. pat and defined($1)
  949. kills ALL
  950. uses dereg={const2,$1}
  951. gen Call {label,".and"}
  952. pat and !defined($1)
  953. with dereg
  954. kills ALL
  955. gen Call {label,".and"}
  956. pat ior $1==2
  957. with hl_or_de hl_or_de
  958. uses areg
  959. gen mov a,%1.2
  960. ora %2.2
  961. mov %2.2,a
  962. mov a,%1.1
  963. ora %2.1
  964. mov %2.1,a yields %2
  965. with hl_or_de hl_or_de
  966. uses areg
  967. gen mov a,%1.2
  968. ora %2.2
  969. mov %1.2,a
  970. mov a,%1.1
  971. ora %2.1
  972. mov %1.1,a yields %1
  973. pat ior defined($1)
  974. kills ALL
  975. uses dereg={const2,$1}
  976. gen Call {label,".ior"}
  977. pat ior !defined($1)
  978. with dereg
  979. kills ALL
  980. gen Call {label,".ior"}
  981. pat xor $1==2
  982. with hl_or_de hl_or_de
  983. uses areg
  984. gen mov a,%1.2
  985. xra %2.2
  986. mov %2.2,a
  987. mov a,%1.1
  988. xra %2.1
  989. mov %2.1,a yields %2
  990. with hl_or_de hl_or_de
  991. uses areg
  992. gen mov a,%1.2
  993. xra %2.2
  994. mov %1.2,a
  995. mov a,%1.1
  996. xra %2.1
  997. mov %1.1,a yields %1
  998. pat xor defined($1)
  999. kills ALL
  1000. uses dereg={const2,$1}
  1001. gen Call {label,".xor"}
  1002. pat xor !defined($1)
  1003. with dereg
  1004. kills ALL
  1005. gen Call {label,".xor"}
  1006. pat com $1==2
  1007. with hl_or_de
  1008. uses areg
  1009. gen mov a,%1.2
  1010. cma.
  1011. mov %1.2,a
  1012. mov a,%1.1
  1013. cma.
  1014. mov %1.1,a yields %1
  1015. pat com defined($1)
  1016. kills ALL
  1017. uses dereg={const2,$1}
  1018. gen Call {label,".com"}
  1019. pat com !defined($1)
  1020. with dereg
  1021. kills ALL
  1022. gen Call {label,".com"}
  1023. pat rol $1==2
  1024. with dereg hlreg
  1025. kills ALL
  1026. uses areg
  1027. gen mov a,e
  1028. ani {const1,15}
  1029. jz {label,3f}
  1030. 1:
  1031. dad hl
  1032. jnc {label,2f}
  1033. inr l
  1034. 2:
  1035. dcr a
  1036. jnz {label,1b}
  1037. 3: yields hl
  1038. pat rol $1==4
  1039. with dereg
  1040. kills ALL
  1041. gen Call {label,".rol4"}
  1042. pat ror $1==2
  1043. with dereg hlreg
  1044. kills ALL
  1045. uses areg
  1046. gen mov a,e
  1047. ani {const1,15}
  1048. jz {label,2f}
  1049. mov e,a
  1050. mov a,l
  1051. 1:
  1052. rar.
  1053. mov a,h
  1054. rar.
  1055. mov h,a
  1056. mov a,l
  1057. rar.
  1058. mov l,a
  1059. dcr e
  1060. jnz {label,1b}
  1061. 2: yields hl
  1062. pat ror $1==4
  1063. with dereg
  1064. kills ALL
  1065. gen Call {label,".ror4"}
  1066. /***********************************************/
  1067. /* Group 10: Set instructions */
  1068. /***********************************************/
  1069. pat inn $1==2
  1070. kills ALL
  1071. gen Call {label,".inn2"} yields de
  1072. pat inn defined($1)
  1073. kills ALL
  1074. uses dereg={const2,$1}
  1075. gen Call {label,".inn"} yields de
  1076. pat inn !defined($1)
  1077. with dereg
  1078. kills ALL
  1079. gen Call {label,".inn"} yields de
  1080. pat set $1==2
  1081. with dereg
  1082. kills ALL
  1083. gen Call {label,".set2"} yields de
  1084. pat set defined($1)
  1085. kills ALL
  1086. uses dereg={const2,$1}
  1087. gen Call {label,".set"}
  1088. pat set !defined($1)
  1089. with dereg
  1090. kills ALL
  1091. gen Call {label,".set"}
  1092. /***********************************************/
  1093. /* Group 11: Array instructions */
  1094. /***********************************************/
  1095. pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
  1096. pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
  1097. pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
  1098. with hlreg
  1099. gen dad hl yields hl leaving adi 2
  1100. pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
  1101. with hlreg
  1102. uses dereg={const2,0-rom($1,1)}
  1103. gen dad de
  1104. dad hl yields hl leaving adi 2
  1105. pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
  1106. with hlreg
  1107. gen dad hl
  1108. dad hl yields hl leaving adi 2
  1109. pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
  1110. with hlreg
  1111. uses dereg={const2,0-rom($1,1)}
  1112. gen dad de
  1113. dad hl
  1114. dad hl yields hl leaving adi 2
  1115. pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
  1116. with hlreg
  1117. gen dad hl
  1118. dad hl
  1119. dad hl yields hl leaving adi 2
  1120. pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
  1121. with hlreg
  1122. uses dereg={const2,0-rom($1,1)}
  1123. gen dad de
  1124. dad hl
  1125. dad hl
  1126. dad hl yields hl leaving adi 2
  1127. pat lar $1==2
  1128. kills ALL
  1129. gen Call {label,".lar2"}
  1130. pat lar defined($1)
  1131. gen Call {label,"eunimpl"}
  1132. pat lar !defined($1)
  1133. with hl_or_de
  1134. kills ALL
  1135. uses areg
  1136. gen mov a,%1.2
  1137. cpi {const1,2}
  1138. cnz {label,"eunimpl"}
  1139. mov a,%1.1
  1140. ora a
  1141. cnz {label,"eunimpl"}
  1142. Call {label,".lar2"}
  1143. pat sar $1==2
  1144. kills ALL
  1145. gen Call {label,".sar2"}
  1146. pat sar defined($1)
  1147. kills ALL
  1148. gen Call {label,"eunimpl"}
  1149. pat sar !defined($1)
  1150. with hl_or_de
  1151. kills ALL
  1152. uses areg
  1153. gen mov a,%1.2
  1154. cpi {const1,2}
  1155. cnz {label,"eunimpl"}
  1156. mov a,%1.1
  1157. ora a
  1158. cnz {label,"eunimpl"}
  1159. Call {label,".sar2"}
  1160. pat aar $1==2
  1161. kills ALL
  1162. gen Call {label,".aar2"}
  1163. pat aar defined($1)
  1164. kills ALL
  1165. gen Call {label,"eunimpl"}
  1166. pat aar !defined($1)
  1167. with hl_or_de
  1168. kills ALL
  1169. uses areg
  1170. gen mov a,%1.2
  1171. cpi {const1,2}
  1172. cnz {label,"eunimpl"}
  1173. mov a,%1.1
  1174. ora a
  1175. cnz {label,"eunimpl"}
  1176. Call {label,".aar2"}
  1177. /***********************************************/
  1178. /* Group 12: Compare instructions */
  1179. /***********************************************/
  1180. pat cmi $1==2 leaving sbi 2
  1181. pat cmi $1==4
  1182. kills ALL
  1183. uses areg={const1,1}
  1184. gen Call {label,".cmi4"} yields de
  1185. pat cmf $1==4
  1186. kills ALL
  1187. gen Call {label,".cmf4"}
  1188. pat cmf $1==8
  1189. kills ALL
  1190. gen Call {label,".cmf8"}
  1191. pat cmu $1==2
  1192. with hl_or_de hl_or_de
  1193. uses areg
  1194. gen mov a,%2.1
  1195. cmp %1.1
  1196. jz {label,2f}
  1197. jc {label,1f}
  1198. 0:
  1199. lxi %2,{const2,1}
  1200. jmp {label,3f}
  1201. 1:
  1202. lxi %2,{const2,0-1}
  1203. jmp {label,3f}
  1204. 2:
  1205. mov a,%2.2
  1206. cmp %1.2
  1207. jc {label,1b}
  1208. jnz {label,0b}
  1209. lxi %2,{const2,0}
  1210. 3: yields %2
  1211. pat cmu $1==4
  1212. kills ALL
  1213. uses areg={const1,0}
  1214. gen Call {label,".cmi4"} yields de
  1215. pat cms $1==2 leaving cmi 2
  1216. pat cms defined($1)
  1217. kills ALL
  1218. uses dereg={const2,$1}
  1219. gen Call {label,".cms"} yields de
  1220. pat cms !defined($1)
  1221. with dereg
  1222. kills ALL
  1223. gen Call {label,".cms"} yields de
  1224. pat cmp leaving cmu 2
  1225. pat tlt
  1226. with hl_or_de
  1227. uses areg
  1228. gen mov a,%1.1
  1229. ral.
  1230. mvi a,{const1,0}
  1231. mov %1.1,a
  1232. adc a
  1233. mov %1.2,a yields %1
  1234. pat tle
  1235. with hl_or_de
  1236. uses hl_or_de={const2,1}, areg
  1237. gen xra a
  1238. add %1.1
  1239. jm {label,2f}
  1240. jnz {label,1f}
  1241. xra a
  1242. add %1.2
  1243. jz {label,2f}
  1244. 1:
  1245. dcx %a
  1246. 2: yields %a
  1247. pat teq
  1248. with hl_or_de
  1249. uses areg
  1250. gen mov a,%1.1
  1251. ora %1.2
  1252. move {const2,0},%1
  1253. jnz {label,1f}
  1254. inx %1
  1255. 1: yields %1
  1256. pat tne
  1257. with hl_or_de
  1258. uses areg
  1259. gen mov a,%1.1
  1260. ora %1.2
  1261. move {const2,0},%1
  1262. jz {label,1f}
  1263. inx %1
  1264. 1: yields %1
  1265. pat tge
  1266. with hl_or_de
  1267. uses areg
  1268. gen mov a,%1.1
  1269. ral.
  1270. cmc.
  1271. mvi a,{const1,0}
  1272. mov %1.1,a
  1273. adc a
  1274. mov %1.2,a yields %1
  1275. pat tgt
  1276. with hl_or_de
  1277. uses hl_or_de={const2,0}, areg
  1278. gen xra a
  1279. add %1.1
  1280. jm {label,2f}
  1281. jnz {label,1f}
  1282. xra a
  1283. add %1.2
  1284. jz {label,2f}
  1285. 1:
  1286. inx %a
  1287. 2: yields %a
  1288. pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
  1289. with exact areg hl_or_de
  1290. gen cpi {const1,$1}
  1291. jz {label,1f}
  1292. move {const2,0},%2
  1293. 1: yields %2
  1294. with hl_or_de hl_or_de
  1295. uses areg
  1296. gen mov a,%1.2
  1297. cpi {const1,$1}
  1298. jnz {label,1f}
  1299. mov a,%1.1
  1300. ora a
  1301. jz {label,2f}
  1302. 1:
  1303. move {const2,0},%2
  1304. 2: yields %2
  1305. pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
  1306. with exact areg hl_or_de
  1307. gen cpi {const1,$1}
  1308. jnz {label,1f}
  1309. move {const2,0},%2
  1310. 1: yields %2
  1311. with hl_or_de hl_or_de
  1312. uses areg
  1313. gen mov a,%1.2
  1314. cpi {const1,$1}
  1315. jnz {label,1f}
  1316. mov a,%1.1
  1317. ora a
  1318. jnz {label,1f}
  1319. move {const2,0},%2
  1320. 1: yields %2
  1321. pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
  1322. with exact areg hl_or_de
  1323. gen cpi {const1,$1}
  1324. jnz {label,1f}
  1325. move {const2,1},%2
  1326. 1: yields %2
  1327. with hl_or_de hl_or_de
  1328. uses areg
  1329. gen mov a,%1.2
  1330. cpi {const1,$1}
  1331. jnz {label,1f}
  1332. mov a,%1.1
  1333. ora a
  1334. jnz {label,1f}
  1335. move {const2,1},%2
  1336. 1: yields %2
  1337. pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
  1338. with exact areg hl_or_de
  1339. gen cpi {const1,$1}
  1340. jz {label,1f}
  1341. move {const2,1},%2
  1342. 1: yields %2
  1343. with hl_or_de hl_or_de
  1344. uses areg
  1345. gen mov a,%1.2
  1346. cpi {const1,$1}
  1347. jnz {label,1f}
  1348. mov a,%1.1
  1349. ora a
  1350. jz {label,2f}
  1351. 1:
  1352. move {const2,1},%2
  1353. 2: yields %2
  1354. pat loc cmi teq $1>=0 && $1<=255 && $2==2
  1355. with exact areg
  1356. uses hl_or_de={const2,0}
  1357. gen cpi {const1,$1}
  1358. jnz {label,1f}
  1359. inx %a
  1360. 1: yields %a
  1361. with hl_or_de
  1362. uses hl_or_de={const2,0}, areg
  1363. gen mov a,%1.2
  1364. cpi {const1,$1}
  1365. jnz {label,1f}
  1366. mov a,%1.1
  1367. ora a
  1368. jnz {label,1f}
  1369. inx %a
  1370. 1: yields %a
  1371. pat loc cmi tne $1>=0 && $1<=255 && $2==2
  1372. with exact areg
  1373. uses hl_or_de={const2,0}
  1374. gen cpi {const1,$1}
  1375. jz {label,1f}
  1376. inx %a
  1377. 1: yields %a
  1378. with hl_or_de
  1379. uses hl_or_de={const2,1}, areg
  1380. gen mov a,%1.2
  1381. cpi {const1,$1}
  1382. jnz {label,1f}
  1383. mov a,%1.1
  1384. ora a
  1385. jnz {label,1f}
  1386. dcx %a
  1387. 1: yields %a
  1388. pat loc cmi $1>=0 && $1<=255 && $2==2
  1389. with exact areg
  1390. uses hl_or_de
  1391. gen sui {const1,$1}
  1392. mov %a.2,a
  1393. rar.
  1394. mov %a.1,a yields %a
  1395. with yields {const2,$1}
  1396. leaving cmi 2
  1397. pat loc cmi $1<0 && $2==2
  1398. with exact areg yields {const2,0-1}
  1399. with yields {const2,$1}
  1400. leaving cmi 2
  1401. /*******************************************/
  1402. /* Group 13: Branch instructions */
  1403. /*******************************************/
  1404. pat loc beq $1>=0 && $1<=255
  1405. with exact reg
  1406. uses reusing %1, areg=%1
  1407. gen cpi {const1,$1}
  1408. jz {label,$2}
  1409. with yields {const2,$1}
  1410. leaving beq $2
  1411. pat loc bne $1>=0 && $1<=255
  1412. with exact reg
  1413. uses reusing %1, areg=%1
  1414. gen cpi {const1,$1}
  1415. jnz {label,$2}
  1416. with yields {const2,$1}
  1417. leaving bne $2
  1418. pat bra
  1419. with STACK
  1420. gen jmp {label,$1}
  1421. pat blt
  1422. with hl_or_de hl_or_de STACK
  1423. uses areg
  1424. gen mov a,%2.2
  1425. sub %1.2
  1426. mov a,%2.1
  1427. sbb %1.1
  1428. jm {label,$1}
  1429. pat ble
  1430. with hl_or_de hl_or_de STACK
  1431. uses areg
  1432. gen mov a,%1.2
  1433. sub %2.2
  1434. mov a,%1.1
  1435. sbb %2.1
  1436. jp {label,$1}
  1437. pat beq
  1438. with hl_or_de hl_or_de STACK
  1439. uses areg
  1440. gen mov a,%2.2
  1441. cmp %1.2
  1442. jnz {label,1f}
  1443. mov a,%2.1
  1444. cmp %1.1
  1445. jz {label,$1}
  1446. 1:
  1447. pat bne
  1448. with hl_or_de hl_or_de STACK
  1449. uses areg
  1450. gen mov a,%2.2
  1451. cmp %1.2
  1452. jnz {label,$1}
  1453. mov a,%2.1
  1454. cmp %1.1
  1455. jnz {label,$1}
  1456. pat bge
  1457. with hl_or_de hl_or_de STACK
  1458. uses areg
  1459. gen mov a,%2.2
  1460. sub %1.2
  1461. mov a,%2.1
  1462. sbb %1.1
  1463. jp {label,$1}
  1464. pat bgt
  1465. with hl_or_de hl_or_de STACK
  1466. uses areg
  1467. gen mov a,%1.2
  1468. sub %2.2
  1469. mov a,%1.1
  1470. sbb %2.1
  1471. jm {label,$1}
  1472. pat zlt
  1473. with STACK
  1474. gen pop psw
  1475. ora a
  1476. jm {label,$1}
  1477. with hl_or_de STACK
  1478. gen mov a,%1.1
  1479. ora a
  1480. jm {label,$1}
  1481. pat zle
  1482. with hl_or_de STACK
  1483. uses areg
  1484. gen xra a
  1485. add %1.1
  1486. jm {label,$1}
  1487. jnz {label,1f}
  1488. xra a
  1489. add %1.2
  1490. jz {label,$1}
  1491. 1:
  1492. pat zeq
  1493. with hl_or_de STACK
  1494. uses areg
  1495. gen mov a,%1.1
  1496. ora %1.2
  1497. jz {label,$1}
  1498. pat zne
  1499. with hl_or_de STACK
  1500. uses areg
  1501. gen mov a,%1.1
  1502. ora %1.2
  1503. jnz {label,$1}
  1504. pat zge
  1505. with STACK
  1506. gen pop psw
  1507. ral.
  1508. jnc {label,$1}
  1509. with hl_or_de STACK
  1510. gen mov a,%1.1
  1511. ora a
  1512. jp {label,$1}
  1513. pat zgt
  1514. with hl_or_de STACK
  1515. uses areg
  1516. gen xra a
  1517. add %1.1
  1518. jm {label,1f}
  1519. jnz {label,$1}
  1520. xra a
  1521. add %1.2
  1522. jnz {label,$1}
  1523. 1:
  1524. pat lol zeq
  1525. with STACK
  1526. uses hlreg={const2,$1}, areg
  1527. gen dad lb
  1528. mov a,{m}
  1529. inx hl
  1530. ora {m}
  1531. jz {label,$2}
  1532. pat lol zne
  1533. with STACK
  1534. uses hlreg={const2,$1}, areg
  1535. gen dad lb
  1536. mov a,{m}
  1537. inx hl
  1538. ora {m}
  1539. jnz {label,$2}
  1540. pat ior zeq $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. jz {label,$2}
  1548. pat ior zne $1==2
  1549. with hl_or_de hl_or_de STACK
  1550. uses areg
  1551. gen mov a,%1.1
  1552. ora %1.2
  1553. ora %2.1
  1554. ora %2.2
  1555. jnz {label,$2}
  1556. /*********************************************/
  1557. /* Group 14: Procedure call instructions */
  1558. /*********************************************/
  1559. pat cal
  1560. kills ALL
  1561. gen Call {label,$1}
  1562. pat cai
  1563. with hlreg
  1564. kills ALL
  1565. uses dereg
  1566. gen lxi de,{label,1f}
  1567. push de
  1568. pchl.
  1569. 1:
  1570. pat lfr $1==2 yields de
  1571. pat lfr $1<=8
  1572. with STACK
  1573. uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
  1574. gen 1:
  1575. dcx hl
  1576. mov d,{m}
  1577. dcx hl
  1578. mov e,{m}
  1579. push de
  1580. dcr a
  1581. jnz {label,1b}
  1582. pat lfr ret $1==$2 leaving ret 0
  1583. pat ret $1==0
  1584. with STACK
  1585. uses hlreg
  1586. gen move lb,hl
  1587. sphl.
  1588. pop lb
  1589. ret.
  1590. pat ret $1==2
  1591. with dereg STACK
  1592. uses hlreg
  1593. gen move lb,hl
  1594. sphl.
  1595. pop lb
  1596. ret.
  1597. pat ret $1<=8
  1598. with STACK
  1599. uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
  1600. gen 1:
  1601. pop de
  1602. mov {m},e
  1603. inx hl
  1604. mov {m},d
  1605. inx hl
  1606. dcr a
  1607. jnz {label,1b}
  1608. move lb,hl
  1609. sphl.
  1610. pop lb
  1611. ret.
  1612. /******************************************/
  1613. /* Group 15: Miscellaneous */
  1614. /******************************************/
  1615. pat asp $1<=0-6
  1616. with STACK
  1617. uses hlreg={const2,$1}
  1618. gen dad sp
  1619. sphl.
  1620. pat asp $1==0-4
  1621. with STACK
  1622. gen dcx sp
  1623. dcx sp
  1624. dcx sp
  1625. dcx sp
  1626. pat asp $1==0-2
  1627. with STACK
  1628. gen dcx sp
  1629. dcx sp
  1630. pat asp $1==0 /* do nothing */
  1631. pat asp $1==2
  1632. with exact src1or2
  1633. with STACK
  1634. gen inx sp
  1635. inx sp
  1636. pat asp $1==4
  1637. with exact src1or2 leaving asp 2
  1638. with STACK
  1639. gen inx sp
  1640. inx sp
  1641. inx sp
  1642. inx sp
  1643. pat asp $1>=6
  1644. with exact src1or2 leaving asp $1-2
  1645. with STACK
  1646. uses hlreg={const2,$1}
  1647. gen dad sp
  1648. sphl.
  1649. pat ass $1==2
  1650. with hlreg STACK
  1651. gen dad sp
  1652. sphl.
  1653. pat blm
  1654. kills ALL
  1655. uses dereg={const2,$1}
  1656. gen Call {label,".blm"}
  1657. pat bls
  1658. with dereg
  1659. kills ALL
  1660. gen Call {label,".blm"}
  1661. pat csa
  1662. kills ALL
  1663. gen jmp {label,".csa"}
  1664. pat csb
  1665. kills ALL
  1666. gen jmp {label,".csb"}
  1667. pat dch leaving loi 2
  1668. pat dup $1==2
  1669. with src1or2 yields %1 %1
  1670. pat dup $1==4
  1671. with src1or2 src1or2 yields %2 %1 %2 %1
  1672. pat dup
  1673. kills ALL
  1674. uses dereg={const2,$1}
  1675. gen Call {label,".dup"}
  1676. pat dus $1==2
  1677. with dereg
  1678. kills ALL
  1679. gen Call {label,".dup"}
  1680. pat exg $1==2
  1681. with src1or2 src1or2 yields %1 %2
  1682. pat exg defined($1)
  1683. kills ALL
  1684. uses dereg={const2,1}
  1685. gen Call {label,".exg"}
  1686. pat fil
  1687. uses hlreg={label,$1}
  1688. gen shld {label,"hol0"+4}
  1689. pat gto
  1690. with STACK
  1691. gen lhld {label,$1+2}
  1692. sphl.
  1693. lhld {label,$1+4}
  1694. move hl,lb
  1695. lhld {label,$1}
  1696. pchl.
  1697. pat lim
  1698. uses hlreg
  1699. gen lhld {label,".ignmask"} yields hl
  1700. pat lin
  1701. uses hlreg={const2,$1}
  1702. gen shld {label,"hol0"}
  1703. pat lni
  1704. uses hlreg
  1705. gen lhld {label,"hol0"}
  1706. inx hl
  1707. shld {label,"hol0"}
  1708. pat lor $1==0 yields lb
  1709. pat lor $1==1
  1710. with STACK
  1711. uses hlreg={const2,0}
  1712. gen dad sp yields hl
  1713. pat lor $1==2
  1714. uses hlreg
  1715. gen lhld {label,".reghp"} yields hl
  1716. pat lpb leaving adp SL
  1717. pat mon
  1718. kills ALL
  1719. gen Call {label,".mon"}
  1720. pat nop
  1721. kills ALL
  1722. #ifdef DEBUG
  1723. gen Call {label,".nop"}
  1724. #endif
  1725. pat rck
  1726. with hl_or_de STACK
  1727. pat rtt leaving ret 0
  1728. pat sig
  1729. with dereg
  1730. uses hlreg
  1731. gen lhld {label,".trapproc"}
  1732. xchg.
  1733. shld {label,".trapproc"} yields de
  1734. with STACK
  1735. uses hlreg
  1736. gen lhld {label,".trapproc"}
  1737. xthl.
  1738. shld {label,".trapproc"}
  1739. pat sim
  1740. with hlreg
  1741. gen shld {label,".ignmask"}
  1742. pat str $1==0
  1743. with localbase
  1744. pat str $1==1
  1745. with hlreg
  1746. gen sphl.
  1747. pat str $1==2
  1748. with hlreg
  1749. gen shld {label,".reghp"}
  1750. pat trp
  1751. kills ALL
  1752. gen Call {label,".trp"}