table 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857
  1. "$Id$"
  2. #define SL 6
  3. #define SSL "6"
  4. /* savsize is 6 because size of LB is 2 and size of z8000-PC is 4 */
  5. #define NC nocoercions:
  6. /*********************************************************
  7. ** Back end tables for z8000 **
  8. ** Author: Jan Voors **
  9. ** **
  10. ** wordsize = 2 bytes, pointersize = 2 bytes. **
  11. ** **
  12. ** Register R13 is used as LB, RR14 is the normal **
  13. ** z8000-stackpointer. Some global variables are used: **
  14. ** - reghp : the heap pointer **
  15. ** - trpim : trap ignore mask **
  16. ** - trppc : address of user defined trap handler **
  17. ** **
  18. ** Floating point arithmetic and constants are not **
  19. ** implemented. **
  20. ** **
  21. *********************************************************/
  22. /*
  23. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  24. *
  25. * This product is part of the Amsterdam Compiler Kit.
  26. *
  27. * Permission to use, sell, duplicate or disclose this software must be
  28. * obtained in writing. Requests for such permissions may be sent to
  29. *
  30. * Dr. Andrew S. Tanenbaum
  31. * Wiskundig Seminarium
  32. * Vrije Universiteit
  33. * Postbox 7161
  34. * 1007 MC Amsterdam
  35. * The Netherlands
  36. *
  37. */
  38. EM_WSIZE = 2
  39. EM_PSIZE = 2
  40. EM_BSIZE = SL
  41. TIMEFACTOR = 3/4
  42. REGISTERS:
  43. R0 = ("R0", 2), REG, B2REG.
  44. R1 = ("R1", 2), REG, B2REG, XREG.
  45. R2 = ("R2", 2), REG, B2REG, XREG.
  46. R3 = ("R3", 2), REG, B2REG, XREG.
  47. R4 = ("R4", 2), REG, B2REG, XREG.
  48. R5 = ("R5", 2), REG, B2REG, XREG.
  49. R6 = ("R6", 2), REG, B2REG, XREG.
  50. R7 = ("R7", 2), REG, B2REG, XREG.
  51. R8 = ("R8", 2), REG, XREG.
  52. R9 = ("R9", 2), REG, XREG.
  53. R10 = ("R10", 2), REG, XREG.
  54. R11 = ("R11", 2), REG, XREG.
  55. R12 = ("R12", 2), REG, XREG.
  56. LB = ("R13", 2), localbase.
  57. RR0 = ("RR0", 4, R0, R1), LWREG, LWB2REG.
  58. RR2 = ("RR2", 4, R2, R3), LWREG, LWB2REG, LWXREG.
  59. RR4 = ("RR4", 4, R4, R5), LWREG, LWB2REG, LWXREG.
  60. RR6 = ("RR6", 4, R6, R7), LWREG, LWB2REG, LWXREG.
  61. RR8 = ("RR8", 4, R8, R9), LWREG, LWXREG.
  62. RR10 = ("RR10", 4, R10, R11), LWREG, LWXREG.
  63. RQ0 = ("RQ0", 8, RR0, RR2), DLWREG.
  64. RQ4 = ("RQ4", 8, RR4, RR6), DLWREG.
  65. RQ8 = ("RQ8", 8, RR8, RR10), DLWREG.
  66. /* */
  67. TOKENS:
  68. /* z8000-addressing-modes 'ra', 'ba' and 'bx' never used so far,
  69. ** so there are no tokens for them (yet).
  70. */
  71. ir1 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]"
  72. ir2 = { REGISTER lwxreg; } 2 cost=(0,2) "*%[lwxreg]"
  73. ir4 = { REGISTER lwxreg; } 4 cost=(0,5) "*%[lwxreg]"
  74. ir4_hi = { REGISTER lwreg; } 2
  75. da1 = { STRING ind; } 2 cost=(4,4) "%[ind]"
  76. da2 = { STRING ind; } 2 cost=(4,4) "%[ind]"
  77. da4 = { STRING ind; } 4 cost=(4,7) "%[ind]"
  78. im2 = { INT num; } 2 cost=(2,2) "$%[num]"
  79. im4 = { INT num; } 4 cost=(4,5) "$%[num]"
  80. double = { STRING ind; } 4 cost=(4,5) "$%[ind]"
  81. x1 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])"
  82. x2 = { REGISTER xreg; INT ind; } 2 cost=(4,5) "%[ind](%[xreg])"
  83. x4 = { REGISTER xreg; INT ind; } 4 cost=(4,8) "%[ind](%[xreg])"
  84. ADDR_LOCAL = { INT ind; } 2
  85. ADDR_EXTERNAL = { STRING ind; } 2 cost=(2,3) "$%[ind]"
  86. regconst2 = { REGISTER xreg; INT ind; } 2
  87. TOKENEXPRESSIONS:
  88. REGS = REG + LWREG + DLWREG
  89. SCR_REG = REG * SCRATCH
  90. SCR_XREG = XREG * SCRATCH
  91. SCR_LWREG = LWREG * SCRATCH
  92. SCR_DLWREG = DLWREG * SCRATCH
  93. src1 = ir1 + da1 + x1
  94. src2 = REG + ir2 + im2 + da2 + x2 + localbase + ADDR_EXTERNAL
  95. src4 = LWREG + ir4 + im4 + da4 + x4 + double
  96. indexed = x1 + x2 + x4
  97. ind_access = ir1 + ir2 + ir4
  98. da = da1 + da2 + da4
  99. const2 = im2 + ADDR_EXTERNAL
  100. const4 = im4 + double
  101. allexceptcon = ALL - REGS - im2 - im4 - double - ADDR_LOCAL
  102. - ADDR_EXTERNAL
  103. src2a = ir2 + da2 + x2
  104. src4a = ir4 + da4 + x4
  105. src2b = REG + im2 + localbase + ADDR_EXTERNAL
  106. src4b = LWREG
  107. src2c = REG + ir2 + da2 + x2
  108. CODE:
  109. /* */
  110. /***************************************
  111. ******** GROUP 1 ********
  112. ***************************************/
  113. loc | | | {im2, $1} | |
  114. ldc | | allocate( LWREG )
  115. move( {im2, highw(1)}, %[a.1] )
  116. move( {im2, loww(1)}, %[a.2] ) | %[a] | |
  117. lol | | | {x2, LB, $1} | |
  118. ldl | | | {x4, LB, $1} | |
  119. loe | | | {da2, $1} | |
  120. lde | | | {da4, $1} | |
  121. lil | | allocate( LWXREG )
  122. move( {x2, LB, $1}, %[a.2] )
  123. move( {im2, 0}, %[a.1] ) | {ir2,%[a]} | |
  124. lof | XREG | | {x2, %[1], $1} | |
  125. ... | NC regconst2 | | {x2, %[1.xreg], $1+%[1.ind]} | |
  126. ... | NC ADDR_EXTERNAL | | {da2, tostring($1)+"+"+%[1.ind]} | |
  127. ... | NC ADDR_LOCAL | | {x2, LB, %[1.ind]+$1} | |
  128. ldf | XREG | | {x4, %[1], $1} | |
  129. ... | NC regconst2 | | {x4, %[1.xreg], $1+%[1.ind]} | |
  130. ... | NC ADDR_EXTERNAL | | {da4, tostring($1)+"+"+%[1.ind]} | |
  131. ... | NC ADDR_LOCAL | | {x4, LB, %[1.ind]+$1} | |
  132. lal | | | { ADDR_LOCAL, $1 } | |
  133. lae | | | { ADDR_EXTERNAL, $1 } | |
  134. lxl $1==0 | | | LB | |
  135. lxl $1==1 | | | {x2, LB, SL} | |
  136. lxl $1==2 | | allocate( XREG = {x2, LB, SL} ) | {x2, %[a], SL}| |
  137. lxl $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
  138. "1:\tld %[a], 6(%[a])"
  139. "djnz %[b], 1b"
  140. erase(%[a]) erase(%[b]) samecc | %[a] | |
  141. lxa $1==0 | | | {ADDR_LOCAL, SL} | |
  142. lxa $1==1 | | allocate( XREG = {x2, LB, SL} ) |
  143. {regconst2, %[a], SL} | |
  144. lxa $1==2 | | allocate( XREG = {x2, LB, SL} )
  145. move( {x2, %[a], SL }, %[a] ) |
  146. {regconst2, %[a], SL} | |
  147. lxa $1>2 | | allocate( XREG = {x2, LB, SL}, REG = {im2, $1-1} )
  148. "1:\tld %[a], 6(%[a])"
  149. "djnz %[b], 1b"
  150. erase(%[a]) erase(%[b]) samecc |
  151. {regconst2, %[a], SL} | |
  152. loi $1==1 | NC regconst2 | | {x1, %[1.xreg], %[1.ind]} | |
  153. ... | NC ADDR_LOCAL| | {x1, LB, %[1.ind]} | |
  154. ... | NC ADDR_EXTERNAL | | {da1, %[1.ind]} | |
  155. ... | src2 | allocate( %[1], LWXREG )
  156. move( %[1], %[a.2] )
  157. move( {im2, 0}, %[a.1] )
  158. | {ir1, %[a]} | |
  159. loi $1==2 | NC regconst2 | | {x2, %[1.xreg], %[1.ind]} | |
  160. ... | NC ADDR_LOCAL| | {x2, LB, %[1.ind]} | |
  161. ... | NC ADDR_EXTERNAL | | {da2, %[1.ind]} | |
  162. ... | src2 | allocate( %[1], LWXREG )
  163. move( %[1], %[a.2] )
  164. move( {im2, 0}, %[a.1] )
  165. | {ir2, %[a]} | |
  166. loi $1==4 | NC regconst2 | | {x4, %[1.xreg], %[1.ind]} | |
  167. ... | NC ADDR_LOCAL| | {x4, LB, %[1.ind]} | |
  168. ... | NC ADDR_EXTERNAL | | {da4, %[1.ind]} | |
  169. ... | src2 | allocate( %[1], LWXREG )
  170. move( %[1], %[a.2] )
  171. move( {im2, 0}, %[a.1] )
  172. | {ir4, %[a]} | |
  173. loi $1>4 | src2 STACK | allocate( REG = {im2, $1/2} )
  174. allocate( %[1], LWXREG )
  175. move( %[1], %[b.2] )
  176. move( {im2, 0}, %[b.1] )
  177. "add %[b.2], $$$1-2"
  178. "dec R15, $$2"
  179. "lddr *RR14, *%[b], %[a]"
  180. "inc R15, $$2"
  181. erase(%[a]) erase(%[b]) nocc | | |
  182. lal loi $2==6 | STACK | "push *RR14, $1+4(R13)"
  183. "pushl *RR14, $1(R13)" | | |
  184. lal loi $2==8 | STACK | "pushl *RR14, $1+4(R13)"
  185. "pushl *RR14, $1(R13)" | | |
  186. lae loi $2==6 | STACK | "push *RR14, $1+4"
  187. "pushl *RR14, $1" | | |
  188. lae loi $2==8 | STACK | "pushl *RR14, $1+4"
  189. "pushl *RR14, $1" | | |
  190. los $1==2 | STACK | "calr los2" | | |
  191. los !defined($1)| src2c STACK | "cp %[1], $$2"
  192. "jr NE, unknown"
  193. "calr los2" | | |
  194. lpi | | | {ADDR_EXTERNAL, $1} | |
  195. /* */
  196. /***************************************
  197. ******** GROUP 2 ********
  198. ***************************************/
  199. stl | src2b | remove( x2, %[xreg]==LB && %[ind]==$1 )
  200. remove( x4, %[xreg]==LB &&
  201. ( %[ind]==$1-2 || %[ind]==$1 ))
  202. remove( x1, %[xreg]==LB &&
  203. ( %[ind]==$1 || %[ind]==$1+1 ))
  204. remove( indexed, %[xreg]!=LB )
  205. remove( ind_access )
  206. move( %[1], {x2, LB, $1} ) | | |
  207. ste | src2b | remove( da )
  208. remove( indexed, %[xreg]!=LB )
  209. remove( ind_access )
  210. move( %[1], {da2, $1} ) | | |
  211. sil | src2b | remove( allexceptcon )
  212. allocate( LWXREG )
  213. move( {x2, LB, $1}, %[a.2] )
  214. move( {im2, 0}, %[a.1] )
  215. move( %[1], {ir2, %[a]} ) | | |
  216. stf | regconst2 src2b |
  217. remove( allexceptcon )
  218. move( %[2], {x2, %[1.xreg], $1+%[1.ind]} ) | | |
  219. ... | ADDR_EXTERNAL src2b |
  220. remove( allexceptcon )
  221. move( %[2], {da2, tostring($1)+"+"+%[1.ind]} ) | | |
  222. sti $1==1 | regconst2 const2 | remove( allexceptcon )
  223. move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
  224. ... | regconst2 B2REG | remove( allexceptcon )
  225. move( %[2], {x1, %[1.xreg], %[1.ind]} ) | | |
  226. ... | NC ADDR_LOCAL const2 | remove( allexceptcon )
  227. move( %[2], {x1, LB, %[1.ind]} ) | | |
  228. ... | ADDR_LOCAL B2REG | remove( allexceptcon )
  229. move( %[2], {x1, LB, %[1.ind]} ) | | |
  230. ... | NC ADDR_EXTERNAL const2 | remove( allexceptcon )
  231. move( %[2], {da1, %[1.ind]} ) | | |
  232. ... | ADDR_EXTERNAL B2REG | remove( allexceptcon )
  233. move( %[2], {da1, %[1.ind]} ) | | |
  234. ... | src2 const2 | remove( allexceptcon )
  235. allocate( %[1], LWXREG )
  236. move( %[1], %[a.2] )
  237. move( {im2, 0}, %[a.1] )
  238. move( %[2], {ir1, %[a]} ) | | |
  239. ... | src2 B2REG | remove( allexceptcon )
  240. allocate( %[1], LWXREG )
  241. move( %[1], %[a.2] )
  242. move( {im2, 0}, %[a.1] )
  243. move( %[2], {ir1, %[a]} ) | | |
  244. sti $1==2 | regconst2 src2b | remove( allexceptcon )
  245. move( %[2], {x2, %[1.xreg], %[1.ind]} ) | | |
  246. ... | ADDR_LOCAL src2b | remove( allexceptcon )
  247. move( %[2], {x2, LB, %[1.ind]} ) | | |
  248. ... | ADDR_EXTERNAL src2b | remove( allexceptcon )
  249. move( %[2], {da2, %[1.ind]} ) | | |
  250. ... | src2 src2b | remove( allexceptcon )
  251. allocate( %[1], LWXREG )
  252. move( %[1], %[a.2] )
  253. move( {im2, 0}, %[a.1] )
  254. move( %[2], {ir2, %[a]} ) | | |
  255. sti $1==4 | regconst2 src4b | remove( allexceptcon )
  256. move( %[2], {x4, %[1.xreg], %[1.ind]} ) | | |
  257. ... | ADDR_LOCAL src4b | remove( allexceptcon )
  258. move( %[2], {x4, LB, %[1.ind]} ) | | |
  259. ... | ADDR_EXTERNAL src4b | remove( allexceptcon )
  260. move( %[2], {da4, %[1.ind]} ) | | |
  261. ... | src2 src4b | remove( allexceptcon )
  262. allocate( %[1], LWXREG )
  263. move( %[1], %[a.2] )
  264. move( {im2, 0}, %[a.1] )
  265. move( %[2], {ir4, %[a]} ) | | |
  266. sti $1>4 | src2 STACK |
  267. allocate( REG = {im2, $1/2} )
  268. allocate( %[1], LWXREG )
  269. move( %[1], %[b.2] )
  270. move( {im2, 0}, %[b.1] )
  271. "ldir *%[b], *RR14, %[a]"
  272. erase(%[a]) erase(%[b]) nocc | | |
  273. lal sti $2>4 && $2<=8 | NC src2b | | %[1] |
  274. stl $1 lal $1+2 sti $2-2 |
  275. ... | | | {ADDR_LOCAL, $1} | sti $2 |
  276. sts $1==2 | STACK | "calr sts2" | | |
  277. sts !defined($1)| src2c STACK | "cp %[1], $$2"
  278. "jr NE, unknown"
  279. "calr sts2" | | |
  280. sdl | src4b | remove( x2, %[xreg]==LB &&
  281. ( %[ind]==$1 || %[ind]==$1+2 ))
  282. remove( x4, %[xreg]==LB &&
  283. ( %[ind]>=$1-2 && %[ind]<=$1+2 ))
  284. remove( x1, %[xreg]==LB &&
  285. ( %[ind]>=$1 && %[ind]<=$1+3 ))
  286. remove( indexed, %[xreg]!=LB )
  287. remove( ind_access )
  288. move( %[1], {x4, LB, $1} ) | | |
  289. sde | src4b | remove( da )
  290. remove( indexed, %[xreg]!=LB )
  291. remove( ind_access )
  292. move( %[1], {da4, $1} ) | | |
  293. sdf | regconst2 src4b |
  294. remove( allexceptcon )
  295. move( %[2], {x4, %[1.xreg], $1+%[1.ind]} ) | | |
  296. ... | ADDR_EXTERNAL src4b |
  297. remove( allexceptcon )
  298. move( %[2], {da4, tostring($1)+"+"+%[1.ind]} ) | | |
  299. /* */
  300. /***************************************
  301. ******** GROUP 3 ********
  302. ***************************************/
  303. adi $1==2 | NC SCR_XREG im2 | |
  304. {regconst2, %[1], %[2.num]} | |
  305. ... | NC SCR_XREG ADDR_LOCAL |
  306. "add %[1], R13"
  307. erase(%[1]) |
  308. {regconst2, %[1], %[2.ind]} | |
  309. ... | NC REG ADDR_LOCAL |
  310. allocate( XREG )
  311. "ld %[a], R13"
  312. "add %[a], %[1]"
  313. erase(%[a]) |
  314. {regconst2, %[a], %[2.ind]} | |
  315. ... | NC SCR_XREG regconst2 |
  316. "add %[1], %[2.xreg]"
  317. erase(%[1]) |
  318. {regconst2, %[1], %[2.ind]} | |
  319. ... | NC im2 ADDR_LOCAL | |
  320. {ADDR_LOCAL, %[1.num]+%[2.ind]} | |
  321. ... | NC src2 im2+ADDR_LOCAL |
  322. allocate( %[1], XREG = %[1] ) |
  323. %[2] %[a] | adi 2 |
  324. ... | NC src2 regconst2 |
  325. "add %[2.xreg], %[1]"
  326. erase(%[2.xreg]) | %[2] | |
  327. ... | NC regconst2 im2 | |
  328. {regconst2, %[1.xreg], %[2.num]+%[1.ind]} | |
  329. ... | NC regconst2 ADDR_LOCAL |
  330. "add %[1.xreg], R13"
  331. erase(%[1.xreg]) |
  332. {regconst2, %[1.xreg],
  333. %[2.ind]+%[1.ind]} | |
  334. ... | NC regconst2 regconst2 |
  335. "add %[1.xreg],%[2.xreg]"
  336. erase(%[1.xreg]) |
  337. {regconst2, %[1.xreg],
  338. %[2.ind]+%[1.ind]} | |
  339. ... | NC regconst2 src2-im2 |
  340. "add %[1.xreg], %[2]"
  341. erase(%[1.xreg]) | %[1] | |
  342. ... | NC ADDR_LOCAL regconst2 |
  343. "add %[2.xreg], R13"
  344. erase(%[2.xreg]) |
  345. {regconst2, %[2.xreg],
  346. %[1.ind]+%[2.ind]} | |
  347. ... | NC ADDR_LOCAL src2 | | %[1] %[2] | adi 2 |
  348. ... | NC SCR_REG src2-im2 | "add %[1], %[2]"
  349. erase(%[1])
  350. setcc(%[1]) | %[1] | |
  351. ... | src2 SCR_REG | "add %[2], %[1]"
  352. erase(%[2])
  353. setcc(%[2]) | %[2] | |
  354. adi $1==4 | src4 SCR_LWREG |
  355. "addl %[2], %[1]"
  356. erase(%[2])
  357. setcc(%[2]) | %[2] | | (2,8)+%[1]
  358. ... | SCR_LWREG src4 |
  359. "addl %[1], %[2]"
  360. erase(%[1])
  361. setcc(%[1]) | %[1] | | (2,8)+%[2]
  362. sbi $1==2 | src2 SCR_REG | "sub %[2], %[1]"
  363. erase(%[2])
  364. setcc(%[2]) | %[2] | | (2,4)+%[1]
  365. ... | SCR_REG src2 | "sub %[1], %[2]"
  366. erase(%[1])
  367. | %[1] | ngi 2 | (2,4)+%[2]
  368. sbi $1==4 | src4 SCR_LWREG |
  369. "subl %[2], %[1]"
  370. erase(%[2])
  371. setcc(%[2]) | %[2] | | (2,8)+%[1]
  372. ... | SCR_LWREG src4 |
  373. "subl %[1], %[2]"
  374. erase(%[1])
  375. | %[1] | ngi 4 | (2,8)+%[2]
  376. mli $1==2 | src2 src2 | allocate( %[2], LWREG )
  377. move( %[2], %[a.2] )
  378. "mult %[a], %[1]"
  379. erase(%[a])
  380. setcc(%[a.2]) | %[a.2] | |
  381. mli $1==4 | src4 src4 | allocate( %[2], DLWREG )
  382. move( %[2], %[a.2] )
  383. "multl %[a], %[1]"
  384. erase(%[a])
  385. setcc(%[a.2]) | %[a.2] | |
  386. dvi $1==2 | src2 src2 | allocate( %[2], LWREG )
  387. move( %[2], %[a.2] )
  388. "exts %[a]"
  389. "div %[a], %[1]"
  390. erase(%[a])
  391. nocc | %[a.2] | |
  392. dvi $1==4 | src4 src4 | allocate( %[2], DLWREG )
  393. move( %[2], %[a.2] )
  394. "extsl %[a]"
  395. "divl %[a], %[1]"
  396. erase(%[a])
  397. nocc | %[a.2] | |
  398. rmi $1==2 | src2 src2 | allocate( %[2], LWREG )
  399. move( %[2], %[a.2] )
  400. "exts %[a]"
  401. "div %[a], %[1]"
  402. erase(%[a])
  403. nocc | %[a.1] | |
  404. rmi $1==4 | src4 src4 | allocate( %[2], DLWREG )
  405. move( %[2], %[a.2] )
  406. "extsl %[a]"
  407. "divl %[a], %[1]"
  408. erase(%[a])
  409. nocc | %[a.1] | |
  410. ngi $1==2 | SCR_REG | "neg %[1]"
  411. erase(%[1])
  412. setcc(%[1]) | %[1] | | (2,7)
  413. ngi $1==4 | src4 | allocate( LWREG = {im4, 0} )
  414. "subl %[a], %[1]"
  415. erase(%[a])
  416. setcc(%[a]) | %[a] | | (2,8)+%[1]
  417. sli $1==2 | im2 SCR_REG | "sla %[2], %[1]"
  418. erase(%[2])
  419. setcc(%[2]) | %[2] | | (2,0)
  420. ... | REG SCR_REG | "sda %[2], %[1]"
  421. erase(%[2])
  422. setcc(%[2]) | %[2] | | (4,2)
  423. sli $1==4 | im2 SCR_LWREG | "slal %[2], %[1]"
  424. erase(%[2])
  425. setcc(%[2]) | %[2] | | (2,0)
  426. ... | REG SCR_LWREG | "sdal %[2], %[1]"
  427. erase(%[2])
  428. setcc(%[2]) | %[2] | | (4,2)
  429. sri $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} )
  430. "sda %[2], %[a]"
  431. erase(%[2])
  432. setcc(%[2]) | %[2] | | (4,2)
  433. ... | REG SCR_REG | "neg %[1]"
  434. "sda %[2], %[1]"
  435. erase(%[2])
  436. setcc(%[2]) | %[2] | | (6,9)
  437. sri $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
  438. "sdal %[2], %[a]"
  439. erase(%[2])
  440. setcc(%[2]) | %[2] | | (4,2)
  441. ... | REG SCR_LWREG | "neg %[1]"
  442. "sdal %[2], %[1]"
  443. erase(%[2])
  444. setcc(%[2]) | %[2] | | (6,9)
  445. lol loc adi stl $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
  446. loc $2 lol $1 adi $3 stl $4 |
  447. loc lol adi stl $2==$4 && $3==2 && $1>0 && $1<=16 | |
  448. remove( x2, %[xreg]==LB && %[ind]==$2 )
  449. remove( x4, %[xreg]==LB &&
  450. ( %[ind]==$2-2 || %[ind]==$2 ))
  451. remove( x1, %[xreg]==LB &&
  452. ( %[ind]==$2 || %[ind]==$2+1 ))
  453. remove( indexed, %[xreg]!=LB )
  454. remove( ind_access )
  455. "inc $2(R13), $$$1"
  456. setcc({x2, LB, $2}) | | |
  457. loc lol adi stl $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
  458. remove( x2, %[xreg]==LB && %[ind]==$2 )
  459. remove( x4, %[xreg]==LB &&
  460. ( %[ind]==$2-2 || %[ind]==$2 ))
  461. remove( x1, %[xreg]==LB &&
  462. ( %[ind]==$2 || %[ind]==$2+1 ))
  463. remove( indexed, %[xreg]!=LB )
  464. remove( ind_access )
  465. "dec $2(R13), $$0-$1"
  466. setcc({x2, LB, $2}) | | |
  467. loe loc adi ste $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
  468. loc $2 loe $1 adi $3 ste $4 |
  469. loc loe adi ste $2==$4 && $3==2 && $1>0 && $1<=16 | |
  470. remove( da )
  471. remove( indexed, %[xreg]!=LB )
  472. remove( ind_access )
  473. "inc $2, $$$1"
  474. setcc({da2, $2}) | | |
  475. loc loe adi ste $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
  476. remove( da )
  477. remove( indexed, %[xreg]!=LB )
  478. remove( ind_access )
  479. "dec $2, $$0-$1"
  480. setcc({da2, $2}) | | |
  481. lil loc adi sil $1==$4 && $3==2 && $2>=0-16 && $2<=16 | | | |
  482. loc $2 lil $1 adi $3 sil $4 |
  483. loc lil adi sil $2==$4 && $3==2 && $1>0 && $1<=16 | |
  484. remove( allexceptcon )
  485. allocate( LWXREG )
  486. move( {x2, LB, $2}, %[a.2] )
  487. move( {im2, 0}, %[a.1] )
  488. "inc *%[a], $$$1"
  489. setcc({ir2, %[a]}) | | |
  490. loc lil adi sil $2==$4 && $3==2 && $1<0 && $1>=0-16 | |
  491. remove( allexceptcon )
  492. allocate( LWXREG )
  493. move( {x2, LB, $2}, %[a.2] )
  494. move( {im2, 0}, %[a.1] )
  495. "dec *%[a], $$0-$1"
  496. setcc({ir2, %[a]}) | | |
  497. lol loc sbi stl $1==$4 && $3==2 && $2>0 && $2<=16 | |
  498. remove( x2, %[xreg]==LB && %[ind]==$1 )
  499. remove( x4, %[xreg]==LB &&
  500. ( %[ind]==$1-2 || %[ind]==$1 ))
  501. remove( x1, %[xreg]==LB &&
  502. ( %[ind]==$1 || %[ind]==$1+1 ))
  503. remove( indexed, %[xreg]!=LB )
  504. remove( ind_access )
  505. "dec $1(R13), $$$2"
  506. setcc({x2, LB, $1}) | | |
  507. lol loc sbi stl $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
  508. remove( x2, %[xreg]==LB && %[ind]==$1 )
  509. remove( x4, %[xreg]==LB &&
  510. ( %[ind]==$1-2 || %[ind]==$1 ))
  511. remove( x1, %[xreg]==LB &&
  512. ( %[ind]==$1 || %[ind]==$1+1 ))
  513. remove( indexed, %[xreg]!=LB )
  514. remove( ind_access )
  515. "inc $1(R13), $$0-$2"
  516. setcc({x2, LB, $1}) | | |
  517. loe loc sbi ste $1==$4 && $3==2 && $2>0 && $2<=16 | |
  518. remove( da )
  519. remove( indexed, %[xreg]!=LB )
  520. remove( ind_access )
  521. "dec $1, $$$2"
  522. setcc({da2, $1}) | | |
  523. loe loc sbi ste $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
  524. remove( da )
  525. remove( indexed, %[xreg]!=LB )
  526. remove( ind_access )
  527. "inc $1, $$0-$2"
  528. setcc({da2, $1}) | | |
  529. lil loc sbi sil $1==$4 && $3==2 && $2>0 && $2<=16 | |
  530. remove( allexceptcon )
  531. allocate( LWXREG )
  532. move( {x2, LB, $1}, %[a.2] )
  533. move( {im2, 0}, %[a.1] )
  534. "dec *%[a], $$$2"
  535. setcc({ir2, %[a]}) | | |
  536. lil loc sbi sil $1==$4 && $3==2 && $2<0 && $2>=0-16 | |
  537. remove( allexceptcon )
  538. allocate( LWXREG )
  539. move( {x2, LB, $1}, %[a.2] )
  540. move( {im2, 0}, %[a.1] )
  541. "inc *%[a], $$0-$2"
  542. setcc({ir2, %[a]}) | | |
  543. lol ngi stl $1==$3 && $2==2 | |
  544. remove( x2, %[xreg]==LB && %[ind]==$1 )
  545. remove( x4, %[xreg]==LB &&
  546. ( %[ind]==$1-2 || %[ind]==$1 ))
  547. remove( x1, %[xreg]==LB &&
  548. ( %[ind]==$1 || %[ind]==$1+1 ))
  549. remove( indexed, %[xreg]!=LB )
  550. remove( ind_access )
  551. remove( allexceptcon )
  552. "neg $1(R13)"
  553. setcc({x2, LB, $1}) | | |
  554. loe ngi ste $1==$3 && $2==2 | |
  555. remove( da )
  556. remove( indexed, %[xreg]!=LB )
  557. remove( ind_access )
  558. "neg $1"
  559. setcc({da2, $1}) | | |
  560. lil ngi sil $1==$3 && $2==2 | |
  561. remove( allexceptcon )
  562. allocate( LWXREG )
  563. move( {x2, LB, $1}, %[a.2] )
  564. move( {im2, 0}, %[a.1] )
  565. "neg *%[a]"
  566. setcc({ir2, %[a]}) | | |
  567. loc sli $1>=0 && $1<=16 && $2==2 | SCR_REG |
  568. "sla %[1], $$$1"
  569. erase(%[1])
  570. setcc(%[1]) | %[1] | |
  571. loc sli $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
  572. "slal %[1], $$$1"
  573. erase(%[1])
  574. setcc(%[1]) | %[1] | |
  575. loc sri $1>=0 && $1<=16 && $2==2 | SCR_REG |
  576. "sra %[1], $$-$1"
  577. erase(%[1])
  578. setcc(%[1]) | %[1] | |
  579. loc sri $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
  580. "sral %[1], $$-$1"
  581. erase(%[1])
  582. setcc(%[1]) | %[1] | |
  583. loc sru $1>=0 && $1<=16 && $2==2 | SCR_REG |
  584. "srl %[1], $$-$1"
  585. erase(%[1])
  586. setcc(%[1]) | %[1] | |
  587. loc sru $1>=0 && $1<=32 && $2==4 | SCR_LWREG |
  588. "srll %[1], $$-$1"
  589. erase(%[1])
  590. setcc(%[1]) | %[1] | |
  591. /* */
  592. /***************************************
  593. ******** GROUP 4 ********
  594. ***************************************/
  595. /* adu = adi
  596. ** sbu = sbi
  597. ** mlu = mli
  598. ** slu = sli
  599. */
  600. adu | | | | adi $1 |
  601. sbu | | | | sbi $1 |
  602. mlu | | | | mli $1 |
  603. slu | | | | sli $1 |
  604. dvu $1==2 | STACK | "calr dvu2" | R1 | |
  605. dvu $1==4 | STACK | "calr dvu4" | R3 R2 | |
  606. rmu $1==2 | STACK | "calr rmu2" | R0 | |
  607. rmu $1==4 | STACK | "calr rmu4" | R1 R0 | |
  608. sru $1==2 | im2 SCR_REG | allocate( REG = {im2, 0-%[1.num]} )
  609. "sdl %[2], %[a]"
  610. erase(%[2])
  611. setcc(%[2]) | %[2] | | (4,2)
  612. ... | REG SCR_REG | "neg %[1]"
  613. "sdl %[2], %[1]"
  614. erase(%[2])
  615. setcc(%[2]) | %[2] | | (6,9)
  616. sru $1==4 | im2 SCR_LWREG | allocate( REG = {im2, 0-%[1.num]} )
  617. "sdll %[2], %[a]"
  618. erase(%[2])
  619. setcc(%[2]) | %[2] | | (4,2)
  620. ... | REG SCR_LWREG | "neg %[1]"
  621. "sdll %[2], %[1]"
  622. erase(%[2])
  623. setcc(%[2]) | %[2] | | (6,9)
  624. /* */
  625. /***************************************
  626. ******** GROUP 6 ********
  627. ***************************************/
  628. adp | SCR_XREG | | {regconst2, %[1], $1} | |
  629. ... | NC regconst2 | | {regconst2, %[1.xreg], $1+%[1.ind]} | |
  630. ... | NC ADDR_LOCAL | | {ADDR_LOCAL, %[1.ind]+$1 } | |
  631. ... | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL,
  632. tostring($1)+"+"+%[1.ind]} | |
  633. lil adp sil $1==$3 && $2>0 && $2<=16 | | allocate( LWXREG )
  634. remove( allexceptcon )
  635. move( {x2, LB, $1}, %[a.2] )
  636. move( {im2, 0}, %[a.1] )
  637. "inc *%[a], $$$2"
  638. setcc({ir2, %[a]}) | | |
  639. lil adp sil $1==$3 && $2<0 && $2>=0-16 | | allocate( LWXREG )
  640. remove( allexceptcon )
  641. move( {x2, LB, $1}, %[a.2] )
  642. move( {im2, 0}, %[a.1] )
  643. "dec *%[a], $$0-$2"
  644. setcc({ir2, %[a]}) | | |
  645. lil adp dup sil adp $1==$4 && $3==2 && $2==1 && $5==0-1 | |
  646. allocate( LWXREG, XREG )
  647. remove( allexceptcon )
  648. move( {x2, LB, $1}, %[a.2] )
  649. move( {im2, 0}, %[a.1] )
  650. "ld %[b], *%[a]"
  651. "inc *%[a]" | {regconst2, %[b], 0} | |
  652. /* because the next EM-instruction
  653. ** will be `loi'.
  654. */
  655. lil adp dup sil $1==$4 && $3==2 && $2==1 | |
  656. allocate( LWXREG )
  657. remove( allexceptcon )
  658. move( {x2, LB, $1}, %[a.2] )
  659. move( {im2, 0}, %[a.1] )
  660. "inc *%[a]"
  661. setcc({ir2, %[a]}) | {ir2,%[a]} | |
  662. lol dup adp stl $1==$4 && $2==2 && $3>0 && $3<=16 | |
  663. allocate( REG = {x2, LB, $1} )
  664. remove( x2, %[xreg]==LB && %[ind]==$1 )
  665. remove( x4, %[xreg]==LB &&
  666. ( %[ind]==$1-2 || %[ind]==$1 ))
  667. remove( x1, %[xreg]==LB &&
  668. ( %[ind]==$1 || %[ind]==$1+1 ))
  669. remove( indexed, %[xreg]!=LB )
  670. remove( ind_access )
  671. "inc $1(R13), $$$3"
  672. setcc({x2, LB, $1}) | %[a] | |
  673. lol dup adp stl $1==$4 && $2==2 && $3<0 && $3>=0-16 | |
  674. allocate( REG = {x2, LB, $1} )
  675. remove( x2, %[xreg]==LB && %[ind]==$1 )
  676. remove( x4, %[xreg]==LB &&
  677. ( %[ind]==$1-2 || %[ind]==$1 ))
  678. remove( x1, %[xreg]==LB &&
  679. ( %[ind]==$1 || %[ind]==$1+1 ))
  680. remove( indexed, %[xreg]!=LB )
  681. remove( ind_access )
  682. "dec $1(R13), $$0-$3"
  683. setcc({x2, LB, $1}) | %[a] | |
  684. loe dup adp ste $1==$4 && $2==2 && $3>0 && $3<=16 | |
  685. allocate( REG = {da2, $1} )
  686. remove( da )
  687. remove( indexed, %[xreg]!=LB )
  688. remove( ind_access )
  689. "inc $1, $$$3"
  690. setcc({da2, $1}) | %[a] | |
  691. loe dup adp ste $1==$4 && $2==2 && $3<0 && $3>=0-16 | |
  692. allocate( REG = {da2, $1} )
  693. remove( da )
  694. remove( indexed, %[xreg]!=LB )
  695. remove( ind_access )
  696. "dec $1, $$0-$3"
  697. setcc({da2, $1}) | %[a] | |
  698. lol adp stl $1==$3 && $2>0 && $2<=16 | |
  699. remove( x2, %[xreg]==LB && %[ind]==$1 )
  700. remove( x4, %[xreg]==LB &&
  701. ( %[ind]==$1-2 || %[ind]==$1 ))
  702. remove( x1, %[xreg]==LB &&
  703. ( %[ind]==$1 || %[ind]==$1+1 ))
  704. remove( indexed, %[xreg]!=LB )
  705. remove( ind_access )
  706. "inc $1(R13), $$$2"
  707. setcc({x2, LB, $1}) | | |
  708. lol adp stl $1==$3 && $2<0 && $2>=0-16 | |
  709. remove( x2, %[xreg]==LB && %[ind]==$1 )
  710. remove( x4, %[xreg]==LB &&
  711. ( %[ind]==$1-2 || %[ind]==$1 ))
  712. remove( x1, %[xreg]==LB &&
  713. ( %[ind]==$1 || %[ind]==$1+1 ))
  714. remove( indexed, %[xreg]!=LB )
  715. remove( ind_access )
  716. "dec $1(R13), $$0-$2"
  717. setcc({x2, LB, $1}) | | |
  718. loe adp ste $1==$3 && $2>0 && $2<=16 | |
  719. remove( da )
  720. remove( indexed, %[xreg]!=LB )
  721. remove( ind_access )
  722. "inc $1, $$$2"
  723. setcc({da2, $1}) | | |
  724. loe adp ste $1==$3 && $2<0 && $2>=0-16 | |
  725. remove( da )
  726. remove( indexed, %[xreg]!=LB )
  727. remove( ind_access )
  728. "dec $1, $$0-$2"
  729. setcc({da2, $1}) | | |
  730. ads $1==2 | | | | adi $1 |
  731. ads $1==4 | | | | adi $1 |
  732. sbs $1==2 | | | | sbi $1 |
  733. sbs $1==4 | | | | sbi $1 |
  734. /* */
  735. /***************************************
  736. ******** GROUP 7 ********
  737. ***************************************/
  738. inc | SCR_REG | "inc %[1]"
  739. erase(%[1]) setcc(%[1]) | %[1] | |
  740. lil inc sil $1==$3 | | allocate( LWXREG )
  741. remove( allexceptcon )
  742. move( {x2, LB, $1}, %[a.2] )
  743. move( {im2, 0}, %[a.1] )
  744. "inc *%[a]"
  745. setcc({ir2, %[a]}) | | |
  746. dec | SCR_REG | "dec %[1]"
  747. erase(%[1]) setcc(%[1]) | %[1] | |
  748. lil dec sil $1==$3 | | allocate( LWXREG )
  749. remove( allexceptcon )
  750. move( {x2, LB, $1}, %[a.2] )
  751. move( {im2, 0}, %[a.1] )
  752. "dec *%[a]"
  753. setcc({ir2, %[a]}) | | |
  754. lil dec dup sil $1==$4 && $3==2 | | allocate( LWXREG )
  755. remove( allexceptcon )
  756. move( {x2, LB, $1}, %[a.2] )
  757. move( {im2, 0}, %[a.1] )
  758. "dec *%[a]"
  759. setcc({ir2, %[a]}) | {ir2,%[a]} | |
  760. inl | | remove( x2, %[xreg]==LB && %[ind]==$1 )
  761. remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
  762. remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
  763. remove( indexed, %[xreg]!=LB )
  764. remove( ind_access )
  765. "inc $1(R13)"
  766. setcc({x2, LB, $1}) | | |
  767. del | | remove( x2, %[xreg]==LB && %[ind]==$1 )
  768. remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
  769. remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
  770. remove( indexed, %[xreg]!=LB )
  771. remove( ind_access )
  772. "dec $1(R13)"
  773. setcc({x2, LB, $1}) | | |
  774. zrl | | remove( x2, %[xreg]==LB && %[ind]==$1 )
  775. remove( x4, %[xreg]==LB && ( %[ind]==$1-2 || %[ind]==$1 ) )
  776. remove( x1, %[xreg]==LB && ( %[ind]==$1 || %[ind]==$1+1 ))
  777. remove( indexed, %[xreg]!=LB )
  778. remove( ind_access )
  779. "clr $1(R13)"
  780. samecc | | |
  781. ine | | remove( da )
  782. remove( indexed, %[xreg]!=LB )
  783. remove( ind_access )
  784. "inc $1"
  785. setcc({da2, $1}) | | |
  786. dee | | remove( da )
  787. remove( indexed, %[xreg]!=LB )
  788. remove( ind_access )
  789. "dec $1"
  790. setcc({da2, $1}) | | |
  791. zre | | remove( da )
  792. remove( indexed, %[xreg]!=LB )
  793. remove( ind_access )
  794. "clr $1"
  795. samecc | | |
  796. zer $1==2 | | | {im2, 0} | |
  797. zer $1==4 | | | {im4, 0} | |
  798. zer $1==6 | | | {im4, 0} {im2, 0} | |
  799. zer $1==8 | | | {im4, 0} {im4, 0} | |
  800. zer $1>8 | | remove( ALL )
  801. allocate( REG = {im2, $1/2} ) /*nr of words*/
  802. "1:\tpush *RR14, $$0"
  803. "djnz %[a], 1b"
  804. erase(%[a]) samecc | | |
  805. zer !defined($1)| SCR_REG | remove( ALL )
  806. "sra %[1]"
  807. "1:\tpush *RR14, $$0"
  808. "djnz %[1], 1b"
  809. erase(%[1]) nocc | | |
  810. /* */
  811. /***************************************
  812. ******** GROUP 8 ********
  813. ***************************************/
  814. cii | STACK | "calr cii" | | |
  815. loc loc cii $1==1 && $2==2 | NC src1 |
  816. allocate( %[1], B2REG = %[1] ) | %[a] | |
  817. ... | src2 | allocate( %[1], REG = %[1] )
  818. "extsb %[a]"
  819. erase(%[a]) samecc | %[a] | |
  820. loc loc cii $1==1 && $2==4 | NC src1 |
  821. allocate( %[1], LWB2REG )
  822. move( %[1], %[a.2] )
  823. "exts %[a]"
  824. samecc | %[a] | |
  825. ... | src2 | allocate( %[1], LWREG )
  826. move( %[1], %[a.2] )
  827. "exts %[a]"
  828. samecc | %[a] | |
  829. loc loc cii $1==2 && $2==4 | src2 | allocate( %[1], LWREG )
  830. move( %[1], %[a.2] )
  831. "exts %[a]"
  832. samecc | %[a] | |
  833. loc loc loc cii $1>=0 && $2==2 && $3==4 | | | | loc $1 loc 0 |
  834. loc loc loc cii $1< 0 && $2==2 && $3==4 | | | | loc $1 loc 0-1 |
  835. loc loc cii $1==4 && $2==2 | src2 src2 | | %[2] | |
  836. loc loc cuu $1==2 && $2==4 | | | {im2, 0} | |
  837. loc loc cuu $1==4 && $2==2 | src2 | | | |
  838. cuu | STACK | "calr cuu" | | |
  839. ciu | | | | cuu |
  840. cui | | | | cuu |
  841. /* */
  842. /***************************************
  843. ******** GROUP 9 ********
  844. ***************************************/
  845. and $1==2 | SCR_REG src2 | "and %[1], %[2]"
  846. erase(%[1])
  847. setcc(%[1]) | %[1] | | (2,4)+%[2]
  848. ... | src2 SCR_REG | "and %[2], %[1]"
  849. erase(%[2])
  850. setcc(%[2]) | %[2] | | (2,4)+%[1]
  851. and $1>2 | | remove( ALL )
  852. allocate( LWXREG, REG, REG = {im2, $1/2} )
  853. "ldl %[a], RR14"
  854. "addl %[a], $$$1"
  855. "1:\tpop %[b], *RR14"
  856. "and %[b], *%[a]"
  857. "ld *%[a], %[b]"
  858. "inc %[a.2], $$2"
  859. "djnz %[c], 1b"
  860. erase(%[c]) nocc | | |
  861. and !defined($1)| SCR_REG | remove( ALL )
  862. allocate( LWXREG, REG )
  863. "ldl %[a], RR14"
  864. "addl %[a], $$$1"
  865. "sra %[1]"
  866. "1:\tpop %[b], *RR14"
  867. "and %[b], *%[a]"
  868. "ld *%[a], %[b]"
  869. "inc %[a.2], $$2"
  870. "djnz %[1], 1b"
  871. erase(%[1]) nocc | | |
  872. ior $1==2 | SCR_REG src2 | "or %[1], %[2]"
  873. erase(%[1])
  874. setcc(%[1]) | %[1] | | (2,4)+%[2]
  875. ... | src2 SCR_REG | "or %[2], %[1]"
  876. erase(%[2])
  877. setcc(%[2]) | %[2] | | (2,4)+%[1]
  878. ior $1>2 | | remove( ALL )
  879. allocate( LWXREG, REG, REG = {im2, $1/2} )
  880. "ldl %[a], RR14"
  881. "addl %[a], $$$1"
  882. "1:\tpop %[b], *RR14"
  883. "or %[b], *%[a]"
  884. "ld *%[a], %[b]"
  885. "inc %[a.2], $$2"
  886. "djnz %[c], 1b"
  887. erase(%[c]) nocc | | |
  888. ior !defined($1)| SCR_REG | remove( ALL )
  889. allocate( LWXREG, REG )
  890. "ldl %[a], RR14"
  891. "addl %[a], $$$1"
  892. "sra %[1]"
  893. "1:\tpop %[b], *RR14"
  894. "or %[b], *%[a]"
  895. "ld *%[a], %[b]"
  896. "inc %[a.2], $$2"
  897. "djnz %[1], 1b"
  898. erase(%[1]) nocc | | |
  899. xor $1==2 | SCR_REG src2 | "xor %[1], %[2]"
  900. erase(%[1])
  901. setcc(%[1]) | %[1] | | (2,4)+%[2]
  902. ... | src2 SCR_REG | "xor %[2], %[1]"
  903. erase(%[2])
  904. setcc(%[2]) | %[2] | | (2,4)+%[1]
  905. xor $1>2 | | remove( ALL )
  906. allocate( LWXREG, REG, REG = {im2, $1/2} )
  907. "ldl %[a], RR14"
  908. "addl %[a], $$$1"
  909. "1:\tpop %[b], *RR14"
  910. "xor %[b], *%[a]"
  911. "ld *%[a], %[b]"
  912. "inc %[a.2], $$2"
  913. "djnz %[c], 1b"
  914. erase(%[c]) nocc | | |
  915. xor !defined($1)| SCR_REG | remove( ALL )
  916. allocate( LWXREG, REG )
  917. "ldl %[a], RR14"
  918. "addl %[a], $$$1"
  919. "sra %[1]"
  920. "1:\tpop %[b], *RR14"
  921. "xor %[b], *%[a]"
  922. "ld *%[a], %[b]"
  923. "inc %[a.2], $$2"
  924. "djnz %[1], 1b"
  925. erase(%[1]) nocc | | |
  926. com $1==2 | SCR_REG | "com %[1]"
  927. erase(%[1])
  928. setcc(%[1]) | %[1] | |
  929. com defined($1) | STACK | allocate( LWXREG, REG = {im2, $1/2} )
  930. "ldl %[a], RR14"
  931. "1:\tcom *%[a]"
  932. "inc %[a.2], $$2"
  933. "djnz %[b], 1b"
  934. erase(%[b]) nocc | | |
  935. com !defined($1)| SCR_REG STACK | allocate( LWXREG )
  936. "ldl %[a], RR14"
  937. "1:\tcom *%[a]"
  938. "inc %[a.2], $$2"
  939. "djnz %[1], 1b"
  940. erase(%[1]) nocc | | |
  941. lil and sil $1==$3 && $2==2 | SCR_REG |
  942. allocate( LWXREG )
  943. remove( allexceptcon )
  944. move( {x2, LB, $1}, %[a.2] )
  945. move( {im2, 0}, %[a.1] )
  946. "and %[1], *%[a]"
  947. "ld *%[a], %[1]" | | |
  948. lil ior sil $1==$3 && $2==2 | SCR_REG |
  949. allocate( LWXREG )
  950. remove( allexceptcon )
  951. move( {x2, LB, $1}, %[a.2] )
  952. move( {im2, 0}, %[a.1] )
  953. "or %[1], *%[a]"
  954. "ld *%[a], %[1]" | | |
  955. lil xor sil $1==$3 && $2==2 | SCR_REG |
  956. allocate( LWXREG )
  957. remove( allexceptcon )
  958. move( {x2, LB, $1}, %[a.2] )
  959. move( {im2, 0}, %[a.1] )
  960. "xor %[1], *%[a]"
  961. "ld *%[a], %[1]" | | |
  962. lol com stl $1==$3 && $2==2 | |
  963. remove( x2, %[xreg]==LB && %[ind]==$1 )
  964. remove( x4, %[xreg]==LB &&
  965. ( %[ind]==$1-2 || %[ind]==$1 ))
  966. remove( x1, %[xreg]==LB &&
  967. ( %[ind]==$1 || %[ind]==$1+1 ))
  968. remove( indexed, %[xreg]!=LB )
  969. remove( ind_access )
  970. remove( allexceptcon )
  971. "com $1(R13)"
  972. setcc({x2, LB, $1}) | | |
  973. loe com ste $1==$3 && $2==2 | |
  974. remove( da )
  975. remove( indexed, %[xreg]!=LB )
  976. remove( ind_access )
  977. "com $1"
  978. setcc({da2, $1}) | | |
  979. lil com sil $1==$3 && $2==2 | |
  980. allocate( LWXREG )
  981. remove( allexceptcon )
  982. move( {x2, LB, $1}, %[a.2] )
  983. move( {im2, 0}, %[a.1] )
  984. "com *%[a]"
  985. setcc({ir2, %[a]}) | | |
  986. rol $1==2 | SCR_REG SCR_REG | "1:\trl %[2]"
  987. "djnz %[1], 1b"
  988. erase(%[2])
  989. setcc(%[2]) | %[2] | |
  990. ror $1==2 | SCR_REG SCR_REG | "1:\trr %[2]"
  991. "djnz %[1], 1b"
  992. erase(%[2])
  993. setcc(%[2]) | %[2] | |
  994. /* */
  995. /***************************************
  996. ******** GROUP 10 ********
  997. ***************************************/
  998. inn $1==2 | REG SCR_REG | allocate( REG = {im2, 0} )
  999. "cp %[1], $$15"
  1000. "jr UGT, 1f"
  1001. "bit %[2], %[1]"
  1002. "tcc NE, %[a]\n1:"
  1003. erase(%[a]) nocc | %[a] | |
  1004. inn defined($1) | src2 STACK | move( %[1], R1 )
  1005. move( {im2, $1}, R2 )
  1006. "calr inn"
  1007. erase(R1)
  1008. erase(R2) | R0 | |
  1009. inn !defined($1)| src2 src2 STACK | move( %[1], R2 )
  1010. move( %[2], R1 )
  1011. "calr inn"
  1012. erase(R1)
  1013. erase(R2) | R0 | |
  1014. loc inn $2==2 && $1==0 | SCR_REG |
  1015. "and %[1], $$1"
  1016. erase(%[1]) setcc(%[1]) | %[1] | |
  1017. loc inn $2==2 && $1==1 | SCR_REG |
  1018. "srl %[1]"
  1019. "and %[1], $$1"
  1020. erase(%[1]) setcc(%[1]) | %[1] | |
  1021. loc inn $2==2 && $1>1 && $1<=16 | SCR_REG |
  1022. "srl %[1], $$%(0-$1%)"
  1023. "and %[1], $$1"
  1024. erase(%[1]) setcc(%[1]) | %[1] | |
  1025. loc inn zeq $2==2 | | | {im2, 1<<$1} | and 2 zeq $3 |
  1026. inn zeq $1==2 | REG | allocate( REG = {im2, 1} )
  1027. "sdl %[a], %[1]"
  1028. erase(%[a])
  1029. setcc(%[a]) | %[a] | and 2 zeq $2 |
  1030. loc inn zne $2==2 | | | {im2, 1<<$1} | and 2 zne $3 |
  1031. inn zne $1==2 | REG | allocate( REG = {im2, 1} )
  1032. "sdl %[a], %[1]"
  1033. erase(%[a])
  1034. setcc(%[a]) | %[a] | and 2 zne $2 |
  1035. set $1==2 | REG | allocate( REG = {im2, 0} )
  1036. "cp %[1], $$15"
  1037. "jr ULE, 1f"
  1038. "push *RR14, $$ESET"
  1039. "calr trp"
  1040. "jr 2f"
  1041. "1:\tset %[a], %[1]\n2:"
  1042. erase(%[a]) nocc | %[a] | |
  1043. set defined($1) | src2 STACK | move( %[1], R1 )
  1044. move( {im2, $1}, R0 )
  1045. "calr xset"
  1046. erase(R0)
  1047. erase(R1) | | |
  1048. set !defined($1)| src2 src2 STACK | move( %[1], R0 )
  1049. move( %[2], R1 )
  1050. "calr xset"
  1051. erase(R0)
  1052. erase(R1) | | |
  1053. /* */
  1054. /***************************************
  1055. ******** GROUP 11 ********
  1056. ***************************************/
  1057. aar $1==2 | src2 src2 STACK | move( %[1], R1 )
  1058. move( %[2], R3 )
  1059. "calr aar"
  1060. erase(R1)
  1061. erase(R3) | | |
  1062. aar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
  1063. move( %[3], R3 )
  1064. "cp %[1], $$2"
  1065. "jr NE, unknown"
  1066. "calr aar"
  1067. erase(R1)
  1068. erase(R3) | | |
  1069. sar $1==2 | src2 src2 STACK | move( %[1], R1 )
  1070. move( %[2], R3 )
  1071. "calr sar"
  1072. erase(R1)
  1073. erase(R3) | | |
  1074. sar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
  1075. move( %[3], R3 )
  1076. "cp %[1], $$2"
  1077. "jr NE, unknown"
  1078. "calr sar"
  1079. erase(R1)
  1080. erase(R3) | | |
  1081. lar $1==2 | src2 src2 STACK | move( %[1], R1 )
  1082. move( %[2], R3 )
  1083. "calr lar"
  1084. erase(R1)
  1085. erase(R3) | | |
  1086. lar !defined($1)| src2c src2 src2 STACK | move( %[2], R1 )
  1087. move( %[3], R3 )
  1088. "cp %[1], $$2"
  1089. "jr NE, unknown"
  1090. "calr lar"
  1091. erase(R1)
  1092. erase(R3) | | |
  1093. lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0 | | | | adi 2 |
  1094. lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0 | | | |
  1095. adi 2 adp 0-rom(1,1) |
  1096. lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0 | SCR_REG |
  1097. "sla %[1]"
  1098. erase(%[1]) | %[1] | adi 2 |
  1099. lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | SCR_XREG |
  1100. "sla %[1]"
  1101. erase(%[1])
  1102. | {regconst2, %[1], (0-2)*rom(1,1)} | adi 2 |
  1103. lae aar $2==2 && rom(1,3)==4 && rom(1,1)==0 | SCR_REG |
  1104. "sla %[1], $$2"
  1105. erase(%[1]) | %[1] | adi 2 |
  1106. lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0 | SCR_XREG |
  1107. "sla %[1], $$2"
  1108. erase(%[1])
  1109. | {regconst2, %[1], (0-4)*rom(1,1)} | adi 2 |
  1110. lae aar $2==2 && rom(1,3)==8 && rom(1,1)==0 | SCR_REG |
  1111. "sla %[1], $$3"
  1112. erase(%[1]) | %[1] | adi 2 |
  1113. lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0 | SCR_XREG |
  1114. "sla %[1], $$3"
  1115. erase(%[1])
  1116. | {regconst2, %[1], (0-8)*rom(1,1)} | adi 2 |
  1117. lae aar $2==2 && rom(1,1)==0 | src2 |
  1118. allocate( %[1], LWREG )
  1119. move( %[1], %[a.2] )
  1120. "mult %[a], $$%(rom(1,3)%)"
  1121. erase(%[a]) | %[a.2] | adi 2 |
  1122. lae aar $2==2 && defined(rom(1,1)) | src2 |
  1123. allocate( %[1], LWREG )
  1124. move( %[1], %[a.2] )
  1125. "mult %[a], $$%(rom(1,3)%)"
  1126. erase(%[a])
  1127. | {regconst2, %[a.2], (0-rom(1,3))*rom(1,1)} | adi 2 |
  1128. lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) |
  1129. lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) |
  1130. /* */
  1131. /***************************************
  1132. ******** GROUP 12 ********
  1133. ***************************************/
  1134. cmi $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1135. "cp %[2], %[1]"
  1136. "jr EQ, 2f"
  1137. "jr LT, 1f"
  1138. "inc %[a]"
  1139. "jr 2f"
  1140. "1:\tdec %[a]\n2:"
  1141. erase(%[a]) nocc | %[a] | |
  1142. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1143. "cp %[2], %[1]"
  1144. "jr EQ, 2f"
  1145. "jr LT, 1f"
  1146. "inc %[a]"
  1147. "jr 2f"
  1148. "1:\tdec %[a]\n2:"
  1149. erase(%[a]) nocc | %[a] | |
  1150. cmi $1==4 | STACK | "calr cmi4" | R0 | |
  1151. cmi !defined($1)| src2 STACK | move( %[1], R0 )
  1152. "calr cmi"
  1153. erase(R0) | R0 | |
  1154. cmu $1==2 | | | | cmp |
  1155. cmu $1==4 | STACK | "calr cmu4" | R0 | |
  1156. cmu !defined($1)| src2 STACK | move( %[1], R0 )
  1157. "calr cmu"
  1158. erase(R0) | R0 | |
  1159. cms $1==2 | | | | sbi $1 |
  1160. cms defined($1) | STACK | move( {im2, $1}, R0 )
  1161. "calr cms"
  1162. erase(R0) | R0 | |
  1163. cms !defined($1)| src2 STACK | move( %[1], R0 )
  1164. "calr cms"
  1165. erase(R0) | R0 | |
  1166. cmp | src2 REG | allocate( REG = {im2, 0} )
  1167. "cp %[2], %[1]"
  1168. "jr EQ, 2f"
  1169. "jr ULT, 1f"
  1170. "inc %[a]"
  1171. "jr 2f"
  1172. "1:\tdec %[a]\n2:"
  1173. erase(%[a]) nocc | %[a] | |
  1174. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1175. "cp %[2], %[1]"
  1176. "jr EQ, 2f"
  1177. "jr ULT, 1f"
  1178. "inc %[a]"
  1179. "jr 2f"
  1180. "1:\tdec %[a]\n2:"
  1181. erase(%[a]) nocc | %[a] | |
  1182. tlt | src2c | allocate( REG = {im2, 0} )
  1183. test(%[1])
  1184. "tcc LT, %[a]"
  1185. erase(%[a]) samecc | %[a] | |
  1186. tle | src2c | allocate( REG = {im2, 0} )
  1187. test(%[1])
  1188. "tcc LE, %[a]"
  1189. erase(%[a]) samecc | %[a] | |
  1190. teq | src2c | allocate( REG = {im2, 0} )
  1191. test(%[1])
  1192. "tcc EQ, %[a]"
  1193. erase(%[a]) samecc | %[a] | |
  1194. tne | src2c | allocate( REG = {im2, 0} )
  1195. test(%[1])
  1196. "tcc NE, %[a]"
  1197. erase(%[a]) samecc | %[a] | |
  1198. tge | src2c | allocate( REG = {im2, 0} )
  1199. test(%[1])
  1200. "tcc GE, %[a]"
  1201. erase(%[a]) samecc | %[a] | |
  1202. tgt | src2c | allocate( REG = {im2, 0} )
  1203. test(%[1])
  1204. "tcc GT, %[a]"
  1205. erase(%[a]) samecc | %[a] | |
  1206. cmp tlt | src2 REG | allocate( REG = {im2, 0} )
  1207. "cp %[2], %[1]"
  1208. "tcc ULT, %[a]"
  1209. erase(%[a]) | %[a] | |
  1210. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1211. "cp %[2], %[1]"
  1212. "tcc ULT, %[a]"
  1213. erase(%[a]) | %[a] | |
  1214. cmp tle | src2 REG | allocate( REG = {im2, 0} )
  1215. "cp %[2], %[1]"
  1216. "tcc ULE, %[a]"
  1217. erase(%[a]) | %[a] | |
  1218. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1219. "cp %[2], %[1]"
  1220. "tcc ULE, %[a]"
  1221. erase(%[a]) | %[a] | |
  1222. cmp teq | src2 REG | allocate( REG = {im2, 0} )
  1223. "cp %[2], %[1]"
  1224. "tcc EQ, %[a]"
  1225. erase(%[a]) | %[a] | |
  1226. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1227. "cp %[2], %[1]"
  1228. "tcc EQ, %[a]"
  1229. erase(%[a]) | %[a] | |
  1230. cmp tne | src2 REG | allocate( REG = {im2, 0} )
  1231. "cp %[2], %[1]"
  1232. "tcc NE, %[a]"
  1233. erase(%[a]) | %[a] | |
  1234. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1235. "cp %[2], %[1]"
  1236. "tcc NE, %[a]"
  1237. erase(%[a]) | %[a] | |
  1238. cmp tge | src2 REG | allocate( REG = {im2, 0} )
  1239. "cp %[2], %[1]"
  1240. "tcc UGE, %[a]"
  1241. erase(%[a]) | %[a] | |
  1242. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1243. "cp %[2], %[1]"
  1244. "tcc UGE, %[a]"
  1245. erase(%[a]) | %[a] | |
  1246. cmp tgt | src2 REG | allocate( REG = {im2, 0} )
  1247. "cp %[2], %[1]"
  1248. "tcc UGT, %[a]"
  1249. erase(%[a]) | %[a] | |
  1250. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1251. "cp %[2], %[1]"
  1252. "tcc UGT, %[a]"
  1253. erase(%[a]) | %[a] | |
  1254. tlt and $2==2 | src2c SCR_REG | test(%[1])
  1255. "jr LT, 1f"
  1256. "ldk %[2], $$0\n1:"
  1257. erase(%[2]) | %[2] | |
  1258. tlt ior $2==2 | src2c SCR_REG | test(%[1])
  1259. "tcc LT, %[2]"
  1260. samecc
  1261. erase(%[2]) | %[2] | |
  1262. tle and $2==2 | src2c SCR_REG | test(%[1])
  1263. "jr LE, 1f"
  1264. "ldk %[2], $$0\n1:"
  1265. erase(%[2]) | %[2] | |
  1266. tle ior $2==2 | src2c SCR_REG | test(%[1])
  1267. "tcc LE, %[2]"
  1268. samecc
  1269. erase(%[2]) | %[2] | |
  1270. teq and $2==2 | src2c SCR_REG | test(%[1])
  1271. "jr EQ, 1f"
  1272. "ldk %[2], $$0\n1:"
  1273. erase(%[2]) | %[2] | |
  1274. teq ior $2==2 | src2c SCR_REG | test(%[1])
  1275. "tcc EQ, %[2]"
  1276. samecc
  1277. erase(%[2]) | %[2] | |
  1278. tne and $2==2 | src2c SCR_REG | test(%[1])
  1279. "jr NE, 1f"
  1280. "ldk %[2], $$0\n1:"
  1281. erase(%[2]) | %[2] | |
  1282. tne ior $2==2 | src2c SCR_REG | test(%[1])
  1283. "tcc NE, %[2]"
  1284. samecc
  1285. erase(%[2]) | %[2] | |
  1286. tgt and $2==2 | src2c SCR_REG | test(%[1])
  1287. "jr GT, 1f"
  1288. "ldk %[2], $$0\n1:"
  1289. erase(%[2]) | %[2] | |
  1290. tgt ior $2==2 | src2c SCR_REG | test(%[1])
  1291. "tcc GT, %[2]"
  1292. samecc
  1293. erase(%[2]) | %[2] | |
  1294. tge and $2==2 | src2c SCR_REG | test(%[1])
  1295. "jr GE, 1f"
  1296. "ldk %[2], $$0\n1:"
  1297. erase(%[2]) | %[2] | |
  1298. tge ior $2==2 | src2c SCR_REG | test(%[1])
  1299. "tcc GE, %[2]"
  1300. samecc
  1301. erase(%[2]) | %[2] | |
  1302. cmi tlt and $1==2 && $3==2 | src2 REG SCR_REG |
  1303. "cp %[2], %[1]"
  1304. "jr LT, 1f"
  1305. "ldk %[3], $$0\n1:"
  1306. erase(%[3]) | %[3] | |
  1307. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1308. "jr LT, 1f"
  1309. "ldk %[3], $$0\n1:"
  1310. erase(%[3]) | %[3] | |
  1311. cmi tlt ior $1==2 && $3==2 | src2 REG SCR_REG |
  1312. "cp %[2], %[1]"
  1313. "tcc LT, %[3]"
  1314. erase(%[3]) | %[3] | |
  1315. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1316. "tcc LT, %[3]"
  1317. erase(%[3]) | %[3] | |
  1318. cmi tlt $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1319. "cp %[2], %[1]"
  1320. "tcc LT, %[a]"
  1321. erase(%[a]) | %[a] | |
  1322. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1323. "cp %[2], %[1]"
  1324. "tcc LT, %[a]"
  1325. erase(%[a]) | %[a] | |
  1326. cmi tle and $1==2 && $3==2 | src2 REG SCR_REG |
  1327. "cp %[2], %[1]"
  1328. "jr LE, 1f"
  1329. "ldk %[3], $$0\n1:"
  1330. erase(%[3]) | %[3] | |
  1331. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1332. "jr LE, 1f"
  1333. "ldk %[3], $$0\n1:"
  1334. erase(%[3]) | %[3] | |
  1335. cmi tle ior $1==2 && $3==2 | src2 REG SCR_REG |
  1336. "cp %[2], %[1]"
  1337. "tcc LE, %[3]"
  1338. erase(%[3]) | %[3] | |
  1339. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1340. "tcc LE, %[3]"
  1341. erase(%[3]) | %[3] | |
  1342. cmi tle $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1343. "cp %[2], %[1]"
  1344. "tcc LE, %[a]"
  1345. erase(%[a]) | %[a] | |
  1346. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1347. "cp %[2], %[1]"
  1348. "tcc LE, %[a]"
  1349. erase(%[a]) | %[a] | |
  1350. cmi teq and $1==2 && $3==2 | src2 REG SCR_REG |
  1351. "cp %[2], %[1]"
  1352. "jr EQ, 1f"
  1353. "ldk %[3], $$0\n1:"
  1354. erase(%[3]) | %[3] | |
  1355. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1356. "jr EQ, 1f"
  1357. "ldk %[3], $$0\n1:"
  1358. erase(%[3]) | %[3] | |
  1359. cmi teq ior $1==2 && $3==2 | src2 REG SCR_REG |
  1360. "cp %[2], %[1]"
  1361. "tcc EQ, %[3]"
  1362. erase(%[3]) | %[3] | |
  1363. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1364. "tcc EQ, %[3]"
  1365. erase(%[3]) | %[3] | |
  1366. cmi teq $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1367. "cp %[2], %[1]"
  1368. "tcc EQ, %[a]"
  1369. erase(%[a]) | %[a] | |
  1370. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1371. "cp %[2], %[1]"
  1372. "tcc EQ, %[a]"
  1373. erase(%[a]) | %[a] | |
  1374. cmi tne and $1==2 && $3==2 | src2 REG SCR_REG |
  1375. "cp %[2], %[1]"
  1376. "jr NE, 1f"
  1377. "ldk %[3], $$0\n1:"
  1378. erase(%[3]) | %[3] | |
  1379. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1380. "jr NE, 1f"
  1381. "ldk %[3], $$0\n1:"
  1382. erase(%[3]) | %[3] | |
  1383. cmi tne ior $1==2 && $3==2 | src2 REG SCR_REG |
  1384. "cp %[2], %[1]"
  1385. "tcc NE, %[3]"
  1386. erase(%[3]) | %[3] | |
  1387. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1388. "tcc NE, %[3]"
  1389. erase(%[3]) | %[3] | |
  1390. cmi tne $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1391. "cp %[2], %[1]"
  1392. "tcc NE, %[a]"
  1393. erase(%[a]) | %[a] | |
  1394. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1395. "cp %[2], %[1]"
  1396. "tcc NE, %[a]"
  1397. erase(%[a]) | %[a] | |
  1398. cmi tge and $1==2 && $3==2 | src2 REG SCR_REG |
  1399. "cp %[2], %[1]"
  1400. "jr GE, 1f"
  1401. "ldk %[3], $$0\n1:"
  1402. erase(%[3]) | %[3] | |
  1403. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1404. "jr GE, 1f"
  1405. "ldk %[3], $$0\n1:"
  1406. erase(%[3]) | %[3] | |
  1407. cmi tge ior $1==2 && $3==2 | src2 REG SCR_REG |
  1408. "cp %[2], %[1]"
  1409. "tcc GE, %[3]"
  1410. erase(%[3]) | %[3] | |
  1411. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1412. "tcc GE, %[3]"
  1413. erase(%[3]) | %[3] | |
  1414. cmi tge $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1415. "cp %[2], %[1]"
  1416. "tcc GE, %[a]"
  1417. erase(%[a]) | %[a] | |
  1418. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1419. "cp %[2], %[1]"
  1420. "tcc GE, %[a]"
  1421. erase(%[a]) | %[a] | |
  1422. cmi tgt and $1==2 && $3==2 | src2 REG SCR_REG |
  1423. "cp %[2], %[1]"
  1424. "jr GT, 1f"
  1425. "ldk %[3], $$0\n1:"
  1426. erase(%[3]) | %[3] | |
  1427. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1428. "jr GT, 1f"
  1429. "ldk %[3], $$0\n1:"
  1430. erase(%[3]) | %[3] | |
  1431. cmi tgt ior $1==2 && $3==2 | src2 REG SCR_REG |
  1432. "cp %[2], %[1]"
  1433. "tcc GT, %[3]"
  1434. erase(%[3]) | %[3] | |
  1435. ... | NC im2 src2a SCR_REG | "cp %[2], %[1]"
  1436. "tcc GT, %[3]"
  1437. erase(%[3]) | %[3] | |
  1438. cmi tgt $1==2 | src2 REG | allocate( REG = {im2, 0} )
  1439. "cp %[2], %[1]"
  1440. "tcc GT, %[a]"
  1441. erase(%[a]) | %[a] | |
  1442. ... | NC im2 src2a | allocate( REG = {im2, 0} )
  1443. "cp %[2], %[1]"
  1444. "tcc GT, %[a]"
  1445. erase(%[a]) | %[a] | |
  1446. /* */
  1447. /***************************************
  1448. ******** GROUP 13 ********
  1449. ***************************************/
  1450. bra | STACK | "jr $1" samecc | | |
  1451. blt | src2 REG | remove( ALL )
  1452. "cp %[2], %[1]"
  1453. "jr LT, $1" | | | (4,10)+%[1]
  1454. ... | NC im2 src2a | remove( ALL )
  1455. "cp %[2], %[1]"
  1456. "jr LT, $1" | | |
  1457. ... | REG src2 | remove( ALL )
  1458. "cp %[1], %[2]"
  1459. "jr GT, $1" | | | (4,10)+%[2]
  1460. ... | NC src2a im2 | remove( ALL )
  1461. "cp %[1], %[2]"
  1462. "jr GT, $1" | | |
  1463. ble | src2 REG | remove( ALL )
  1464. "cp %[2], %[1]"
  1465. "jr LE, $1" | | | (4,10)+%[1]
  1466. ... | NC im2 src2a | remove( ALL )
  1467. "cp %[2], %[1]"
  1468. "jr LE, $1" | | |
  1469. ... | REG src2 | remove( ALL )
  1470. "cp %[1], %[2]"
  1471. "jr GE, $1" | | | (4,10)+%[2]
  1472. ... | NC src2a im2 | remove( ALL )
  1473. "cp %[1], %[2]"
  1474. "jr GE, $1" | | |
  1475. beq | src2 REG | remove( ALL )
  1476. "cp %[2], %[1]"
  1477. "jr EQ, $1" | | | (4,10)+%[1]
  1478. ... | NC im2 src2a | remove( ALL )
  1479. "cp %[2], %[1]"
  1480. "jr EQ, $1" | | |
  1481. ... | REG src2 | remove( ALL )
  1482. "cp %[1], %[2]"
  1483. "jr EQ, $1" | | | (4,10)+%[2]
  1484. ... | NC src2a im2 | remove( ALL )
  1485. "cp %[1], %[2]"
  1486. "jr EQ, $1" | | |
  1487. bne | src2 REG | remove( ALL )
  1488. "cp %[2], %[1]"
  1489. "jr NE, $1" | | | (4,10)+%[1]
  1490. ... | NC im2 src2a | remove( ALL )
  1491. "cp %[2], %[1]"
  1492. "jr NE, $1" | | |
  1493. ... | REG src2 | remove( ALL )
  1494. "cp %[1], %[2]"
  1495. "jr NE, $1" | | | (4,10)+%[2]
  1496. ... | NC src2a im2 | remove( ALL )
  1497. "cp %[1], %[2]"
  1498. "jr NE, $1" | | |
  1499. bge | src2 REG | remove( ALL )
  1500. "cp %[2], %[1]"
  1501. "jr GE, $1" | | | (4,10)+%[1]
  1502. ... | NC im2 src2a | remove( ALL )
  1503. "cp %[2], %[1]"
  1504. "jr GE, $1" | | |
  1505. ... | REG src2 | remove( ALL )
  1506. "cp %[1], %[2]"
  1507. "jr LE, $1" | | | (4,10)+%[2]
  1508. ... | NC src2a im2 | remove( ALL )
  1509. "cp %[1], %[2]"
  1510. "jr LE, $1" | | |
  1511. bgt | src2 REG | remove( ALL )
  1512. "cp %[2], %[1]"
  1513. "jr GT, $1" | | | (4,10)+%[1]
  1514. ... | NC im2 src2a | remove( ALL )
  1515. "cp %[2], %[1]"
  1516. "jr GT, $1" | | |
  1517. ... | REG src2 | remove( ALL )
  1518. "cp %[1], %[2]"
  1519. "jr LT, $1" | | | (4,10)+%[2]
  1520. ... | NC src2a im2 | remove( ALL )
  1521. "cp %[1], %[2]"
  1522. "jr LT, $1" | | |
  1523. zlt | src2c | remove( ALL )
  1524. test(%[1])
  1525. "jr LT, $1"
  1526. samecc | | |
  1527. zle | src2c | remove( ALL )
  1528. test(%[1])
  1529. "jr LE, $1"
  1530. samecc | | |
  1531. zeq | src2c | remove( ALL )
  1532. test(%[1])
  1533. "jr EQ, $1"
  1534. samecc | | |
  1535. zne | src2c | remove( ALL )
  1536. test(%[1])
  1537. "jr NE, $1"
  1538. samecc | | |
  1539. zge | src2c | remove( ALL )
  1540. test(%[1])
  1541. "jr GE, $1"
  1542. samecc | | |
  1543. zgt | src2c | remove( ALL )
  1544. test(%[1])
  1545. "jr GT, $1"
  1546. samecc | | |
  1547. cmp zlt | src2 REG STACK | "cp %[2], %[1]"
  1548. "jr ULT, $2" | | |
  1549. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1550. "jr ULT, $2" | | |
  1551. cmp zle | src2 REG STACK | "cp %[2], %[1]"
  1552. "jr ULE, $2" | | |
  1553. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1554. "jr ULE, $2" | | |
  1555. cmp zeq | src2 REG STACK | "cp %[2], %[1]"
  1556. "jr EQ, $2" | | |
  1557. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1558. "jr EQ, $2" | | |
  1559. cmp zne | src2 REG STACK | "cp %[2], %[1]"
  1560. "jr NE, $2" | | |
  1561. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1562. "jr NE, $2" | | |
  1563. cmp zgt | src2 REG STACK | "cp %[2], %[1]"
  1564. "jr UGT, $2" | | |
  1565. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1566. "jr UGT, $2" | | |
  1567. cmp zge | src2 REG STACK | "cp %[2], %[1]"
  1568. "jr UGE, $2" | | |
  1569. ... | NC im2 src2a STACK | "cp %[2], %[1]"
  1570. "jr UGE, $2" | | |
  1571. and zeq $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
  1572. "jr EQ, $2"
  1573. erase(%[2]) | | | (4,10)+%[1]
  1574. ... | SCR_REG src2 STACK | "and %[1], %[2]"
  1575. "jr EQ, $2"
  1576. erase(%[1]) | | | (4,10)+%[2]
  1577. and zne $1==2 | src2 SCR_REG STACK | "and %[2], %[1]"
  1578. "jr NE, $2"
  1579. erase(%[2]) | | | (4,10)+%[1]
  1580. ... | SCR_REG src2 STACK | "and %[1], %[2]"
  1581. "jr NE, $2"
  1582. erase(%[1]) | | | (4,10)+%[2]
  1583. /* */
  1584. /***************************************
  1585. ******** GROUP 14 ********
  1586. ***************************************/
  1587. cal | STACK | "calr $1" | | |
  1588. cai | NC src2a-x2 STACK | "call %[1]" | | |
  1589. ... | NC x2 STACK | allocate( %[1], XREG = %[1] )
  1590. "call 0(%[a])" | | |
  1591. ... | XREG STACK | "call 0(%[1])" | | |
  1592. lfr $1==0 | | | | |
  1593. lfr $1==2 | | | R0 | |
  1594. lfr $1==4 | | | RR0 | |
  1595. lfr $1==6 | | | R2 R1 R0 | |
  1596. lfr $1==8 | | | RR2 RR0 | |
  1597. ret $1==0 | STACK | "ldk R14, $$0\nld R15, R13"
  1598. "pop R13, *RR14"
  1599. "ret" | | |
  1600. ret $1==2 | src2 STACK | move( %[1], R0 )
  1601. "ldk R14, $$0\nld R15, R13"
  1602. "pop R13, *RR14"
  1603. "ret" | | |
  1604. ret $1==4 | src4 STACK | move( %[1], RR0 )
  1605. "ldk R14, $$0\nld R15, R13"
  1606. "pop R13, *RR14"
  1607. "ret" | | |
  1608. ret $1==6 | src2 src2 src2 STACK | move( %[1], R0 )
  1609. move( %[2], R1 )
  1610. move( %[3], R2 )
  1611. "ldk R14, $$0\nld R15, R13"
  1612. "pop R13, *RR14"
  1613. "ret" | | |
  1614. ret $1==8 | src4 src4 STACK | move( %[1], RR0 )
  1615. move( %[2], RR2 )
  1616. "ldk R14, $$0\nld R15, R13"
  1617. "pop R13, *RR14"
  1618. "ret" | | |
  1619. lfr ret $1==$2 | | | | ret 0 |
  1620. asp lfr ret $2==$3 | | | | ret 0 |
  1621. asp ret $2==0 | | | | ret 0 |
  1622. /* */
  1623. /***************************************
  1624. ******** GROUP 15 ********
  1625. ***************************************/
  1626. asp | STACK | "add R15, $$$1" | | |
  1627. ass $1==2 | src2 STACK | "add R15, %[1]" | | |
  1628. blm | STACK | move( {im2, $1}, R0 )
  1629. "calr blm"
  1630. erase(R0) | | |
  1631. bls $1==2 | src2 STACK | move( %[1], R0 )
  1632. "calr blm"
  1633. erase(R0) | | |
  1634. csa $1==2 | STACK | "pop R1, *RR14"
  1635. "pop R2, *RR14"
  1636. "jr csa" | | |
  1637. lae csa $2==2 | src2 STACK | move( %[1], R2 )
  1638. move( {ADDR_EXTERNAL, $1}, R1 )
  1639. "jr csa" | | |
  1640. csb $1==2 | STACK | "pop R1, *RR14"
  1641. "pop R2, *RR14"
  1642. "jr csb" | | |
  1643. lae csb $2==2 | src2 STACK | move( %[1], R2 )
  1644. move( {ADDR_EXTERNAL, $1}, R1 )
  1645. "jr csb" | | |
  1646. dup $1==2 | src2 | | %[1] %[1] | |
  1647. dup $1==4 | src2 src2 | | %[2] %[1] %[2] %[1] | |
  1648. dup | STACK | move( {im2, $1}, R0 )
  1649. "calr dup"
  1650. erase(R0) | | |
  1651. dus $1==2 | src2 STACK | move( %[1], R0 )
  1652. "calr dup"
  1653. erase(R0) | | |
  1654. exg $1==2 | src2 src2 | | %[1] %[2] | |
  1655. exg $1==2 | STACK | move( {im2, $1}, R0 )
  1656. "calr exg"
  1657. erase(R0) | | |
  1658. lor $1==0 | | | LB | |
  1659. lor $1==1 | STACK | allocate( REG )
  1660. "ld %[a], R15"
  1661. samecc | %[a] | |
  1662. lor $1==2 | | | {da2, "reghp"} | |
  1663. rck $1==2 | src2 STACK | move( %[1], R1 )
  1664. "calr rck" | | |
  1665. rck !defined($1)| src2 src2 STACK | "cp %[1], $$2"
  1666. "jr NE, unknown"
  1667. move( %[2], R1 )
  1668. "calr rck" | | |
  1669. str $1==0 | src2 | "ld R13, %[1]" samecc | | |
  1670. str $1==1 | src2 STACK | "ldk R14, $$0\nld R15, %[1]"
  1671. samecc | | |
  1672. str $1==2 | STACK | "calr strhp" | | |
  1673. dch | | | | loi 2 |
  1674. fil | | "ld hol0+4, $$$1" samecc | | |
  1675. gto | STACK | "push *RR14, $$$1"
  1676. "jr gto" | | |
  1677. lim | | | {da2, "trpim"} | |
  1678. lin | | "ld hol0, $$$1" samecc | | |
  1679. lni | | "inc hol0" | | |
  1680. lpb | | | | adp SL |
  1681. mon | STACK | "calr mon" | | |
  1682. nop | STACK |
  1683. #ifdef DEBUG
  1684. "calr noop"
  1685. #endif
  1686. | | |
  1687. rtt | | | | ret 0 |
  1688. sig | REG | allocate(REG)
  1689. move( {da2, "trppc"}, %[a] )
  1690. "ld trppc, %[1]"
  1691. samecc | %[a] | |
  1692. sim | STACK | "pop trpim, *RR14"
  1693. samecc | | |
  1694. trp | STACK | "calr trp" | | |
  1695. /* For several floating point instructions we generate an illegal
  1696. ** instruction trap
  1697. */
  1698. adf | | | | loc 18 trp |
  1699. sbf | | | | loc 18 trp |
  1700. mlf | | | | loc 18 trp |
  1701. dvf | | | | loc 18 trp |
  1702. ngf | | | | loc 18 trp |
  1703. fef | | | | loc 18 trp |
  1704. fif | | | | loc 18 trp |
  1705. zrf | | | | loc 18 trp |
  1706. cfi | | | | loc 18 trp |
  1707. cif | | | | loc 18 trp |
  1708. cfu | | | | loc 18 trp |
  1709. cuf | | | | loc 18 trp |
  1710. cff | | | | loc 18 trp |
  1711. cmf | | | | loc 18 trp |
  1712. /* */
  1713. /* COERCIONS */
  1714. /*********************************
  1715. ** From source2 to register **
  1716. *********************************/
  1717. | regconst2 | allocate( %[1], XREG = %[1.xreg] )
  1718. "add %[a], $$%[1.ind]"
  1719. setcc(%[a]) | %[a] | | (4,7)
  1720. | ADDR_LOCAL | allocate( REG )
  1721. "ld %[a], R13"
  1722. "add %[a], $$%[1.ind]"
  1723. setcc(%[a]) | %[a] | | (6,10)
  1724. | REG | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | |
  1725. | src2 | allocate( %[1], REG = %[1] ) | %[a] | |
  1726. | src2 | allocate( %[1], XREG = %[1] ) | {regconst2, %[a], 0} | |
  1727. /*********************************
  1728. ** From source2 to source2 **
  1729. *********************************/
  1730. | ADDR_EXTERNAL | | {da2, %[1.ind]} | |
  1731. /*********************************
  1732. ** From source1 to source2 **
  1733. *********************************/
  1734. | src1 | allocate( %[1], B2REG = %[1] ) | %[a] | |
  1735. /*********************************
  1736. ** From source4 to register **
  1737. *********************************/
  1738. | src4 | allocate( %[1], LWREG = %[1] ) | %[a] | |
  1739. /*********************************
  1740. ** From source4 to source2 **
  1741. *********************************/
  1742. | LWREG | | %[1.2] %[1.1] | |
  1743. | x4 | | {x2, %[1.xreg], 2+%[1.ind]} {x2, %[1.xreg], %[1.ind]} | |
  1744. | da4 | | {da2, "2+"+%[1.ind]} {da2, %[1.ind]} | |
  1745. | ir4 | | {ir4_hi, %[1.lwxreg]} {ir2, %[1.lwxreg]} | |
  1746. | ir4_hi | allocate( LWREG = %[1.lwreg] ) | {x2, %[a.2], 2} | |
  1747. /*********************************
  1748. ** From STACK **
  1749. *********************************/
  1750. | STACK | allocate( REG )
  1751. "pop %[a], *RR14"
  1752. samecc | %[a] | | (2,8)
  1753. | STACK | allocate( XREG )
  1754. "pop %[a], *RR14"
  1755. samecc | {regconst2, %[a], 0} | | (2,8)
  1756. | STACK | allocate( LWREG )
  1757. "popl %[a], *RR14"
  1758. samecc | %[a] | | (2,12)
  1759. MOVES:
  1760. /* move( src, dst ) --> ld dst, src */
  1761. (im2 (%[num]>=0 && %[num]<=15), REG, "ldk %[2], %[1]" samecc, (2,5))
  1762. (im2 %[num]==0, src2a, "clr %[2]" samecc, (2,7)+%[2])
  1763. (im2 %[num]==0, src1, "clrb %[2]" samecc, (2,7)+%[2])
  1764. (im2, src1, "ldb %[2], $$[%[1.num]-[%[1.num]&0xFFFFFF00]+128]%%256-128"
  1765. samecc, (4,9)+%[2])
  1766. (src1, B2REG, "ldk %[2], $$0\nldb L%[2], %[1]" samecc, (4,8)+%[1])
  1767. (src2, REG, "ld %[2], %[1]" samecc, (2,3)+%[1])
  1768. (src4, LWREG, "ldl %[2], %[1]" samecc, (2,5)+%[1])
  1769. (const2, src1, "ldb %[2], %[1]" samecc, (4,9)+%[2])
  1770. (B2REG, src1, "ldb %[2], L%[1]" samecc, (2,6)+%[2])
  1771. (src2b, src2a, "ld %[2], %[1]" samecc, (2,6)+%[1]+%[2])
  1772. (src4b, src4a, "ldl %[2], %[1]" samecc, (2,6)+%[2])
  1773. TESTS:
  1774. (src2c, "test %[1]", (2,7)+%[1])
  1775. STACKS:
  1776. (src1, B2REG, move( %[1], %[a] )
  1777. "push *RR14, %[a]"
  1778. "clrb *RR14"
  1779. samecc, (4,17) )
  1780. (src1,, ".sect data\n1:\t.data2 0\n.text"
  1781. "ld 1b, R0"
  1782. "ldk R0, $$0"
  1783. "ldb RL0, %[1]"
  1784. "push *RR14, R0"
  1785. "ld R0, 1b"
  1786. samecc, (18,37)+%[1] )
  1787. (src2,, "push *RR14, %[1]"
  1788. samecc, (2,9)+%[1] )
  1789. (const4, LWREG, move( %[1], %[a] )
  1790. "pushl *RR14, %[a]"
  1791. samecc, (2,12) )
  1792. (im4,, "push *RR14, %[1]"
  1793. "push *RR14, $$0"
  1794. samecc, (8,24) ) /* there is no pushl ir,im */
  1795. (double,, ".sect .data\n1:\t.data4 %[1]\n.text"
  1796. "pushl *RR14, 1b"
  1797. samecc, (6,20) )
  1798. (src4,, "pushl *RR14, %[1]"
  1799. samecc, (2,12)+%[1] )
  1800. (regconst2,, "add %[1.xreg], $$%[1.ind]"
  1801. "push *RR14, %[1.xreg]"
  1802. nocc, (6,16) )
  1803. (ADDR_LOCAL, REG,
  1804. move( LB, %[a] )
  1805. "add %[a], $$%[1.ind]"
  1806. "push *RR14, %[a]"
  1807. setcc(%[a]), (6,16) )
  1808. (ADDR_LOCAL,, "add R13, $$%[1.ind]"
  1809. "push *RR14, R13"
  1810. "sub R13, $$%[1.ind]"
  1811. nocc, (10,23) )