table 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752
  1. "$Header$"
  2. /*
  3. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. *
  5. * This product is part of the Amsterdam Compiler Kit.
  6. *
  7. * Permission to use, sell, duplicate or disclose this software must be
  8. * obtained in writing. Requests for such permissions may be sent to
  9. *
  10. * Dr. Andrew S. Tanenbaum
  11. * Wiskundig Seminarium
  12. * Vrije Universiteit
  13. * Postbox 7161
  14. * 1007 MC Amsterdam
  15. * The Netherlands
  16. *
  17. */
  18. /***********************************************************************
  19. ***** *****
  20. ***** 6 8 0 0 0 B A C K E N D T A B L E S *****
  21. ***** *****
  22. ***********************************************************************/
  23. /*
  24. * INTEGER SIZE: 16 bits
  25. * POINTER SIZE: 32 bits
  26. */
  27. #define REGVARS
  28. EM_WSIZE = 2
  29. EM_PSIZE = 4
  30. EM_BSIZE = 8
  31. /***************************
  32. ** R E G I S T E R S **
  33. ***************************/
  34. REGISTERS:
  35. D0 = ("d0",2) DATAREG.
  36. D1 = ("d1",2) DATAREG.
  37. D2 = ("d2",2) DATAREG.
  38. /* Note: the order of the registers is important: it is used by
  39. * the .gto routine in the tail_em library.
  40. */
  41. #ifdef REGVARS
  42. D7 = ("d7",2) regvar, DATAREG.
  43. D6 = ("d6",2) regvar, DATAREG.
  44. D5 = ("d5",2) regvar, DATAREG.
  45. D4 = ("d4",2) regvar, DATAREG.
  46. D3 = ("d3",2) regvar, DATAREG.
  47. #else
  48. D3 = ("d3",2) DATAREG.
  49. D4 = ("d4",2) DATAREG.
  50. D5 = ("d5",2) DATAREG.
  51. D6 = ("d6",2) DATAREG.
  52. D7 = ("d7",2) DATAREG.
  53. #endif
  54. #ifndef REGVARS
  55. DD7 = ("d7",4,D7) DATAREG4.
  56. DD6 = ("d6",4,D6) DATAREG4.
  57. DD5 = ("d5",4,D5) DATAREG4.
  58. DD4 = ("d4",4,D4) DATAREG4.
  59. DD3 = ("d3",4,D3) DATAREG4.
  60. #endif
  61. DD2 = ("d2",4,D2) DATAREG4.
  62. DD1 = ("d1",4,D1) DATAREG4.
  63. DD0 = ("d0",4,D0) DATAREG4.
  64. A0 = ("a0",4) ADDREG.
  65. A1 = ("a1",4) ADDREG.
  66. #ifdef REGVARS
  67. A5 = ("a5",4) regvar(pointer), ADDREG.
  68. A4 = ("a4",4) regvar(pointer), ADDREG.
  69. A3 = ("a3",4) regvar(pointer), ADDREG.
  70. A2 = ("a2",4) regvar(pointer), ADDREG.
  71. #else
  72. A2 = ("a2",4) ADDREG.
  73. A3 = ("a3",4) ADDREG.
  74. A4 = ("a4",4) ADDREG.
  75. A5 = ("a5",4) ADDREG.
  76. #endif
  77. LB = ("a6",4) LOCALBASE.
  78. /*****************
  79. ** T O K E N S **
  80. *****************/
  81. TOKENS:
  82. IADDREG = {REGISTER reg;} 2 cost=(0,2) "(%[reg])"
  83. /* indirect address reg. */
  84. IADDREG1 = {REGISTER reg;} 2 cost=(0,2) "(%[reg])"
  85. DISPL = {REGISTER reg;
  86. INT dis;} 2 cost=(2,4) "%[dis](%[reg])"
  87. /* displacement */
  88. DISPL1 = {REGISTER reg;
  89. INT dis;} 2 cost=(2,4) "%[dis](%[reg])"
  90. INDEXED = {REGISTER reg,ireg;
  91. INT di;} 2 cost=(2,5) "%[di](%[reg],%[ireg].w)"
  92. ABS = {STRING addr;} 2 cost=(3,5) "%[addr]"
  93. ABS1 = {STRING addr;} 2 cost=(3,5) "%[addr]"
  94. IMMEDIATE = {INT cc;} 2 cost=(1,2) "#%[cc]"
  95. LOCAL_ADDR = {INT off;} 4 /* not really addressable */
  96. REGOFF_ADDR = {REGISTER reg;
  97. INT off;} 4 /* not really addressable */
  98. EXTERNAL_ADDR = {STRING off;} 4 cost=(4,4) "#%[off]"
  99. INDEX_ADDR = {REGISTER reg,ireg;
  100. INT di;} 4
  101. IADDREG4 = {REGISTER reg;} 4 cost=(0,4) "(%[reg])" /* indirect address reg. */
  102. DISPL4 = {REGISTER reg;
  103. INT dis;} 4 cost=(2,6) "%[dis](%[reg])" /* disisplacement */
  104. INDEXED4 = {REGISTER reg,ireg;
  105. INT di;} 4 cost=(2,7) "%[di](%[reg],%[ireg].w)"
  106. /* The ABS addressing mode requires either 1 or 2 words of extension.
  107. * We just use the average (1.5 words=2bytes). The access time is either
  108. * 4 or 6 cycles, so we use 5.
  109. */
  110. ABS4 = {STRING addr;} 4 cost=(3,7) "%[addr]"
  111. IMMEDIATE4 = {INT cc;} 4 cost=(4,4) "#%[cc]"
  112. DOUBLE = {STRING cc;} 4 cost=(4,4) "#%[cc]"
  113. DOUBLEZERO = { } 4
  114. /*************************************
  115. ** T O K E N E X P R E S S I O N S **
  116. *************************************/
  117. TOKENEXPRESSIONS:
  118. DATA = DATAREG + IADDREG + DISPL + INDEXED +
  119. ABS + IMMEDIATE
  120. MEMORY = DATA - DATAREG
  121. CONTROL = MEMORY - IMMEDIATE
  122. ALTERABLE = DATAREG + IADDREG + DISPL +
  123. INDEXED + ABS
  124. ANY = DATA + MEMORY + CONTROL + ALTERABLE
  125. DATA_ALT = DATA * ALTERABLE
  126. ALT_MEM = ALTERABLE * MEMORY
  127. DATASCR = DATAREG * SCRATCH
  128. ADDSCR = ADDREG * SCRATCH
  129. MEM_ALL = ALL - DATAREG - DATAREG4 - ADDREG - IMMEDIATE - IMMEDIATE4
  130. - LOCAL_ADDR -REGOFF_ADDR - EXTERNAL_ADDR - DOUBLE - DOUBLEZERO
  131. ALL_ACCESSIBLE = IADDREG + IADDREG4 + IADDREG1 + INDEXED + INDEXED4
  132. ANY1 = DISPL1 + ABS1 + IADDREG1
  133. DATA_ALT1 = ANY1
  134. DATA_ALT_1OR2 = DATA_ALT + DATA_ALT1
  135. REG4 = DATAREG4 + ADDREG
  136. DATA4 = DATAREG4 + IADDREG4 + DISPL4 + INDEXED4 +
  137. ABS4 + IMMEDIATE4 + DOUBLE
  138. MEMORY4 = DATA4 - DATAREG4
  139. CONTROL4 = MEMORY4 - IMMEDIATE4 - DOUBLE
  140. ALTERABLE4 = DATAREG4 + ADDREG + IADDREG4 + DISPL4 +
  141. INDEXED4 + ABS4
  142. ANY4 = DATA4 + MEMORY4 + CONTROL4 + ALTERABLE4 + LOCALBASE +
  143. EXTERNAL_ADDR
  144. DATA_ALT4 = DATA4 * ALTERABLE4
  145. ALT_MEM4 = ALTERABLE4 * MEMORY4
  146. DATASCR4 = DATAREG4 * SCRATCH
  147. /*************
  148. ** C O D E **
  149. *************/
  150. CODE:
  151. /* G R O U P I : L O A D S */
  152. loc | | | {IMMEDIATE,$1} | |
  153. loc loc $1==0 && $2==0 | | | {DOUBLEZERO} | |
  154. ldc | | | {DOUBLE, $1} | |
  155. #ifdef REGVARS
  156. lol inreg($1)==2 | | | regvar($1) | |
  157. #endif
  158. lol | | | {DISPL,LB,$1} | |
  159. #ifdef REGVARS
  160. ldl inreg($1)==2 | | | regvar($1) | |
  161. #endif
  162. ldl | | | {DISPL4,LB,$1} | |
  163. loe | | | {ABS,$1} | |
  164. lde | | | {ABS4,$1} | |
  165. #ifdef REGVARS
  166. lil inreg($1) == 2 | | | {IADDREG, regvar($1)} | |
  167. #endif
  168. lil | | allocate(ADDREG = {DISPL4,LB,$1})| {IADDREG,%[a]} | |
  169. lof | ADDREG | | {DISPL,%[1],$1} | |
  170. ... | nocoercions: EXTERNAL_ADDR | | {ABS,%[1.off]+"+"+tostring($1)} | |
  171. ... | nocoercions: LOCAL_ADDR | | {DISPL,LB,%[1.off]+$1} | |
  172. ... | nocoercions: REGOFF_ADDR | | {DISPL,%[1.reg],%[1.off]+$1} | |
  173. ldf | ADDREG | | {DISPL4,%[1],$1} | |
  174. ... | nocoercions: EXTERNAL_ADDR | | {ABS4,%[1.off]+"+"+tostring($1)} | |
  175. ... | nocoercions: LOCAL_ADDR | | {DISPL4,LB,%[1.off]+$1} | |
  176. ... | nocoercions: REGOFF_ADDR | | {DISPL4,%[1.reg],%[1.off]+$1} | |
  177. lal | | | {LOCAL_ADDR,$1} | |
  178. | LOCAL_ADDR | allocate(ADDREG)
  179. "lea %[1.off](a6),%[a]"
  180. samecc | %[a] | |
  181. | REGOFF_ADDR | allocate(ADDREG)
  182. "lea %[1.off](%[1.reg]),%[a]"
  183. samecc | %[a] | |
  184. lae | | | {EXTERNAL_ADDR,$1} | |
  185. | EXTERNAL_ADDR | allocate(ADDREG)
  186. "lea %[1.off],%[a]"
  187. samecc | %[a] | | (3,5)
  188. /* For the lxl and lxa instructions we assume that the static link
  189. * (i.e. a pointer to the LB of the lexically enclosing subprogram)
  190. * is passed as zero-th actual parameter. The distance (in bytes)
  191. * between LB and the zero-th parameter is the constant EM_BSIZE
  192. */
  193. lxl $1 == 0 | | | LB | |
  194. lxl $1 == 1 | | | {DISPL4,LB,8} | |
  195. lxl $1>1 | |
  196. allocate(ADDREG,DATAREG = {IMMEDIATE,$1-1})
  197. "move.l a6,%[a]"
  198. "1:"
  199. "move.l 8(%[a]),%[a]"
  200. "dbf %[b],1b"
  201. erase(%[b]) | %[a] | |
  202. lxa $1 == 0 | |
  203. allocate(ADDREG = {IMMEDIATE4,8})
  204. "add.l a6,%[a]"
  205. erase(%[a]) | %[a] | |
  206. lxa $1 > 0 | |
  207. allocate(ADDREG, DATAREG = {IMMEDIATE,$1-1})
  208. "move.l a6,%[a]"
  209. "1:"
  210. "move.l 8(%[a]),%[a]"
  211. "dbf %[b],1b"
  212. "add.l #8,%[a]"
  213. erase(%[b]) | %[a] | |
  214. loi $1 == 1 | ADDREG | | {IADDREG1, %[1]} | |
  215. ... | nocoercions: LOCAL_ADDR | | {DISPL1,LB,%[1.off]} | |
  216. ... | nocoercions: REGOFF_ADDR | | {DISPL1,%[1.reg],%[1.off]} | |
  217. ... | nocoercions: EXTERNAL_ADDR | | {ABS1,%[1.off]} | |
  218. loi $1 == 2 | ADDREG | | {IADDREG,%[1]} | |
  219. loi $1 == 4 | ADDREG | | {IADDREG4,%[1]} | |
  220. lal loi $2 == 6 | | remove(ALL)
  221. "move.w $1+4(a6),-(sp)"
  222. "move.l $1(a6),-(sp)" | | |
  223. lal loi $2 == 8 | | remove(ALL)
  224. "move.l $1+4(a6),-(sp)"
  225. "move.l $1(a6),-(sp)" | | |
  226. lae loi $2 == 6 | | remove(ALL)
  227. "move.w $1+4,-(sp)"
  228. "move.l $1,-(sp)" | | |
  229. lae loi $2 == 8 | | remove(ALL)
  230. "move.l $1+4,-(sp)"
  231. "move.l $1,-(sp)" | | |
  232. loi $1 == 6 | ADDREG | | {DISPL,%[1],4} {IADDREG4,%[1]} | |
  233. loi $1 == 8 | ADDREG | | {DISPL4,%[1],4} {IADDREG4,%[1]} | |
  234. loi $1 > 8 | ADDSCR | remove(ALL)
  235. allocate(DATAREG4= {IMMEDIATE4,$1/2-1})
  236. "add.l #$1,%[1]"
  237. "1:"
  238. "move.w -(%[1]),-(sp)"
  239. "dbf %[a],1b"
  240. erase(%[a]) | | |
  241. ... | nocoercions: LOCAL_ADDR |
  242. remove(ALL)
  243. allocate(DATAREG4 = {IMMEDIATE4,$1/2-1},
  244. ADDREG)
  245. "lea %[1.off]+$1(a6),%[b]"
  246. "1:"
  247. "move.w -(%[b]),-(sp)"
  248. "dbf %[a],1b"
  249. erase(%[a]) | | |
  250. ... | nocoercions: EXTERNAL_ADDR |
  251. remove(ALL)
  252. allocate(DATAREG4={IMMEDIATE4,$1/2-1},
  253. ADDREG)
  254. "lea %[1.off]+$1,%[b]"
  255. "1:"
  256. "move.w -(%[b]),-(sp)"
  257. "dbf %[a],1b"
  258. erase(%[a]) | | |
  259. los $1 == 2 | |
  260. remove(ALL)
  261. "jsr .los" | | |
  262. lpi | | | {EXTERNAL_ADDR,$1} | |
  263. /* G R O U P II : S T O R E S */
  264. /* A store instruction can always corrupt part of the fakestack,
  265. * so some items of the stack have to be removed (i.e. pushed on
  266. * the real stack or stored in a register). Registers on the
  267. * fakestack will never be corrupted, because they can never be
  268. * the destination.
  269. * For most store instructions (e.g. sil,stf) we have hardly any
  270. * idea what the destination will be, so everything on the
  271. * fakestack (except registers) is removed (i.e. remove(MEM_ALL)).
  272. * For a stl,sdl,ste and sde we remove only those items that may
  273. * be affected, assuming that a stl only affects locals and a
  274. * ste only affects externals. Care has to be taken that doubles
  275. * and singles may overlap, e.g. "lol 6 sdl 4".
  276. * Furthermore, stacktoken instances that resulted from a lof,lif
  277. * or loi may be corrupted too.
  278. */
  279. #ifdef REGVARS
  280. stl inreg($1)==2 | nocoercions: ANY | remove(regvar($1))
  281. move(%[1],regvar($1)) | | |
  282. ... | STACK |
  283. "move.w (sp)+,%(regvar($1)%)" | | |
  284. #endif
  285. stl | nocoercions: ANY | remove(DISPL,%[reg] == LB && %[dis] == $1)
  286. remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
  287. %[dis] == $1))
  288. remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
  289. %[dis] == $1+1))
  290. remove(DISPL,%[reg] != LB)
  291. remove(DISPL4,%[reg] != LB)
  292. remove(DISPL1,%[reg] != LB)
  293. remove(ALL_ACCESSIBLE)
  294. move(%[1],{DISPL,LB,$1}) | | |
  295. ... | STACK |
  296. "move.w (sp)+,$1(a6)" | | |
  297. ste | ANY |
  298. remove(ABS)
  299. remove(ABS4)
  300. remove(ABS1)
  301. remove(DISPL,%[reg] != LB)
  302. remove(DISPL4,%[reg] != LB)
  303. remove(DISPL1,%[reg] != LB)
  304. remove(ALL_ACCESSIBLE)
  305. move(%[1],{ABS,$1}) | | |
  306. #ifdef REGVARS
  307. sil inreg($1)==2 | ANY | remove(MEM_ALL)
  308. move(%[1],{IADDREG,regvar($1)}) | | |
  309. #endif
  310. sil | ANY | allocate(ADDREG={DISPL4,LB,$1})
  311. remove(MEM_ALL)
  312. move(%[1],{IADDREG,%[a]})
  313. setcc({IADDREG,%[a]}) | | |
  314. stf | ADDREG ANY | remove(MEM_ALL)
  315. move(%[2],{DISPL,%[1],$1}) | | |
  316. sti $1 == 1
  317. | ADDREG DATAREG |
  318. remove(MEM_ALL)
  319. move(%[2], {IADDREG1,%[1]}) | | |
  320. ... | ADDREG IADDREG |
  321. remove(MEM_ALL)
  322. move({DISPL,%[2.reg],1}, {IADDREG1,%[1]}) | | |
  323. ... | ADDREG DISPL |
  324. remove(MEM_ALL)
  325. move({DISPL,%[2.reg],%[2.dis]+1}, {IADDREG1,%[1]}) | | |
  326. ... | ADDREG INDEXED |
  327. remove(MEM_ALL)
  328. move({INDEXED,%[2.reg],%[2.ireg],%[2.di]+1},
  329. {IADDREG1,%[1]}) | | |
  330. ... | ADDREG ABS |
  331. remove(MEM_ALL)
  332. move({ABS,%[2.addr]+"+1"}, {IADDREG1,%[1]}) | | |
  333. ... | ADDREG IMMEDIATE |
  334. remove(MEM_ALL)
  335. move({IMMEDIATE,(%[2.cc]-((%[2.cc]>>8)<<8)+128)%256-128},
  336. {IADDREG1,%[1]}) | | |
  337. ... | ADDREG ANY1 |
  338. remove(MEM_ALL)
  339. move(%[2],{IADDREG1,%[1]}) | | |
  340. ... | nocoercions: LOCAL_ADDR DATAREG |
  341. remove(MEM_ALL)
  342. move(%[2], {DISPL1,LB,%[1.off]}) | | |
  343. ... | nocoercions: LOCAL_ADDR IADDREG |
  344. remove(MEM_ALL)
  345. move({DISPL,%[2.reg],1}, {DISPL1,LB,%[1.off]}) | | |
  346. ... | nocoercions: LOCAL_ADDR DISPL |
  347. remove(MEM_ALL)
  348. move({DISPL,%[2.reg],%[2.dis]+1}, {DISPL1,LB,%[1.off]}) | | |
  349. ... | nocoercions: LOCAL_ADDR INDEXED |
  350. remove(MEM_ALL)
  351. move({INDEXED,%[2.reg],%[2.ireg],%[2.di]+1},
  352. {DISPL1,LB,%[1.off]}) | | |
  353. ... | nocoercions: LOCAL_ADDR ABS |
  354. remove(MEM_ALL)
  355. move({ABS,%[2.addr]+"+1"}, {DISPL1,LB,%[1.off]}) | | |
  356. ... | nocoercions: LOCAL_ADDR IMMEDIATE |
  357. remove(MEM_ALL)
  358. move({IMMEDIATE,(%[2.cc]-((%[2.cc]>>8)<<8)+128)%256-128},
  359. {DISPL1,LB,%[1.off]}) | | |
  360. ... | nocoercions: LOCAL_ADDR ANY1 |
  361. remove(MEM_ALL)
  362. move(%[2],{DISPL1,LB,%[1.off]}) | | |
  363. ... | nocoercions: REGOFF_ADDR DATAREG |
  364. remove(MEM_ALL)
  365. move(%[2], {DISPL1,%[1.reg],%[1.off]}) | | |
  366. ... | nocoercions: REGOFF_ADDR IADDREG |
  367. remove(MEM_ALL)
  368. move({DISPL,%[2.reg],1}, {DISPL1,%[1.reg],%[1.off]}) | | |
  369. ... | nocoercions: REGOFF_ADDR DISPL |
  370. remove(MEM_ALL)
  371. move({DISPL,%[2.reg],%[2.dis]+1}, {DISPL1,%[1.reg],%[1.off]}) | | |
  372. ... | nocoercions: REGOFF_ADDR INDEXED |
  373. remove(MEM_ALL)
  374. move({INDEXED,%[2.reg],%[2.ireg],%[2.di]+1},
  375. {DISPL1,%[1.reg],%[1.off]}) | | |
  376. ... | nocoercions: REGOFF_ADDR ABS |
  377. remove(MEM_ALL)
  378. move({ABS,%[2.addr]+"+1"}, {DISPL1,%[1.reg],%[1.off]}) | | |
  379. ... | nocoercions: REGOFF_ADDR IMMEDIATE |
  380. remove(MEM_ALL)
  381. move({IMMEDIATE,(%[2.cc]-((%[2.cc]>>8)<<8)+128)%256-128},
  382. {DISPL1,%[1.reg],%[1.off]}) | | |
  383. ... | nocoercions: REGOFF_ADDR ANY1 |
  384. remove(MEM_ALL)
  385. move(%[2],{DISPL1,%[1.reg],%[1.off]}) | | |
  386. ... | nocoercions: EXTERNAL_ADDR DATAREG |
  387. remove(MEM_ALL)
  388. move(%[2], {ABS1,%[1.off]}) | | |
  389. ... | nocoercions: EXTERNAL_ADDR IADDREG |
  390. remove(MEM_ALL)
  391. move({DISPL,%[2.reg],1}, {ABS1,%[1.off]}) | | |
  392. ... | nocoercions: EXTERNAL_ADDR DISPL |
  393. remove(MEM_ALL)
  394. move({DISPL,%[2.reg],%[2.dis]+1}, {ABS1,%[1.off]}) | | |
  395. ... | nocoercions: EXTERNAL_ADDR INDEXED |
  396. remove(MEM_ALL)
  397. move({INDEXED,%[2.reg],%[2.ireg],%[2.di]+1},
  398. {ABS1,%[1.off]}) | | |
  399. ... | nocoercions: EXTERNAL_ADDR ABS |
  400. remove(MEM_ALL)
  401. move({ABS,%[2.addr]+"+1"}, {ABS1,%[1.off]}) | | |
  402. ... | nocoercions: EXTERNAL_ADDR IMMEDIATE |
  403. remove(MEM_ALL)
  404. move({IMMEDIATE,(%[2.cc]-((%[2.cc]>>8)<<8)+128)%256-128},
  405. {ABS1,%[1.off]}) | | |
  406. ... | nocoercions: EXTERNAL_ADDR ANY1 |
  407. remove(MEM_ALL)
  408. move(%[2],{ABS1,%[1.off]}) | | |
  409. sti $1 == 2 | ADDREG ANY | remove(MEM_ALL)
  410. move(%[2],{IADDREG,%[1]}) | | |
  411. sti $1 == 4 | ADDREG ANY4 | remove(MEM_ALL)
  412. move(%[2],{IADDREG4,%[1]}) | | |
  413. sti $1 > 4 | ADDREG | remove(ALL)
  414. allocate(DATAREG4={IMMEDIATE4,$1/2-1})
  415. "1:"
  416. "move.w (sp)+,(%[1])+"
  417. "dbf %[a], 1b"
  418. setcc({IADDREG,%[1]}) | | |
  419. sts $1 == 2 | | remove(ALL)
  420. "jsr .sts"
  421. | | |
  422. #ifdef REGVARS
  423. sdl inreg($1)==2 | nocoercions: ANY4 | remove(regvar($1))
  424. move (%[1],regvar($1)) | | |
  425. ... | STACK |
  426. "move.l (sp)+,%(regvar($1)%)" | | |
  427. #endif
  428. sdl | nocoercions: ANY4 |
  429. remove(DISPL,%[reg] == LB && (%[dis] == $1 || %[dis] == $1+2))
  430. remove(DISPL4,%[reg] == LB && (%[dis] >= $1-2 &&
  431. %[dis] <= $1+2))
  432. remove(DISPL1,%[reg] == LB && (%[dis] >= $1 &&
  433. %[dis] <= $1+3))
  434. remove(DISPL,%[reg] != LB)
  435. remove(DISPL4,%[reg] != LB)
  436. remove(DISPL1,%[reg] != LB)
  437. remove(ALL_ACCESSIBLE)
  438. move(%[1],{DISPL4,LB,$1}) | | |
  439. ... | STACK |
  440. "move.l (sp)+,$1(a6)" | | |
  441. sde | ANY4 |
  442. remove(ABS)
  443. remove(ABS4)
  444. remove(ABS1)
  445. remove(DISPL,%[reg] != LB)
  446. remove(DISPL4,%[reg] != LB)
  447. remove(DISPL1,%[reg] != LB)
  448. remove(ALL_ACCESSIBLE)
  449. move(%[1],{ABS4,$1}) | | |
  450. sdf | ADDREG ANY4 | remove(MEM_ALL)
  451. move(%[2],{DISPL4,%[1],$1}) | | |
  452. #ifdef REGVARS
  453. /* R U L E S F O R R E G I S T E R V A R I A B L E S */
  454. /* Note that these rules should come before the normal patterns for
  455. * local variables that are not register-variables.
  456. */
  457. ldl ldl adp sdl loi $1==$2 && $2==$4 && inreg($1)==2 && $3==1 && $5==1 | |
  458. allocate(DATAREG={IMMEDIATE,0})
  459. remove(regvar($1))
  460. "move.b (%(regvar($1)%))+,%[a]" | %[a] | |
  461. ldl ldl adp sdl loi $1==$2 && $2==$4 && inreg($1)==2 && $3==2 && $5==2 | |
  462. allocate(DATAREG)
  463. remove(regvar($1))
  464. "move.w (%(regvar($1)%))+,%[a]" | %[a] | |
  465. ldl ldl adp sdl sti $1==$2 && $2==$4 && inreg($1)==2 && $3==1 && $5==1 | DATAREG |
  466. remove(regvar($1))
  467. "move.b %[1],(%(regvar($1)%))+" | | |
  468. ldl ldl adp sdl sti $1==$2 && $2==$4 && inreg($1)==2 && $3==2 && $5==2 | ANY |
  469. remove(regvar($1))
  470. "move.w %[1],(%(regvar($1)%))+" | | |
  471. ldl ldl adp sdl $1==$2 && $2==$4 && inreg($1)==2 | |
  472. allocate(ADDREG=regvar($1)) | %[a]
  473. | ldl $2 adp $3 sdl $2 |
  474. lol inl $1==$2 && inreg($1)==2 | |
  475. allocate(DATAREG=regvar($1)) | %[a]
  476. | inl $2 |
  477. lol inl $1==$2 | |
  478. allocate(DATAREG={DISPL,LB,$1}) | %[a]
  479. | inl $2 |
  480. lol del $1==$2 && inreg($1)==2 | |
  481. allocate(DATAREG=regvar($1)) | %[a]
  482. | del $2 |
  483. lol del $1==$2 | |
  484. allocate(DATAREG={DISPL,LB,$1}) | %[a]
  485. | del $2 |
  486. loe ine $1==$2 | |
  487. allocate(DATAREG={ABS,$1}) | %[a]
  488. | ine $2 |
  489. loe dee $1==$2 | |
  490. allocate(DATAREG={ABS,$1}) | %[a]
  491. | dee $2 |
  492. lol adi stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
  493. remove(regvar($1))
  494. "add.w %[1],%(regvar($1)%)"
  495. erase(regvar($1)) | | |
  496. loc lil adi sil $2 == $4 && $3 == 2 && inreg($2)==2 | |
  497. remove(MEM_ALL)
  498. "add.w #$1,(%(regvar($2)%))" | | |
  499. lil adi sil $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  500. remove(ALL)
  501. "add.w %[1],(%(regvar($1)%))" | | |
  502. ldl ldc adi sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  503. remove(regvar($1))
  504. "add.l #$2,%(regvar($1)%)"
  505. erase(regvar($1)) | | |
  506. ldc ldl adi sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  507. remove(regvar($2))
  508. "add.l #$1,%(regvar($2)%)"
  509. erase(regvar($2)) | | |
  510. ldl adi sdl $1 == $3 && $2 == 4 && inreg($1)==2 | DATAREG4 |
  511. remove(regvar($1))
  512. "add.l %[1],%(regvar($1)%)"
  513. erase(regvar($1)) | | |
  514. lol loc sbi stl $1 == $4 && $3 == 2 && inreg($1)==2 | |
  515. remove(regvar($1))
  516. "sub.w #$2,%(regvar($1)%)"
  517. erase(regvar($1)) | | |
  518. lil loc adi sil $1 == $4 && $3 == 2 && inreg($1)==2 | |
  519. remove(MEM_ALL)
  520. "add.w #$2,(%(regvar($1)%))" | | |
  521. ldl ldc sbi sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  522. remove(regvar($1))
  523. "sub.l #$2,%(regvar($1)%)"
  524. erase(regvar($1)) | | |
  525. lol ngi stl $1 == $3 && $2 == 2 && inreg($1)==2 | |
  526. remove(regvar($1))
  527. "neg.w %(regvar($1)%)"
  528. erase(regvar($1)) | | |
  529. lil ngi sil $1 == $3 && $2 == 2 && inreg($1)==2 | |
  530. remove(MEM_ALL)
  531. "neg.w (%(regvar($1)%))" | | |
  532. lol ngi stl $1 == $3 && $2 == 4 && inreg($1)==2 | |
  533. remove(regvar($1))
  534. "neg.l %(regvar($1)%)"
  535. erase(regvar($1)) | | |
  536. lol loc sli stl $1 == $4 && $2 == 1 && $3 == 2 && inreg($1)==2 | |
  537. remove(regvar($1))
  538. "asl.w #1, %(regvar($1)%)"
  539. erase(regvar($1)) | | |
  540. lol loc sri stl $1 == $4 && $2 == 1 && $3 == 2 && inreg($1)==2 | |
  541. remove(regvar($1))
  542. "asr.w #1,%(regvar($1)%)"
  543. erase(regvar($1)) | | |
  544. lol loc sru stl $1 == $4 && $2 == 1 && $3 == 2 && inreg($1)==2 | |
  545. remove(regvar($1))
  546. "lsr.w #1,%(regvar($1)%)"
  547. erase(regvar($1)) | | |
  548. lol loc adu stl $1 == $4 && $3 == 2 && inreg($1)==2 | |
  549. remove(regvar($1))
  550. "add.w #$2,%(regvar($1)%)"
  551. erase(regvar($1)) | | |
  552. lol adu stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
  553. remove(regvar($1))
  554. "add.w %[1],%(regvar($1)%)"
  555. erase(regvar($1)) | | |
  556. loc lil adu sil $2 == $4 && $3 == 2 && inreg($2)==2 | |
  557. remove(MEM_ALL)
  558. "add.w #$1,(%(regvar($2)%))" | | |
  559. lil adu sil $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  560. remove(MEM_ALL)
  561. "add.w %[1],(%(regvar($1)%))" | | |
  562. ldl ldc adu sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  563. remove(regvar($1))
  564. "add.l #$2,%(regvar($1)%)"
  565. erase(regvar($1)) | | |
  566. ldc ldl adu sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  567. remove(regvar($2))
  568. "add.l #$1,%(regvar($2)%)"
  569. erase(regvar($2)) | | |
  570. ldl adu sdl $1 == $3 && $2 == 4 && inreg($1)==2 | DATAREG4 |
  571. remove(regvar($1))
  572. "add.l %[1],%(regvar($1)%)"
  573. erase(regvar($1)) | | |
  574. lol loc sbu stl $1 == $4 && $3 == 2 && inreg($1)==2 | |
  575. remove(regvar($1))
  576. "sub.w #$2,%(regvar($1)%)"
  577. erase(regvar($1)) | | |
  578. lil loc adu sil $1 == $4 && $3 == 2 && inreg($1)==2 | |
  579. remove(MEM_ALL)
  580. "add.w #$2,(%(regvar($1)%))" | | |
  581. ldl ldc sbu sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  582. remove(regvar($1))
  583. "sub.l #$2,%(regvar($1)%)"
  584. erase(regvar($1)) | | |
  585. lol loc slu stl $1 == $4 && $2 == 1 && $3 == 2 && inreg($1)==2 | |
  586. remove(regvar($1))
  587. "asl.w #1,%(regvar($1)%)"
  588. erase(regvar($1)) | | |
  589. ldl adp sdl $1 == $3 && inreg($1)==2 | | remove(regvar($1))
  590. "add.l #$2,%(regvar($1)%)"
  591. erase(regvar($1)) | | |
  592. ldl adp dup sdl loi inreg($1) == 2 && $1 == $4 && $3 == 4 && $5 == 4 | | | |
  593. ldl $1 adp $2 sdl $1 ldl $1 loi 4 |
  594. ldl loi ldl loi adp ldl sti $2==4&&$4==4&&$7==4&&$1==$3&&$1==$6&&inreg($1)==2
  595. | | remove(MEM_ALL)
  596. allocate(ADDREG = {IADDREG4,regvar($1)})
  597. "add.l #$5,(%(regvar($1)%))" | %[a] | |
  598. loc ldl ads sdl $2 == $4 && $3 == 2 && inreg($2)==2 | |
  599. remove(regvar($2))
  600. "add.l #$1,%(regvar($2)%)"
  601. erase(regvar($2)) | | |
  602. ldl ldc ads sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  603. remove(regvar($1))
  604. "add.l #$2,%(regvar($1)%)"
  605. erase(regvar($1)) | | |
  606. ldc ldl ads sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  607. remove(regvar($2))
  608. "add.l #$1,%(regvar($2)%)"
  609. erase(regvar($2)) | | |
  610. lil inc sil $1==$3 && inreg($1)==2 | |
  611. remove(MEM_ALL)
  612. "add.w #1,(%(regvar($1)%))"
  613. setcc({IADDREG,regvar($1)}) | | |
  614. lil dec sil $1==$3 && inreg($1)==2 | |
  615. remove(MEM_ALL)
  616. "sub.w #1,(%(regvar($1)%))"
  617. setcc({IADDREG,regvar($1)}) | | |
  618. lol and stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
  619. remove(regvar($1))
  620. "and.w %[1],%(regvar($1)%)"
  621. erase(regvar($1)) | | |
  622. loc lil and sil $2 == $4 && $3 == 2 && inreg($2)==2 | |
  623. remove(MEM_ALL)
  624. "and.w #$1,(%(regvar($2)%))" | | |
  625. lil and sil $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  626. remove(MEM_ALL)
  627. "and.w %[1],(%(regvar($1)%))" | | |
  628. ldl ldc and sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  629. remove(regvar($1))
  630. "and.l #$2,%(regvar($1)%)"
  631. erase(regvar($1)) | | |
  632. ldc ldl and sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  633. remove(regvar($2))
  634. "and.l #$1,%(regvar($2)%)"
  635. erase(regvar($2)) | | |
  636. ldl and sdl $1 == $3 && $2 == 4 && inreg($1)==2 | DATAREG4 |
  637. remove(regvar($1))
  638. "and.l %[1],%(regvar($1)%)"
  639. erase(regvar($1)) | | |
  640. lol ior stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
  641. remove(regvar($1))
  642. "or.w %[1],%(regvar($1)%)"
  643. erase(regvar($1)) | | |
  644. lil ior sil $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  645. remove(MEM_ALL)
  646. "or.w %[1],(%(regvar($1)%))" | | |
  647. loc lil ior sil $2 == $4 && $3 == 2 && inreg($2)==2 | |
  648. remove(MEM_ALL)
  649. "or.w #$1,(%(regvar($2)%))" | | |
  650. ldl ldc ior sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  651. remove(regvar($1))
  652. "or.l #$2,%(regvar($1)%)"
  653. erase(regvar($1)) | | |
  654. ldc ldl ior sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  655. remove(regvar($2))
  656. "or.l #$1,%(regvar($2)%)"
  657. erase(regvar($2)) | | |
  658. ldl ior sdl $1 == $3 && $2 == 4 && inreg($1)==2 | DATAREG4 |
  659. remove(regvar($1))
  660. "or.l %[1],%(regvar($1)%)"
  661. erase(regvar($1)) | | |
  662. lol loc xor stl $1 == $4 && $3 == 2 && inreg($1)==2 | |
  663. remove(regvar($1))
  664. "eor.w #$2,%(regvar($1)%)"
  665. erase(regvar($1)) | | |
  666. loc lol xor stl $2 == $4 && $3 == 2 && inreg($2)==2 | |
  667. remove(regvar($2))
  668. "eor.w #$1,%(regvar($2)%)"
  669. erase(regvar($2)) | | |
  670. loc lil xor sil $2 == $4 && $3 == 2 && inreg($2)==2 | |
  671. remove(MEM_ALL)
  672. "eor.w #$1,(%(regvar($2)%))" | | |
  673. lol xor stl $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  674. remove(regvar($1))
  675. "eor.w %[1],%(regvar($1)%)"
  676. erase(regvar($1)) | | |
  677. lil xor sil $1 == $3 && $2 == 2 && inreg($1)==2 | DATAREG |
  678. remove(MEM_ALL)
  679. "eor.w %[1],(%(regvar($1)%))" | | |
  680. ldl ldc xor sdl $1 == $4 && $3 == 4 && inreg($1)==2 | |
  681. remove(regvar($1))
  682. "eor.l #$2,%(regvar($1)%)"
  683. erase(regvar($1)) | | |
  684. ldc ldl xor sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
  685. remove(regvar($2))
  686. "eor.l #$1,%(regvar($2)%)"
  687. erase(regvar($2)) | | |
  688. ldl xor sdl $1 == $3 && $2 == 4 && inreg($1)==2 | DATAREG4 |
  689. remove(regvar($1))
  690. "eor.l %[1],%(regvar($1)%)"
  691. erase(regvar($1)) | | |
  692. #endif
  693. /* G R O U P III AND IV : I N T E G E R A R I T H M E T I C */
  694. adi $1 == 2 | ANY DATASCR | "add.w %[1],%[2]"
  695. erase(%[2])
  696. setcc(%[2]) | %[2] | | (2,2)+%[1]
  697. ... | DATASCR ANY | "add.w %[2],%[1]"
  698. erase(%[1])
  699. setcc(%[1]) | %[1] | | (2,2)+%[2]
  700. loc lol adi stl $2 == $4 && $3 == 2 && inreg($2) < 2 | |
  701. remove(MEM_ALL)
  702. "add.w #$1,$2(a6)" | | | (6,10)
  703. loc lil adi sil $2 == $4 && $3 == 2 | |
  704. allocate(ADDREG = {DISPL4,LB,$2})
  705. remove(MEM_ALL)
  706. "add.w #$1,(%[a])" | | |
  707. lol adi stl $1 == $3 && $2 == 2 && inreg($1) < 2 | DATAREG |
  708. remove(MEM_ALL)
  709. "add.w %[1],$1(a6)" | | |
  710. loe adi ste $1 == $3 && $2 == 2 | DATAREG |
  711. remove(MEM_ALL)
  712. "add.w %[1],$1" | | |
  713. lil adi sil $1 == $3 && $2 == 2 | DATAREG |
  714. allocate(ADDREG={DISPL4,LB,$1})
  715. remove(ALL)
  716. "add.w %[1],(%[a])" | | |
  717. loe loc adi ste $3 == 2 && $1 == $4 | |
  718. remove(MEM_ALL)
  719. "add.w #$2,$1" | | | (7,11)
  720. loc loe adi ste $3 == 2 && $2 == $4 | |
  721. remove(MEM_ALL)
  722. "add.w #$1,$2" | | | (7,11)
  723. adi $1 == 4 | ANY4 DATASCR4 | "add.l %[1],%[2]"
  724. erase(%[2])
  725. setcc(%[2]) | %[2] | | (2,3)+%[1]
  726. ... | DATASCR4 ANY4 | "add.l %[2],%[1]"
  727. erase(%[1])
  728. setcc(%[1]) | %[1] | | (2,3)+%[2]
  729. ldl ldc adi sdl $1 == $4 && $3 == 4 | |
  730. remove(MEM_ALL)
  731. "add.l #$2,$1(a6)" | | | (8,16)
  732. ldc ldl adi sdl $2 == $4 && $3 == 4 | |
  733. remove(MEM_ALL)
  734. "add.l #$1,$2(a6)" | | | (8,16)
  735. lde ldc adi sde $3 == 4 && $1 == $4 | |
  736. remove(MEM_ALL)
  737. "add.l #$2,$1" | | | (9,17)
  738. ldc lde adi sde $3 == 4 && $2 == $4 | |
  739. remove(MEM_ALL)
  740. "add.l #$1,$2" | | | (9,17)
  741. ldl adi sdl $1 == $3 && $2 == 4 | DATAREG4 |
  742. remove(MEM_ALL)
  743. "add.l %[1],$1(a6)" | | |
  744. lde adi sde $1 == $3 && $2 == 4 | DATAREG4 |
  745. remove(MEM_ALL)
  746. "add.l %[1],$1" | | |
  747. sbi $1 == 2 | ANY DATASCR | "sub.w %[1],%[2]"
  748. erase(%[2])
  749. setcc(%[2]) | %[2] | | (2,2)+%[1]
  750. lol loc sbi stl $1 == $4 && $3 == 2 | |
  751. remove(MEM_ALL)
  752. "sub.w #$2,$1(a6)" | | | (6,10)
  753. loe loc sbi ste $3 == 2 && $1 == $4 | |
  754. remove(MEM_ALL)
  755. "sub.w #$2,$1" | | | (7,11)
  756. lil loc adi sil $1 == $4 && $3 == 2 | |
  757. allocate(ADDREG = {DISPL4,LB,$1})
  758. remove(MEM_ALL)
  759. "add.w #$2,(%[a])" | | |
  760. sbi $1 == 4 | ANY4 DATASCR4 | "sub.l %[1],%[2]"
  761. erase(%[2])
  762. setcc(%[2]) | %[2] | | (2,3)+%[1]
  763. ldl ldc sbi sdl $1 == $4 && $3 == 4 | |
  764. remove(MEM_ALL)
  765. "sub.l #$2,$1(a6)" | | | (8,16)
  766. lde ldc sbi sde $3 == 4 && $1 == $4 | |
  767. remove(MEM_ALL)
  768. "sub.l #$2,$1" | | | (9,17)
  769. mli $1 == 2 | ANY DATASCR | "muls %[1],%[2]"
  770. erase(%[2])
  771. setcc(%[2]) | %[2] | |
  772. mli $1 == 4 | | remove(ALL)
  773. "jsr .mli"
  774. | DD1 | |
  775. dvi $1 == 2 | ANY DATASCR | "ext.l %[2]"
  776. "divs %[1],%[2]"
  777. erase(%[2])
  778. setcc(%[2]) | %[2] | |
  779. dvi $1 == 4 | | remove(ALL)
  780. "jsr .dvi"
  781. | DD1 | |
  782. rmi $1 == 2 | ANY DATASCR | "ext.l %[2]"
  783. "divs %[1],%[2]"
  784. "swap %[2]"
  785. erase(%[2]) | %[2] | |
  786. rmi $1 == 4 | | remove(ALL)
  787. "jsr .dvi"
  788. | DD2 | |
  789. ngi $1 == 2 | DATASCR | "neg %[1]"
  790. erase(%[1])
  791. setcc(%[1]) | %[1] | |
  792. lol ngi stl $1 == $3 && $2 == 2 | |
  793. remove(MEM_ALL)
  794. "neg.w $1(a6)" | | |
  795. loe ngi ste $1 == $3 && $2 == 2 | |
  796. remove(MEM_ALL)
  797. "neg.w $1" | | |
  798. lil ngi sil $1 == $3 && $2 == 2 | |
  799. allocate(ADDREG={DISPL4,LB,$1})
  800. remove(MEM_ALL)
  801. "neg.w (%[a])" | | |
  802. ngi $1 == 4 | DATASCR4 | "neg.l %[1]"
  803. erase(%[1])
  804. setcc(%[1]) | %[1] | |
  805. lol ngi stl $1 == $3 && $2 == 4 | |
  806. remove(MEM_ALL)
  807. "neg.l $1(a6)" | | |
  808. loe ngi ste $1 == $3 && $2 == 4 | |
  809. remove(MEM_ALL)
  810. "neg.l $1" | | |
  811. loc sli $1 == 1 && $2 == 2 | DATASCR |
  812. "add.w %[1],%[1]"
  813. erase(%[1])
  814. setcc(%[1]) | %[1] | |
  815. loc sli $1 > 1 && $1 <= 8 && $2 == 2 | DATASCR |
  816. "asl.w #$1,%[1]"
  817. erase(%[1]) | %[1] | |
  818. loc sli $1 == 1 && $2 == 4 | DATASCR4 |
  819. "add.l %[1],%[1]"
  820. erase(%[1])
  821. setcc(%[1]) | %[1] | |
  822. loc sli $1 > 1 && $1 <= 8 && $2 == 4 | DATASCR4 |
  823. "asl.l #$1,%[1]"
  824. erase(%[1]) | %[1] | |
  825. lol loc sli ads inreg($1) == 2 && $2 == 1 && $3 == 2 && $4 == 2 | ADDSCR |
  826. "add.w %(regvar($1)%),%[1]"
  827. "add.w %(regvar($1)%),%[1]"
  828. erase(%[1]) | %[1] | |
  829. lol loc sli stl $1 == $4 && $2 == 1 && $3 == 2 | |
  830. remove(MEM_ALL)
  831. "asl.w #1, $1(a6)" | | |
  832. loe loc sli ste $1 == $4 && $2 == 1 && $3 == 2 | |
  833. remove(MEM_ALL)
  834. "asl.w #1, $1" | | |
  835. sli $1 == 2 | DATAREG DATASCR | "asl %[1],%[2]"
  836. erase(%[2])
  837. setcc(%[2]) | %[2] | |
  838. sli $1 == 4 | DATAREG DATASCR4 | "asl.l %[1],%[2]"
  839. erase(%[2])
  840. setcc(%[2]) | %[2] | |
  841. loc sri $1 >= 1 && $1 <= 8 && $2 == 2 | DATASCR |
  842. "asr.w #$1,%[1]"
  843. erase(%[1]) | %[1] | |
  844. loc sri $1 >= 1 && $1 <= 8 && $2 == 4 | DATASCR4 |
  845. "asr.l #$1,%[1]"
  846. erase(%[1]) | %[1] | |
  847. lol loc sri stl $1 == $4 && $2 == 1 && $3 == 2 | |
  848. remove(MEM_ALL)
  849. "asr.w #1,$1(a6)" | | |
  850. loe loc sri ste $1 == $4 && $2 == 1 && $3 == 2 | |
  851. remove(MEM_ALL)
  852. "asr.w #1,$1" | | |
  853. sri $1 == 2 | DATAREG DATASCR | "asr %[1],%[2]"
  854. erase(%[2])
  855. setcc(%[2]) | %[2] | |
  856. sri $1 == 4 | DATAREG DATASCR4 | "asr.l %[1],%[2]"
  857. erase(%[2])
  858. setcc(%[2]) | %[2] | |
  859. mlu $1 == 2 | ANY DATASCR | "mulu %[1],%[2]"
  860. erase(%[2])
  861. setcc(%[2]) | %[2] | |
  862. mlu $1 == 4 | | remove(ALL)
  863. "jsr .mlu"
  864. | DD1 | |
  865. dvu $1 == 2 | ANY ANY | allocate(DATAREG)
  866. "clr.l %[a]"
  867. "move.w %[2],%[a]"
  868. "divu %[1],%[a]" | %[a] | |
  869. dvu $1 == 4 | | remove(ALL)
  870. "jsr .dvu"
  871. | DD1 | |
  872. rmu $1 == 2 | ANY ANY | allocate(DATAREG)
  873. "clr.l %[a]"
  874. "move.w %[2],%[a]"
  875. "divu %[1],%[a]"
  876. "swap %[a]" | %[a] | |
  877. rmu $1 == 4 | | remove(ALL)
  878. "jsr .dvu"
  879. | DD2 | |
  880. loc sru $1 >= 1 && $1 <= 8 && $2 == 2 | DATASCR |
  881. "lsr.w #$1,%[1]"
  882. erase(%[1]) | %[1] | |
  883. loc sru $1 >= 1 && $1 <= 8 && $2 == 4 | DATASCR4 |
  884. "lsr.l #$1,%[1]"
  885. erase(%[1]) | %[1] | |
  886. lol loc sru stl $1 == $4 && $2 == 1 && $3 == 2 | |
  887. remove(MEM_ALL)
  888. "lsr.w #1,$1(a6)" | | |
  889. loe loc sru ste $1 == $4 && $2 == 1 && $3 == 2 | |
  890. remove(MEM_ALL)
  891. "lsr.w #1,$1" | | |
  892. sru $1 == 2 | DATAREG DATASCR | "lsr %[1],%[2]"
  893. erase(%[2])
  894. setcc(%[2]) | %[2] | |
  895. sru $1 == 4 | DATAREG DATASCR4 | "lsr.l %[1],%[2]"
  896. erase(%[2])
  897. setcc(%[2]) | %[2] | |
  898. /* The adu instruction has precisely the same effect as an adi.
  899. * The same applies to (sbu,sbi) and (slu,sli)
  900. */
  901. lol loc adu stl $1 == $4 && $3 == 2 && inreg($1) < 2 | |
  902. remove(MEM_ALL)
  903. "add.w #$2,$1(a6)" | | |
  904. loc lol adu stl $2 == $4 && $3 == 2 && inreg($2) < 2 | |
  905. remove(MEM_ALL)
  906. "add.w #$1,$2(a6)" | | |
  907. loc lil adu sil $2 == $4 && $3 == 2 | |
  908. allocate(ADDREG = {DISPL4,LB,$2})
  909. remove(MEM_ALL)
  910. "add.w #$1,(%[a])" | | |
  911. lol adu stl $1 == $3 && $2 == 2 && inreg($1) < 2 | DATAREG |
  912. remove(MEM_ALL)
  913. "add.w %[1],$1(a6)" | | |
  914. loe adu ste $1 == $3 && $2 == 2 | DATAREG |
  915. remove(MEM_ALL)
  916. "add.w %[1],$1" | | |
  917. lil adu sil $1 == $3 && $2 == 2 | DATAREG |
  918. allocate(ADDREG={DISPL4,LB,$1})
  919. remove(MEM_ALL)
  920. "add.w %[1],(%[a])" | | |
  921. loe loc adu ste $3 == 2 && $1 == $4 | |
  922. remove(MEM_ALL)
  923. "add.w #$2,$1" | | | (7,11)
  924. loc loe adu ste $3 == 2 && $2 == $4 | |
  925. remove(MEM_ALL)
  926. "add.w #$1,$2" | | | (7,11)
  927. ldl ldc adu sdl $1 == $4 && $3 == 4 | |
  928. remove(MEM_ALL)
  929. "add.l #$2,$1(a6)" | | | (8,16)
  930. ldc ldl adu sdl $2 == $4 && $3 == 4 | |
  931. remove(MEM_ALL)
  932. "add.l #$1,$2(a6)" | | | (8,16)
  933. lde ldc adu sde $3 == 4 && $1 == $4 | |
  934. remove(MEM_ALL)
  935. "add.l #$2,$1" | | | (9,17)
  936. ldc lde adu sde $3 == 4 && $2 == $4 | |
  937. remove(MEM_ALL)
  938. "add.l #$1,$2" | | | (9,17)
  939. ldl adu sdl $1 == $3 && $2 == 4 | DATAREG4 |
  940. remove(MEM_ALL)
  941. "add.l %[1],$1(a6)" | | |
  942. lde adu sde $1 == $3 && $2 == 4 | DATAREG4 |
  943. remove(MEM_ALL)
  944. "add.l %[1],$1" | | |
  945. lol loc sbu stl $1 == $4 && $3 == 2 | |
  946. remove(MEM_ALL)
  947. "sub.w #$2,$1(a6)" | | | (6,10)
  948. loe loc sbu ste $3 == 2 && $1 == $4 | |
  949. remove(MEM_ALL)
  950. "sub.w #$2,$1" | | | (7,11)
  951. lil loc adu sil $1 == $4 && $3 == 2 | |
  952. allocate(ADDREG = {DISPL4,LB,$1})
  953. remove(MEM_ALL)
  954. "add.w #$2,(%[a])" | | |
  955. ldl ldc sbu sdl $1 == $4 && $3 == 4 | |
  956. remove(MEM_ALL)
  957. "sub.l #$2,$1(a6)" | | | (8,16)
  958. lde ldc sbu sde $3 == 4 && $1 == $4 | |
  959. remove(MEM_ALL)
  960. "sub.l #$2,$1" | | | (9,17)
  961. loc slu $1 >= 1 && $1 <= 8 && $2 == 2 | DATASCR |
  962. "asl.w #$1,%[1]"
  963. erase(%[1]) | %[1] | |
  964. loc slu $1 >= 1 && $1 <= 8 && $2 == 4 | DATASCR4 |
  965. "asl.l #$1,%[1]"
  966. erase(%[1]) | %[1] | |
  967. lol loc slu stl $1 == $4 && $2 == 1 && $3 == 2 | |
  968. remove(MEM_ALL)
  969. "asl.w #1,$1(a6)" | | |
  970. loe loc slu ste $1 == $4 && $2 == 1 && $3 == 2 | |
  971. remove(MEM_ALL)
  972. "asl.w #1,$1" | | |
  973. adu | | | | adi $1 |
  974. sbu | | | | sbi $1 |
  975. slu | | | | sli $1 |
  976. /* G R O U P VI : P O I N T E R A R I T H M E T I C */
  977. adp $1 >= 1 && $1 <= 8
  978. | nocoercions: EXTERNAL_ADDR | | {EXTERNAL_ADDR,%[1.off] + "+"
  979. + tostring($1)} | |
  980. ... | nocoercions: LOCAL_ADDR | | {LOCAL_ADDR,%[1.off]+$1} | |
  981. ... | nocoercions: REGOFF_ADDR | | {REGOFF_ADDR,%[1.reg],%[1.off]+$1} | |
  982. ... | nocoercions: ADDREG | | {REGOFF_ADDR,%[1],$1} | |
  983. ... | ADDSCR | "add.l #$1,%[1]"
  984. erase(%[1])
  985. setcc(%[1]) | %[1] | |
  986. adp $1 >= 0-32767 && $1 <= 32767
  987. | nocoercions: EXTERNAL_ADDR | | {EXTERNAL_ADDR,%[1.off] + "+"
  988. + tostring($1)} | |
  989. ... | nocoercions: LOCAL_ADDR | | {LOCAL_ADDR,%[1.off]+$1} | |
  990. ... | nocoercions: REGOFF_ADDR | | {REGOFF_ADDR,%[1.reg],%[1.off]+$1} | |
  991. ... | nocoercions: ADDREG | | {REGOFF_ADDR,%[1],$1} | |
  992. ... | ADDSCR | "lea $1(%[1]),%[1]"
  993. erase(%[1])
  994. setcc(%[1]) | %[1] | |
  995. adp | nocoercions: EXTERNAL_ADDR | | {EXTERNAL_ADDR,%[1.off] + "+"
  996. + tostring($1)} | |
  997. ... | ADDSCR | "add.l #$1,%[1]"
  998. erase(%[1])
  999. setcc(%[1]) | %[1] | |
  1000. /* The next patterns are for efficient translation of "*p++" in C */
  1001. ldl ldl adp sdl $1 == $2 && $2 == $4 | |
  1002. allocate(ADDREG={DISPL4,LB,$1})
  1003. remove(DISPL,%[reg] == LB && (%[dis] == $1 || %[dis] == $1+2))
  1004. remove(DISPL4,%[reg] == LB && (%[dis] >= $1-2 &&
  1005. %[dis] <= $1+2))
  1006. remove(DISPL1,%[reg] == LB && (%[dis] >= $1 &&
  1007. %[dis] <= $1+3))
  1008. remove(DISPL,%[reg] != LB)
  1009. remove(DISPL4,%[reg] != LB)
  1010. remove(DISPL1,%[reg] != LB)
  1011. remove(ALL_ACCESSIBLE)
  1012. "add.l #$3,$1(a6)" | %[a] | |
  1013. lde lde adp sde $1 == $2 && $2 == $4 | |
  1014. allocate(ADDREG={ABS4,$1})
  1015. remove(ABS)
  1016. remove(ABS4)
  1017. remove(ABS1)
  1018. remove(DISPL,%[reg] != LB)
  1019. remove(DISPL4,%[reg] != LB)
  1020. remove(DISPL1,%[reg] != LB)
  1021. remove(ALL_ACCESSIBLE)
  1022. "add.l #$3,$1" | %[a] | |
  1023. ldl adp sdl $1 == $3 | | remove(MEM_ALL)
  1024. "add.l #$2,$1(a6)" | | | (8,16)
  1025. lde adp sde $1 == $3 | | remove(MEM_ALL)
  1026. "add.l #$2,$1" | | | (9,17)
  1027. ads $1 == 2 | ANY ADDSCR | "add.w %[1],%[2]"
  1028. erase(%[2])
  1029. setcc(%[2]) | %[2] | |
  1030. ads $1 == 4 | ANY4 ADDSCR | "add.l %[1],%[2]"
  1031. erase(%[2])
  1032. setcc(%[2]) | %[2] | |
  1033. loc ldl ads sdl $2 == $4 && $3 == 2 | |
  1034. remove(MEM_ALL)
  1035. "add.l #$1,$2(a6)" | | | (8,16)
  1036. lde loc ads sde $3 == 2 && $1 == $4 | |
  1037. remove(MEM_ALL)
  1038. "add.l #$2,$1" | | | (9,17)
  1039. ldl ldc ads sdl $1 == $4 && $3 == 4 | |
  1040. remove(MEM_ALL)
  1041. "add.l #$2,$1(a6)" | | | (8,16)
  1042. ldc ldl ads sdl $2 == $4 && $3 == 4 | |
  1043. remove(MEM_ALL)
  1044. "add.l #$1,$2(a6)" | | | (8,16)
  1045. lde ldc ads sde $3 == 4 && $1 == $4 | |
  1046. remove(MEM_ALL)
  1047. "add.l #$2,$1" | | | (9,17)
  1048. ldc lde ads sde $3 == 4 && $2 == $4 | |
  1049. remove(MEM_ALL)
  1050. "add.l #$1,$2" | | | (9,17)
  1051. sbs $1 == 2 | ANY4 DATASCR4 | "sub.l %[1],%[2]"
  1052. erase(%[2])
  1053. setcc(%[2]) | %[2.1] | |
  1054. sbs $1 == 4 | ANY4 DATASCR4 | "sub.l %[1],%[2]"
  1055. erase(%[2])
  1056. setcc(%[2]) | %[2] | |
  1057. /* G R O U P VII : I N C R E M E N T / D E C R E M E N T */
  1058. inc | DATASCR | "add.w #1,%[1]"
  1059. erase(%[1])
  1060. setcc(%[1]) | %[1] | |
  1061. ... | STACK | "add.w #1,(sp)" | | |
  1062. #ifdef REGVARS
  1063. lil inc sil $1==$3 && inreg($1) == 2 | |
  1064. remove(MEM_ALL)
  1065. "add.w #1,(%(regvar($1)%))"
  1066. setcc({IADDREG,regvar($1)}) | | |
  1067. lil dec sil $1==$3 && inreg($1) == 2 | |
  1068. remove(MEM_ALL)
  1069. "sub.w #1,(%(regvar($1)%))"
  1070. setcc({IADDREG,regvar($1)}) | | |
  1071. #endif
  1072. lil inc sil $1==$3 | | allocate(ADDREG={DISPL4,LB,$1})
  1073. remove(MEM_ALL)
  1074. "add.w #1,(%[a])" | | |
  1075. lil dec sil $1==$3 | | allocate(ADDREG={DISPL4,LB,$1})
  1076. remove(MEM_ALL)
  1077. "sub.w #1,(%[a])" | | |
  1078. #ifdef REGVARS
  1079. inl inreg($1)==2 | | remove(regvar($1))
  1080. "add.w #1,%(regvar($1)%)"
  1081. erase(regvar($1))
  1082. setcc(regvar($1)) | | |
  1083. del inreg($1)==2 | | remove(regvar($1))
  1084. "sub.w #1,%(regvar($1)%)"
  1085. erase(regvar($1))
  1086. setcc(regvar($1)) | | |
  1087. zrl inreg($1)==2 | | remove(regvar($1))
  1088. "clr.w %(regvar($1)%)"
  1089. erase(regvar($1))
  1090. setcc(regvar($1)) | | |
  1091. #endif
  1092. inl | | remove(DISPL,%[reg] == LB && %[dis] == $1)
  1093. remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
  1094. %[dis] == $1))
  1095. remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
  1096. %[dis] == $1+1))
  1097. remove(DISPL,%[reg] != LB)
  1098. remove(DISPL4,%[reg] != LB)
  1099. remove(DISPL1,%[reg] != LB)
  1100. remove(ALL_ACCESSIBLE)
  1101. "add.w #1,$1(a6)"
  1102. setcc({DISPL,LB,$1}) | | |
  1103. ine | |
  1104. remove(ABS)
  1105. remove(ABS4)
  1106. remove(ABS1)
  1107. remove(DISPL,%[reg] != LB)
  1108. remove(DISPL4,%[reg] != LB)
  1109. remove(DISPL1,%[reg] != LB)
  1110. remove(ALL_ACCESSIBLE)
  1111. "add.w #1,$1"
  1112. setcc({ABS,$1}) | | |
  1113. dec | DATASCR | "sub.w #1,%[1]"
  1114. erase(%[1])
  1115. setcc(%[1]) | %[1] | |
  1116. ... | STACK | "sub.w #1,(sp)" | | |
  1117. del | | remove(DISPL,%[reg] == LB && %[dis] == $1)
  1118. remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
  1119. %[dis] == $1))
  1120. remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
  1121. %[dis] == $1+1))
  1122. remove(DISPL,%[reg] != LB)
  1123. remove(DISPL4,%[reg] != LB)
  1124. remove(DISPL1,%[reg] != LB)
  1125. remove(ALL_ACCESSIBLE)
  1126. "sub.w #1,$1(a6)"
  1127. setcc({DISPL,LB,$1}) | | |
  1128. dee | |
  1129. remove(ABS)
  1130. remove(ABS4)
  1131. remove(ABS1)
  1132. remove(DISPL,%[reg] != LB)
  1133. remove(DISPL4,%[reg] != LB)
  1134. remove(DISPL1,%[reg] != LB)
  1135. remove(ALL_ACCESSIBLE)
  1136. "sub.w #1,$1"
  1137. setcc({ABS,$1}) | | |
  1138. zrl | | remove(DISPL,%[reg] == LB && %[dis] == $1)
  1139. remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
  1140. %[dis] == $1))
  1141. remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
  1142. %[dis] == $1+1))
  1143. remove(DISPL,%[reg] != LB)
  1144. remove(DISPL4,%[reg] != LB)
  1145. remove(DISPL1,%[reg] != LB)
  1146. remove(ALL_ACCESSIBLE)
  1147. "clr $1(a6)"
  1148. setcc({DISPL,LB,$1}) | | |
  1149. zre | |
  1150. remove(ABS)
  1151. remove(ABS4)
  1152. remove(ABS1)
  1153. remove(DISPL,%[reg] != LB)
  1154. remove(DISPL4,%[reg] != LB)
  1155. remove(DISPL1,%[reg] != LB)
  1156. remove(ALL_ACCESSIBLE)
  1157. "clr $1"
  1158. setcc({ABS,$1}) | | |
  1159. zrf $1 == 4 | | | {IMMEDIATE4,0} | |
  1160. zrf $1 == 8 | | | {IMMEDIATE4,0} {IMMEDIATE4,0} | |
  1161. zer $1 == 2 | | | {IMMEDIATE,0} | |
  1162. zer $1 == 4 | | | | ldc 0 |
  1163. zer $1 == 6 | | remove(ALL)
  1164. "clr.l -(sp)"
  1165. "clr.w -(sp)" | | |
  1166. zer $1 == 8 | | remove(ALL)
  1167. "clr.l -(sp)"
  1168. "clr.l -(sp)" | | |
  1169. zer $1 == 10 | | remove(ALL)
  1170. "clr.l -(sp)"
  1171. "clr.l -(sp)"
  1172. "clr.w -(sp)" | | |
  1173. zer $1 == 12 | | remove(ALL)
  1174. "clr.l -(sp)"
  1175. "clr.l -(sp)"
  1176. "clr.l -(sp)" | | |
  1177. zer $1 > 12 | | remove(ALL)
  1178. allocate(DATAREG4)
  1179. "move.l #$1/2-1,%[a]"
  1180. "1:"
  1181. "clr -(sp)"
  1182. "dbf %[a],1b" | | |
  1183. /* G R O U P VIII : C O N V E R T */
  1184. cii | | remove(ALL)
  1185. "jsr .cii"
  1186. | | |
  1187. cuu | | remove(ALL)
  1188. "jsr .cuu"
  1189. | | |
  1190. cui | | | | cuu |
  1191. ciu | | | | cuu |
  1192. loc loc cii $1==1 && $2==2 | DATASCR |
  1193. "ext.w %[1]"
  1194. erase(%[1])
  1195. setcc(%[1]) | %[1] | |
  1196. loc loc cii $1==1 && $2==4 | ANY |
  1197. allocate(%[1],DATAREG4)
  1198. move(%[1],%[a.1])
  1199. "ext.w %[a]"
  1200. "ext.l %[a]"
  1201. erase(%[a])
  1202. setcc(%[a]) | %[a] | |
  1203. loc loc cii $1==2 && $2==4 | ANY |
  1204. allocate(%[1],DATAREG4)
  1205. move(%[1],%[a.1])
  1206. "ext.l %[a]"
  1207. erase(%[a])
  1208. setcc(%[a]) | %[a] | |
  1209. loc loc cuu $1==2 && $2==4 | | | {IMMEDIATE,0} | |
  1210. loc loc ciu $1==2 && $2==4 | | | {IMMEDIATE,0} | |
  1211. loc loc cui $1==2 && $2==4 | | | {IMMEDIATE,0} | |
  1212. loc loc loc cuu $1 == 0 && $2 == 2 && $3 == 4 | | | {DOUBLE,"0"} | |
  1213. loc loc loc ciu $1 == 0 && $2 == 2 && $3 == 4 | | | {DOUBLE,"0"} | |
  1214. loc loc loc cui $1 == 0 && $2 == 2 && $3 == 4 | | | {DOUBLE,"0"} | |
  1215. loc loc cii $1==4 && $2==2 | DATAREG4 | | %[1.1] | |
  1216. ... | ANY ANY | | %[2] | |
  1217. loc loc cuu $1==4 && $2==2 | DATAREG4 | | %[1.1] | |
  1218. ... | ANY | | | |
  1219. loc loc ciu $1==4 && $2==2 | DATAREG4 | | %[1.1] | |
  1220. ... | ANY | | | |
  1221. loc loc cui $1==4 && $2==2 | DATAREG4 | | %[1.1] | |
  1222. ... | ANY | | | |
  1223. /* G R O U P IX : L O G I C A L */
  1224. and defined($1) && $1 == 2 | ANY DATASCR |
  1225. "and %[1],%[2]"
  1226. setcc(%[2])
  1227. erase(%[2]) | %[2] | | (2,2)+%[1]
  1228. ... | DATASCR ANY |
  1229. "and %[2],%[1]"
  1230. setcc(%[1])
  1231. erase(%[1]) | %[1] | | (2,2)+%[2]
  1232. lol loc and $2 == 255 && inreg($1) < 2 && $3 == 2 | | | {DISPL1,LB,$1} | |
  1233. lal loi and lal sti $1 == $4 && $2 == 1 && $3 == 2 && $5 == 1 && inreg($1) < 2
  1234. | DATAREG |
  1235. remove(MEM_ALL)
  1236. "and.b %[1],$1(a6)" | | |
  1237. loc lol and stl $2 == $4 && $3 == 2 && inreg($2) < 2 | |
  1238. remove(MEM_ALL)
  1239. "and.w #$1,$2(a6)" | | | (6,10)
  1240. loe loc and ste $3 == 2 && $1 == $4 | |
  1241. remove(MEM_ALL)
  1242. "and.w #$2,$1" | | | (7,11)
  1243. loc loe and ste $3 == 2 && $2 == $4 | |
  1244. remove(MEM_ALL)
  1245. "and.w #$1,$2" | | | (7,11)
  1246. loc lil and sil $2 == $4 && $3 == 2 | |
  1247. allocate(ADDREG = {DISPL4,LB,$2})
  1248. remove(MEM_ALL)
  1249. "and.w #$1,(%[a])" | | |
  1250. lol and stl $1 == $3 && $2 == 2 && inreg($1) < 2 | DATAREG |
  1251. remove(MEM_ALL)
  1252. "and.w %[1],$1(a6)" | | |
  1253. loe and ste $1 == $3 && $2 == 2 | DATAREG |
  1254. remove(MEM_ALL)
  1255. "and.w %[1],$1" | | |
  1256. lil and sil $1 == $3 && $2 == 2 | DATAREG |
  1257. allocate(ADDREG={DISPL4,LB,$1})
  1258. remove(MEM_ALL)
  1259. "and.w %[1],(%[a])" | | |
  1260. /* Note that the contents of an address register may not be used as
  1261. * operand of a and, or etc. instruction
  1262. */
  1263. and defined($1) && $1 == 4 | ANY4-ADDREG DATASCR4 |
  1264. "and.l %[1],%[2]"
  1265. erase(%[2])
  1266. setcc(%[2]) | %[2] | | (2,3)+%[1]
  1267. ... | DATASCR4 ANY4-ADDREG |
  1268. "and.l %[2],%[1]"
  1269. erase(%[1])
  1270. setcc(%[1]) | %[1] | | (2,3)+%[2]
  1271. ldl ldc and sdl $1 == $4 && $3 == 4 | |
  1272. remove(MEM_ALL)
  1273. "and.l #$2,$1(a6)" | | | (8,16)
  1274. ldc ldl and sdl $2 == $4 && $3 == 4 | |
  1275. remove(MEM_ALL)
  1276. "and.l #$1,$2(a6)" | | | (8,16)
  1277. lde ldc and sde $3 == 4 && $1 == $4 | |
  1278. remove(MEM_ALL)
  1279. "and.l #$2,$1" | | | (9,17)
  1280. ldc lde and sde $3 == 4 && $2 == $4 | |
  1281. remove(MEM_ALL)
  1282. "and.l #$1,$2" | | | (9,17)
  1283. ldl and sdl $1 == $3 && $2 == 4 | DATAREG4 |
  1284. remove(MEM_ALL)
  1285. "and.l %[1],$1(a6)" | | |
  1286. lde and sde $1 == $3 && $2 == 4 | DATAREG4 |
  1287. remove(MEM_ALL)
  1288. "and.l %[1],$1" | | |
  1289. and defined($1) && $1 > 4 | STACK |
  1290. allocate(DATAREG4,ADDREG,DATAREG)
  1291. "move.l #$1/2-1,%[a]"
  1292. "move.l sp,%[b]"
  1293. "add.l #$1,%[b]"
  1294. "1:"
  1295. "move.w (sp)+,%[c]"
  1296. "and %[c],(%[b])+"
  1297. "dbf %[a],1b" | | |
  1298. and !defined($1) | DATASCR STACK |
  1299. allocate(ADDREG,DATAREG)
  1300. "move.l sp,%[a]"
  1301. "sub.w #1,%[1]"
  1302. "asr #1,%[1]"
  1303. "1:"
  1304. "move.w (sp)+,%[b]"
  1305. "and %[b],(%[a])+"
  1306. "dbf %[1],1b"
  1307. erase(%[1]) | | |
  1308. ior defined($1) && $1 == 2 | ANY DATASCR |
  1309. "or %[1],%[2]"
  1310. erase(%[2])
  1311. setcc(%[2]) | %[2] | | (2,2)+%[1]
  1312. ... | DATASCR ANY |
  1313. "or %[2],%[1]"
  1314. erase(%[1])
  1315. setcc(%[1]) | %[1] | | (2,2)+%[2]
  1316. lal loi ior lal sti $1 == $4 && $2 == 1 && $3 == 2 && $5 == 1 && inreg($1) < 2
  1317. | DATAREG |
  1318. remove(MEM_ALL)
  1319. "or.b %[1],$1(a6)" | | |
  1320. loc lol ior stl $2 == $4 && $3 == 2 && inreg($2) < 2 | |
  1321. remove(MEM_ALL)
  1322. "or.w #$1,$2(a6)" | | | (6,10)
  1323. lol ior stl $1 == $3 && $2 == 2 && inreg($1) < 2 | DATAREG |
  1324. remove(MEM_ALL)
  1325. "or.w %[1],$1(a6)" | | |
  1326. loe ior ste $1 == $3 && $2 == 2 | DATAREG |
  1327. remove(MEM_ALL)
  1328. "or.w %[1],$1" | | |
  1329. lil ior sil $1 == $3 && $2 == 2 | DATAREG |
  1330. allocate(ADDREG={DISPL4,LB,$1})
  1331. remove(MEM_ALL)
  1332. "or.w %[1],(%[a])" | | |
  1333. loe loc ior ste $3 == 2 && $1 == $4 | |
  1334. remove(MEM_ALL)
  1335. "or.w #$2,$1" | | | (7,11)
  1336. loc loe ior ste $3 == 2 && $2 == $4 | |
  1337. remove(MEM_ALL)
  1338. "or.w #$1,$2" | | | (7,11)
  1339. loc lil ior sil $2 == $4 && $3 == 2 | |
  1340. allocate(ADDREG = {DISPL4,LB,$2})
  1341. remove(MEM_ALL)
  1342. "or.w #$1,(%[a])" | | |
  1343. ior defined($1) && $1 == 4 | ANY4-ADDREG DATASCR4 |
  1344. "or.l %[1],%[2]"
  1345. erase(%[2])
  1346. setcc(%[2]) | %[2] | |(2,3)+%[1]
  1347. ... | DATASCR4 ANY4-ADDREG |
  1348. "or.l %[2],%[1]"
  1349. erase(%[1])
  1350. setcc(%[1]) | %[1] | |(2,3)+%[2]
  1351. ldl ldc ior sdl $1 == $4 && $3 == 4 | |
  1352. remove(MEM_ALL)
  1353. "or.l #$2,$1(a6)" | | | (8,16)
  1354. ldc ldl ior sdl $2 == $4 && $3 == 4 | |
  1355. remove(MEM_ALL)
  1356. "or.l #$1,$2(a6)" | | | (8,16)
  1357. lde ldc ior sde $3 == 4 && $1 == $4 | |
  1358. remove(MEM_ALL)
  1359. "or.l #$2,$1" | | | (9,17)
  1360. ldc lde ior sde $3 == 4 && $2 == $4 | |
  1361. remove(MEM_ALL)
  1362. "or.l #$1,$2" | | | (9,17)
  1363. ldl ior sdl $1 == $3 && $2 == 4 | DATAREG4 |
  1364. remove(MEM_ALL)
  1365. "or.l %[1],$1(a6)" | | |
  1366. lde ior sde $1 == $3 && $2 == 4 | DATAREG4 |
  1367. remove(MEM_ALL)
  1368. "or.l %[1],$1" | | |
  1369. ior defined($1) && $1 > 4 | STACK |
  1370. allocate(DATAREG4,ADDREG,DATAREG)
  1371. "move.l #$1/2-1,%[a]"
  1372. "move.l sp,%[b]"
  1373. "add.l #$1,%[b]"
  1374. "1:"
  1375. "move.w (sp)+,%[c]"
  1376. "or %[c],(%[b])+"
  1377. "dbf %[a],1b" | | |
  1378. ior !defined($1) | DATASCR STACK |
  1379. allocate(ADDREG,DATAREG)
  1380. "move.l sp,%[a]"
  1381. "sub.w #1,%[1]"
  1382. "asr #1,%[1]"
  1383. "1:"
  1384. "move.w (sp)+,%[b]"
  1385. "or %[b],(%[a])+"
  1386. "dbf %[1],1b"
  1387. erase(%[1]) | | |
  1388. xor defined($1) && $1 == 2 | DATAREG DATASCR |
  1389. "eor %[1],%[2]"
  1390. erase(%[2])
  1391. setcc(%[2]) | %[2] | | (2,2)+%[1]
  1392. ... | DATASCR DATAREG |
  1393. "eor %[2],%[1]"
  1394. erase(%[1])
  1395. setcc(%[1]) | %[1] | | (2,2)+%[2]
  1396. lal loi xor lal sti $1 == $4 && $2 == 1 && $3 == 2 && $5 == 1 && inreg($1) < 2
  1397. | DATAREG |
  1398. remove(MEM_ALL)
  1399. "eor.b %[1],$1(a6)" | | |
  1400. lol loc xor stl $1 == $4 && $3 == 2 | |
  1401. remove(MEM_ALL)
  1402. "eor.w #$2,$1(a6)" | | | (6,10)
  1403. loc lol xor stl $2 == $4 && $3 == 2 | |
  1404. remove(MEM_ALL)
  1405. "eor.w #$1,$2(a6)" | | | (6,10)
  1406. loe loc xor ste $3 == 2 && $1 == $4 | |
  1407. remove(MEM_ALL)
  1408. "eor.w #$2,$1" | | | (7,11)
  1409. loc loe xor ste $3 == 2 && $2 == $4 | |
  1410. remove(MEM_ALL)
  1411. "eor.w #$1,$2" | | | (7,11)
  1412. loc lil xor sil $2 == $4 && $3 == 2 | |
  1413. allocate(ADDREG = {DISPL4,LB,$2})
  1414. remove(MEM_ALL)
  1415. "eor.w #$1,(%[a])" | | |
  1416. lol xor stl $1 == $3 && $2 == 2 | DATAREG |
  1417. remove(MEM_ALL)
  1418. "eor.w %[1],$1(a6)" | | |
  1419. loe xor ste $1 == $3 && $2 == 2 | DATAREG |
  1420. remove(MEM_ALL)
  1421. "eor.w %[1],$1" | | |
  1422. lil xor sil $1 == $3 && $2 == 2 | DATAREG |
  1423. allocate(ADDREG={DISPL4,LB,$1})
  1424. remove(MEM_ALL)
  1425. "eor.w %[1],(%[a])" | | |
  1426. xor defined($1) && $1 == 4 | DATAREG4 DATASCR4 |
  1427. "eor.l %[1],%[2]"
  1428. erase(%[2])
  1429. setcc(%[2]) | %[2] | | (2,3)+%[1]
  1430. ... | DATASCR4 DATAREG4 |
  1431. "eor.l %[2],%[1]"
  1432. erase(%[1])
  1433. setcc(%[1]) | %[1] | | (2,3)+%[2]
  1434. ldl ldc xor sdl $1 == $4 && $3 == 4 | |
  1435. remove(MEM_ALL)
  1436. "eor.l #$2,$1(a6)" | | | (8,16)
  1437. ldc ldl xor sdl $2 == $4 && $3 == 4 | |
  1438. remove(MEM_ALL)
  1439. "eor.l #$1,$2(a6)" | | | (8,16)
  1440. lde ldc xor sde $3 == 4 && $1 == $4 | |
  1441. remove(MEM_ALL)
  1442. "eor.l #$2,$1" | | | (9,17)
  1443. ldc lde xor sde $3 == 4 && $2 == $4 | |
  1444. remove(MEM_ALL)
  1445. "eor.l #$1,$2" | | | (9,17)
  1446. ldl xor sdl $1 == $3 && $2 == 4 | DATAREG4 |
  1447. remove(MEM_ALL)
  1448. "eor.l %[1],$1(a6)" | | |
  1449. lde xor sde $1 == $3 && $2 == 4 | DATAREG4 |
  1450. remove(MEM_ALL)
  1451. "eor.l %[1],$1" | | |
  1452. xor defined($1) && $1 > 4 | STACK |
  1453. allocate(DATAREG4,ADDREG,DATAREG)
  1454. "move.l #$1/2-1,%[a]"
  1455. "move.l sp,%[b]"
  1456. "add.l #$1,%[b]"
  1457. "1:"
  1458. "move.w (sp)+,%[c]"
  1459. "eor %[c],(%[b])+"
  1460. "dbf %[a],1b" | | |
  1461. xor !defined($1) | DATASCR STACK |
  1462. allocate(ADDREG,DATAREG)
  1463. "move.l sp,%[a]"
  1464. "sub.w #1,%[1]"
  1465. "asr #1,%[1]"
  1466. "1:"
  1467. "move.w (sp)+,%[b]"
  1468. "eor %[b],(%[a])+"
  1469. "dbf %[1],1b"
  1470. erase(%[1]) | | |
  1471. com defined($1) && $1 == 2 | DATASCR | "not %[1]"
  1472. erase(%[1])
  1473. setcc(%[1]) | %[1] | |
  1474. com defined($1) && $1 == 4 | DATASCR4 | "not.l %[1]"
  1475. erase(%[1])
  1476. setcc(%[1]) | %[1] | |
  1477. com defined($1) && $1 > 4 | STACK | allocate(DATAREG4,ADDREG)
  1478. "move.l #$1/2-1,%[a]"
  1479. "move.l sp,%[b]"
  1480. "1:"
  1481. "not (%[b])+"
  1482. "dbf %[a],1b" | | |
  1483. com !defined($1) | DATASCR STACK | allocate(ADDREG)
  1484. "sub.w #1,%[1]"
  1485. "asr #1,%[1]"
  1486. "move.w sp,%[a]"
  1487. "1:"
  1488. "not (%[a])+"
  1489. "dbf %[1],1b" | | |
  1490. rol defined($1) && $1 == 2 | DATAREG DATASCR |
  1491. "rol %[1],%[2]"
  1492. erase(%[2])
  1493. setcc(%[2]) | %[2] | |
  1494. rol defined($1) && $1 == 4 | DATAREG DATASCR4 |
  1495. "rol.l %[1],%[2]"
  1496. erase(%[2])
  1497. setcc(%[2]) | %[2] | |
  1498. ror defined($1) && $1 == 2 | DATAREG DATAREG |
  1499. "ror %[1],%[2]"
  1500. erase(%[2])
  1501. setcc(%[2]) | %[2] | |
  1502. ror defined($1) && $1 == 4 | DATAREG DATAREG4 |
  1503. "ror.l %[1],%[2]"
  1504. erase(%[2])
  1505. setcc(%[2]) | %[2] | |
  1506. /* G R O U P X : S E T S */
  1507. inn defined($1) | | remove(ALL)
  1508. move({IMMEDIATE,$1},D0)
  1509. "jsr .inn"
  1510. erase(D0)
  1511. | D0 | |
  1512. inn !defined($1) | ANY | remove(ALL)
  1513. move(%[1],D0)
  1514. "jsr .inn"
  1515. erase(D0)
  1516. | D0 | |
  1517. set defined($1) | | remove(ALL)
  1518. move({IMMEDIATE,$1},D0)
  1519. "jsr .set"
  1520. erase(D0)
  1521. | | |
  1522. set !defined($1) | ANY | remove(ALL)
  1523. move(%[1],D0)
  1524. "jsr .set"
  1525. erase(D0)
  1526. | | |
  1527. /* G R O U P XI : A R R A Y S */
  1528. /* In general, array references are resolved via a subroutine call.
  1529. * Only for two very simple cases we use a more efficient method.
  1530. * The array must be static, i.e. its element size and its index
  1531. * range must be static. In these cases the array descriptor will
  1532. * normally be stored in a rom and an element will be accessed via
  1533. * the sequence "lae lar", in which lae puts the address of the
  1534. * descriptor on the stack. The efficient method is used only if the
  1535. * element size is 2 or 4 bytes. We also make sure that
  1536. * the offset generated fits in 8 bits.
  1537. */
  1538. lae lar $2 == 2 && rom(1,3) == 2 && rom(1,1) >= (0-63) && rom(1,1) <= 63
  1539. | DATASCR ADDREG |
  1540. "asl #1,%[1]"
  1541. erase(%[1])
  1542. setcc(%[1]) |
  1543. {INDEXED,%[2],%[1],
  1544. (0-2)*rom(1,1)} | |
  1545. lae lar $2 == 2 && rom(1,3) == 4 && rom(1,1) >= (0-31) && rom(1,1) <= 31
  1546. | DATASCR ADDREG |
  1547. "asl #2,%[1]"
  1548. erase(%[1])
  1549. setcc(%[1]) |
  1550. {INDEXED4,%[2],%[1],
  1551. (0-4)*rom(1,1)} | |
  1552. lar $1 == 2 | | remove(ALL)
  1553. "jsr .lar"
  1554. | | |
  1555. lae sar $2 == 2 && rom(1,3) == 2 && rom(1,1) >= (0-63) && rom(1,1) <= 63
  1556. | DATASCR ADDREG ANY |
  1557. remove(MEM_ALL)
  1558. "asl #1,%[1]"
  1559. move(%[3],{INDEXED,%[2],%[1],
  1560. (0-2)*rom(1,1)} )
  1561. erase(%[1]) | | |
  1562. lae sar $2 == 2 && rom(1,3) == 4 && rom(1,1) >= (0-31) && rom(1,1) <= 31
  1563. | DATASCR ADDREG ANY4 |
  1564. remove(MEM_ALL)
  1565. "asl #2,%[1]"
  1566. move(%[3],{INDEXED4,%[2],%[1],
  1567. (0-4)*rom(1,1)})
  1568. erase(%[1]) | | |
  1569. sar $1 == 2 | | remove(ALL)
  1570. "jsr .sar"
  1571. | | |
  1572. lae aar $2 == 2 && rom(1,3) == 2 && rom(1,1) >= (0-63) && rom(1,1) <= 63
  1573. | DATASCR ADDREG |
  1574. "asl #1,%[1]"
  1575. erase(%[1])
  1576. setcc(%[1]) |
  1577. {INDEX_ADDR,%[2],%[1],
  1578. (0-2)*rom(1,1)} | |
  1579. lae aar $2 == 2 && rom(1,3) == 4 && rom(1,1) >= (0-31) && rom(1,1) <= 31
  1580. | DATASCR ADDREG |
  1581. "asl #2,%[1]"
  1582. erase(%[1])
  1583. setcc(%[1]) |
  1584. {INDEX_ADDR,%[2],%[1],
  1585. (0-4)*rom(1,1)} | |
  1586. | INDEX_ADDR | allocate(ADDREG)
  1587. "lea %[1.di](%[1.reg],%[1.ireg].w),%[a]"
  1588. samecc | %[a] | |
  1589. aar $1 == 2 | | remove(ALL)
  1590. "jsr .aar"
  1591. | | |
  1592. lar !defined($1) | |
  1593. remove(ALL)
  1594. "jsr .lari"
  1595. | | |
  1596. sar !defined($1) | |
  1597. remove(ALL)
  1598. "jsr .sari"
  1599. | | |
  1600. aar !defined($1) | |
  1601. remove(ALL)
  1602. "jsr .aari"
  1603. | | |
  1604. /* G R O U P XII : C O M P A R E */
  1605. cmi $1 == 2 | ANY DATASCR | "sub.w %[1],%[2]"
  1606. erase(%[2])
  1607. setcc(%[2]) | %[2] | |
  1608. cmi $1 == 4 | | remove(ALL)
  1609. "jsr .cmi"
  1610. | D1 | |
  1611. cmu $1 == 4 | | | | cmp |
  1612. cmu defined($1) | | remove(ALL)
  1613. "move.w #$1,d0"
  1614. "jsr .cmu"
  1615. | D1 | |
  1616. cmu !defined($1) | ANY | remove(ALL)
  1617. move(%[1],D0)
  1618. erase(D0)
  1619. "jsr .cmu"
  1620. | D1 | |
  1621. cms $1 == 2 | ANY DATASCR | "sub.w %[1],%[2]"
  1622. setcc(%[2])
  1623. erase(%[2]) | %[2] | |
  1624. ... | DATASCR ANY | "sub.w %[2],%[1]"
  1625. setcc(%[1])
  1626. erase(%[1]) | %[1] | |
  1627. cms $1==4 | | | | cmi $1 |
  1628. cms defined($1) | | remove(ALL)
  1629. "move.w #$1,d0"
  1630. "jsr .cms"
  1631. | | |
  1632. cms !defined($1) | ANY | remove(ALL)
  1633. move(%[1],D0)
  1634. "jsr .cms"
  1635. erase(D0)
  1636. | | |
  1637. cmp | | remove(ALL)
  1638. "jsr .cmp"
  1639. | D1 | |
  1640. cmi tlt and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1641. "cmp %[1],%[2]"
  1642. "blt 1f"
  1643. "clr %[3]"
  1644. "1:"
  1645. erase(%[3]) | %[3] | |
  1646. cmi tlt ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1647. "cmp %[1],%[2]"
  1648. "bge 1f"
  1649. "bset #0,%[3]"
  1650. "1:"
  1651. erase(%[3]) | %[3] | |
  1652. cmi tle and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1653. "cmp %[1],%[2]"
  1654. "ble 1f"
  1655. "clr %[3]"
  1656. "1:"
  1657. erase(%[3]) | %[3] | |
  1658. cmi tle ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1659. "cmp %[1],%[2]"
  1660. "bgt 1f"
  1661. "bset #0,%[3]"
  1662. "1:"
  1663. erase(%[3]) | %[3] | |
  1664. cmi teq and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1665. "cmp %[1],%[2]"
  1666. "beq 1f"
  1667. "clr %[3]"
  1668. "1:"
  1669. erase(%[3]) | %[3] | |
  1670. cmi teq ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1671. "cmp %[1],%[2]"
  1672. "bne 1f"
  1673. "bset #0,%[3]"
  1674. "1:"
  1675. erase(%[3]) | %[3] | |
  1676. cmi tne and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1677. "cmp %[1],%[2]"
  1678. "bne 1f"
  1679. "clr %[3]"
  1680. "1:"
  1681. erase(%[3]) | %[3] | |
  1682. cmi tne ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1683. "cmp %[1],%[2]"
  1684. "beq 1f"
  1685. "bset #0,%[3]"
  1686. "1:"
  1687. erase(%[3]) | %[3] | |
  1688. cmi tge and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1689. "cmp %[1],%[2]"
  1690. "bge 1f"
  1691. "clr %[3]"
  1692. "1:"
  1693. erase(%[3]) | %[3] | |
  1694. cmi tge ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1695. "cmp %[1],%[2]"
  1696. "blt 1f"
  1697. "bset #0,%[3]"
  1698. "1:"
  1699. erase(%[3]) | %[3] | |
  1700. cmi tgt and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1701. "cmp %[1],%[2]"
  1702. "bgt 1f"
  1703. "clr %[3]"
  1704. "1:"
  1705. erase(%[3]) | %[3] | |
  1706. cmi tgt ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1707. "cmp %[1],%[2]"
  1708. "ble 1f"
  1709. "bset #0,%[3]"
  1710. "1:"
  1711. erase(%[3]) | %[3] | |
  1712. cmu tlt and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1713. "cmp %[1],%[2]"
  1714. "bcs 1f"
  1715. "clr %[3]"
  1716. "1:"
  1717. erase(%[3]) | %[3] | |
  1718. cmu tlt ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1719. "cmp %[1],%[2]"
  1720. "bcc 1f"
  1721. "bset #0,%[3]"
  1722. "1:"
  1723. erase(%[3]) | %[3] | |
  1724. cmu tle and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1725. "cmp %[1],%[2]"
  1726. "bls 1f"
  1727. "clr %[3]"
  1728. "1:"
  1729. erase(%[3]) | %[3] | |
  1730. cmu tle ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1731. "cmp %[1],%[2]"
  1732. "bhi 1f"
  1733. "bset #0,%[3]"
  1734. "1:"
  1735. erase(%[3]) | %[3] | |
  1736. cmu teq and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1737. "cmp %[1],%[2]"
  1738. "beq 1f"
  1739. "clr %[3]"
  1740. "1:"
  1741. erase(%[3]) | %[3] | |
  1742. cmu teq ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1743. "cmp %[1],%[2]"
  1744. "bne 1f"
  1745. "bset #0,%[3]"
  1746. "1:"
  1747. erase(%[3]) | %[3] | |
  1748. cmu tne and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1749. "cmp %[1],%[2]"
  1750. "bne 1f"
  1751. "clr %[3]"
  1752. "1:"
  1753. erase(%[3]) | %[3] | |
  1754. cmu tne ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1755. "cmp %[1],%[2]"
  1756. "beq 1f"
  1757. "bset #0,%[3]"
  1758. "1:"
  1759. erase(%[3]) | %[3] | |
  1760. cmu tge and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1761. "cmp %[1],%[2]"
  1762. "bcc 1f"
  1763. "clr %[3]"
  1764. "1:"
  1765. erase(%[3]) | %[3] | |
  1766. cmu tge ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1767. "cmp %[1],%[2]"
  1768. "bcs 1f"
  1769. "bset #0,%[3]"
  1770. "1:"
  1771. erase(%[3]) | %[3] | |
  1772. cmu tgt and $1==2 && $3==2 | ANY DATAREG DATASCR |
  1773. "cmp %[1],%[2]"
  1774. "bhi 1f"
  1775. "clr %[3]"
  1776. "1:"
  1777. erase(%[3]) | %[3] | |
  1778. cmu tgt ior $1==2 && $3==2 | ANY DATAREG DATASCR |
  1779. "cmp %[1],%[2]"
  1780. "bls 1f"
  1781. "bset #0,%[3]"
  1782. "1:"
  1783. erase(%[3]) | %[3] | |
  1784. cmu zlt $1==2 | ANY DATAREG STACK |
  1785. "cmp.w %[1],%[2]"
  1786. "bcs $2" | | |
  1787. cmu zle $1==2 | ANY DATAREG STACK |
  1788. "cmp.w %[1],%[2]"
  1789. "bls $2" | | |
  1790. cmu zeq $1==2 | ANY DATAREG STACK |
  1791. "cmp.w %[1],%[2]"
  1792. "beq $2" | | |
  1793. cmu zne $1==2 | ANY DATAREG STACK |
  1794. "cmp.w %[1],%[2]"
  1795. "bne $2" | | |
  1796. cmu zge $1==2 | ANY DATAREG STACK |
  1797. "cmp.w %[1],%[2]"
  1798. "bcc $2" | | |
  1799. cmu zgt $1==2 | ANY DATAREG STACK |
  1800. "cmp.w %[1],%[2]"
  1801. "bhi $2" | | |
  1802. cmi tlt and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1803. "cmp.l %[1],%[2]"
  1804. "blt 1f"
  1805. "clr %[3]"
  1806. "1:"
  1807. erase(%[3]) | %[3] | |
  1808. cmi tlt ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1809. "cmp.l %[1],%[2]"
  1810. "bge 1f"
  1811. "bset #0,%[3]"
  1812. "1:"
  1813. erase(%[3]) | %[3] | |
  1814. cmi tle and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1815. "cmp.l %[1],%[2]"
  1816. "ble 1f"
  1817. "clr %[3]"
  1818. "1:"
  1819. erase(%[3]) | %[3] | |
  1820. cmi tle ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1821. "cmp.l %[1],%[2]"
  1822. "bgt 1f"
  1823. "bset #0,%[3]"
  1824. "1:"
  1825. erase(%[3]) | %[3] | |
  1826. cmi teq and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1827. "cmp.l %[1],%[2]"
  1828. "beq 1f"
  1829. "clr %[3]"
  1830. "1:"
  1831. erase(%[3]) | %[3] | |
  1832. cmi teq ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1833. "cmp.l %[1],%[2]"
  1834. "bne 1f"
  1835. "bset #0,%[3]"
  1836. "1:"
  1837. erase(%[3]) | %[3] | |
  1838. cmi tne and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1839. "cmp.l %[1],%[2]"
  1840. "bne 1f"
  1841. "clr %[3]"
  1842. "1:"
  1843. erase(%[3]) | %[3] | |
  1844. cmi tne ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1845. "cmp.l %[1],%[2]"
  1846. "beq 1f"
  1847. "bset #0,%[3]"
  1848. "1:"
  1849. erase(%[3]) | %[3] | |
  1850. cmi tge and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1851. "cmp.l %[1],%[2]"
  1852. "bge 1f"
  1853. "clr %[3]"
  1854. "1:"
  1855. erase(%[3]) | %[3] | |
  1856. cmi tge ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1857. "cmp.l %[1],%[2]"
  1858. "blt 1f"
  1859. "bset #0,%[3]"
  1860. "1:"
  1861. erase(%[3]) | %[3] | |
  1862. cmi tgt and $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1863. "cmp.l %[1],%[2]"
  1864. "bgt 1f"
  1865. "clr %[3]"
  1866. "1:"
  1867. erase(%[3]) | %[3] | |
  1868. cmi tgt ior $1==4 && $3==2 | ANY4 DATAREG4 DATASCR |
  1869. "cmp.l %[1],%[2]"
  1870. "ble 1f"
  1871. "bset #0,%[3]"
  1872. "1:"
  1873. erase(%[3]) | %[3] | |
  1874. cmi tlt $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1875. "cmp.l %[1],%[2]"
  1876. "blt 1f"
  1877. "clr %[a]"
  1878. "1:"
  1879. erase(%[a]) | %[a] | |
  1880. cmi tle $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1881. "cmp.l %[1],%[2]"
  1882. "ble 1f"
  1883. "clr %[a]"
  1884. "1:"
  1885. erase(%[a]) | %[a] | |
  1886. cmi teq $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1887. "cmp.l %[1],%[2]"
  1888. "beq 1f"
  1889. "clr %[a]"
  1890. "1:"
  1891. erase(%[a]) | %[a] | |
  1892. cmi tne $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1893. "cmp.l %[1],%[2]"
  1894. "bne 1f"
  1895. "clr %[a]"
  1896. "1:"
  1897. erase(%[a]) | %[a] | |
  1898. cmi tge $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1899. "cmp.l %[1],%[2]"
  1900. "bge 1f"
  1901. "clr %[a]"
  1902. "1:"
  1903. erase(%[a]) | %[a] | |
  1904. cmi tgt $1==4 | ANY4 DATAREG4 | allocate(DATAREG={IMMEDIATE,1})
  1905. "cmp.l %[1],%[2]"
  1906. "bgt 1f"
  1907. "clr %[a]"
  1908. "1:"
  1909. erase(%[a]) | %[a] | |
  1910. ldc cmi tlt and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1911. "tst.l %[1]"
  1912. "blt 1f"
  1913. "clr %[2]"
  1914. "1:"
  1915. erase(%[2]) | %[2] | |
  1916. ldc cmi tlt ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1917. "tst.l %[1]"
  1918. "bge 1f"
  1919. "bset #0,%[2]"
  1920. "1:"
  1921. erase(%[2]) | %[2] | |
  1922. ldc cmi tle and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1923. "tst.l %[1]"
  1924. "ble 1f"
  1925. "clr %[2]"
  1926. "1:"
  1927. erase(%[2]) | %[2] | |
  1928. ldc cmi tle ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1929. "tst.l %[1]"
  1930. "bgt 1f"
  1931. "bset #0,%[2]"
  1932. "1:"
  1933. erase(%[2]) | %[2] | |
  1934. ldc cmi teq and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1935. "tst.l %[1]"
  1936. "beq 1f"
  1937. "clr %[2]"
  1938. "1:"
  1939. erase(%[2]) | %[2] | |
  1940. ldc cmi teq ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1941. "tst.l %[1]"
  1942. "bne 1f"
  1943. "bset #0,%[2]"
  1944. "1:"
  1945. erase(%[2]) | %[2] | |
  1946. ldc cmi tne and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1947. "tst.l %[1]"
  1948. "bne 1f"
  1949. "clr %[2]"
  1950. "1:"
  1951. erase(%[2]) | %[2] | |
  1952. ldc cmi tne ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1953. "tst.l %[1]"
  1954. "beq 1f"
  1955. "bset #0,%[2]"
  1956. "1:"
  1957. erase(%[2]) | %[2] | |
  1958. ldc cmi tge and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1959. "tst.l %[1]"
  1960. "bge 1f"
  1961. "clr %[2]"
  1962. "1:"
  1963. erase(%[2]) | %[2] | |
  1964. ldc cmi tge ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1965. "tst.l %[1]"
  1966. "blt 1f"
  1967. "bset #0,%[2]"
  1968. "1:"
  1969. erase(%[2]) | %[2] | |
  1970. ldc cmi tgt and loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1971. "tst.l %[1]"
  1972. "bgt 1f"
  1973. "clr %[2]"
  1974. "1:"
  1975. erase(%[2]) | %[2] | |
  1976. ldc cmi tgt ior loww(1)==0&&highw(1)==0 && $2==4 && $4==2 | DATA_ALT4 DATASCR |
  1977. "tst.l %[1]"
  1978. "ble 1f"
  1979. "bset #0,%[2]"
  1980. "1:"
  1981. erase(%[2]) | %[2] | |
  1982. ldc cmi tlt loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  1983. "tst.l %[1]"
  1984. "blt 1f"
  1985. "clr %[a]"
  1986. "1:"
  1987. erase(%[a]) | %[a] | |
  1988. ldc cmi tle loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  1989. "tst.l %[1]"
  1990. "ble 1f"
  1991. "clr %[a]"
  1992. "1:"
  1993. erase(%[a]) | %[a] | |
  1994. ldc cmi teq loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  1995. "tst.l %[1]"
  1996. "beq 1f"
  1997. "clr %[a]"
  1998. "1:"
  1999. erase(%[a]) | %[a] | |
  2000. ldc cmi tne loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  2001. "tst.l %[1]"
  2002. "bne 1f"
  2003. "clr %[a]"
  2004. "1:"
  2005. erase(%[a]) | %[a] | |
  2006. ldc cmi tge loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  2007. "tst.l %[1]"
  2008. "bge 1f"
  2009. "clr %[a]"
  2010. "1:"
  2011. erase(%[a]) | %[a] | |
  2012. ldc cmi tgt loww(1)==0&&highw(1)==0 | DATA_ALT4 | allocate(DATAREG={IMMEDIATE,1})
  2013. "tst.l %[1]"
  2014. "bgt 1f"
  2015. "clr %[a]"
  2016. "1:"
  2017. erase(%[a]) | %[a] | |
  2018. cmi zlt $1==4 | ANY4 REG4 STACK |
  2019. "cmp.l %[1],%[2]"
  2020. "blt $2" | | |
  2021. cmi zle $1==4 | ANY4 REG4 STACK |
  2022. "cmp.l %[1],%[2]"
  2023. "ble $2" | | |
  2024. cmi zeq $1==4 | ANY4 REG4 STACK |
  2025. "cmp.l %[1],%[2]"
  2026. "beq $2" | | |
  2027. cmi zne $1==4 | ANY4 REG4 STACK |
  2028. "cmp.l %[1],%[2]"
  2029. "bne $2" | | |
  2030. cmi zge $1==4 | ANY4 REG4 STACK |
  2031. "cmp.l %[1],%[2]"
  2032. "bge $2" | | |
  2033. cmi zgt $1==4 | ANY4 REG4 STACK |
  2034. "cmp.l %[1],%[2]"
  2035. "bgt $2" | | |
  2036. ldc cmi zlt loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2037. test(%[1])
  2038. "blt $3" | | |
  2039. ldc cmi zle loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2040. test(%[1])
  2041. "ble $3" | | |
  2042. ldc cmi zeq loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2043. test(%[1])
  2044. "beq $3" | | |
  2045. ldc cmi zne loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2046. test(%[1])
  2047. "bne $3" | | |
  2048. ldc cmi zge loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2049. test(%[1])
  2050. "bge $3" | | |
  2051. ldc cmi zgt loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2052. test(%[1])
  2053. "bgt $3" | | |
  2054. ldc cms zeq loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2055. test(%[1])
  2056. "beq $3" | | |
  2057. ldc cms zne loww(1)==0&&highw(1)==0 && $2==4 | DATA_ALT4 STACK |
  2058. test(%[1])
  2059. "bne $3" | | |
  2060. cmp tlt | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2061. "cmp.l %[1],%[2]"
  2062. "bcs 1f"
  2063. "clr.w %[a]"
  2064. "1:"
  2065. erase(%[a]) | %[a] | |
  2066. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2067. "cmp.l %[1],%[2]"
  2068. "bcs 1f"
  2069. "clr.w %[a]"
  2070. "1:"
  2071. erase(%[a]) | %[a] | |
  2072. cmp tle | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2073. "cmp.l %[1],%[2]"
  2074. "bls 1f"
  2075. "clr.w %[a]"
  2076. "1:"
  2077. erase(%[a]) | %[a] | |
  2078. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2079. "cmp.l %[1],%[2]"
  2080. "bls 1f"
  2081. "clr.w %[a]"
  2082. "1:"
  2083. erase(%[a]) | %[a] | |
  2084. cmp teq | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2085. "cmp.l %[1],%[2]"
  2086. "beq 1f"
  2087. "clr.w %[a]"
  2088. "1:"
  2089. erase(%[a]) | %[a] | |
  2090. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2091. "cmp.l %[1],%[2]"
  2092. "beq 1f"
  2093. "clr.w %[a]"
  2094. "1:"
  2095. erase(%[a]) | %[a] | |
  2096. cmp bne | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2097. "cmp.l %[1],%[2]"
  2098. "bne 1f"
  2099. "clr.w %[a]"
  2100. "1:"
  2101. erase(%[a]) | %[a] | |
  2102. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2103. "cmp.l %[1],%[2]"
  2104. "bne 1f"
  2105. "clr.w %[a]"
  2106. "1:"
  2107. erase(%[a]) | %[a] | |
  2108. cmp tge | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2109. "cmp.l %[1],%[2]"
  2110. "bcc 1f"
  2111. "clr.w %[a]"
  2112. "1:"
  2113. erase(%[a]) | %[a] | |
  2114. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2115. "cmp.l %[1],%[2]"
  2116. "bcc 1f"
  2117. "clr.w %[a]"
  2118. "1:"
  2119. erase(%[a]) | %[a] | |
  2120. cmp tgt | ANY4 ADDREG | allocate(DATAREG={IMMEDIATE,1})
  2121. "cmp.l %[1],%[2]"
  2122. "bhi 1f"
  2123. "clr.w %[a]"
  2124. "1:"
  2125. erase(%[a]) | %[a] | |
  2126. ... | nocoercions: EXTERNAL_ADDR ANY4 | allocate(DATAREG={IMMEDIATE,1})
  2127. "cmp.l %[1],%[2]"
  2128. "bhi 1f"
  2129. "clr.w %[a]"
  2130. "1:"
  2131. erase(%[a]) | %[a] | |
  2132. cmp zlt | ANY4 ADDREG | remove(ALL)
  2133. "cmp.l %[1],%[2]"
  2134. "bcs $2" | | |
  2135. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2136. "cmp.l %[1],%[2]"
  2137. "bcs $2" | | |
  2138. cmp zle | ANY4 ADDREG | remove(ALL)
  2139. "cmp.l %[1],%[2]"
  2140. "bls $2" | | |
  2141. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2142. "cmp.l %[1],%[2]"
  2143. "bls $2" | | |
  2144. cmp zeq | ANY4 ADDREG | remove(ALL)
  2145. "cmp.l %[1],%[2]"
  2146. "beq $2" | | |
  2147. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2148. "cmp.l %[1],%[2]"
  2149. "beq $2" | | |
  2150. cmp zne | ANY4 ADDREG | remove(ALL)
  2151. "cmp.l %[1],%[2]"
  2152. "bne $2" | | |
  2153. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2154. "cmp.l %[1],%[2]"
  2155. "bne $2" | | |
  2156. cmp zge | ANY4 ADDREG | remove(ALL)
  2157. "cmp.l %[1],%[2]"
  2158. "bcc $2" | | |
  2159. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2160. "cmp.l %[1],%[2]"
  2161. "bcc $2" | | |
  2162. cmp zgt | ANY4 ADDREG | remove(ALL)
  2163. "cmp.l %[1],%[2]"
  2164. "bhi $2" | | |
  2165. ... | nocoercions: EXTERNAL_ADDR ANY4 | remove(ALL)
  2166. "cmp.l %[1],%[2]"
  2167. "bhi $2" | | |
  2168. tlt and $2==2 | DATA_ALT DATASCR |
  2169. test(%[1])
  2170. "blt 1f"
  2171. "clr.w %[2]"
  2172. "1:"
  2173. erase(%[2]) | %[2] | |
  2174. tlt ior $2==2 | DATA_ALT DATASCR |
  2175. test(%[1])
  2176. "bge 1f"
  2177. "bset #0,%[2]"
  2178. "1:"
  2179. erase(%[2]) | %[2] | |
  2180. tlt | DATA_ALT | allocate(DATAREG={IMMEDIATE,1})
  2181. test(%[1])
  2182. "blt 1f"
  2183. "clr %[a]"
  2184. "1:" | %[a] | |
  2185. tle and $2==2 | DATA_ALT DATASCR |
  2186. test(%[1])
  2187. "ble 1f"
  2188. "clr.w %[2]"
  2189. "1:"
  2190. erase(%[2]) | %[2] | |
  2191. tle ior $2==2 | DATA_ALT DATASCR |
  2192. test(%[1])
  2193. "bgt 1f"
  2194. "bset #0,%[2]"
  2195. "1:"
  2196. erase(%[2]) | %[2] | |
  2197. tle | DATA_ALT | allocate(DATAREG={IMMEDIATE,1})
  2198. test(%[1])
  2199. "ble 1f"
  2200. "clr %[a]"
  2201. "1:" | %[a] | |
  2202. teq and $2==2 | DATA_ALT_1OR2 DATASCR |
  2203. test(%[1])
  2204. "beq 1f"
  2205. "clr.w %[2]"
  2206. "1:"
  2207. erase(%[2]) | %[2] | |
  2208. teq ior $2==2 | DATA_ALT_1OR2 DATASCR |
  2209. test(%[1])
  2210. "bne 1f"
  2211. "bset #0,%[2]"
  2212. "1:"
  2213. erase(%[2]) | %[2] | |
  2214. teq | DATA_ALT_1OR2 | allocate(DATAREG={IMMEDIATE,1})
  2215. test(%[1])
  2216. "beq 1f"
  2217. "clr %[a]"
  2218. "1:" | %[a] | |
  2219. tne and $2==2 | DATA_ALT_1OR2 DATASCR |
  2220. test(%[1])
  2221. "bne 1f"
  2222. "clr.w %[2]"
  2223. "1:"
  2224. erase(%[2]) | %[2] | |
  2225. tne ior $2==2 | DATA_ALT_1OR2 DATASCR |
  2226. test(%[1])
  2227. "beq 1f"
  2228. "bset #0,%[2]"
  2229. "1:"
  2230. erase(%[2]) | %[2] | |
  2231. tne | DATA_ALT_1OR2 | allocate(DATAREG={IMMEDIATE,1})
  2232. test(%[1])
  2233. "bne 1f"
  2234. "clr %[a]"
  2235. "1:" | %[a] | |
  2236. tge and $2==2 | DATA_ALT DATASCR |
  2237. test(%[1])
  2238. "bge 1f"
  2239. "clr.w %[2]"
  2240. "1:"
  2241. erase(%[2]) | %[2] | |
  2242. tge ior $2==2 | DATA_ALT DATASCR |
  2243. test(%[1])
  2244. "blt 1f"
  2245. "bset #0,%[2]"
  2246. "1:"
  2247. erase(%[2]) | %[2] | |
  2248. tge | DATA_ALT | allocate(DATAREG={IMMEDIATE,1})
  2249. test(%[1])
  2250. "bge 1f"
  2251. "clr %[a]"
  2252. "1:" | %[a] | |
  2253. tgt and $2==2 | DATA_ALT DATASCR |
  2254. test(%[1])
  2255. "bgt 1f"
  2256. "clr.w %[2]"
  2257. "1:"
  2258. erase(%[2]) | %[2] | |
  2259. tgt ior $2==2 | DATA_ALT DATASCR |
  2260. test(%[1])
  2261. "ble 1f"
  2262. "bset #0,%[2]"
  2263. "1:"
  2264. erase(%[2]) | %[2] | |
  2265. tgt | DATA_ALT | allocate(DATAREG={IMMEDIATE,1})
  2266. test(%[1])
  2267. "bgt 1f"
  2268. "clr %[a]"
  2269. "1:" | %[a] | |
  2270. /* G R O U P XIII : B R A N C H */
  2271. bra | STACK | "bra $1" | | |
  2272. /* byte comparisons */
  2273. loc beq $1 >= 0 && $1 < 256 | nocoercions: DATA_ALT1 |
  2274. remove(ALL)
  2275. "cmp.b #$1,%[1]"
  2276. "beq $2" | | |
  2277. ... | DATA_ALT STACK |
  2278. "cmp #$1,%[1]"
  2279. "beq $2" | | |
  2280. loc bne $1 >= 0 && $1 < 256 | nocoercions: DATA_ALT1 |
  2281. remove(ALL)
  2282. "cmp.b #$1,%[1]"
  2283. "bne $2" | | |
  2284. ... | DATA_ALT STACK |
  2285. "cmp #$1,%[1]"
  2286. "bne $2" | | |
  2287. blt | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2288. "blt $1" | | |
  2289. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2290. "blt $1" | | |
  2291. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2292. "bgt $1" | | |
  2293. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2294. "bgt $1" | | |
  2295. ble | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2296. "ble $1" | | |
  2297. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2298. "ble $1" | | |
  2299. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2300. "bge $1" | | |
  2301. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2302. "bge $1" | | |
  2303. beq | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2304. "beq $1" | | |
  2305. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2306. "beq $1" | | |
  2307. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2308. "beq $1" | | |
  2309. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2310. "beq $1" | | |
  2311. bne | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2312. "bne $1" | | |
  2313. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2314. "bne $1" | | |
  2315. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2316. "bne $1" | | |
  2317. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2318. "bne $1" | | |
  2319. bge | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2320. "bge $1" | | |
  2321. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2322. "bge $1" | | |
  2323. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2324. "ble $1" | | |
  2325. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2326. "ble $1" | | |
  2327. bgt | IMMEDIATE DATA_ALT STACK | "cmp %[1],%[2]"
  2328. "bgt $1" | | |
  2329. ... | ANY DATAREG STACK | "cmp %[1],%[2]"
  2330. "bgt $1" | | |
  2331. ... | DATAREG ANY STACK | "cmp %[2],%[1]"
  2332. "blt $1" | | |
  2333. ... | DATA_ALT IMMEDIATE STACK | "cmp %[2],%[1]"
  2334. "blt $1" | | |
  2335. zlt | DATA_ALT | remove(ALL)
  2336. test(%[1])
  2337. "blt $1" | | |
  2338. zle | DATA_ALT | remove(ALL)
  2339. test(%[1])
  2340. "ble $1" | | |
  2341. zeq | DATA_ALT_1OR2 | remove(ALL)
  2342. test(%[1])
  2343. "beq $1" | | |
  2344. zne | DATA_ALT_1OR2 | remove(ALL)
  2345. test(%[1])
  2346. "bne $1" | | |
  2347. zge | DATA_ALT | remove(ALL)
  2348. test(%[1])
  2349. "bge $1" | | |
  2350. zgt | DATA_ALT | remove(ALL)
  2351. test(%[1])
  2352. "bgt $1" | | |
  2353. /* G R O U P : XIV P R O C E D U R E C A L L S */
  2354. cai | ADDREG | remove(ALL)
  2355. "jsr (%[1])"
  2356. | | |
  2357. cal | | remove(ALL)
  2358. "jsr $1"
  2359. | | |
  2360. lfr $1 == 2 | | | D0 | |
  2361. lfr $1 == 4 | | | DD0 | |
  2362. lfr $1 == 8 | | | DD1 DD0 | |
  2363. ret $1 == 0 | STACK |
  2364. #ifdef REGVARS
  2365. return | | |
  2366. #else
  2367. "unlk a6"
  2368. "rts" | | |
  2369. #endif
  2370. ret $1 == 2 | ANY STACK |
  2371. move(%[1],D0)
  2372. #ifdef REGVARS
  2373. return | | |
  2374. #else
  2375. "unlk a6"
  2376. "rts" | | |
  2377. #endif
  2378. ... | STACK |
  2379. "move.w (sp)+,d0"
  2380. #ifdef REGVARS
  2381. return | | |
  2382. #else
  2383. "unlk a6"
  2384. "rts" | | |
  2385. #endif
  2386. ret $1 == 4 | ANY4 STACK |
  2387. move(%[1],DD0)
  2388. #ifdef REGVARS
  2389. return | | |
  2390. #else
  2391. "unlk a6"
  2392. "rts" | | |
  2393. #endif
  2394. ... | STACK |
  2395. "move.l (sp)+,d0"
  2396. #ifdef REGVARS
  2397. return | | |
  2398. #else
  2399. "unlk a6"
  2400. "rts" | | |
  2401. #endif
  2402. ret $1 == 8 | ANY4 ANY4 STACK |
  2403. move(%[1],DD0)
  2404. move(%[2],DD1)
  2405. #ifdef REGVARS
  2406. return | | |
  2407. #else
  2408. "unlk a6"
  2409. "rts" | | |
  2410. #endif
  2411. ... | STACK |
  2412. "move.l (sp)+,d0"
  2413. "move.l (sp)+,d1"
  2414. #ifdef REGVARS
  2415. return | | |
  2416. #else
  2417. "unlk a6"
  2418. "rts" | | |
  2419. #endif
  2420. /* G R O U P XV : M I S C E L L A N E O U S */
  2421. asp $1 >= 1 && $1 <= 8 | STACK | "add.l #$1,sp" | | |
  2422. asp | STACK | "lea $1(sp),sp" | | |
  2423. ass $1 == 2 | DATAREG STACK | "add.l %[1],sp" | | |
  2424. blm $1 == 2 | ADDREG ADDREG | remove(MEM_ALL)
  2425. move({IADDREG,%[2]}, {IADDREG,%[1]}) | | |
  2426. blm $1 == 4 | ADDREG ADDREG | remove(MEM_ALL)
  2427. move({IADDREG4,%[2]}, {IADDREG4,%[1]}) | | |
  2428. blm $1 == 6 | ADDSCR ADDSCR | remove(MEM_ALL)
  2429. "move.w (%[2])+,(%[1])+"
  2430. "move.l (%[2]),(%[1])"
  2431. erase(%[1])
  2432. erase(%[2]) | | |
  2433. blm $1 == 8 | ADDSCR ADDSCR | remove(MEM_ALL)
  2434. "move.l (%[2])+,(%[1])+"
  2435. "move.l (%[2]),(%[1])"
  2436. erase(%[1])
  2437. erase(%[2]) | | |
  2438. blm $1 == 10 | ADDSCR ADDSCR | remove(MEM_ALL)
  2439. "move.w (%[2])+,(%[1])+"
  2440. "move.l (%[2])+,(%[1])+"
  2441. "move.l (%[2]),(%[1])"
  2442. erase(%[1])
  2443. erase(%[2]) | | |
  2444. blm $1 == 12 | ADDSCR ADDSCR | remove(MEM_ALL)
  2445. "move.l (%[2])+,(%[1])+"
  2446. "move.l (%[2])+,(%[1])+"
  2447. "move.l (%[2]),(%[1])"
  2448. erase(%[1])
  2449. erase(%[2]) | | |
  2450. blm $1 > 12 | ADDSCR ADDSCR | remove(MEM_ALL)
  2451. allocate(DATAREG4={IMMEDIATE4,$1/2-1})
  2452. "1:"
  2453. "move.w (%[2])+,(%[1])+"
  2454. "dbf %[a],1b"
  2455. erase(%[a])
  2456. erase(%[1])
  2457. erase(%[2]) | | |
  2458. /* Wait for restriction nregneeded<2 to be removed
  2459. bls $1 == 2 | DATASCR ADDSCR ADDSCR |
  2460. remove(MEM_ALL)
  2461. "sub.w #1,%[1]"
  2462. "asr #1,%[1]"
  2463. "beq 2f"
  2464. "1:"
  2465. "move.w (%[3])+,(%[2])+"
  2466. "dbf %[1],1b"
  2467. "2:"
  2468. erase(%[1])
  2469. erase(%[2])
  2470. erase(%[3]) | | |
  2471. */
  2472. bls $1 == 2 | STACK |
  2473. allocate(ADDREG,ADDREG,DATAREG)
  2474. "move.w (sp)+,%[c]"
  2475. "move.l (sp)+,%[b]"
  2476. "move.l (sp)+,%[a]"
  2477. "sub.w #1,%[c]"
  2478. "asr #1,%[c]"
  2479. "beq 2f"
  2480. "1:"
  2481. "move.w (%[a])+,(%[b])+"
  2482. "dbf %[c],1b"
  2483. "2:" | | |
  2484. /* For csa and csb we just jump to a piece of code that computes
  2485. * the jump-address and jumps to this address
  2486. */
  2487. csa $1 == 2 | | remove(ALL)
  2488. "jmp .csa"
  2489. | | |
  2490. csb $1 == 2 | | remove(ALL)
  2491. "jmp .csb"
  2492. | | |
  2493. dch | | | | loi 4 |
  2494. dup $1 == 2 | ANY | | %[1] %[1] | |
  2495. dup $1 == 4 | ANY4 | | %[1] %[1] | |
  2496. ... | ANY ANY | | %[2] %[1] %[2] %[1] | |
  2497. dup $1 > 4 | STACK | allocate(ADDREG,DATAREG4)
  2498. "move.l sp,%[a]"
  2499. "add.l #$1,%[a]"
  2500. "move.l #$1/2-1,%[b]"
  2501. "1:"
  2502. "move.w -(%[a]),-(sp)"
  2503. "dbf %[b],1b" | | |
  2504. dus $1 == 2 | DATASCR | remove(ALL)
  2505. allocate(ADDREG)
  2506. "move.l sp,%[a]"
  2507. "add.l %[1],%[a]"
  2508. "sub.w #1,%[1]"
  2509. "asr #1,%[1]"
  2510. "1:"
  2511. "move.w -(%[a]),-(sp)"
  2512. "dbf %[1],1b" | | |
  2513. exg | STACK | "move.w #$1,d0"
  2514. "jsr .exg" | | |
  2515. fil | | "move.l #$1,.filn" | | |
  2516. gto | STACK | allocate(ADDREG)
  2517. "lea $1,%[a]"
  2518. "move.l 4(%[a]),sp"
  2519. "move.l 8(%[a]),a6"
  2520. "move.l (%[a]),%[a]"
  2521. "jmp (%[a])" | | |
  2522. lin | | "move.w #$1,.lino" | | |
  2523. lni | | "add.w #1,.lino" | | |
  2524. mon | STACK | "jsr .mon" | | |
  2525. nop | STACK | "jsr .nop" | | |
  2526. lim | | | {ABS4,".trpim"} | |
  2527. lor $1 == 0 | | | LB | |
  2528. lor $1 == 1 | STACK | "move.l sp,-(sp)" | | |
  2529. lor $1 == 2 | | | {ABS4,".reghp"} | |
  2530. lpb | | | | adp 8 |
  2531. rck $1 == 2 | | remove(ALL)
  2532. "jsr .rck"
  2533. | | |
  2534. rtt | | | | ret 0 |
  2535. sig | STACK | "jsr .sig" | | |
  2536. sim | | remove(ALL)
  2537. "move.w (sp)+,.trpim" | | |
  2538. str $1 == 0 | ANY4 STACK | "move.l %[1],a6" | | |
  2539. str $1 == 1 | STACK | "move.l (sp)+,sp" | | |
  2540. str $1 == 2 | | remove(ALL)
  2541. "jsr .strhp"
  2542. | | |
  2543. trp | STACK | "jsr .trp" | | |
  2544. /* For several floating point instructions we generate an illegal
  2545. * instruction trap.
  2546. */
  2547. adf | | | | loc 18 trp |
  2548. sbf | | | | loc 18 trp |
  2549. mlf | | | | loc 18 trp |
  2550. dvf | | | | loc 18 trp |
  2551. ngf | | | | loc 18 trp |
  2552. fef | | | | loc 18 trp |
  2553. fif | | | | loc 18 trp |
  2554. zrf | | | | loc 18 trp |
  2555. cfi | | | | loc 18 trp |
  2556. cif | | | | loc 18 trp |
  2557. cuf | | | | loc 18 trp |
  2558. cff | | | | loc 18 trp |
  2559. cfu | | | | loc 18 trp |
  2560. cmf | | | | loc 18 trp |
  2561. /* C O E R C I O N S */
  2562. /* from stack */
  2563. | STACK | allocate(DATAREG)
  2564. "move.w (sp)+,%[a]"
  2565. setcc(%[a]) | %[a] | | (2,4)
  2566. | STACK | allocate(DATAREG4)
  2567. "move.l (sp)+,%[a]"
  2568. setcc(%[a]) | %[a] | | (2,6)
  2569. | STACK | allocate(ADDREG)
  2570. "move.l (sp)+,%[a]"
  2571. setcc(%[a]) | %[a] | | (2,6)
  2572. /* to a register, for efficiency */
  2573. | ANY | allocate(%[1],DATAREG=%[1]) | %[a] | | (2,2)
  2574. | ANY4 | allocate(%[1],DATAREG4=%[1]) | %[a] | | (2,2)
  2575. | ANY4 | allocate(%[1],ADDREG=%[1]) | %[a] | | (2,2)
  2576. /* from double to 2 singles */
  2577. | DOUBLEZERO | | {IMMEDIATE,0} {IMMEDIATE,0} | |
  2578. | DISPL4 | | {DISPL,%[1.reg],%[1.dis]+2} {DISPL,%[1.reg],%[1.dis]} | |
  2579. /* impossible to add string and integer:
  2580. | ABS4 | | {ABS,%[1.addr]} {ABS,[%1.addr]+2} | |
  2581. */
  2582. /*
  2583. | INDEXED4 | | {INDEXED,%[1.reg],%[1.ireg],%[1.di]}
  2584. {INDEXED,%[1.reg],%[1.ireg],%[1.di]+2} | |
  2585. */
  2586. /* from 1 to 2 bytes */
  2587. | ANY1 | allocate(DATAREG = {IMMEDIATE,0})
  2588. "move.b %[1],%[a]"
  2589. erase(%[a]) | %[a] | |
  2590. MOVES:
  2591. (IMMEDIATE %[cc] == 0, DATA_ALT, "clr.w %[2]" setcc(%[2]),(2,3)+%[2] )
  2592. (IMMEDIATE (%[cc] >= 0-128 && %[cc] <= 127), DATAREG,
  2593. "move.l %[1],%[2]" setcc(%[2]),(2,2))
  2594. (ANY, DATA_ALT, "move.w %[1], %[2]"setcc(%[2]),(2,2)+%[1]+%[2])
  2595. (IMMEDIATE %[cc] == 0, ANY1, "clr.b %[2]" setcc(%[2]),(2,3)+%[2] )
  2596. (ANY+ANY1, ANY1, "move.b %[1], %[2]"setcc(%[2]),(2,2)+%[1]+%[2])
  2597. (IMMEDIATE4 %[cc] == 0, DATA_ALT4, "clr.l %[2]"setcc(%[2]),(2,5)+%[2])
  2598. (DOUBLEZERO, DATA_ALT4, "clr.l %[2]"setcc(%[2]),(2,5)+%[2])
  2599. (DOUBLE %[cc] == "0", DATA_ALT4, "clr.l %[2]"setcc(%[2]),(2,5)+%[2])
  2600. (IMMEDIATE4 (%[cc] >= 0-128 && %[cc] <= 127),DATAREG4,
  2601. "move.l %[1],%[2]" setcc(%[2]),(2,2))
  2602. (IMMEDIATE4, ADDREG, "lea %[1.cc],%[2]" nocc, (4,4))
  2603. (EXTERNAL_ADDR, ADDREG, "lea %[1.off],%[2]" nocc, (5,5))
  2604. (ANY4, DATA_ALT4, "move.l %[1], %[2]"setcc(%[2]),(2,2)+%[1]+%[2])
  2605. (ANY, ADDREG, "move.w %[1], %[2]"samecc,(2,2)+%[1])
  2606. (ANY4,ADDREG, "move.l %[1], %[2]"samecc,(2,2)+%[1])
  2607. TESTS:
  2608. (DATA_ALT, "tst %[1]",(2,2)+%[1])
  2609. (DATA_ALT4,"tst.l %[1]",(2,2)+%[1])
  2610. (ANY1,"tst.b %[1]",(2,2)+%[1])
  2611. STACKS:
  2612. (IMMEDIATE %[cc] == 0, , "clr.w -(sp)" setcc(%[1]))
  2613. (ANY, , "move.w %[1],-(sp)" setcc(%[1]), (2,4) + %[1])
  2614. (EXTERNAL_ADDR, , "pea %[1.off]" nocc)
  2615. (LOCAL_ADDR, , "pea %[1.off](a6)" nocc)
  2616. (REGOFF_ADDR, , "pea %[1.off](%[1.reg])" nocc)
  2617. (INDEX_ADDR, , "pea %[1.di](%[1.reg],%[1.ireg].w)" nocc)
  2618. (IMMEDIATE4 %[cc] == 0, , "clr.l -(sp)")
  2619. (IMMEDIATE4, , "pea %[1.cc]" nocc)
  2620. (DOUBLEZERO, , "clr.l -(sp)", (2,4))
  2621. (ANY4, , "move.l %[1],-(sp)" setcc(%[1]), (2,6) + %[1])
  2622. (ANY1, , "clr.w -(sp)" "move.b %[1],1(sp)")