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 -};