sourcepawn/compiler/sc7.scp
branchrefac-jit
changeset 2284 026da5437111
parent 2192 7602d7fb60d9
child 2288 15c77b21589a
     1.1 --- a/sourcepawn/compiler/sc7.scp	Fri Jul 11 06:51:21 2008 +0000
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,2022 +0,0 @@
     1.4 -/*  Pawn compiler - Peephole optimizer "sequences" strings (plain
     1.5 - *                   and compressed formats)
     1.6 - *
     1.7 - *  Copyright (c) ITB CompuPhase, 2000-2006
     1.8 - *
     1.9 - *  This software is provided "as-is", without any express or implied warranty.
    1.10 - *  In no event will the authors be held liable for any damages arising from
    1.11 - *  the use of this software.
    1.12 - *
    1.13 - *  Permission is granted to anyone to use this software for any purpose,
    1.14 - *  including commercial applications, and to alter it and redistribute it
    1.15 - *  freely, subject to the following restrictions:
    1.16 - *
    1.17 - *  1.  The origin of this software must not be misrepresented; you must not
    1.18 - *      claim that you wrote the original software. If you use this software in
    1.19 - *      a product, an acknowledgment in the product documentation would be
    1.20 - *      appreciated but is not required.
    1.21 - *  2.  Altered source versions must be plainly marked as such, and must not be
    1.22 - *      misrepresented as being the original software.
    1.23 - *  3.  This notice may not be removed or altered from any source distribution.
    1.24 - *
    1.25 - *  Version: $Id$
    1.26 - */
    1.27 -
    1.28 -SC_FUNC int strexpand(char *dest, unsigned char *source, int maxlen, unsigned char pairtable[128][2]);
    1.29 -
    1.30 -#define SCPACK_TERMINATOR ,     /* end each section with a comma */
    1.31 -
    1.32 -#define SCPACK_TABLE sequences_table
    1.33 -/*-*SCPACK start of pair table, do not change or remove this line */
    1.34 -unsigned char sequences_table[][2] = {
    1.35 -  {49,33}, {37,128}, {32,129}, {32,37}, {114,105}, {112,132}, {46,133}, {97,100}, {46,97}, {136,108}, {137,116}, {115,104}, {111,135}, {117,139}, {112,141}, {108,140},
    1.36 -  {131,50}, {144,33}, {46,115}, {138,33}, {59,36}, {134,130}, {143,146}, {115,116}, {134,145}, {110,151}, {111,153}, {99,154}, {112,147}, {135,100}, {134,33}, {114,33},
    1.37 -  {111,156}, {112,160}, {46,99}, {138,130}, {142,158}, {131,51}, {150,152}, {112,33}, {120,167}, {101,168}, {148,169}, {97,159}, {112,171}, {148,172}, {165,33}, {173,142},
    1.38 -  {122,101}, {176,114}, {101,113}, {110,100}, {149,164}, {157,114}, {33,161}, {131,49}, {103,33}, {157,33}, {104,184}, {99,186}, {120,187}, {98,111}, {118,101}, {111,190},
    1.39 -  {109,191}, {130,170}, {131,52}, {106,177}, {138,145}, {180,166}, {192,147}, {108,162}, {163,166}, {143,149}, {115,174}, {117,179}, {139,199}, {203,202}, {189,205}, {105,100},
    1.40 -  {115,103}, {115,108}, {207,120}, {195,130}, {46,135}, {178,33}, {212,114}, {204,134}, {155,149}, {142,162}, {183,145}, {150,149}, {143,152}, {194,33}, {130,175}, {97,179},
    1.41 -  {177,111}, {182,185}, {143,46}, {183,144}, {155,152}, {145,175}, {114,101}, {230,102}, {108,231}, {101,115}, {233,115}, {114,116}, {142,147}, {105,33}, {155,163}, {178,130},
    1.42 -  {215,32}, {240,50}, {143,196}, {155,197}, {181,197}, {181,200}, {108,210}, {46,98}, {241,225}, {208,235}, {209,234}, {224,158}, {143,163}, {150,163}, {155,200}
    1.43 -};
    1.44 -/*-*SCPACK end of pair table, do not change or remove this line */
    1.45 -
    1.46 -#define seqsize(o,p)    (opcodes(o)+opargs(p))
    1.47 -typedef struct {
    1.48 -  char *find;
    1.49 -  char *replace;
    1.50 -  int savesize;         /* number of bytes saved (in bytecode) */
    1.51 -} SEQUENCE;
    1.52 -static SEQUENCE sequences_cmp[] = {
    1.53 -  /* A very common sequence in four varieties
    1.54 -   *    load.s.pri n1           load.s.pri n2
    1.55 -   *    push.pri                load.s.alt n1
    1.56 -   *    load.s.pri n2           -
    1.57 -   *    pop.alt                 -
    1.58 -   *    --------------------------------------
    1.59 -   *    load.pri n1             load.s.pri n2
    1.60 -   *    push.pri                load.alt n1
    1.61 -   *    load.s.pri n2           -
    1.62 -   *    pop.alt                 -
    1.63 -   *    --------------------------------------
    1.64 -   *    load.s.pri n1           load.pri n2
    1.65 -   *    push.pri                load.s.alt n1
    1.66 -   *    load.pri n2             -
    1.67 -   *    pop.alt                 -
    1.68 -   *    --------------------------------------
    1.69 -   *    load.pri n1             load.pri n2
    1.70 -   *    push.pri                load.alt n1
    1.71 -   *    load.pri n2             -
    1.72 -   *    pop.alt                 -
    1.73 -   */
    1.74 -  {
    1.75 -    #ifdef SCPACK
    1.76 -      "load.s.pri %1!push.pri!load.s.pri %2!pop.alt!",
    1.77 -      "load.s.pri %2!load.s.alt %1!",
    1.78 -    #else
    1.79 -      "\226\305\241",
    1.80 -      "\246\375",
    1.81 -    #endif
    1.82 -    seqsize(4,2) - seqsize(2,2)
    1.83 -  },
    1.84 -  {
    1.85 -    #ifdef SCPACK
    1.86 -      "load.pri %1!push.pri!load.s.pri %2!pop.alt!",
    1.87 -      "load.s.pri %2!load.alt %1!",
    1.88 -    #else
    1.89 -      "\217\305\241",
    1.90 -      "\246\374",
    1.91 -    #endif
    1.92 -    seqsize(4,2) - seqsize(2,2)
    1.93 -  },
    1.94 -  {
    1.95 -    #ifdef SCPACK
    1.96 -      "load.s.pri %1!push.pri!load.pri %2!pop.alt!",
    1.97 -      "load.pri %2!load.s.alt %1!",
    1.98 -    #else
    1.99 -      "\226\264\334\241",
   1.100 -      "\334\375",
   1.101 -    #endif
   1.102 -    seqsize(4,2) - seqsize(2,2)
   1.103 -  },
   1.104 -  {
   1.105 -    #ifdef SCPACK
   1.106 -      "load.pri %1!push.pri!load.pri %2!pop.alt!",
   1.107 -      "load.pri %2!load.alt %1!",
   1.108 -    #else
   1.109 -      "\217\264\334\241",
   1.110 -      "\334\374",
   1.111 -    #endif
   1.112 -    seqsize(4,2) - seqsize(2,2)
   1.113 -  },
   1.114 -  /* (#1#) The above also occurs with "addr.pri" (array
   1.115 -   * indexing) as the first line; so that adds 2 cases.
   1.116 -   */
   1.117 -  {
   1.118 -    #ifdef SCPACK
   1.119 -      "addr.pri %1!push.pri!load.s.pri %2!pop.alt!",
   1.120 -      "addr.alt %1!load.s.pri %2!",
   1.121 -    #else
   1.122 -      "\364\241",
   1.123 -      "\365",
   1.124 -    #endif
   1.125 -    seqsize(4,2) - seqsize(2,2)
   1.126 -  },
   1.127 -  {
   1.128 -    #ifdef SCPACK
   1.129 -      "addr.pri %1!push.pri!load.pri %2!pop.alt!",
   1.130 -      "addr.alt %1!load.pri %2!",
   1.131 -    #else
   1.132 -      "\265\264\334\241",
   1.133 -      "\265\243\334",
   1.134 -    #endif
   1.135 -    seqsize(4,2) - seqsize(2,2)
   1.136 -  },
   1.137 -  /* And the same sequence with const.pri as either the first
   1.138 -   * or the second load instruction: four more cases.
   1.139 -   */
   1.140 -  {
   1.141 -    #ifdef SCPACK
   1.142 -      "const.pri %1!push.pri!load.s.pri %2!pop.alt!",
   1.143 -      "load.s.pri %2!const.alt %1!",
   1.144 -    #else
   1.145 -      "\363\241",
   1.146 -      "\246\356",
   1.147 -    #endif
   1.148 -    seqsize(4,2) - seqsize(2,2)
   1.149 -  },
   1.150 -  {
   1.151 -    #ifdef SCPACK
   1.152 -      "const.pri %1!push.pri!load.pri %2!pop.alt!",
   1.153 -      "load.pri %2!const.alt %1!",
   1.154 -    #else
   1.155 -      "\233\264\334\241",
   1.156 -      "\334\356",
   1.157 -    #endif
   1.158 -    seqsize(4,2) - seqsize(2,2)
   1.159 -  },
   1.160 -  {
   1.161 -    #ifdef SCPACK
   1.162 -      "load.s.pri %1!push.pri!const.pri %2!pop.alt!",
   1.163 -      "const.pri %2!load.s.alt %1!",
   1.164 -    #else
   1.165 -      "\226\264\344\241",
   1.166 -      "\344\375",
   1.167 -    #endif
   1.168 -    seqsize(4,2) - seqsize(2,2)
   1.169 -  },
   1.170 -  {
   1.171 -    #ifdef SCPACK
   1.172 -      "load.pri %1!push.pri!const.pri %2!pop.alt!",
   1.173 -      "const.pri %2!load.alt %1!",
   1.174 -    #else
   1.175 -      "\217\264\344\241",
   1.176 -      "\344\374",
   1.177 -    #endif
   1.178 -    seqsize(4,2) - seqsize(2,2)
   1.179 -  },
   1.180 -  /* The same as above, but now with "addr.pri" (array
   1.181 -   * indexing) on the first line and const.pri on
   1.182 -   * the second.
   1.183 -   */
   1.184 -  {
   1.185 -    #ifdef SCPACK
   1.186 -      "addr.pri %1!push.pri!const.pri %2!pop.alt!",
   1.187 -      "addr.alt %1!const.pri %2!",
   1.188 -    #else
   1.189 -      "\265\264\344\241",
   1.190 -      "\265\243\344",
   1.191 -    #endif
   1.192 -    seqsize(4,2) - seqsize(2,2)
   1.193 -  },
   1.194 -  {
   1.195 -    #ifdef SCPACK
   1.196 -      "addr.pri %1!push.pri!zero.pri!pop.alt!",
   1.197 -      "addr.alt %1!zero.pri!",
   1.198 -    #else
   1.199 -      "\265\264\373\241",
   1.200 -      "\265\243\373",
   1.201 -    #endif
   1.202 -    seqsize(4,1) - seqsize(2,1)
   1.203 -  },
   1.204 -  /* ??? add references */
   1.205 -  /* Chained relational operators can contain sequences like:
   1.206 -   *    move.pri                load.s.pri n1
   1.207 -   *    push.pri                -
   1.208 -   *    load.s.pri n1           -
   1.209 -   *    pop.alt                 -
   1.210 -   * The above also accurs for "load.pri" and for "const.pri",
   1.211 -   * so add another two cases.
   1.212 -   */
   1.213 -  {
   1.214 -    #ifdef SCPACK
   1.215 -      "move.pri!push.pri!load.s.pri %1!pop.alt!",
   1.216 -      "load.s.pri %1!",
   1.217 -    #else
   1.218 -      "\300\236\244\333\241",
   1.219 -      "\333",
   1.220 -    #endif
   1.221 -    seqsize(4,1) - seqsize(1,1)
   1.222 -  },
   1.223 -  {
   1.224 -    #ifdef SCPACK
   1.225 -      "move.pri!push.pri!load.pri %1!pop.alt!",
   1.226 -      "load.pri %1!",
   1.227 -    #else
   1.228 -      "\300\236\244\311\241",
   1.229 -      "\311",
   1.230 -    #endif
   1.231 -    seqsize(4,1) - seqsize(1,1)
   1.232 -  },
   1.233 -  {
   1.234 -    #ifdef SCPACK
   1.235 -      "move.pri!push.pri!const.pri %1!pop.alt!",
   1.236 -      "const.pri %1!",
   1.237 -    #else
   1.238 -      "\300\236\244\330\241",
   1.239 -      "\330",
   1.240 -    #endif
   1.241 -    seqsize(4,1) - seqsize(1,1)
   1.242 -  },
   1.243 -  /* More optimizations for chained relational operators; the
   1.244 -   * continuation sequences can be simplified if they turn out
   1.245 -   * to be termination sequences:
   1.246 -   *    xchg                    sless       also for sless, sgeq and sleq
   1.247 -   *    sgrtr                   pop.alt
   1.248 -   *    swap.alt                and
   1.249 -   *    and                     ;$exp
   1.250 -   *    pop.alt                 -
   1.251 -   *    ;$exp                   -
   1.252 -   *    --------------------------------------
   1.253 -   *    xchg                    sless       also for sless, sgeq and sleq
   1.254 -   *    sgrtr                   pop.alt
   1.255 -   *    swap.alt                and
   1.256 -   *    and                     jzer n1
   1.257 -   *    pop.alt                 -
   1.258 -   *    jzer n1                 -
   1.259 -   *    --------------------------------------
   1.260 -   *    xchg                    jsgeq  n1   also for sless, sgeq and sleq
   1.261 -   *    sgrtr                   ;$exp       (occurs for non-chained comparisons)
   1.262 -   *    jzer n1                 -
   1.263 -   *    ;$exp                   -
   1.264 -   *    --------------------------------------
   1.265 -   *    xchg                    sless       also for sless, sgeq and sleq
   1.266 -   *    sgrtr                   ;$exp       (occurs for non-chained comparisons)
   1.267 -   *    ;$exp                   -
   1.268 -   */
   1.269 -  {
   1.270 -    #ifdef SCPACK
   1.271 -      "xchg!sgrtr!swap.alt!and!pop.alt!;$exp!",
   1.272 -      "sless!pop.alt!and!;$exp!",
   1.273 -    #else
   1.274 -      "\274\371\237swa\234\337\266\252",
   1.275 -      "\372\266\337!\252",
   1.276 -    #endif
   1.277 -    seqsize(5,0) - seqsize(3,0)
   1.278 -  },
   1.279 -  {
   1.280 -    #ifdef SCPACK
   1.281 -      "xchg!sless!swap.alt!and!pop.alt!;$exp!",
   1.282 -      "sgrtr!pop.alt!and!;$exp!",
   1.283 -    #else
   1.284 -      "\274\372!swa\234\337\266\252",
   1.285 -      "\371\237\241\337!\252",
   1.286 -    #endif
   1.287 -    seqsize(5,0) - seqsize(3,0)
   1.288 -  },
   1.289 -  {
   1.290 -    #ifdef SCPACK
   1.291 -      "xchg!sgeq!swap.alt!and!pop.alt!;$exp!",
   1.292 -      "sleq!pop.alt!and!;$exp!",
   1.293 -    #else
   1.294 -      "\274\320\325swa\234\337\266\252",
   1.295 -      "\321\262\266\337!\252",
   1.296 -    #endif
   1.297 -    seqsize(5,0) - seqsize(3,0)
   1.298 -  },
   1.299 -  {
   1.300 -    #ifdef SCPACK
   1.301 -      "xchg!sleq!swap.alt!and!pop.alt!;$exp!",
   1.302 -      "sgeq!pop.alt!and!;$exp!",
   1.303 -    #else
   1.304 -      "\274\321\325swa\234\337\266\252",
   1.305 -      "\320\262\266\337!\252",
   1.306 -    #endif
   1.307 -    seqsize(5,0) - seqsize(3,0)
   1.308 -  },
   1.309 -  {
   1.310 -    #ifdef SCPACK
   1.311 -      "xchg!sgrtr!swap.alt!and!pop.alt!jzer %1!",
   1.312 -      "sless!pop.alt!and!jzer %1!",
   1.313 -    #else
   1.314 -      "\274\371\237swa\234\337\266\323",
   1.315 -      "\372\266\337!\323",
   1.316 -    #endif
   1.317 -    seqsize(5,0) - seqsize(3,0)
   1.318 -  },
   1.319 -  {
   1.320 -    #ifdef SCPACK
   1.321 -      "xchg!sless!swap.alt!and!pop.alt!jzer %1!",
   1.322 -      "sgrtr!pop.alt!and!jzer %1!",
   1.323 -    #else
   1.324 -      "\274\372!swa\234\337\266\323",
   1.325 -      "\371\237\241\337!\323",
   1.326 -    #endif
   1.327 -    seqsize(5,0) - seqsize(3,0)
   1.328 -  },
   1.329 -  {
   1.330 -    #ifdef SCPACK
   1.331 -      "xchg!sgeq!swap.alt!and!pop.alt!jzer %1!",
   1.332 -      "sleq!pop.alt!and!jzer %1!",
   1.333 -    #else
   1.334 -      "\274\320\325swa\234\337\266\323",
   1.335 -      "\321\262\266\337!\323",
   1.336 -    #endif
   1.337 -    seqsize(5,0) - seqsize(3,0)
   1.338 -  },
   1.339 -  {
   1.340 -    #ifdef SCPACK
   1.341 -      "xchg!sleq!swap.alt!and!pop.alt!jzer %1!",
   1.342 -      "sgeq!pop.alt!and!jzer %1!",
   1.343 -    #else
   1.344 -      "\274\321\325swa\234\337\266\323",
   1.345 -      "\320\262\266\337!\323",
   1.346 -    #endif
   1.347 -    seqsize(5,0) - seqsize(3,0)
   1.348 -  },
   1.349 -  {
   1.350 -    #ifdef SCPACK
   1.351 -      "xchg!sgrtr!jzer %1!;$exp!",
   1.352 -      "jsgeq %1!;$exp!",
   1.353 -    #else
   1.354 -      "\274\371\237\303\301",
   1.355 -      "j\320\262\301",
   1.356 -    #endif
   1.357 -    seqsize(3,1) - seqsize(1,1)
   1.358 -  },
   1.359 -  {
   1.360 -    #ifdef SCPACK
   1.361 -      "xchg!sless!jzer %1!;$exp!",
   1.362 -      "jsleq %1!;$exp!",
   1.363 -    #else
   1.364 -      "\274\372!\303\301",
   1.365 -      "j\321\262\301",
   1.366 -    #endif
   1.367 -    seqsize(3,1) - seqsize(1,1)
   1.368 -  },
   1.369 -  {
   1.370 -    #ifdef SCPACK
   1.371 -      "xchg!sgeq!jzer %1!;$exp!",
   1.372 -      "jsgrtr %1!;$exp!",
   1.373 -    #else
   1.374 -      "\274\320\325\303\301",
   1.375 -      "j\371r\301",
   1.376 -    #endif
   1.377 -    seqsize(3,1) - seqsize(1,1)
   1.378 -  },
   1.379 -  {
   1.380 -    #ifdef SCPACK
   1.381 -      "xchg!sleq!jzer %1!;$exp!",
   1.382 -      "jsless %1!;$exp!",
   1.383 -    #else
   1.384 -      "\274\321\325\303\301",
   1.385 -      "j\372\301",
   1.386 -    #endif
   1.387 -    seqsize(3,1) - seqsize(1,1)
   1.388 -  },
   1.389 -  {
   1.390 -    #ifdef SCPACK
   1.391 -      "xchg!sgrtr!;$exp!",
   1.392 -      "sless!;$exp!",
   1.393 -    #else
   1.394 -      "\274\371\237\252",
   1.395 -      "\372!\252",
   1.396 -    #endif
   1.397 -    seqsize(2,0) - seqsize(1,0)
   1.398 -  },
   1.399 -  {
   1.400 -    #ifdef SCPACK
   1.401 -      "xchg!sless!;$exp!",
   1.402 -      "sgrtr!;$exp!",
   1.403 -    #else
   1.404 -      "\274\372!\252",
   1.405 -      "\371\237\252",
   1.406 -    #endif
   1.407 -    seqsize(2,0) - seqsize(1,0)
   1.408 -  },
   1.409 -  {
   1.410 -    #ifdef SCPACK
   1.411 -      "xchg!sgeq!;$exp!",
   1.412 -      "sleq!;$exp!",
   1.413 -    #else
   1.414 -      "\274\320\325\252",
   1.415 -      "\321\325\252",
   1.416 -    #endif
   1.417 -    seqsize(2,0) - seqsize(1,0)
   1.418 -  },
   1.419 -  {
   1.420 -    #ifdef SCPACK
   1.421 -      "xchg!sleq!;$exp!",
   1.422 -      "sgeq!;$exp!",
   1.423 -    #else
   1.424 -      "\274\321\325\252",
   1.425 -      "\320\325\252",
   1.426 -    #endif
   1.427 -    seqsize(2,0) - seqsize(1,0)
   1.428 -  },
   1.429 -  /* The entry to chained operators is also opt to optimization
   1.430 -   *    load.s.pri n1           load.s.pri n2
   1.431 -   *    load.s.alt n2           load.s.alt n1
   1.432 -   *    xchg                    -
   1.433 -   *    --------------------------------------
   1.434 -   *    load.s.pri n1           load.pri n2
   1.435 -   *    load.alt n2             load.s.alt n1
   1.436 -   *    xchg                    -
   1.437 -   *    --------------------------------------
   1.438 -   *    load.s.pri n1           const.pri n2
   1.439 -   *    const.alt n2            load.s.alt n1
   1.440 -   *    xchg                    -
   1.441 -   *    --------------------------------------
   1.442 -   * and all permutations...
   1.443 -   */
   1.444 -  {
   1.445 -    #ifdef SCPACK
   1.446 -      "load.s.pri %1!load.s.alt %2!xchg!",
   1.447 -      "load.s.pri %2!load.s.alt %1!",
   1.448 -    #else
   1.449 -      "\333\226\304\274",
   1.450 -      "\246\375",
   1.451 -    #endif
   1.452 -    seqsize(3,2) - seqsize(2,2)
   1.453 -  },
   1.454 -  {
   1.455 -    #ifdef SCPACK
   1.456 -      "load.s.pri %1!load.alt %2!xchg!",
   1.457 -      "load.pri %2!load.s.alt %1!",
   1.458 -    #else
   1.459 -      "\333\362\274",
   1.460 -      "\334\375",
   1.461 -    #endif
   1.462 -    seqsize(3,2) - seqsize(2,2)
   1.463 -  },
   1.464 -  {
   1.465 -    #ifdef SCPACK
   1.466 -      "load.s.pri %1!const.alt %2!xchg!",
   1.467 -      "const.pri %2!load.s.alt %1!",
   1.468 -    #else
   1.469 -      "\333\233\304\274",
   1.470 -      "\344\375",
   1.471 -    #endif
   1.472 -    seqsize(3,2) - seqsize(2,2)
   1.473 -  },
   1.474 -  {
   1.475 -    #ifdef SCPACK
   1.476 -      "load.pri %1!load.s.alt %2!xchg!",
   1.477 -      "load.s.pri %2!load.alt %1!",
   1.478 -    #else
   1.479 -      "\311\226\304\274",
   1.480 -      "\246\374",
   1.481 -    #endif
   1.482 -    seqsize(3,2) - seqsize(2,2)
   1.483 -  },
   1.484 -  {
   1.485 -    #ifdef SCPACK
   1.486 -      "load.pri %1!load.alt %2!xchg!",
   1.487 -      "load.pri %2!load.alt %1!",
   1.488 -    #else
   1.489 -      "\311\362\274",
   1.490 -      "\334\374",
   1.491 -    #endif
   1.492 -    seqsize(3,2) - seqsize(2,2)
   1.493 -  },
   1.494 -  {
   1.495 -    #ifdef SCPACK
   1.496 -      "load.pri %1!const.alt %2!xchg!",
   1.497 -      "const.pri %2!load.alt %1!",
   1.498 -    #else
   1.499 -      "\311\233\304\274",
   1.500 -      "\344\374",
   1.501 -    #endif
   1.502 -    seqsize(3,2) - seqsize(2,2)
   1.503 -  },
   1.504 -  {
   1.505 -    #ifdef SCPACK
   1.506 -      "const.pri %1!load.s.alt %2!xchg!",
   1.507 -      "load.s.pri %2!const.alt %1!",
   1.508 -    #else
   1.509 -      "\330\226\304\274",
   1.510 -      "\246\356",
   1.511 -    #endif
   1.512 -    seqsize(3,2) - seqsize(2,2)
   1.513 -  },
   1.514 -  {
   1.515 -    #ifdef SCPACK
   1.516 -      "const.pri %1!load.alt %2!xchg!",
   1.517 -      "load.pri %2!const.alt %1!",
   1.518 -    #else
   1.519 -      "\330\362\274",
   1.520 -      "\334\356",
   1.521 -    #endif
   1.522 -    seqsize(3,2) - seqsize(2,2)
   1.523 -  },
   1.524 -  /* some sequences where PRI is moved to ALT can be optimized
   1.525 -   * further when considering what follows
   1.526 -   *    move.alt                const.alt n1
   1.527 -   *    const.pri %1            -
   1.528 -   *    xchg                    -
   1.529 -   * (also for load.s.pri and load.pri)
   1.530 -   *    --------------------------------------
   1.531 -   *    lref.pri %1             lref.alt %1
   1.532 -   *    move.alt                [load.pri %2]
   1.533 -   *    [load.pri %2]           -
   1.534 -   * (where [load.pri %2] may also be another operatrion loading PRI)
   1.535 -   */
   1.536 -  {
   1.537 -    #ifdef SCPACK
   1.538 -      "move.alt!const.pri %1!xchg!",
   1.539 -      "const.alt %1!",
   1.540 -    #else
   1.541 -      "\306\330\274",
   1.542 -      "\356",
   1.543 -    #endif
   1.544 -    seqsize(3,1) - seqsize(1,1)
   1.545 -  },
   1.546 -  {
   1.547 -    #ifdef SCPACK
   1.548 -      "move.alt!load.pri %1!xchg!",
   1.549 -      "load.alt %1!",
   1.550 -    #else
   1.551 -      "\306\311\274",
   1.552 -      "\374",
   1.553 -    #endif
   1.554 -    seqsize(3,1) - seqsize(1,1)
   1.555 -  },
   1.556 -  {
   1.557 -    #ifdef SCPACK
   1.558 -      "move.alt!load.s.pri %1!xchg!",
   1.559 -      "load.s.alt %1!",
   1.560 -    #else
   1.561 -      "\306\333\274",
   1.562 -      "\375",
   1.563 -    #endif
   1.564 -    seqsize(3,1) - seqsize(1,1)
   1.565 -  },
   1.566 -  /* ----- */
   1.567 -  {
   1.568 -    #ifdef SCPACK
   1.569 -      "lref.pri %1!move.alt!load.pri %2!",
   1.570 -      "lref.alt %1!load.pri %2!",
   1.571 -    #else
   1.572 -      "\350\225\306\334",
   1.573 -      "\350\243\334",
   1.574 -    #endif
   1.575 -    seqsize(3,2) - seqsize(2,2)
   1.576 -  },
   1.577 -  {
   1.578 -    #ifdef SCPACK
   1.579 -      "lref.pri %1!move.alt!load.s.pri %2!",
   1.580 -      "lref.alt %1!load.s.pri %2!",
   1.581 -    #else
   1.582 -      "\350\225\306\246",
   1.583 -      "\350\310",
   1.584 -    #endif
   1.585 -    seqsize(3,2) - seqsize(2,2)
   1.586 -  },
   1.587 -  {
   1.588 -    #ifdef SCPACK
   1.589 -      "lref.pri %1!move.alt!const.pri %2!",
   1.590 -      "lref.alt %1!const.pri %2!",
   1.591 -    #else
   1.592 -      "\350\225\306\344",
   1.593 -      "\350\243\344",
   1.594 -    #endif
   1.595 -    seqsize(3,2) - seqsize(2,2)
   1.596 -  },
   1.597 -  {
   1.598 -    #ifdef SCPACK
   1.599 -      "lref.s.pri %1!move.alt!load.pri %2!",
   1.600 -      "lref.s.alt %1!load.pri %2!",
   1.601 -    #else
   1.602 -      "\350\222\225\306\334",
   1.603 -      "\350\222\243\334",
   1.604 -    #endif
   1.605 -    seqsize(3,2) - seqsize(2,2)
   1.606 -  },
   1.607 -  {
   1.608 -    #ifdef SCPACK
   1.609 -      "lref.s.pri %1!move.alt!load.s.pri %2!",
   1.610 -      "lref.s.alt %1!load.s.pri %2!",
   1.611 -    #else
   1.612 -      "\350\222\225\306\246",
   1.613 -      "\350\222\310",
   1.614 -    #endif
   1.615 -    seqsize(3,2) - seqsize(2,2)
   1.616 -  },
   1.617 -  {
   1.618 -    #ifdef SCPACK
   1.619 -      "lref.s.pri %1!move.alt!const.pri %2!",
   1.620 -      "lref.s.alt %1!const.pri %2!",
   1.621 -    #else
   1.622 -      "\350\222\225\306\344",
   1.623 -      "\350\222\243\344",
   1.624 -    #endif
   1.625 -    seqsize(3,2) - seqsize(2,2)
   1.626 -  },
   1.627 -  /* Array indexing can merit from special instructions.
   1.628 -   * Simple indexed array lookup can be optimized quite
   1.629 -   * a bit.
   1.630 -   *    addr.pri n1             addr.alt n1
   1.631 -   *    push.pri                load.s.pri n2
   1.632 -   *    load.s.pri n2           bounds n3
   1.633 -   *    bounds n3               lidx.b n4
   1.634 -   *    shl.c.pri n4            -
   1.635 -   *    pop.alt                 -
   1.636 -   *    add                     -
   1.637 -   *    load.i                  -
   1.638 -   *
   1.639 -   * And to prepare for storing a value in an array
   1.640 -   *    addr.pri n1             addr.alt n1
   1.641 -   *    push.pri                load.s.pri n2
   1.642 -   *    load.s.pri n2           bounds n3
   1.643 -   *    bounds n3               idxaddr.b n4
   1.644 -   *    shl.c.pri n4            -
   1.645 -   *    pop.alt                 -
   1.646 -   *    add                     -
   1.647 -   *
   1.648 -   * Notes (additional cases):
   1.649 -   * 1. instruction addr.pri can also be const.pri (for
   1.650 -   *    global arrays)
   1.651 -   * 2. the bounds instruction can be absent
   1.652 -   * 3. when "n4" (the shift value) is the 2 (with 32-bit cells), use the
   1.653 -   *    even more optimal instructions LIDX and IDDXADDR
   1.654 -   *
   1.655 -   * If the array index is more complex, one can only optimize
   1.656 -   * the last four instructions:
   1.657 -   *    shl.c.pri n1            pop.alt
   1.658 -   *    pop.alt                 lidx.b n1
   1.659 -   *    add                     -
   1.660 -   *    loadi                   -
   1.661 -   *    --------------------------------------
   1.662 -   *    shl.c.pri n1            pop.alt
   1.663 -   *    pop.alt                 idxaddr.b n1
   1.664 -   *    add                     -
   1.665 -   */
   1.666 -#if !defined BIT16
   1.667 -  /* loading from array, "cell" shifted */
   1.668 -  {
   1.669 -    #ifdef SCPACK
   1.670 -      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
   1.671 -      "addr.alt %1!load.s.pri %2!bounds %3!lidx!",
   1.672 -    #else
   1.673 -      "\364\316\370\342\355",
   1.674 -      "\365\316\366!",
   1.675 -    #endif
   1.676 -    seqsize(8,4) - seqsize(4,3)
   1.677 -  },
   1.678 -  {
   1.679 -    #ifdef SCPACK
   1.680 -      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
   1.681 -      "const.alt %1!load.s.pri %2!bounds %3!lidx!",
   1.682 -    #else
   1.683 -      "\363\316\370\342\355",
   1.684 -      "\376\316\366!",
   1.685 -    #endif
   1.686 -    seqsize(8,4) - seqsize(4,3)
   1.687 -  },
   1.688 -  {
   1.689 -    #ifdef SCPACK
   1.690 -      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
   1.691 -      "addr.alt %1!load.s.pri %2!lidx!",
   1.692 -    #else
   1.693 -      "\364\370\342\355",
   1.694 -      "\365\366!",
   1.695 -    #endif
   1.696 -    seqsize(7,3) - seqsize(3,2)
   1.697 -  },
   1.698 -  {
   1.699 -    #ifdef SCPACK
   1.700 -      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
   1.701 -      "const.alt %1!load.s.pri %2!lidx!",
   1.702 -    #else
   1.703 -      "\363\370\342\355",
   1.704 -      "\376\366!",
   1.705 -    #endif
   1.706 -    seqsize(7,3) - seqsize(3,2)
   1.707 -  },
   1.708 -#endif
   1.709 -  /* loading from array, not "cell" shifted */
   1.710 -  {
   1.711 -    #ifdef SCPACK
   1.712 -      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
   1.713 -      "addr.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
   1.714 -    #else
   1.715 -      "\364\316\327\302\341\342\355",
   1.716 -      "\365\316\366\367\335",
   1.717 -    #endif
   1.718 -    seqsize(8,4) - seqsize(4,4)
   1.719 -  },
   1.720 -  {
   1.721 -    #ifdef SCPACK
   1.722 -      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
   1.723 -      "const.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
   1.724 -    #else
   1.725 -      "\363\316\327\302\341\342\355",
   1.726 -      "\376\316\366\367\335",
   1.727 -    #endif
   1.728 -    seqsize(8,4) - seqsize(4,4)
   1.729 -  },
   1.730 -  {
   1.731 -    #ifdef SCPACK
   1.732 -      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
   1.733 -      "addr.alt %1!load.s.pri %2!lidx.b %3!",
   1.734 -    #else
   1.735 -      "\364\327\256\241\271\342\355",
   1.736 -      "\365\366\367\256",
   1.737 -    #endif
   1.738 -    seqsize(7,3) - seqsize(3,3)
   1.739 -  },
   1.740 -  {
   1.741 -    #ifdef SCPACK
   1.742 -      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
   1.743 -      "const.alt %1!load.s.pri %2!lidx.b %3!",
   1.744 -    #else
   1.745 -      "\363\327\256\241\271\342\355",
   1.746 -      "\376\366\367\256",
   1.747 -    #endif
   1.748 -    seqsize(7,3) - seqsize(3,3)
   1.749 -  },
   1.750 -#if !defined BIT16
   1.751 -  /* array index calculation for storing a value, "cell" aligned */
   1.752 -  {
   1.753 -    #ifdef SCPACK
   1.754 -      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
   1.755 -      "addr.alt %1!load.s.pri %2!bounds %3!idxaddr!",
   1.756 -    #else
   1.757 -      "\364\316\370",
   1.758 -      "\365\316\322\235\237",
   1.759 -    #endif
   1.760 -    seqsize(7,4) - seqsize(4,3)
   1.761 -  },
   1.762 -  {
   1.763 -    #ifdef SCPACK
   1.764 -      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
   1.765 -      "const.alt %1!load.s.pri %2!bounds %3!idxaddr!",
   1.766 -    #else
   1.767 -      "\363\316\370",
   1.768 -      "\376\316\322\235\237",
   1.769 -    #endif
   1.770 -    seqsize(7,4) - seqsize(4,3)
   1.771 -  },
   1.772 -  {
   1.773 -    #ifdef SCPACK
   1.774 -      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
   1.775 -      "addr.alt %1!load.s.pri %2!idxaddr!",
   1.776 -    #else
   1.777 -      "\364\370",
   1.778 -      "\365\322\235\237",
   1.779 -    #endif
   1.780 -    seqsize(6,3) - seqsize(3,2)
   1.781 -  },
   1.782 -  {
   1.783 -    #ifdef SCPACK
   1.784 -      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
   1.785 -      "const.alt %1!load.s.pri %2!idxaddr!",
   1.786 -    #else
   1.787 -      "\363\370",
   1.788 -      "\376\322\235\237",
   1.789 -    #endif
   1.790 -    seqsize(6,3) - seqsize(3,2)
   1.791 -  },
   1.792 -#endif
   1.793 -  /* array index calculation for storing a value, not "cell" packed */
   1.794 -  {
   1.795 -    #ifdef SCPACK
   1.796 -      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
   1.797 -      "addr.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
   1.798 -    #else
   1.799 -      "\364\316\327\302\341",
   1.800 -      "\365\316\322\265\367\335",
   1.801 -    #endif
   1.802 -    seqsize(7,4) - seqsize(4,4)
   1.803 -  },
   1.804 -  {
   1.805 -    #ifdef SCPACK
   1.806 -      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
   1.807 -      "const.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
   1.808 -    #else
   1.809 -      "\363\316\327\302\341",
   1.810 -      "\376\316\322\265\367\335",
   1.811 -    #endif
   1.812 -    seqsize(7,4) - seqsize(4,4)
   1.813 -  },
   1.814 -  {
   1.815 -    #ifdef SCPACK
   1.816 -      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
   1.817 -      "addr.alt %1!load.s.pri %2!idxaddr.b %3!",
   1.818 -    #else
   1.819 -      "\364\327\256\241\271",
   1.820 -      "\365\322\265\367\256",
   1.821 -    #endif
   1.822 -    seqsize(6,3) - seqsize(3,3)
   1.823 -  },
   1.824 -  {
   1.825 -    #ifdef SCPACK
   1.826 -      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
   1.827 -      "const.alt %1!load.s.pri %2!idxaddr.b %3!",
   1.828 -    #else
   1.829 -      "\363\327\256\241\271",
   1.830 -      "\376\322\265\367\256",
   1.831 -    #endif
   1.832 -    seqsize(6,3) - seqsize(3,3)
   1.833 -  },
   1.834 -#if !defined BIT16
   1.835 -  /* the shorter array indexing sequences, see above for comments */
   1.836 -  {
   1.837 -    #ifdef SCPACK
   1.838 -      "shl.c.pri 2!pop.alt!add!loadi!",
   1.839 -      "pop.alt!lidx!",
   1.840 -    #else
   1.841 -      "\370\217\355",
   1.842 -      "\241\366!",
   1.843 -    #endif
   1.844 -    seqsize(4,1) - seqsize(2,0)
   1.845 -  },
   1.846 -  {
   1.847 -    #ifdef SCPACK
   1.848 -      "shl.c.pri 2!pop.alt!add!",
   1.849 -      "pop.alt!idxaddr!",
   1.850 -    #else
   1.851 -      "\370",
   1.852 -      "\241\322\235\237",
   1.853 -    #endif
   1.854 -    seqsize(3,1) - seqsize(2,0)
   1.855 -  },
   1.856 -#endif
   1.857 -  {
   1.858 -    #ifdef SCPACK
   1.859 -      "shl.c.pri %1!pop.alt!add!loadi!",
   1.860 -      "pop.alt!lidx.b %1!",
   1.861 -    #else
   1.862 -      "\314\225\241\271\217\355",
   1.863 -      "\241\366\367\202",
   1.864 -    #endif
   1.865 -    seqsize(4,1) - seqsize(2,1)
   1.866 -  },
   1.867 -  {
   1.868 -    #ifdef SCPACK
   1.869 -      "shl.c.pri %1!pop.alt!add!",
   1.870 -      "pop.alt!idxaddr.b %1!",
   1.871 -    #else
   1.872 -      "\314\225\241\271",
   1.873 -      "\241\322\265\367\202",
   1.874 -    #endif
   1.875 -    seqsize(3,1) - seqsize(2,1)
   1.876 -  },
   1.877 -  /* For packed arrays, there is another case (packed arrays
   1.878 -   * do not take advantage of the LIDX or IDXADDR instructions).
   1.879 -   *    addr.pri n1             addr.alt n1
   1.880 -   *    push.pri                load.s.pri n2
   1.881 -   *    load.s.pri n2           bounds n3
   1.882 -   *    bounds n3               -
   1.883 -   *    pop.alt                 -
   1.884 -   *
   1.885 -   * Notes (additional cases):
   1.886 -   * 1. instruction addr.pri can also be const.pri (for
   1.887 -   *    global arrays)
   1.888 -   * 2. the bounds instruction can be absent, but that
   1.889 -   *    case is already handled (see #1#)
   1.890 -   */
   1.891 -  {
   1.892 -    #ifdef SCPACK
   1.893 -      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
   1.894 -      "addr.alt %1!load.s.pri %2!bounds %3!",
   1.895 -    #else
   1.896 -      "\364\316\241",
   1.897 -      "\365\316",
   1.898 -    #endif
   1.899 -    seqsize(5,3) - seqsize(3,3)
   1.900 -  },
   1.901 -  {
   1.902 -    #ifdef SCPACK
   1.903 -      "const.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
   1.904 -      "const.alt %1!load.s.pri %2!bounds %3!",
   1.905 -    #else
   1.906 -      "\363\316\241",
   1.907 -      "\376\316",
   1.908 -    #endif
   1.909 -    seqsize(5,3) - seqsize(3,3)
   1.910 -  },
   1.911 -  /* Declaration of simple variables often follows the sequence:
   1.912 -   *    ;$lcl <name> <stk>      ;$lcl <name> <stk>
   1.913 -   *    stack -4                push.c <constval>
   1.914 -   *    const.pri <constval>    ;$exp
   1.915 -   *    stor.s.pri <stk>        -
   1.916 -   *    ;$exp                   -
   1.917 -   */
   1.918 -  {
   1.919 -    #ifdef SCPACK
   1.920 -      ";$lcl %1 %2!stack -4!const.pri %3!stor.s.pri %2!;$exp!",
   1.921 -      ";$lcl %1 %2!push.c %3!;$exp!",
   1.922 -    #else
   1.923 -      "\224lcl\332\227ack -4!\233\206\256\227or\222\230\252",
   1.924 -      "\224lcl\332\331\256\252",
   1.925 -    #endif
   1.926 -    seqsize(3,3) - seqsize(1,1)
   1.927 -  },
   1.928 -  {
   1.929 -    #ifdef SCPACK
   1.930 -      ";$lcl %1 %2!stack -4!zero.pri!stor.s.pri %2!;$exp!",
   1.931 -      ";$lcl %1 %2!push.c 0!;$exp!",
   1.932 -    #else
   1.933 -      "\224lcl\332\227ack -4!\373\227or\222\230\252",
   1.934 -      "\224lcl\332\331 0!\252",
   1.935 -    #endif
   1.936 -    seqsize(3,2) - seqsize(1,1)
   1.937 -  },
   1.938 -  /* During a calculation, the intermediate result must sometimes
   1.939 -   * be moved from PRI to ALT, like in:
   1.940 -   *    push.pri                move.alt
   1.941 -   *    load.s.pri n1           load.s.pri n1
   1.942 -   *    pop.alt                 -
   1.943 -   *
   1.944 -   * The above also accurs for "load.pri" and for "const.pri",
   1.945 -   * so add another two cases.
   1.946 -   */
   1.947 -  {
   1.948 -    #ifdef SCPACK
   1.949 -      "push.pri!load.s.pri %1!pop.alt!",
   1.950 -      "move.alt!load.s.pri %1!",
   1.951 -    #else
   1.952 -      "\244\333\241",
   1.953 -      "\306\333",
   1.954 -    #endif
   1.955 -    seqsize(3,1) - seqsize(2,1)
   1.956 -  },
   1.957 -  {
   1.958 -    #ifdef SCPACK
   1.959 -      "push.pri!load.pri %1!pop.alt!",
   1.960 -      "move.alt!load.pri %1!",
   1.961 -    #else
   1.962 -      "\244\311\241",
   1.963 -      "\306\311",
   1.964 -    #endif
   1.965 -    seqsize(3,1) - seqsize(2,1)
   1.966 -  },
   1.967 -  {
   1.968 -    #ifdef SCPACK
   1.969 -      "push.pri!const.pri %1!pop.alt!",
   1.970 -      "move.alt!const.pri %1!",
   1.971 -    #else
   1.972 -      "\244\330\241",
   1.973 -      "\306\330",
   1.974 -    #endif
   1.975 -    seqsize(3,1) - seqsize(2,1)
   1.976 -  },
   1.977 -  {
   1.978 -    #ifdef SCPACK
   1.979 -      "push.pri!zero.pri!pop.alt!",
   1.980 -      "move.alt!zero.pri!",
   1.981 -    #else
   1.982 -      "\244\373\241",
   1.983 -      "\306\373",
   1.984 -    #endif
   1.985 -    seqsize(3,0) - seqsize(2,0)
   1.986 -  },
   1.987 -  /* saving PRI and then loading from its address
   1.988 -   * occurs when indexing a multi-dimensional array
   1.989 -   */
   1.990 -  {
   1.991 -    #ifdef SCPACK
   1.992 -      "push.pri!load.i!pop.alt!",
   1.993 -      "move.alt!load.i!",
   1.994 -    #else
   1.995 -      "\244\342i\266",
   1.996 -      "\306\342\355",
   1.997 -    #endif
   1.998 -    seqsize(3,0) - seqsize(2,0)
   1.999 -  },
  1.1000 -  /* An even simpler PUSH/POP optimization (occurs in
  1.1001 -   * switch statements):
  1.1002 -   *    push.pri                move.alt
  1.1003 -   *    pop.alt                 -
  1.1004 -   */
  1.1005 -  {
  1.1006 -    #ifdef SCPACK
  1.1007 -      "push.pri!pop.alt!",
  1.1008 -      "move.alt!",
  1.1009 -    #else
  1.1010 -      "\244\241",
  1.1011 -      "\306",
  1.1012 -    #endif
  1.1013 -    seqsize(2,0) - seqsize(1,0)
  1.1014 -  },
  1.1015 -  /* Some simple arithmetic sequences
  1.1016 -   */
  1.1017 -  {
  1.1018 -    #ifdef SCPACK
  1.1019 -      "move.alt!load.s.pri %1!add!",
  1.1020 -      "load.s.alt %1!add!",
  1.1021 -    #else
  1.1022 -      "\306\333\271",
  1.1023 -      "\375\271",
  1.1024 -    #endif
  1.1025 -    seqsize(3,1) - seqsize(2,1)
  1.1026 -  },
  1.1027 -  {
  1.1028 -    #ifdef SCPACK
  1.1029 -      "move.alt!load.pri %1!add!",
  1.1030 -      "load.alt %1!add!",
  1.1031 -    #else
  1.1032 -      "\306\311\271",
  1.1033 -      "\374\271",
  1.1034 -    #endif
  1.1035 -    seqsize(3,1) - seqsize(2,1)
  1.1036 -  },
  1.1037 -  {
  1.1038 -    #ifdef SCPACK
  1.1039 -      "move.alt!const.pri %1!add!",
  1.1040 -      "const.alt %1!add!",
  1.1041 -    #else
  1.1042 -      "\306\330\271",
  1.1043 -      "\356\271",
  1.1044 -    #endif
  1.1045 -    seqsize(3,1) - seqsize(2,1)
  1.1046 -  },
  1.1047 -  {
  1.1048 -    #ifdef SCPACK
  1.1049 -      "move.alt!load.s.pri %1!sub.alt!",
  1.1050 -      "load.s.alt %1!sub!",
  1.1051 -    #else
  1.1052 -      "\306\333sub\223",
  1.1053 -      "\375sub!",
  1.1054 -    #endif
  1.1055 -    seqsize(3,1) - seqsize(2,1)
  1.1056 -  },
  1.1057 -  {
  1.1058 -    #ifdef SCPACK
  1.1059 -      "move.alt!load.pri %1!sub.alt!",
  1.1060 -      "load.alt %1!sub!",
  1.1061 -    #else
  1.1062 -      "\306\311sub\223",
  1.1063 -      "\374sub!",
  1.1064 -    #endif
  1.1065 -    seqsize(3,1) - seqsize(2,1)
  1.1066 -  },
  1.1067 -  {
  1.1068 -    #ifdef SCPACK
  1.1069 -      "move.alt!const.pri %1!sub.alt!",
  1.1070 -      "const.alt %1!sub!",
  1.1071 -    #else
  1.1072 -      "\306\330sub\223",
  1.1073 -      "\356sub!",
  1.1074 -    #endif
  1.1075 -    seqsize(3,1) - seqsize(2,1)
  1.1076 -  },
  1.1077 -  /* User-defined operators first load the operands into registers and
  1.1078 -   * then have them pushed onto the stack. This can give rise to sequences
  1.1079 -   * like:
  1.1080 -   *    const.pri n1            push.c n1
  1.1081 -   *    const.alt n2            push.c n2
  1.1082 -   *    push.pri                -
  1.1083 -   *    push.alt                -
  1.1084 -   * A similar sequence occurs with the two PUSH.pri/alt instructions inverted.
  1.1085 -   * The first, second, or both CONST.pri/alt instructions can also be
  1.1086 -   * LOAD.pri/alt.
  1.1087 -   * This gives 2 x 4 cases.
  1.1088 -   */
  1.1089 -  {
  1.1090 -    #ifdef SCPACK
  1.1091 -      "const.pri %1!const.alt %2!push.pri!push.alt!",
  1.1092 -      "push.c %1!push.c %2!",
  1.1093 -    #else
  1.1094 -      "\330\233\304\244\354",
  1.1095 -      "\331\202\331\221",
  1.1096 -    #endif
  1.1097 -    seqsize(4,2) - seqsize(2,2)
  1.1098 -  },
  1.1099 -  {
  1.1100 -    #ifdef SCPACK
  1.1101 -      "const.pri %1!const.alt %2!push.alt!push.pri!",
  1.1102 -      "push.c %2!push.c %1!",
  1.1103 -    #else
  1.1104 -      "\330\233\304\354\244",
  1.1105 -      "\331\221\331\202",
  1.1106 -    #endif
  1.1107 -    seqsize(4,2) - seqsize(2,2)
  1.1108 -  },
  1.1109 -  {
  1.1110 -    #ifdef SCPACK
  1.1111 -      "const.pri %1!load.alt %2!push.pri!push.alt!",
  1.1112 -      "push.c %1!push %2!",
  1.1113 -    #else
  1.1114 -      "\330\362\244\354",
  1.1115 -      "\331\202\216\221",
  1.1116 -    #endif
  1.1117 -    seqsize(4,2) - seqsize(2,2)
  1.1118 -  },
  1.1119 -  {
  1.1120 -    #ifdef SCPACK
  1.1121 -      "const.pri %1!load.alt %2!push.alt!push.pri!",
  1.1122 -      "push %2!push.c %1!",
  1.1123 -    #else
  1.1124 -      "\330\362\354\244",
  1.1125 -      "\216\221\331\202",
  1.1126 -    #endif
  1.1127 -    seqsize(4,2) - seqsize(2,2)
  1.1128 -  },
  1.1129 -  {
  1.1130 -    #ifdef SCPACK
  1.1131 -      "load.pri %1!const.alt %2!push.pri!push.alt!",
  1.1132 -      "push %1!push.c %2!",
  1.1133 -    #else
  1.1134 -      "\311\233\304\244\354",
  1.1135 -      "\216\202\331\221",
  1.1136 -    #endif
  1.1137 -    seqsize(4,2) - seqsize(2,2)
  1.1138 -  },
  1.1139 -  {
  1.1140 -    #ifdef SCPACK
  1.1141 -      "load.pri %1!const.alt %2!push.alt!push.pri!",
  1.1142 -      "push.c %2!push %1!",
  1.1143 -    #else
  1.1144 -      "\311\233\304\354\244",
  1.1145 -      "\331\221\216\202",
  1.1146 -    #endif
  1.1147 -    seqsize(4,2) - seqsize(2,2)
  1.1148 -  },
  1.1149 -  {
  1.1150 -    #ifdef SCPACK
  1.1151 -      "load.pri %1!load.alt %2!push.pri!push.alt!",
  1.1152 -      "push %1!push %2!",
  1.1153 -    #else
  1.1154 -      "\311\362\244\354",
  1.1155 -      "\216\202\216\221",
  1.1156 -    #endif
  1.1157 -    seqsize(4,2) - seqsize(2,2)
  1.1158 -  },
  1.1159 -  {
  1.1160 -    #ifdef SCPACK
  1.1161 -      "load.pri %1!load.alt %2!push.alt!push.pri!",
  1.1162 -      "push %2!push %1!",
  1.1163 -    #else
  1.1164 -      "\311\362\354\244",
  1.1165 -      "\216\221\216\202",
  1.1166 -    #endif
  1.1167 -    seqsize(4,2) - seqsize(2,2)
  1.1168 -  },
  1.1169 -  /* Function calls (parameters are passed on the stack)
  1.1170 -   *    load.s.pri n1           push.s n1
  1.1171 -   *    push.pri                -
  1.1172 -   *    --------------------------------------
  1.1173 -   *    load.pri n1             push n1
  1.1174 -   *    push.pri                -
  1.1175 -   *    --------------------------------------
  1.1176 -   *    const.pri n1            push.c n1
  1.1177 -   *    push.pri                -
  1.1178 -   *    --------------------------------------
  1.1179 -   *    zero.pri                push.c 0
  1.1180 -   *    push.pri                -
  1.1181 -   *    --------------------------------------
  1.1182 -   *    addr.pri n1             push.adr n1
  1.1183 -   *    push.pri                -
  1.1184 -   *
  1.1185 -   * However, PRI must not be needed after this instruction
  1.1186 -   * if this shortcut is used. Check for the ;$par comment.
  1.1187 -   */
  1.1188 -  {
  1.1189 -    #ifdef SCPACK
  1.1190 -      "load.s.pri %1!push.pri!;$par!",
  1.1191 -      "push.s %1!;$par!",
  1.1192 -    #else
  1.1193 -      "\226\264\255",
  1.1194 -      "\216\222\202\255",
  1.1195 -    #endif
  1.1196 -    seqsize(2,1) - seqsize(1,1)
  1.1197 -  },
  1.1198 -  {
  1.1199 -    #ifdef SCPACK
  1.1200 -      "load.pri %1!push.pri!;$par!",
  1.1201 -      "push %1!;$par!",
  1.1202 -    #else
  1.1203 -      "\217\264\255",
  1.1204 -      "\216\202\255",
  1.1205 -    #endif
  1.1206 -    seqsize(2,1) - seqsize(1,1)
  1.1207 -  },
  1.1208 -  {
  1.1209 -    #ifdef SCPACK
  1.1210 -      "const.pri %1!push.pri!;$par!",
  1.1211 -      "push.c %1!;$par!",
  1.1212 -    #else
  1.1213 -      "\233\264\255",
  1.1214 -      "\331\202\255",
  1.1215 -    #endif
  1.1216 -    seqsize(2,1) - seqsize(1,1)
  1.1217 -  },
  1.1218 -  {
  1.1219 -    #ifdef SCPACK
  1.1220 -      "zero.pri!push.pri!;$par!",
  1.1221 -      "push.c 0!;$par!",
  1.1222 -    #else
  1.1223 -      "\373\244\255",
  1.1224 -      "\331 0!\255",
  1.1225 -    #endif
  1.1226 -    seqsize(2,0) - seqsize(1,1)
  1.1227 -  },
  1.1228 -  {
  1.1229 -    #ifdef SCPACK
  1.1230 -      "addr.pri %1!push.pri!;$par!",
  1.1231 -      "push.adr %1!;$par!",
  1.1232 -    #else
  1.1233 -      "\265\264\255",
  1.1234 -      "\216\326\202\255",
  1.1235 -    #endif
  1.1236 -    seqsize(2,1) - seqsize(1,1)
  1.1237 -  },
  1.1238 -  /* References with a default value generate new cells on the heap
  1.1239 -   * dynamically. That code often ends with:
  1.1240 -   *    move.pri                push.alt
  1.1241 -   *    push.pri                -
  1.1242 -   */
  1.1243 -  {
  1.1244 -    #ifdef SCPACK
  1.1245 -      "move.pri!push.pri!",
  1.1246 -      "push.alt!",
  1.1247 -    #else
  1.1248 -      "\300\236\244",
  1.1249 -      "\354",
  1.1250 -    #endif
  1.1251 -    seqsize(2,0) - seqsize(1,0)
  1.1252 -  },
  1.1253 -  /* Simple arithmetic operations on constants. Noteworthy is the
  1.1254 -   * subtraction of a constant, since it is converted to the addition
  1.1255 -   * of the inverse value.
  1.1256 -   *    const.alt n1            add.c n1
  1.1257 -   *    add                     -
  1.1258 -   *    --------------------------------------
  1.1259 -   *    const.alt n1            add.c -n1
  1.1260 -   *    sub                     -
  1.1261 -   *    --------------------------------------
  1.1262 -   *    const.alt n1            smul.c n1
  1.1263 -   *    smul                    -
  1.1264 -   *    --------------------------------------
  1.1265 -   *    const.alt n1            eq.c.pri n1
  1.1266 -   *    eq                      -
  1.1267 -   */
  1.1268 -  {
  1.1269 -    #ifdef SCPACK
  1.1270 -      "const.alt %1!add!",
  1.1271 -      "add.c %1!",
  1.1272 -    #else
  1.1273 -      "\356\271",
  1.1274 -      "\235\242\202",
  1.1275 -    #endif
  1.1276 -    seqsize(2,1) - seqsize(1,1)
  1.1277 -  },
  1.1278 -  {
  1.1279 -    #ifdef SCPACK
  1.1280 -      "const.alt %1!sub!",
  1.1281 -      "add.c -%1!",
  1.1282 -    #else
  1.1283 -      "\356sub!",
  1.1284 -      "\235\242 -\201",
  1.1285 -    #endif
  1.1286 -    seqsize(2,1) - seqsize(1,1)
  1.1287 -  },
  1.1288 -  {
  1.1289 -    #ifdef SCPACK
  1.1290 -      "const.alt %1!smul!",
  1.1291 -      "smul.c %1!",
  1.1292 -    #else
  1.1293 -      "\356smul!",
  1.1294 -      "smu\307\202",
  1.1295 -    #endif
  1.1296 -    seqsize(2,1) - seqsize(1,1)
  1.1297 -  },
  1.1298 -  {
  1.1299 -    #ifdef SCPACK
  1.1300 -      "const.alt %1!eq!",
  1.1301 -      "eq.c.pri %1!",
  1.1302 -    #else
  1.1303 -      "\356\325",
  1.1304 -      "\262\242\225",
  1.1305 -    #endif
  1.1306 -    seqsize(2,1) - seqsize(1,1)
  1.1307 -  },
  1.1308 -  /* Some operations use the alternative subtraction operation --these
  1.1309 -   * can also be optimized.
  1.1310 -   *    const.pri n1            load.s.pri n2
  1.1311 -   *    load.s.alt n2           add.c -n1
  1.1312 -   *    sub.alt                 -
  1.1313 -   *    --------------------------------------
  1.1314 -   *    const.pri n1            load.pri n2
  1.1315 -   *    load.alt n2             add.c -n1
  1.1316 -   *    sub.alt                 -
  1.1317 -   */
  1.1318 -  {
  1.1319 -    #ifdef SCPACK
  1.1320 -      "const.pri %1!load.s.alt %2!sub.alt!",
  1.1321 -      "load.s.pri %2!add.c -%1!",
  1.1322 -    #else
  1.1323 -      "\330\226\304sub\223",
  1.1324 -      "\246\235\242 -\201",
  1.1325 -    #endif
  1.1326 -    seqsize(3,2) - seqsize(2,2)
  1.1327 -  },
  1.1328 -  {
  1.1329 -    #ifdef SCPACK
  1.1330 -      "const.pri %1!load.alt %2!sub.alt!",
  1.1331 -      "load.pri %2!add.c -%1!",
  1.1332 -    #else
  1.1333 -      "\330\362sub\223",
  1.1334 -      "\334\235\242 -\201",
  1.1335 -    #endif
  1.1336 -    seqsize(3,2) - seqsize(2,2)
  1.1337 -  },
  1.1338 -  /* With arrays indexed with constants that come from enumerations, it happens
  1.1339 -   * multiple add.c opcodes follow in sequence.
  1.1340 -   *    add.c n1                add.c n1+n2
  1.1341 -   *    add.c n2                -
  1.1342 -   */
  1.1343 -  {
  1.1344 -    #ifdef SCPACK
  1.1345 -      "add.c %1!add.c %2!",
  1.1346 -      "add.c %1+%2!",
  1.1347 -    #else
  1.1348 -      "\235\242\202\235\242\221",
  1.1349 -      "\235\242\267+%2!",
  1.1350 -    #endif
  1.1351 -    seqsize(2,2) - seqsize(1,1)
  1.1352 -  },
  1.1353 -  /* Compare and jump
  1.1354 -   *    eq                      jneq n1
  1.1355 -   *    jzer n1                 -
  1.1356 -   *    --------------------------------------
  1.1357 -   *    eq                      jeq n1
  1.1358 -   *    jnz n1                  -
  1.1359 -   *    --------------------------------------
  1.1360 -   *    neq                     jeq n1
  1.1361 -   *    jzer n1                 -
  1.1362 -   *    --------------------------------------
  1.1363 -   *    neq                     jneq n1
  1.1364 -   *    jnz n1                  -
  1.1365 -   * Compares followed by jzer occur much more
  1.1366 -   * often than compares followed with jnz. So we
  1.1367 -   * take the easy route here.
  1.1368 -   *    less                    jgeq n1
  1.1369 -   *    jzer n1                 -
  1.1370 -   *    --------------------------------------
  1.1371 -   *    leq                     jgrtr n1
  1.1372 -   *    jzer n1                 -
  1.1373 -   *    --------------------------------------
  1.1374 -   *    grtr                    jleq n1
  1.1375 -   *    jzer n1                 -
  1.1376 -   *    --------------------------------------
  1.1377 -   *    geq                     jless n1
  1.1378 -   *    jzer n1                 -
  1.1379 -   *    --------------------------------------
  1.1380 -   *    sless                   jsgeq n1
  1.1381 -   *    jzer n1                 -
  1.1382 -   *    --------------------------------------
  1.1383 -   *    sleq                    jsgrtr n1
  1.1384 -   *    jzer n1                 -
  1.1385 -   *    --------------------------------------
  1.1386 -   *    sgrtr                   jsleq n1
  1.1387 -   *    jzer n1                 -
  1.1388 -   *    --------------------------------------
  1.1389 -   *    sgeq                    jsless n1
  1.1390 -   *    jzer n1                 -
  1.1391 -   */
  1.1392 -  {
  1.1393 -    #ifdef SCPACK
  1.1394 -      "eq!jzer %1!",
  1.1395 -      "jneq %1!",
  1.1396 -    #else
  1.1397 -      "\325\323",
  1.1398 -      "jn\357",
  1.1399 -    #endif
  1.1400 -    seqsize(2,1) - seqsize(1,1)
  1.1401 -  },
  1.1402 -  {
  1.1403 -    #ifdef SCPACK
  1.1404 -      "eq!jnz %1!",
  1.1405 -      "jeq %1!",
  1.1406 -    #else
  1.1407 -      "\325jnz\202",
  1.1408 -      "j\357",
  1.1409 -    #endif
  1.1410 -    seqsize(2,1) - seqsize(1,1)
  1.1411 -  },
  1.1412 -  {
  1.1413 -    #ifdef SCPACK
  1.1414 -      "neq!jzer %1!",
  1.1415 -      "jeq %1!",
  1.1416 -    #else
  1.1417 -      "n\325\323",
  1.1418 -      "j\357",
  1.1419 -    #endif
  1.1420 -    seqsize(2,1) - seqsize(1,1)
  1.1421 -  },
  1.1422 -  {
  1.1423 -    #ifdef SCPACK
  1.1424 -      "neq!jnz %1!",
  1.1425 -      "jneq %1!",
  1.1426 -    #else
  1.1427 -      "n\325jnz\202",
  1.1428 -      "jn\357",
  1.1429 -    #endif
  1.1430 -    seqsize(2,1) - seqsize(1,1)
  1.1431 -  },
  1.1432 -  {
  1.1433 -    #ifdef SCPACK
  1.1434 -      "less!jzer %1!",
  1.1435 -      "jgeq %1!",
  1.1436 -    #else
  1.1437 -      "l\352!\323",
  1.1438 -      "jg\357",
  1.1439 -    #endif
  1.1440 -    seqsize(2,1) - seqsize(1,1)
  1.1441 -  },
  1.1442 -  {
  1.1443 -    #ifdef SCPACK
  1.1444 -      "leq!jzer %1!",
  1.1445 -      "jgrtr %1!",
  1.1446 -    #else
  1.1447 -      "l\325\323",
  1.1448 -      "jg\353r\202",
  1.1449 -    #endif
  1.1450 -    seqsize(2,1) - seqsize(1,1)
  1.1451 -  },
  1.1452 -  {
  1.1453 -    #ifdef SCPACK
  1.1454 -      "grtr!jzer %1!",
  1.1455 -      "jleq %1!",
  1.1456 -    #else
  1.1457 -      "g\353\237\323",
  1.1458 -      "jl\357",
  1.1459 -    #endif
  1.1460 -    seqsize(2,1) - seqsize(1,1)
  1.1461 -  },
  1.1462 -  {
  1.1463 -    #ifdef SCPACK
  1.1464 -      "geq!jzer %1!",
  1.1465 -      "jless %1!",
  1.1466 -    #else
  1.1467 -      "g\325\323",
  1.1468 -      "jl\352\202",
  1.1469 -    #endif
  1.1470 -    seqsize(2,1) - seqsize(1,1)
  1.1471 -  },
  1.1472 -  {
  1.1473 -    #ifdef SCPACK
  1.1474 -      "sless!jzer %1!",
  1.1475 -      "jsgeq %1!",
  1.1476 -    #else
  1.1477 -      "\372!\323",
  1.1478 -      "j\320\357",
  1.1479 -    #endif
  1.1480 -    seqsize(2,1) - seqsize(1,1)
  1.1481 -  },
  1.1482 -  {
  1.1483 -    #ifdef SCPACK
  1.1484 -      "sleq!jzer %1!",
  1.1485 -      "jsgrtr %1!",
  1.1486 -    #else
  1.1487 -      "\321\325\323",
  1.1488 -      "j\371r\202",
  1.1489 -    #endif
  1.1490 -    seqsize(2,1) - seqsize(1,1)
  1.1491 -  },
  1.1492 -  {
  1.1493 -    #ifdef SCPACK
  1.1494 -      "sgrtr!jzer %1!",
  1.1495 -      "jsleq %1!",
  1.1496 -    #else
  1.1497 -      "\371\237\323",
  1.1498 -      "j\321\357",
  1.1499 -    #endif
  1.1500 -    seqsize(2,1) - seqsize(1,1)
  1.1501 -  },
  1.1502 -  {
  1.1503 -    #ifdef SCPACK
  1.1504 -      "sgeq!jzer %1!",
  1.1505 -      "jsless %1!",
  1.1506 -    #else
  1.1507 -      "\320\325\323",
  1.1508 -      "j\372\202",
  1.1509 -    #endif
  1.1510 -    seqsize(2,1) - seqsize(1,1)
  1.1511 -  },
  1.1512 -  /* Test for zero (common case, especially for strings)
  1.1513 -   * E.g. the test expression of: "for (i=0; str{i}!=0; ++i)"
  1.1514 -   *
  1.1515 -   *    zero.alt                jzer n1
  1.1516 -   *    jeq n1                  -
  1.1517 -   *    --------------------------------------
  1.1518 -   *    zero.alt                jnz n1
  1.1519 -   *    jneq n1                 -
  1.1520 -   */
  1.1521 -  {
  1.1522 -    #ifdef SCPACK
  1.1523 -      "zero.alt!jeq %1!",
  1.1524 -      "jzer %1!",
  1.1525 -    #else
  1.1526 -      "\340\223j\357",
  1.1527 -      "\323",
  1.1528 -    #endif
  1.1529 -    seqsize(2,1) - seqsize(1,1)
  1.1530 -  },
  1.1531 -  {
  1.1532 -    #ifdef SCPACK
  1.1533 -      "zero.alt!jneq %1!",
  1.1534 -      "jnz %1!",
  1.1535 -    #else
  1.1536 -      "\340\223jn\357",
  1.1537 -      "jnz\202",
  1.1538 -    #endif
  1.1539 -    seqsize(2,1) - seqsize(1,1)
  1.1540 -  },
  1.1541 -  /* Incrementing and decrementing leaves a value in
  1.1542 -   * in PRI which may not be used (for example, as the
  1.1543 -   * third expression in a "for" loop).
  1.1544 -   *    inc n1                  inc n1  ; ++n
  1.1545 -   *    load.pri n1             ;$exp
  1.1546 -   *    ;$exp                   -
  1.1547 -   *    --------------------------------------
  1.1548 -   *    load.pri n1             inc n1  ; n++, e.g. "for (n=0; n<10; n++)"
  1.1549 -   *    inc n1                  ;$exp
  1.1550 -   *    ;$exp                   -
  1.1551 -   * Plus the varieties for stack relative increments
  1.1552 -   * and decrements.
  1.1553 -   */
  1.1554 -  {
  1.1555 -    #ifdef SCPACK
  1.1556 -      "inc %1!load.pri %1!;$exp!",
  1.1557 -      "inc %1!;$exp!",
  1.1558 -    #else
  1.1559 -      "inc\202\311\252",
  1.1560 -      "inc\301",
  1.1561 -    #endif
  1.1562 -    seqsize(2,2) - seqsize(1,1)
  1.1563 -  },
  1.1564 -  {
  1.1565 -    #ifdef SCPACK
  1.1566 -      "load.pri %1!inc %1!;$exp!",
  1.1567 -      "inc %1!;$exp!",
  1.1568 -    #else
  1.1569 -      "\311inc\301",
  1.1570 -      "inc\301",
  1.1571 -    #endif
  1.1572 -    seqsize(2,2) - seqsize(1,1)
  1.1573 -  },
  1.1574 -  {
  1.1575 -    #ifdef SCPACK
  1.1576 -      "inc.s %1!load.s.pri %1!;$exp!",
  1.1577 -      "inc.s %1!;$exp!",
  1.1578 -    #else
  1.1579 -      "inc\222\202\333\252",
  1.1580 -      "inc\222\301",
  1.1581 -    #endif
  1.1582 -    seqsize(2,2) - seqsize(1,1)
  1.1583 -  },
  1.1584 -  {
  1.1585 -    #ifdef SCPACK
  1.1586 -      "load.s.pri %1!inc.s %1!;$exp!",
  1.1587 -      "inc.s %1!;$exp!",
  1.1588 -    #else
  1.1589 -      "\333inc\222\301",
  1.1590 -      "inc\222\301",
  1.1591 -    #endif
  1.1592 -    seqsize(2,2) - seqsize(1,1)
  1.1593 -  },
  1.1594 -  {
  1.1595 -    #ifdef SCPACK
  1.1596 -      "dec %1!load.pri %1!;$exp!",
  1.1597 -      "dec %1!;$exp!",
  1.1598 -    #else
  1.1599 -      "dec\202\311\252",
  1.1600 -      "dec\301",
  1.1601 -    #endif
  1.1602 -    seqsize(2,2) - seqsize(1,1)
  1.1603 -  },
  1.1604 -  {
  1.1605 -    #ifdef SCPACK
  1.1606 -      "load.pri %1!dec %1!;$exp!",
  1.1607 -      "dec %1!;$exp!",
  1.1608 -    #else
  1.1609 -      "\311dec\301",
  1.1610 -      "dec\301",
  1.1611 -    #endif
  1.1612 -    seqsize(2,2) - seqsize(1,1)
  1.1613 -  },
  1.1614 -  {
  1.1615 -    #ifdef SCPACK
  1.1616 -      "dec.s %1!load.s.pri %1!;$exp!",
  1.1617 -      "dec.s %1!;$exp!",
  1.1618 -    #else
  1.1619 -      "dec\222\202\333\252",
  1.1620 -      "dec\222\301",
  1.1621 -    #endif
  1.1622 -    seqsize(2,2) - seqsize(1,1)
  1.1623 -  },
  1.1624 -  {
  1.1625 -    #ifdef SCPACK
  1.1626 -      "load.s.pri %1!dec.s %1!;$exp!",
  1.1627 -      "dec.s %1!;$exp!",
  1.1628 -    #else
  1.1629 -      "\333dec\222\301",
  1.1630 -      "dec\222\301",
  1.1631 -    #endif
  1.1632 -    seqsize(2,2) - seqsize(1,1)
  1.1633 -  },
  1.1634 -  /* ??? the same (increments and decrements) for references */
  1.1635 -  /* Loading the constant zero has a special opcode.
  1.1636 -   * When storing zero in memory, the value of PRI must not be later on.
  1.1637 -   *    const.pri 0             zero n1
  1.1638 -   *    stor.pri n1             ;$exp
  1.1639 -   *    ;$exp                   -
  1.1640 -   *    --------------------------------------
  1.1641 -   *    const.pri 0             zero.s n1
  1.1642 -   *    stor.s.pri n1           ;$exp
  1.1643 -   *    ;$exp                   -
  1.1644 -   *    --------------------------------------
  1.1645 -   *    zero.pri                zero n1
  1.1646 -   *    stor.pri n1             ;$exp
  1.1647 -   *    ;$exp                   -
  1.1648 -   *    --------------------------------------
  1.1649 -   *    zero.pri                zero.s n1
  1.1650 -   *    stor.s.pri n1           ;$exp
  1.1651 -   *    ;$exp                   -
  1.1652 -   *    --------------------------------------
  1.1653 -   *    const.pri 0             zero.pri
  1.1654 -   *    --------------------------------------
  1.1655 -   *    const.alt 0             zero.alt
  1.1656 -   * The last two alternatives save more memory than they save
  1.1657 -   * time, but anyway...
  1.1658 -   */
  1.1659 -  {
  1.1660 -    #ifdef SCPACK
  1.1661 -      "const.pri 0!stor.pri %1!;$exp!",
  1.1662 -      "zero %1!;$exp!",
  1.1663 -    #else
  1.1664 -      "\233\206 0!\227or\225\252",
  1.1665 -      "\340\301",
  1.1666 -    #endif
  1.1667 -    seqsize(2,2) - seqsize(1,1)
  1.1668 -  },
  1.1669 -  {
  1.1670 -    #ifdef SCPACK
  1.1671 -      "const.pri 0!stor.s.pri %1!;$exp!",
  1.1672 -      "zero.s %1!;$exp!",
  1.1673 -    #else
  1.1674 -      "\233\206 0!\227or\222\225\252",
  1.1675 -      "\340\222\301",
  1.1676 -    #endif
  1.1677 -    seqsize(2,2) - seqsize(1,1)
  1.1678 -  },
  1.1679 -  {
  1.1680 -    #ifdef SCPACK
  1.1681 -      "zero.pri!stor.pri %1!;$exp!",
  1.1682 -      "zero %1!;$exp!",
  1.1683 -    #else
  1.1684 -      "\373\227or\225\252",
  1.1685 -      "\340\301",
  1.1686 -    #endif
  1.1687 -    seqsize(2,1) - seqsize(1,1)
  1.1688 -  },
  1.1689 -  {
  1.1690 -    #ifdef SCPACK
  1.1691 -      "zero.pri!stor.s.pri %1!;$exp!",
  1.1692 -      "zero.s %1!;$exp!",
  1.1693 -    #else
  1.1694 -      "\373\227or\222\225\252",
  1.1695 -      "\340\222\301",
  1.1696 -    #endif
  1.1697 -    seqsize(2,1) - seqsize(1,1)
  1.1698 -  },
  1.1699 -  {
  1.1700 -    #ifdef SCPACK
  1.1701 -      "const.pri 0!",
  1.1702 -      "zero.pri!",
  1.1703 -    #else
  1.1704 -      "\233\206 0!",
  1.1705 -      "\373",
  1.1706 -    #endif
  1.1707 -    seqsize(1,1) - seqsize(1,0)
  1.1708 -  },
  1.1709 -  {
  1.1710 -    #ifdef SCPACK
  1.1711 -      "const.alt 0!",
  1.1712 -      "zero.alt!",
  1.1713 -    #else
  1.1714 -      "\233\212 0!",
  1.1715 -      "\340\223",
  1.1716 -    #endif
  1.1717 -    seqsize(1,1) - seqsize(1,0)
  1.1718 -  },
  1.1719 -
  1.1720 -  /* ------------------ */
  1.1721 -  /* Macro instructions */
  1.1722 -  /* ------------------ */
  1.1723 -
  1.1724 -  { "", "", 0 },    /* separator, so optimizer can stop before generating macro opcodes */
  1.1725 -
  1.1726 -  /* optimizing the calling of native functions (which always have a parameter
  1.1727 -   * count pushed before, and the stack pointer restored afterwards
  1.1728 -   */
  1.1729 -  {
  1.1730 -    #ifdef SCPACK
  1.1731 -      "push.c %1!sysreq.c %2!stack %3!",        //note: %3 == %1 + 4
  1.1732 -      "sysreq.n %2 %1!",
  1.1733 -    #else
  1.1734 -      "\331\202sysr\262\242\221\227ack\256",
  1.1735 -      "sysr\262.n\220\202",
  1.1736 -    #endif
  1.1737 -    seqsize(3,3) - seqsize(1,2)
  1.1738 -  },
  1.1739 -  /* ----- */
  1.1740 -  /* Functions with many parameters with the same "type" have sequences like:
  1.1741 -   *    push.c n1               push3.c n1 n2 n3
  1.1742 -   *    ;$par                   ;$par
  1.1743 -   *    push.c n2               -
  1.1744 -   *    ;$par                   -
  1.1745 -   *    push.c n3               -
  1.1746 -   *    ;$par                   -
  1.1747 -   *    etc.                    etc.
  1.1748 -   *
  1.1749 -   * Similar sequences occur with PUSH, PUSH.s and PUSHADDR
  1.1750 -   */
  1.1751 -  {
  1.1752 -    #ifdef SCPACK
  1.1753 -      "push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!;$par!push.c %5!",
  1.1754 -      "push5.c %1 %2 %3 %4 %5!",
  1.1755 -    #else
  1.1756 -      "\331\336\242\345\242\256\257\242\335\257\242\2035!",
  1.1757 -      "\2165\242\343\245\302\2035!",
  1.1758 -    #endif
  1.1759 -    seqsize(5,5) - seqsize(1,5)
  1.1760 -  },
  1.1761 -  {
  1.1762 -    #ifdef SCPACK
  1.1763 -      "push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!",
  1.1764 -      "push4.c %1 %2 %3 %4!",
  1.1765 -    #else
  1.1766 -      "\331\336\242\345\242\256\257\242\335",
  1.1767 -      "\2164\242\343\245\335",
  1.1768 -    #endif
  1.1769 -    seqsize(4,4) - seqsize(1,4)
  1.1770 -  },
  1.1771 -  {
  1.1772 -    #ifdef SCPACK
  1.1773 -      "push.c %1!;$par!push.c %2!;$par!push.c %3!",
  1.1774 -      "push3.c %1 %2 %3!",
  1.1775 -    #else
  1.1776 -      "\331\336\242\345\242\256",
  1.1777 -      "\2163\242\343\256",
  1.1778 -    #endif
  1.1779 -    seqsize(3,3) - seqsize(1,3)
  1.1780 -  },
  1.1781 -  {
  1.1782 -    #ifdef SCPACK
  1.1783 -      "push.c %1!;$par!push.c %2!",
  1.1784 -      "push2.c %1 %2!",
  1.1785 -    #else
  1.1786 -      "\331\336\242\221",
  1.1787 -      "\2162\242\332",
  1.1788 -    #endif
  1.1789 -    seqsize(2,2) - seqsize(1,2)
  1.1790 -  },
  1.1791 -  /* ----- */
  1.1792 -  {
  1.1793 -    #ifdef SCPACK
  1.1794 -      "push %1!;$par!push %2!;$par!push %3!;$par!push %4!;$par!push %5!",
  1.1795 -      "push5 %1 %2 %3 %4 %5!",
  1.1796 -    #else
  1.1797 -      "\216\336\345\256\257\335\257\2035!",
  1.1798 -      "\2165\343\245\302\2035!",
  1.1799 -    #endif
  1.1800 -    seqsize(5,5) - seqsize(1,5)
  1.1801 -  },
  1.1802 -  {
  1.1803 -    #ifdef SCPACK
  1.1804 -      "push %1!;$par!push %2!;$par!push %3!;$par!push %4!",
  1.1805 -      "push4 %1 %2 %3 %4!",
  1.1806 -    #else
  1.1807 -      "\216\336\345\256\257\335",
  1.1808 -      "\2164\343\245\335",
  1.1809 -    #endif
  1.1810 -    seqsize(4,4) - seqsize(1,4)
  1.1811 -  },
  1.1812 -  {
  1.1813 -    #ifdef SCPACK
  1.1814 -      "push %1!;$par!push %2!;$par!push %3!",
  1.1815 -      "push3 %1 %2 %3!",
  1.1816 -    #else
  1.1817 -      "\216\336\345\256",
  1.1818 -      "\2163\343\256",
  1.1819 -    #endif
  1.1820 -    seqsize(3,3) - seqsize(1,3)
  1.1821 -  },
  1.1822 -  {
  1.1823 -    #ifdef SCPACK
  1.1824 -      "push %1!;$par!push %2!",
  1.1825 -      "push2 %1 %2!",
  1.1826 -    #else
  1.1827 -      "\216\336\221",
  1.1828 -      "\2162\332",
  1.1829 -    #endif
  1.1830 -    seqsize(2,2) - seqsize(1,2)
  1.1831 -  },
  1.1832 -  /* ----- */
  1.1833 -  {
  1.1834 -    #ifdef SCPACK
  1.1835 -      "push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!;$par!push.s %5!",
  1.1836 -      "push5.s %1 %2 %3 %4 %5!",
  1.1837 -    #else
  1.1838 -      "\216\222\336\222\345\222\256\257\222\335\257\222\2035!",
  1.1839 -      "\2165\222\343\245\302\2035!",
  1.1840 -    #endif
  1.1841 -    seqsize(5,5) - seqsize(1,5)
  1.1842 -  },
  1.1843 -  {
  1.1844 -    #ifdef SCPACK
  1.1845 -      "push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!",
  1.1846 -      "push4.s %1 %2 %3 %4!",
  1.1847 -    #else
  1.1848 -      "\216\222\336\222\345\222\256\257\222\335",
  1.1849 -      "\2164\222\343\245\335",
  1.1850 -    #endif
  1.1851 -    seqsize(4,4) - seqsize(1,4)
  1.1852 -  },
  1.1853 -  {
  1.1854 -    #ifdef SCPACK
  1.1855 -      "push.s %1!;$par!push.s %2!;$par!push.s %3!",
  1.1856 -      "push3.s %1 %2 %3!",
  1.1857 -    #else
  1.1858 -      "\216\222\336\222\345\222\256",
  1.1859 -      "\2163\222\343\256",
  1.1860 -    #endif
  1.1861 -    seqsize(3,3) - seqsize(1,3)
  1.1862 -  },
  1.1863 -  {
  1.1864 -    #ifdef SCPACK
  1.1865 -      "push.s %1!;$par!push.s %2!",
  1.1866 -      "push2.s %1 %2!",
  1.1867 -    #else
  1.1868 -      "\216\222\336\222\221",
  1.1869 -      "\2162\222\332",
  1.1870 -    #endif
  1.1871 -    seqsize(2,2) - seqsize(1,2)
  1.1872 -  },
  1.1873 -  /* ----- */
  1.1874 -  {
  1.1875 -    #ifdef SCPACK
  1.1876 -      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!;$par!push.adr %5!",
  1.1877 -      "push5.adr %1 %2 %3 %4 %5!",
  1.1878 -    #else
  1.1879 -      "\216\326\336\326\345\326\256\257\326\335\257\326\2035!",
  1.1880 -      "\2165\326\343\245\302\2035!",
  1.1881 -    #endif
  1.1882 -    seqsize(5,5) - seqsize(1,5)
  1.1883 -  },
  1.1884 -  {
  1.1885 -    #ifdef SCPACK
  1.1886 -      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!",
  1.1887 -      "push4.adr %1 %2 %3 %4!",
  1.1888 -    #else
  1.1889 -      "\216\326\336\326\345\326\256\257\326\335",
  1.1890 -      "\2164\326\343\245\335",
  1.1891 -    #endif
  1.1892 -    seqsize(4,4) - seqsize(1,4)
  1.1893 -  },
  1.1894 -  {
  1.1895 -    #ifdef SCPACK
  1.1896 -      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!",
  1.1897 -      "push3.adr %1 %2 %3!",
  1.1898 -    #else
  1.1899 -      "\216\326\336\326\345\326\256",
  1.1900 -      "\2163\326\343\256",
  1.1901 -    #endif
  1.1902 -    seqsize(3,3) - seqsize(1,3)
  1.1903 -  },
  1.1904 -  {
  1.1905 -    #ifdef SCPACK
  1.1906 -      "push.adr %1!;$par!push.adr %2!",
  1.1907 -      "push2.adr %1 %2!",
  1.1908 -    #else
  1.1909 -      "\216\326\336\326\221",
  1.1910 -      "\2162\326\332",
  1.1911 -    #endif
  1.1912 -    seqsize(2,2) - seqsize(1,2)
  1.1913 -  },
  1.1914 -  /* Loading two registers at a time
  1.1915 -   *    load.pri n1             load.both n1 n2
  1.1916 -   *    load.alt n2             -
  1.1917 -   *    --------------------------------------
  1.1918 -   *    load.alt n2             load.both n1 n2
  1.1919 -   *    load.pri n1             -
  1.1920 -   *    --------------------------------------
  1.1921 -   *    load.s.pri n1           load.s.both n1 n2
  1.1922 -   *    load.s.alt n2           -
  1.1923 -   *    --------------------------------------
  1.1924 -   *    load.s.alt n2           load.s.both n1 n2
  1.1925 -   *    load.s.pri n1           -
  1.1926 -   */
  1.1927 -  {
  1.1928 -    #ifdef SCPACK
  1.1929 -      "load.pri %1!load.alt %2!",
  1.1930 -      "load.both %1 %2!",
  1.1931 -    #else
  1.1932 -      "\311\362",
  1.1933 -      "\342\275th\332",
  1.1934 -    #endif
  1.1935 -    seqsize(2,2) - seqsize(1,2)
  1.1936 -  },
  1.1937 -  {
  1.1938 -    #ifdef SCPACK
  1.1939 -      "load.alt %2!load.pri %1!",
  1.1940 -      "load.both %1 %2!",
  1.1941 -    #else
  1.1942 -      "\362\311",
  1.1943 -      "\342\275th\332",
  1.1944 -    #endif
  1.1945 -    seqsize(2,2) - seqsize(1,2)
  1.1946 -  },
  1.1947 -  {
  1.1948 -    #ifdef SCPACK
  1.1949 -      "load.s.pri %1!load.s.alt %2!",
  1.1950 -      "load.s.both %1 %2!",
  1.1951 -    #else
  1.1952 -      "\333\226\304",
  1.1953 -      "\226.\275th\332",
  1.1954 -    #endif
  1.1955 -    seqsize(2,2) - seqsize(1,2)
  1.1956 -  },
  1.1957 -  {
  1.1958 -    #ifdef SCPACK
  1.1959 -      "load.s.alt %2!load.s.pri %1!",
  1.1960 -      "load.s.both %1 %2!",
  1.1961 -    #else
  1.1962 -      "\226\304\333",
  1.1963 -      "\226.\275th\332",
  1.1964 -    #endif
  1.1965 -    seqsize(2,2) - seqsize(1,2)
  1.1966 -  },
  1.1967 -  /* Loading two registers and then pushing them occurs with user operators
  1.1968 -   *    load.both n1 n2         push2 n1 n2
  1.1969 -   *    push.pri                -
  1.1970 -   *    push.alt                -
  1.1971 -   *    --------------------------------------
  1.1972 -   *    load.s.both n1 n2       push2.s n1 n2
  1.1973 -   *    push.pri                -
  1.1974 -   *    push.alt                -
  1.1975 -   */
  1.1976 -  {
  1.1977 -    #ifdef SCPACK
  1.1978 -      "load.both %1 %2!push.pri!push.alt!",
  1.1979 -      "push2 %1 %2!",
  1.1980 -    #else
  1.1981 -      "\342\275th\332\244\354",
  1.1982 -      "\2162\332",
  1.1983 -    #endif
  1.1984 -    seqsize(3,2) - seqsize(1,2)
  1.1985 -  },
  1.1986 -  {
  1.1987 -    #ifdef SCPACK
  1.1988 -      "load.s.both %1 %2!push.pri!push.alt!",
  1.1989 -      "push2.s %1 %2!",
  1.1990 -    #else
  1.1991 -      "\226.\275th\332\244\354",
  1.1992 -      "\2162\222\332",
  1.1993 -    #endif
  1.1994 -    seqsize(3,2) - seqsize(1,2)
  1.1995 -  },
  1.1996 -  /* Load a constant in a variable
  1.1997 -   *    const.pri n1            const n2 n1
  1.1998 -   *    stor.pri n2             -
  1.1999 -   *    --------------------------------------
  1.2000 -   *    const.pri n1            const.s n2 n1
  1.2001 -   *    stor.s.pri n2           -
  1.2002 -   */
  1.2003 -  {
  1.2004 -    #ifdef SCPACK
  1.2005 -      "const.pri %1!stor.pri %2!",
  1.2006 -      "const %2 %1!",
  1.2007 -    #else
  1.2008 -      "\330\227or\230",
  1.2009 -      "\233\220\202",
  1.2010 -    #endif
  1.2011 -    seqsize(2,2) - seqsize(1,2)
  1.2012 -  },
  1.2013 -  {
  1.2014 -    #ifdef SCPACK
  1.2015 -      "const.pri %1!stor.s.pri %2!",
  1.2016 -      "const.s %2 %1!",
  1.2017 -    #else
  1.2018 -      "\330\227or\222\230",
  1.2019 -      "\233\222\220\202",
  1.2020 -    #endif
  1.2021 -    seqsize(2,2) - seqsize(1,2)
  1.2022 -  },
  1.2023 -  /* ----- */
  1.2024 -  { NULL, NULL, 0 }
  1.2025 -};