table 70 KB

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