sourcepawn/compiler/sc7.scp
author David Anderson <danderson@mozilla.com>
Thu Aug 08 09:40:23 2013 -0700 (2013-08-08)
changeset 3976 bc77cfde7c5c
parent 1952 b7aa2b626807
permissions -rw-r--r--
Add -Wno-narrowing to support building on GCC-4.7 (no bug, r=me).
ds@1952
     1
/*  Pawn compiler - Peephole optimizer "sequences" strings (plain
ds@1952
     2
 *                   and compressed formats)
ds@1952
     3
 *
ds@1952
     4
 *  Copyright (c) ITB CompuPhase, 2000-2006
ds@1952
     5
 *
ds@1952
     6
 *  This software is provided "as-is", without any express or implied warranty.
ds@1952
     7
 *  In no event will the authors be held liable for any damages arising from
ds@1952
     8
 *  the use of this software.
ds@1952
     9
 *
ds@1952
    10
 *  Permission is granted to anyone to use this software for any purpose,
ds@1952
    11
 *  including commercial applications, and to alter it and redistribute it
ds@1952
    12
 *  freely, subject to the following restrictions:
ds@1952
    13
 *
ds@1952
    14
 *  1.  The origin of this software must not be misrepresented; you must not
ds@1952
    15
 *      claim that you wrote the original software. If you use this software in
ds@1952
    16
 *      a product, an acknowledgment in the product documentation would be
ds@1952
    17
 *      appreciated but is not required.
ds@1952
    18
 *  2.  Altered source versions must be plainly marked as such, and must not be
ds@1952
    19
 *      misrepresented as being the original software.
ds@1952
    20
 *  3.  This notice may not be removed or altered from any source distribution.
ds@1952
    21
 *
ds@1952
    22
 *  Version: $Id$
ds@1952
    23
 */
ds@1952
    24
ds@1952
    25
SC_FUNC int strexpand(char *dest, unsigned char *source, int maxlen, unsigned char pairtable[128][2]);
ds@1952
    26
ds@1952
    27
#define SCPACK_TERMINATOR ,     /* end each section with a comma */
ds@1952
    28
ds@1952
    29
#define SCPACK_TABLE sequences_table
ds@1952
    30
/*-*SCPACK start of pair table, do not change or remove this line */
ds@1952
    31
unsigned char sequences_table[][2] = {
ds@1952
    32
  {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},
ds@1952
    33
  {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},
ds@1952
    34
  {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},
ds@1952
    35
  {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},
ds@1952
    36
  {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},
ds@1952
    37
  {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},
ds@1952
    38
  {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},
ds@1952
    39
  {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}
ds@1952
    40
};
ds@1952
    41
/*-*SCPACK end of pair table, do not change or remove this line */
ds@1952
    42
ds@1952
    43
#define seqsize(o,p)    (opcodes(o)+opargs(p))
ds@1952
    44
typedef struct {
ds@1952
    45
  char *find;
ds@1952
    46
  char *replace;
ds@1952
    47
  int savesize;         /* number of bytes saved (in bytecode) */
ds@1952
    48
} SEQUENCE;
ds@1952
    49
static SEQUENCE sequences_cmp[] = {
ds@1952
    50
  /* A very common sequence in four varieties
ds@1952
    51
   *    load.s.pri n1           load.s.pri n2
ds@1952
    52
   *    push.pri                load.s.alt n1
ds@1952
    53
   *    load.s.pri n2           -
ds@1952
    54
   *    pop.alt                 -
ds@1952
    55
   *    --------------------------------------
ds@1952
    56
   *    load.pri n1             load.s.pri n2
ds@1952
    57
   *    push.pri                load.alt n1
ds@1952
    58
   *    load.s.pri n2           -
ds@1952
    59
   *    pop.alt                 -
ds@1952
    60
   *    --------------------------------------
ds@1952
    61
   *    load.s.pri n1           load.pri n2
ds@1952
    62
   *    push.pri                load.s.alt n1
ds@1952
    63
   *    load.pri n2             -
ds@1952
    64
   *    pop.alt                 -
ds@1952
    65
   *    --------------------------------------
ds@1952
    66
   *    load.pri n1             load.pri n2
ds@1952
    67
   *    push.pri                load.alt n1
ds@1952
    68
   *    load.pri n2             -
ds@1952
    69
   *    pop.alt                 -
ds@1952
    70
   */
ds@1952
    71
  {
ds@1952
    72
    #ifdef SCPACK
ds@1952
    73
      "load.s.pri %1!push.pri!load.s.pri %2!pop.alt!",
ds@1952
    74
      "load.s.pri %2!load.s.alt %1!",
ds@1952
    75
    #else
ds@1952
    76
      "\226\305\241",
ds@1952
    77
      "\246\375",
ds@1952
    78
    #endif
ds@1952
    79
    seqsize(4,2) - seqsize(2,2)
ds@1952
    80
  },
ds@1952
    81
  {
ds@1952
    82
    #ifdef SCPACK
ds@1952
    83
      "load.pri %1!push.pri!load.s.pri %2!pop.alt!",
ds@1952
    84
      "load.s.pri %2!load.alt %1!",
ds@1952
    85
    #else
ds@1952
    86
      "\217\305\241",
ds@1952
    87
      "\246\374",
ds@1952
    88
    #endif
ds@1952
    89
    seqsize(4,2) - seqsize(2,2)
ds@1952
    90
  },
ds@1952
    91
  {
ds@1952
    92
    #ifdef SCPACK
ds@1952
    93
      "load.s.pri %1!push.pri!load.pri %2!pop.alt!",
ds@1952
    94
      "load.pri %2!load.s.alt %1!",
ds@1952
    95
    #else
ds@1952
    96
      "\226\264\334\241",
ds@1952
    97
      "\334\375",
ds@1952
    98
    #endif
ds@1952
    99
    seqsize(4,2) - seqsize(2,2)
ds@1952
   100
  },
ds@1952
   101
  {
ds@1952
   102
    #ifdef SCPACK
ds@1952
   103
      "load.pri %1!push.pri!load.pri %2!pop.alt!",
ds@1952
   104
      "load.pri %2!load.alt %1!",
ds@1952
   105
    #else
ds@1952
   106
      "\217\264\334\241",
ds@1952
   107
      "\334\374",
ds@1952
   108
    #endif
ds@1952
   109
    seqsize(4,2) - seqsize(2,2)
ds@1952
   110
  },
ds@1952
   111
  /* (#1#) The above also occurs with "addr.pri" (array
ds@1952
   112
   * indexing) as the first line; so that adds 2 cases.
ds@1952
   113
   */
ds@1952
   114
  {
ds@1952
   115
    #ifdef SCPACK
ds@1952
   116
      "addr.pri %1!push.pri!load.s.pri %2!pop.alt!",
ds@1952
   117
      "addr.alt %1!load.s.pri %2!",
ds@1952
   118
    #else
ds@1952
   119
      "\364\241",
ds@1952
   120
      "\365",
ds@1952
   121
    #endif
ds@1952
   122
    seqsize(4,2) - seqsize(2,2)
ds@1952
   123
  },
ds@1952
   124
  {
ds@1952
   125
    #ifdef SCPACK
ds@1952
   126
      "addr.pri %1!push.pri!load.pri %2!pop.alt!",
ds@1952
   127
      "addr.alt %1!load.pri %2!",
ds@1952
   128
    #else
ds@1952
   129
      "\265\264\334\241",
ds@1952
   130
      "\265\243\334",
ds@1952
   131
    #endif
ds@1952
   132
    seqsize(4,2) - seqsize(2,2)
ds@1952
   133
  },
ds@1952
   134
  /* And the same sequence with const.pri as either the first
ds@1952
   135
   * or the second load instruction: four more cases.
ds@1952
   136
   */
ds@1952
   137
  {
ds@1952
   138
    #ifdef SCPACK
ds@1952
   139
      "const.pri %1!push.pri!load.s.pri %2!pop.alt!",
ds@1952
   140
      "load.s.pri %2!const.alt %1!",
ds@1952
   141
    #else
ds@1952
   142
      "\363\241",
ds@1952
   143
      "\246\356",
ds@1952
   144
    #endif
ds@1952
   145
    seqsize(4,2) - seqsize(2,2)
ds@1952
   146
  },
ds@1952
   147
  {
ds@1952
   148
    #ifdef SCPACK
ds@1952
   149
      "const.pri %1!push.pri!load.pri %2!pop.alt!",
ds@1952
   150
      "load.pri %2!const.alt %1!",
ds@1952
   151
    #else
ds@1952
   152
      "\233\264\334\241",
ds@1952
   153
      "\334\356",
ds@1952
   154
    #endif
ds@1952
   155
    seqsize(4,2) - seqsize(2,2)
ds@1952
   156
  },
ds@1952
   157
  {
ds@1952
   158
    #ifdef SCPACK
ds@1952
   159
      "load.s.pri %1!push.pri!const.pri %2!pop.alt!",
ds@1952
   160
      "const.pri %2!load.s.alt %1!",
ds@1952
   161
    #else
ds@1952
   162
      "\226\264\344\241",
ds@1952
   163
      "\344\375",
ds@1952
   164
    #endif
ds@1952
   165
    seqsize(4,2) - seqsize(2,2)
ds@1952
   166
  },
ds@1952
   167
  {
ds@1952
   168
    #ifdef SCPACK
ds@1952
   169
      "load.pri %1!push.pri!const.pri %2!pop.alt!",
ds@1952
   170
      "const.pri %2!load.alt %1!",
ds@1952
   171
    #else
ds@1952
   172
      "\217\264\344\241",
ds@1952
   173
      "\344\374",
ds@1952
   174
    #endif
ds@1952
   175
    seqsize(4,2) - seqsize(2,2)
ds@1952
   176
  },
ds@1952
   177
  /* The same as above, but now with "addr.pri" (array
ds@1952
   178
   * indexing) on the first line and const.pri on
ds@1952
   179
   * the second.
ds@1952
   180
   */
ds@1952
   181
  {
ds@1952
   182
    #ifdef SCPACK
ds@1952
   183
      "addr.pri %1!push.pri!const.pri %2!pop.alt!",
ds@1952
   184
      "addr.alt %1!const.pri %2!",
ds@1952
   185
    #else
ds@1952
   186
      "\265\264\344\241",
ds@1952
   187
      "\265\243\344",
ds@1952
   188
    #endif
ds@1952
   189
    seqsize(4,2) - seqsize(2,2)
ds@1952
   190
  },
ds@1952
   191
  {
ds@1952
   192
    #ifdef SCPACK
ds@1952
   193
      "addr.pri %1!push.pri!zero.pri!pop.alt!",
ds@1952
   194
      "addr.alt %1!zero.pri!",
ds@1952
   195
    #else
ds@1952
   196
      "\265\264\373\241",
ds@1952
   197
      "\265\243\373",
ds@1952
   198
    #endif
ds@1952
   199
    seqsize(4,1) - seqsize(2,1)
ds@1952
   200
  },
ds@1952
   201
  /* ??? add references */
ds@1952
   202
  /* Chained relational operators can contain sequences like:
ds@1952
   203
   *    move.pri                load.s.pri n1
ds@1952
   204
   *    push.pri                -
ds@1952
   205
   *    load.s.pri n1           -
ds@1952
   206
   *    pop.alt                 -
ds@1952
   207
   * The above also accurs for "load.pri" and for "const.pri",
ds@1952
   208
   * so add another two cases.
ds@1952
   209
   */
ds@1952
   210
  {
ds@1952
   211
    #ifdef SCPACK
ds@1952
   212
      "move.pri!push.pri!load.s.pri %1!pop.alt!",
ds@1952
   213
      "load.s.pri %1!",
ds@1952
   214
    #else
ds@1952
   215
      "\300\236\244\333\241",
ds@1952
   216
      "\333",
ds@1952
   217
    #endif
ds@1952
   218
    seqsize(4,1) - seqsize(1,1)
ds@1952
   219
  },
ds@1952
   220
  {
ds@1952
   221
    #ifdef SCPACK
ds@1952
   222
      "move.pri!push.pri!load.pri %1!pop.alt!",
ds@1952
   223
      "load.pri %1!",
ds@1952
   224
    #else
ds@1952
   225
      "\300\236\244\311\241",
ds@1952
   226
      "\311",
ds@1952
   227
    #endif
ds@1952
   228
    seqsize(4,1) - seqsize(1,1)
ds@1952
   229
  },
ds@1952
   230
  {
ds@1952
   231
    #ifdef SCPACK
ds@1952
   232
      "move.pri!push.pri!const.pri %1!pop.alt!",
ds@1952
   233
      "const.pri %1!",
ds@1952
   234
    #else
ds@1952
   235
      "\300\236\244\330\241",
ds@1952
   236
      "\330",
ds@1952
   237
    #endif
ds@1952
   238
    seqsize(4,1) - seqsize(1,1)
ds@1952
   239
  },
ds@1952
   240
  /* More optimizations for chained relational operators; the
ds@1952
   241
   * continuation sequences can be simplified if they turn out
ds@1952
   242
   * to be termination sequences:
ds@1952
   243
   *    xchg                    sless       also for sless, sgeq and sleq
ds@1952
   244
   *    sgrtr                   pop.alt
ds@1952
   245
   *    swap.alt                and
ds@1952
   246
   *    and                     ;$exp
ds@1952
   247
   *    pop.alt                 -
ds@1952
   248
   *    ;$exp                   -
ds@1952
   249
   *    --------------------------------------
ds@1952
   250
   *    xchg                    sless       also for sless, sgeq and sleq
ds@1952
   251
   *    sgrtr                   pop.alt
ds@1952
   252
   *    swap.alt                and
ds@1952
   253
   *    and                     jzer n1
ds@1952
   254
   *    pop.alt                 -
ds@1952
   255
   *    jzer n1                 -
ds@1952
   256
   *    --------------------------------------
ds@1952
   257
   *    xchg                    jsgeq  n1   also for sless, sgeq and sleq
ds@1952
   258
   *    sgrtr                   ;$exp       (occurs for non-chained comparisons)
ds@1952
   259
   *    jzer n1                 -
ds@1952
   260
   *    ;$exp                   -
ds@1952
   261
   *    --------------------------------------
ds@1952
   262
   *    xchg                    sless       also for sless, sgeq and sleq
ds@1952
   263
   *    sgrtr                   ;$exp       (occurs for non-chained comparisons)
ds@1952
   264
   *    ;$exp                   -
ds@1952
   265
   */
ds@1952
   266
  {
ds@1952
   267
    #ifdef SCPACK
ds@1952
   268
      "xchg!sgrtr!swap.alt!and!pop.alt!;$exp!",
ds@1952
   269
      "sless!pop.alt!and!;$exp!",
ds@1952
   270
    #else
ds@1952
   271
      "\274\371\237swa\234\337\266\252",
ds@1952
   272
      "\372\266\337!\252",
ds@1952
   273
    #endif
ds@1952
   274
    seqsize(5,0) - seqsize(3,0)
ds@1952
   275
  },
ds@1952
   276
  {
ds@1952
   277
    #ifdef SCPACK
ds@1952
   278
      "xchg!sless!swap.alt!and!pop.alt!;$exp!",
ds@1952
   279
      "sgrtr!pop.alt!and!;$exp!",
ds@1952
   280
    #else
ds@1952
   281
      "\274\372!swa\234\337\266\252",
ds@1952
   282
      "\371\237\241\337!\252",
ds@1952
   283
    #endif
ds@1952
   284
    seqsize(5,0) - seqsize(3,0)
ds@1952
   285
  },
ds@1952
   286
  {
ds@1952
   287
    #ifdef SCPACK
ds@1952
   288
      "xchg!sgeq!swap.alt!and!pop.alt!;$exp!",
ds@1952
   289
      "sleq!pop.alt!and!;$exp!",
ds@1952
   290
    #else
ds@1952
   291
      "\274\320\325swa\234\337\266\252",
ds@1952
   292
      "\321\262\266\337!\252",
ds@1952
   293
    #endif
ds@1952
   294
    seqsize(5,0) - seqsize(3,0)
ds@1952
   295
  },
ds@1952
   296
  {
ds@1952
   297
    #ifdef SCPACK
ds@1952
   298
      "xchg!sleq!swap.alt!and!pop.alt!;$exp!",
ds@1952
   299
      "sgeq!pop.alt!and!;$exp!",
ds@1952
   300
    #else
ds@1952
   301
      "\274\321\325swa\234\337\266\252",
ds@1952
   302
      "\320\262\266\337!\252",
ds@1952
   303
    #endif
ds@1952
   304
    seqsize(5,0) - seqsize(3,0)
ds@1952
   305
  },
ds@1952
   306
  {
ds@1952
   307
    #ifdef SCPACK
ds@1952
   308
      "xchg!sgrtr!swap.alt!and!pop.alt!jzer %1!",
ds@1952
   309
      "sless!pop.alt!and!jzer %1!",
ds@1952
   310
    #else
ds@1952
   311
      "\274\371\237swa\234\337\266\323",
ds@1952
   312
      "\372\266\337!\323",
ds@1952
   313
    #endif
ds@1952
   314
    seqsize(5,0) - seqsize(3,0)
ds@1952
   315
  },
ds@1952
   316
  {
ds@1952
   317
    #ifdef SCPACK
ds@1952
   318
      "xchg!sless!swap.alt!and!pop.alt!jzer %1!",
ds@1952
   319
      "sgrtr!pop.alt!and!jzer %1!",
ds@1952
   320
    #else
ds@1952
   321
      "\274\372!swa\234\337\266\323",
ds@1952
   322
      "\371\237\241\337!\323",
ds@1952
   323
    #endif
ds@1952
   324
    seqsize(5,0) - seqsize(3,0)
ds@1952
   325
  },
ds@1952
   326
  {
ds@1952
   327
    #ifdef SCPACK
ds@1952
   328
      "xchg!sgeq!swap.alt!and!pop.alt!jzer %1!",
ds@1952
   329
      "sleq!pop.alt!and!jzer %1!",
ds@1952
   330
    #else
ds@1952
   331
      "\274\320\325swa\234\337\266\323",
ds@1952
   332
      "\321\262\266\337!\323",
ds@1952
   333
    #endif
ds@1952
   334
    seqsize(5,0) - seqsize(3,0)
ds@1952
   335
  },
ds@1952
   336
  {
ds@1952
   337
    #ifdef SCPACK
ds@1952
   338
      "xchg!sleq!swap.alt!and!pop.alt!jzer %1!",
ds@1952
   339
      "sgeq!pop.alt!and!jzer %1!",
ds@1952
   340
    #else
ds@1952
   341
      "\274\321\325swa\234\337\266\323",
ds@1952
   342
      "\320\262\266\337!\323",
ds@1952
   343
    #endif
ds@1952
   344
    seqsize(5,0) - seqsize(3,0)
ds@1952
   345
  },
ds@1952
   346
  {
ds@1952
   347
    #ifdef SCPACK
ds@1952
   348
      "xchg!sgrtr!jzer %1!;$exp!",
ds@1952
   349
      "jsgeq %1!;$exp!",
ds@1952
   350
    #else
ds@1952
   351
      "\274\371\237\303\301",
ds@1952
   352
      "j\320\262\301",
ds@1952
   353
    #endif
ds@1952
   354
    seqsize(3,1) - seqsize(1,1)
ds@1952
   355
  },
ds@1952
   356
  {
ds@1952
   357
    #ifdef SCPACK
ds@1952
   358
      "xchg!sless!jzer %1!;$exp!",
ds@1952
   359
      "jsleq %1!;$exp!",
ds@1952
   360
    #else
ds@1952
   361
      "\274\372!\303\301",
ds@1952
   362
      "j\321\262\301",
ds@1952
   363
    #endif
ds@1952
   364
    seqsize(3,1) - seqsize(1,1)
ds@1952
   365
  },
ds@1952
   366
  {
ds@1952
   367
    #ifdef SCPACK
ds@1952
   368
      "xchg!sgeq!jzer %1!;$exp!",
ds@1952
   369
      "jsgrtr %1!;$exp!",
ds@1952
   370
    #else
ds@1952
   371
      "\274\320\325\303\301",
ds@1952
   372
      "j\371r\301",
ds@1952
   373
    #endif
ds@1952
   374
    seqsize(3,1) - seqsize(1,1)
ds@1952
   375
  },
ds@1952
   376
  {
ds@1952
   377
    #ifdef SCPACK
ds@1952
   378
      "xchg!sleq!jzer %1!;$exp!",
ds@1952
   379
      "jsless %1!;$exp!",
ds@1952
   380
    #else
ds@1952
   381
      "\274\321\325\303\301",
ds@1952
   382
      "j\372\301",
ds@1952
   383
    #endif
ds@1952
   384
    seqsize(3,1) - seqsize(1,1)
ds@1952
   385
  },
ds@1952
   386
  {
ds@1952
   387
    #ifdef SCPACK
ds@1952
   388
      "xchg!sgrtr!;$exp!",
ds@1952
   389
      "sless!;$exp!",
ds@1952
   390
    #else
ds@1952
   391
      "\274\371\237\252",
ds@1952
   392
      "\372!\252",
ds@1952
   393
    #endif
ds@1952
   394
    seqsize(2,0) - seqsize(1,0)
ds@1952
   395
  },
ds@1952
   396
  {
ds@1952
   397
    #ifdef SCPACK
ds@1952
   398
      "xchg!sless!;$exp!",
ds@1952
   399
      "sgrtr!;$exp!",
ds@1952
   400
    #else
ds@1952
   401
      "\274\372!\252",
ds@1952
   402
      "\371\237\252",
ds@1952
   403
    #endif
ds@1952
   404
    seqsize(2,0) - seqsize(1,0)
ds@1952
   405
  },
ds@1952
   406
  {
ds@1952
   407
    #ifdef SCPACK
ds@1952
   408
      "xchg!sgeq!;$exp!",
ds@1952
   409
      "sleq!;$exp!",
ds@1952
   410
    #else
ds@1952
   411
      "\274\320\325\252",
ds@1952
   412
      "\321\325\252",
ds@1952
   413
    #endif
ds@1952
   414
    seqsize(2,0) - seqsize(1,0)
ds@1952
   415
  },
ds@1952
   416
  {
ds@1952
   417
    #ifdef SCPACK
ds@1952
   418
      "xchg!sleq!;$exp!",
ds@1952
   419
      "sgeq!;$exp!",
ds@1952
   420
    #else
ds@1952
   421
      "\274\321\325\252",
ds@1952
   422
      "\320\325\252",
ds@1952
   423
    #endif
ds@1952
   424
    seqsize(2,0) - seqsize(1,0)
ds@1952
   425
  },
ds@1952
   426
  /* The entry to chained operators is also opt to optimization
ds@1952
   427
   *    load.s.pri n1           load.s.pri n2
ds@1952
   428
   *    load.s.alt n2           load.s.alt n1
ds@1952
   429
   *    xchg                    -
ds@1952
   430
   *    --------------------------------------
ds@1952
   431
   *    load.s.pri n1           load.pri n2
ds@1952
   432
   *    load.alt n2             load.s.alt n1
ds@1952
   433
   *    xchg                    -
ds@1952
   434
   *    --------------------------------------
ds@1952
   435
   *    load.s.pri n1           const.pri n2
ds@1952
   436
   *    const.alt n2            load.s.alt n1
ds@1952
   437
   *    xchg                    -
ds@1952
   438
   *    --------------------------------------
ds@1952
   439
   * and all permutations...
ds@1952
   440
   */
ds@1952
   441
  {
ds@1952
   442
    #ifdef SCPACK
ds@1952
   443
      "load.s.pri %1!load.s.alt %2!xchg!",
ds@1952
   444
      "load.s.pri %2!load.s.alt %1!",
ds@1952
   445
    #else
ds@1952
   446
      "\333\226\304\274",
ds@1952
   447
      "\246\375",
ds@1952
   448
    #endif
ds@1952
   449
    seqsize(3,2) - seqsize(2,2)
ds@1952
   450
  },
ds@1952
   451
  {
ds@1952
   452
    #ifdef SCPACK
ds@1952
   453
      "load.s.pri %1!load.alt %2!xchg!",
ds@1952
   454
      "load.pri %2!load.s.alt %1!",
ds@1952
   455
    #else
ds@1952
   456
      "\333\362\274",
ds@1952
   457
      "\334\375",
ds@1952
   458
    #endif
ds@1952
   459
    seqsize(3,2) - seqsize(2,2)
ds@1952
   460
  },
ds@1952
   461
  {
ds@1952
   462
    #ifdef SCPACK
ds@1952
   463
      "load.s.pri %1!const.alt %2!xchg!",
ds@1952
   464
      "const.pri %2!load.s.alt %1!",
ds@1952
   465
    #else
ds@1952
   466
      "\333\233\304\274",
ds@1952
   467
      "\344\375",
ds@1952
   468
    #endif
ds@1952
   469
    seqsize(3,2) - seqsize(2,2)
ds@1952
   470
  },
ds@1952
   471
  {
ds@1952
   472
    #ifdef SCPACK
ds@1952
   473
      "load.pri %1!load.s.alt %2!xchg!",
ds@1952
   474
      "load.s.pri %2!load.alt %1!",
ds@1952
   475
    #else
ds@1952
   476
      "\311\226\304\274",
ds@1952
   477
      "\246\374",
ds@1952
   478
    #endif
ds@1952
   479
    seqsize(3,2) - seqsize(2,2)
ds@1952
   480
  },
ds@1952
   481
  {
ds@1952
   482
    #ifdef SCPACK
ds@1952
   483
      "load.pri %1!load.alt %2!xchg!",
ds@1952
   484
      "load.pri %2!load.alt %1!",
ds@1952
   485
    #else
ds@1952
   486
      "\311\362\274",
ds@1952
   487
      "\334\374",
ds@1952
   488
    #endif
ds@1952
   489
    seqsize(3,2) - seqsize(2,2)
ds@1952
   490
  },
ds@1952
   491
  {
ds@1952
   492
    #ifdef SCPACK
ds@1952
   493
      "load.pri %1!const.alt %2!xchg!",
ds@1952
   494
      "const.pri %2!load.alt %1!",
ds@1952
   495
    #else
ds@1952
   496
      "\311\233\304\274",
ds@1952
   497
      "\344\374",
ds@1952
   498
    #endif
ds@1952
   499
    seqsize(3,2) - seqsize(2,2)
ds@1952
   500
  },
ds@1952
   501
  {
ds@1952
   502
    #ifdef SCPACK
ds@1952
   503
      "const.pri %1!load.s.alt %2!xchg!",
ds@1952
   504
      "load.s.pri %2!const.alt %1!",
ds@1952
   505
    #else
ds@1952
   506
      "\330\226\304\274",
ds@1952
   507
      "\246\356",
ds@1952
   508
    #endif
ds@1952
   509
    seqsize(3,2) - seqsize(2,2)
ds@1952
   510
  },
ds@1952
   511
  {
ds@1952
   512
    #ifdef SCPACK
ds@1952
   513
      "const.pri %1!load.alt %2!xchg!",
ds@1952
   514
      "load.pri %2!const.alt %1!",
ds@1952
   515
    #else
ds@1952
   516
      "\330\362\274",
ds@1952
   517
      "\334\356",
ds@1952
   518
    #endif
ds@1952
   519
    seqsize(3,2) - seqsize(2,2)
ds@1952
   520
  },
ds@1952
   521
  /* some sequences where PRI is moved to ALT can be optimized
ds@1952
   522
   * further when considering what follows
ds@1952
   523
   *    move.alt                const.alt n1
ds@1952
   524
   *    const.pri %1            -
ds@1952
   525
   *    xchg                    -
ds@1952
   526
   * (also for load.s.pri and load.pri)
ds@1952
   527
   *    --------------------------------------
ds@1952
   528
   *    lref.pri %1             lref.alt %1
ds@1952
   529
   *    move.alt                [load.pri %2]
ds@1952
   530
   *    [load.pri %2]           -
ds@1952
   531
   * (where [load.pri %2] may also be another operatrion loading PRI)
ds@1952
   532
   */
ds@1952
   533
  {
ds@1952
   534
    #ifdef SCPACK
ds@1952
   535
      "move.alt!const.pri %1!xchg!",
ds@1952
   536
      "const.alt %1!",
ds@1952
   537
    #else
ds@1952
   538
      "\306\330\274",
ds@1952
   539
      "\356",
ds@1952
   540
    #endif
ds@1952
   541
    seqsize(3,1) - seqsize(1,1)
ds@1952
   542
  },
ds@1952
   543
  {
ds@1952
   544
    #ifdef SCPACK
ds@1952
   545
      "move.alt!load.pri %1!xchg!",
ds@1952
   546
      "load.alt %1!",
ds@1952
   547
    #else
ds@1952
   548
      "\306\311\274",
ds@1952
   549
      "\374",
ds@1952
   550
    #endif
ds@1952
   551
    seqsize(3,1) - seqsize(1,1)
ds@1952
   552
  },
ds@1952
   553
  {
ds@1952
   554
    #ifdef SCPACK
ds@1952
   555
      "move.alt!load.s.pri %1!xchg!",
ds@1952
   556
      "load.s.alt %1!",
ds@1952
   557
    #else
ds@1952
   558
      "\306\333\274",
ds@1952
   559
      "\375",
ds@1952
   560
    #endif
ds@1952
   561
    seqsize(3,1) - seqsize(1,1)
ds@1952
   562
  },
ds@1952
   563
  /* ----- */
ds@1952
   564
  {
ds@1952
   565
    #ifdef SCPACK
ds@1952
   566
      "lref.pri %1!move.alt!load.pri %2!",
ds@1952
   567
      "lref.alt %1!load.pri %2!",
ds@1952
   568
    #else
ds@1952
   569
      "\350\225\306\334",
ds@1952
   570
      "\350\243\334",
ds@1952
   571
    #endif
ds@1952
   572
    seqsize(3,2) - seqsize(2,2)
ds@1952
   573
  },
ds@1952
   574
  {
ds@1952
   575
    #ifdef SCPACK
ds@1952
   576
      "lref.pri %1!move.alt!load.s.pri %2!",
ds@1952
   577
      "lref.alt %1!load.s.pri %2!",
ds@1952
   578
    #else
ds@1952
   579
      "\350\225\306\246",
ds@1952
   580
      "\350\310",
ds@1952
   581
    #endif
ds@1952
   582
    seqsize(3,2) - seqsize(2,2)
ds@1952
   583
  },
ds@1952
   584
  {
ds@1952
   585
    #ifdef SCPACK
ds@1952
   586
      "lref.pri %1!move.alt!const.pri %2!",
ds@1952
   587
      "lref.alt %1!const.pri %2!",
ds@1952
   588
    #else
ds@1952
   589
      "\350\225\306\344",
ds@1952
   590
      "\350\243\344",
ds@1952
   591
    #endif
ds@1952
   592
    seqsize(3,2) - seqsize(2,2)
ds@1952
   593
  },
ds@1952
   594
  {
ds@1952
   595
    #ifdef SCPACK
ds@1952
   596
      "lref.s.pri %1!move.alt!load.pri %2!",
ds@1952
   597
      "lref.s.alt %1!load.pri %2!",
ds@1952
   598
    #else
ds@1952
   599
      "\350\222\225\306\334",
ds@1952
   600
      "\350\222\243\334",
ds@1952
   601
    #endif
ds@1952
   602
    seqsize(3,2) - seqsize(2,2)
ds@1952
   603
  },
ds@1952
   604
  {
ds@1952
   605
    #ifdef SCPACK
ds@1952
   606
      "lref.s.pri %1!move.alt!load.s.pri %2!",
ds@1952
   607
      "lref.s.alt %1!load.s.pri %2!",
ds@1952
   608
    #else
ds@1952
   609
      "\350\222\225\306\246",
ds@1952
   610
      "\350\222\310",
ds@1952
   611
    #endif
ds@1952
   612
    seqsize(3,2) - seqsize(2,2)
ds@1952
   613
  },
ds@1952
   614
  {
ds@1952
   615
    #ifdef SCPACK
ds@1952
   616
      "lref.s.pri %1!move.alt!const.pri %2!",
ds@1952
   617
      "lref.s.alt %1!const.pri %2!",
ds@1952
   618
    #else
ds@1952
   619
      "\350\222\225\306\344",
ds@1952
   620
      "\350\222\243\344",
ds@1952
   621
    #endif
ds@1952
   622
    seqsize(3,2) - seqsize(2,2)
ds@1952
   623
  },
ds@1952
   624
  /* Array indexing can merit from special instructions.
ds@1952
   625
   * Simple indexed array lookup can be optimized quite
ds@1952
   626
   * a bit.
ds@1952
   627
   *    addr.pri n1             addr.alt n1
ds@1952
   628
   *    push.pri                load.s.pri n2
ds@1952
   629
   *    load.s.pri n2           bounds n3
ds@1952
   630
   *    bounds n3               lidx.b n4
ds@1952
   631
   *    shl.c.pri n4            -
ds@1952
   632
   *    pop.alt                 -
ds@1952
   633
   *    add                     -
ds@1952
   634
   *    load.i                  -
ds@1952
   635
   *
ds@1952
   636
   * And to prepare for storing a value in an array
ds@1952
   637
   *    addr.pri n1             addr.alt n1
ds@1952
   638
   *    push.pri                load.s.pri n2
ds@1952
   639
   *    load.s.pri n2           bounds n3
ds@1952
   640
   *    bounds n3               idxaddr.b n4
ds@1952
   641
   *    shl.c.pri n4            -
ds@1952
   642
   *    pop.alt                 -
ds@1952
   643
   *    add                     -
ds@1952
   644
   *
ds@1952
   645
   * Notes (additional cases):
ds@1952
   646
   * 1. instruction addr.pri can also be const.pri (for
ds@1952
   647
   *    global arrays)
ds@1952
   648
   * 2. the bounds instruction can be absent
ds@1952
   649
   * 3. when "n4" (the shift value) is the 2 (with 32-bit cells), use the
ds@1952
   650
   *    even more optimal instructions LIDX and IDDXADDR
ds@1952
   651
   *
ds@1952
   652
   * If the array index is more complex, one can only optimize
ds@1952
   653
   * the last four instructions:
ds@1952
   654
   *    shl.c.pri n1            pop.alt
ds@1952
   655
   *    pop.alt                 lidx.b n1
ds@1952
   656
   *    add                     -
ds@1952
   657
   *    loadi                   -
ds@1952
   658
   *    --------------------------------------
ds@1952
   659
   *    shl.c.pri n1            pop.alt
ds@1952
   660
   *    pop.alt                 idxaddr.b n1
ds@1952
   661
   *    add                     -
ds@1952
   662
   */
ds@1952
   663
#if !defined BIT16
ds@1952
   664
  /* loading from array, "cell" shifted */
ds@1952
   665
  {
ds@1952
   666
    #ifdef SCPACK
ds@1952
   667
      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
ds@1952
   668
      "addr.alt %1!load.s.pri %2!bounds %3!lidx!",
ds@1952
   669
    #else
ds@1952
   670
      "\364\316\370\342\355",
ds@1952
   671
      "\365\316\366!",
ds@1952
   672
    #endif
ds@1952
   673
    seqsize(8,4) - seqsize(4,3)
ds@1952
   674
  },
ds@1952
   675
  {
ds@1952
   676
    #ifdef SCPACK
ds@1952
   677
      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
ds@1952
   678
      "const.alt %1!load.s.pri %2!bounds %3!lidx!",
ds@1952
   679
    #else
ds@1952
   680
      "\363\316\370\342\355",
ds@1952
   681
      "\376\316\366!",
ds@1952
   682
    #endif
ds@1952
   683
    seqsize(8,4) - seqsize(4,3)
ds@1952
   684
  },
ds@1952
   685
  {
ds@1952
   686
    #ifdef SCPACK
ds@1952
   687
      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
ds@1952
   688
      "addr.alt %1!load.s.pri %2!lidx!",
ds@1952
   689
    #else
ds@1952
   690
      "\364\370\342\355",
ds@1952
   691
      "\365\366!",
ds@1952
   692
    #endif
ds@1952
   693
    seqsize(7,3) - seqsize(3,2)
ds@1952
   694
  },
ds@1952
   695
  {
ds@1952
   696
    #ifdef SCPACK
ds@1952
   697
      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
ds@1952
   698
      "const.alt %1!load.s.pri %2!lidx!",
ds@1952
   699
    #else
ds@1952
   700
      "\363\370\342\355",
ds@1952
   701
      "\376\366!",
ds@1952
   702
    #endif
ds@1952
   703
    seqsize(7,3) - seqsize(3,2)
ds@1952
   704
  },
ds@1952
   705
#endif
ds@1952
   706
  /* loading from array, not "cell" shifted */
ds@1952
   707
  {
ds@1952
   708
    #ifdef SCPACK
ds@1952
   709
      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
ds@1952
   710
      "addr.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
ds@1952
   711
    #else
ds@1952
   712
      "\364\316\327\302\341\342\355",
ds@1952
   713
      "\365\316\366\367\335",
ds@1952
   714
    #endif
ds@1952
   715
    seqsize(8,4) - seqsize(4,4)
ds@1952
   716
  },
ds@1952
   717
  {
ds@1952
   718
    #ifdef SCPACK
ds@1952
   719
      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
ds@1952
   720
      "const.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
ds@1952
   721
    #else
ds@1952
   722
      "\363\316\327\302\341\342\355",
ds@1952
   723
      "\376\316\366\367\335",
ds@1952
   724
    #endif
ds@1952
   725
    seqsize(8,4) - seqsize(4,4)
ds@1952
   726
  },
ds@1952
   727
  {
ds@1952
   728
    #ifdef SCPACK
ds@1952
   729
      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
ds@1952
   730
      "addr.alt %1!load.s.pri %2!lidx.b %3!",
ds@1952
   731
    #else
ds@1952
   732
      "\364\327\256\241\271\342\355",
ds@1952
   733
      "\365\366\367\256",
ds@1952
   734
    #endif
ds@1952
   735
    seqsize(7,3) - seqsize(3,3)
ds@1952
   736
  },
ds@1952
   737
  {
ds@1952
   738
    #ifdef SCPACK
ds@1952
   739
      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
ds@1952
   740
      "const.alt %1!load.s.pri %2!lidx.b %3!",
ds@1952
   741
    #else
ds@1952
   742
      "\363\327\256\241\271\342\355",
ds@1952
   743
      "\376\366\367\256",
ds@1952
   744
    #endif
ds@1952
   745
    seqsize(7,3) - seqsize(3,3)
ds@1952
   746
  },
ds@1952
   747
#if !defined BIT16
ds@1952
   748
  /* array index calculation for storing a value, "cell" aligned */
ds@1952
   749
  {
ds@1952
   750
    #ifdef SCPACK
ds@1952
   751
      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
ds@1952
   752
      "addr.alt %1!load.s.pri %2!bounds %3!idxaddr!",
ds@1952
   753
    #else
ds@1952
   754
      "\364\316\370",
ds@1952
   755
      "\365\316\322\235\237",
ds@1952
   756
    #endif
ds@1952
   757
    seqsize(7,4) - seqsize(4,3)
ds@1952
   758
  },
ds@1952
   759
  {
ds@1952
   760
    #ifdef SCPACK
ds@1952
   761
      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
ds@1952
   762
      "const.alt %1!load.s.pri %2!bounds %3!idxaddr!",
ds@1952
   763
    #else
ds@1952
   764
      "\363\316\370",
ds@1952
   765
      "\376\316\322\235\237",
ds@1952
   766
    #endif
ds@1952
   767
    seqsize(7,4) - seqsize(4,3)
ds@1952
   768
  },
ds@1952
   769
  {
ds@1952
   770
    #ifdef SCPACK
ds@1952
   771
      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
ds@1952
   772
      "addr.alt %1!load.s.pri %2!idxaddr!",
ds@1952
   773
    #else
ds@1952
   774
      "\364\370",
ds@1952
   775
      "\365\322\235\237",
ds@1952
   776
    #endif
ds@1952
   777
    seqsize(6,3) - seqsize(3,2)
ds@1952
   778
  },
ds@1952
   779
  {
ds@1952
   780
    #ifdef SCPACK
ds@1952
   781
      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
ds@1952
   782
      "const.alt %1!load.s.pri %2!idxaddr!",
ds@1952
   783
    #else
ds@1952
   784
      "\363\370",
ds@1952
   785
      "\376\322\235\237",
ds@1952
   786
    #endif
ds@1952
   787
    seqsize(6,3) - seqsize(3,2)
ds@1952
   788
  },
ds@1952
   789
#endif
ds@1952
   790
  /* array index calculation for storing a value, not "cell" packed */
ds@1952
   791
  {
ds@1952
   792
    #ifdef SCPACK
ds@1952
   793
      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
ds@1952
   794
      "addr.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
ds@1952
   795
    #else
ds@1952
   796
      "\364\316\327\302\341",
ds@1952
   797
      "\365\316\322\265\367\335",
ds@1952
   798
    #endif
ds@1952
   799
    seqsize(7,4) - seqsize(4,4)
ds@1952
   800
  },
ds@1952
   801
  {
ds@1952
   802
    #ifdef SCPACK
ds@1952
   803
      "const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
ds@1952
   804
      "const.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
ds@1952
   805
    #else
ds@1952
   806
      "\363\316\327\302\341",
ds@1952
   807
      "\376\316\322\265\367\335",
ds@1952
   808
    #endif
ds@1952
   809
    seqsize(7,4) - seqsize(4,4)
ds@1952
   810
  },
ds@1952
   811
  {
ds@1952
   812
    #ifdef SCPACK
ds@1952
   813
      "addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
ds@1952
   814
      "addr.alt %1!load.s.pri %2!idxaddr.b %3!",
ds@1952
   815
    #else
ds@1952
   816
      "\364\327\256\241\271",
ds@1952
   817
      "\365\322\265\367\256",
ds@1952
   818
    #endif
ds@1952
   819
    seqsize(6,3) - seqsize(3,3)
ds@1952
   820
  },
ds@1952
   821
  {
ds@1952
   822
    #ifdef SCPACK
ds@1952
   823
      "const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
ds@1952
   824
      "const.alt %1!load.s.pri %2!idxaddr.b %3!",
ds@1952
   825
    #else
ds@1952
   826
      "\363\327\256\241\271",
ds@1952
   827
      "\376\322\265\367\256",
ds@1952
   828
    #endif
ds@1952
   829
    seqsize(6,3) - seqsize(3,3)
ds@1952
   830
  },
ds@1952
   831
#if !defined BIT16
ds@1952
   832
  /* the shorter array indexing sequences, see above for comments */
ds@1952
   833
  {
ds@1952
   834
    #ifdef SCPACK
ds@1952
   835
      "shl.c.pri 2!pop.alt!add!loadi!",
ds@1952
   836
      "pop.alt!lidx!",
ds@1952
   837
    #else
ds@1952
   838
      "\370\217\355",
ds@1952
   839
      "\241\366!",
ds@1952
   840
    #endif
ds@1952
   841
    seqsize(4,1) - seqsize(2,0)
ds@1952
   842
  },
ds@1952
   843
  {
ds@1952
   844
    #ifdef SCPACK
ds@1952
   845
      "shl.c.pri 2!pop.alt!add!",
ds@1952
   846
      "pop.alt!idxaddr!",
ds@1952
   847
    #else
ds@1952
   848
      "\370",
ds@1952
   849
      "\241\322\235\237",
ds@1952
   850
    #endif
ds@1952
   851
    seqsize(3,1) - seqsize(2,0)
ds@1952
   852
  },
ds@1952
   853
#endif
ds@1952
   854
  {
ds@1952
   855
    #ifdef SCPACK
ds@1952
   856
      "shl.c.pri %1!pop.alt!add!loadi!",
ds@1952
   857
      "pop.alt!lidx.b %1!",
ds@1952
   858
    #else
ds@1952
   859
      "\314\225\241\271\217\355",
ds@1952
   860
      "\241\366\367\202",
ds@1952
   861
    #endif
ds@1952
   862
    seqsize(4,1) - seqsize(2,1)
ds@1952
   863
  },
ds@1952
   864
  {
ds@1952
   865
    #ifdef SCPACK
ds@1952
   866
      "shl.c.pri %1!pop.alt!add!",
ds@1952
   867
      "pop.alt!idxaddr.b %1!",
ds@1952
   868
    #else
ds@1952
   869
      "\314\225\241\271",
ds@1952
   870
      "\241\322\265\367\202",
ds@1952
   871
    #endif
ds@1952
   872
    seqsize(3,1) - seqsize(2,1)
ds@1952
   873
  },
ds@1952
   874
  /* For packed arrays, there is another case (packed arrays
ds@1952
   875
   * do not take advantage of the LIDX or IDXADDR instructions).
ds@1952
   876
   *    addr.pri n1             addr.alt n1
ds@1952
   877
   *    push.pri                load.s.pri n2
ds@1952
   878
   *    load.s.pri n2           bounds n3
ds@1952
   879
   *    bounds n3               -
ds@1952
   880
   *    pop.alt                 -
ds@1952
   881
   *
ds@1952
   882
   * Notes (additional cases):
ds@1952
   883
   * 1. instruction addr.pri can also be const.pri (for
ds@1952
   884
   *    global arrays)
ds@1952
   885
   * 2. the bounds instruction can be absent, but that
ds@1952
   886
   *    case is already handled (see #1#)
ds@1952
   887
   */
ds@1952
   888
  {
ds@1952
   889
    #ifdef SCPACK
ds@1952
   890
      "addr.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
ds@1952
   891
      "addr.alt %1!load.s.pri %2!bounds %3!",
ds@1952
   892
    #else
ds@1952
   893
      "\364\316\241",
ds@1952
   894
      "\365\316",
ds@1952
   895
    #endif
ds@1952
   896
    seqsize(5,3) - seqsize(3,3)
ds@1952
   897
  },
ds@1952
   898
  {
ds@1952
   899
    #ifdef SCPACK
ds@1952
   900
      "const.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
ds@1952
   901
      "const.alt %1!load.s.pri %2!bounds %3!",
ds@1952
   902
    #else
ds@1952
   903
      "\363\316\241",
ds@1952
   904
      "\376\316",
ds@1952
   905
    #endif
ds@1952
   906
    seqsize(5,3) - seqsize(3,3)
ds@1952
   907
  },
ds@1952
   908
  /* Declaration of simple variables often follows the sequence:
ds@1952
   909
   *    ;$lcl <name> <stk>      ;$lcl <name> <stk>
ds@1952
   910
   *    stack -4                push.c <constval>
ds@1952
   911
   *    const.pri <constval>    ;$exp
ds@1952
   912
   *    stor.s.pri <stk>        -
ds@1952
   913
   *    ;$exp                   -
ds@1952
   914
   */
ds@1952
   915
  {
ds@1952
   916
    #ifdef SCPACK
ds@1952
   917
      ";$lcl %1 %2!stack -4!const.pri %3!stor.s.pri %2!;$exp!",
ds@1952
   918
      ";$lcl %1 %2!push.c %3!;$exp!",
ds@1952
   919
    #else
ds@1952
   920
      "\224lcl\332\227ack -4!\233\206\256\227or\222\230\252",
ds@1952
   921
      "\224lcl\332\331\256\252",
ds@1952
   922
    #endif
ds@1952
   923
    seqsize(3,3) - seqsize(1,1)
ds@1952
   924
  },
ds@1952
   925
  {
ds@1952
   926
    #ifdef SCPACK
ds@1952
   927
      ";$lcl %1 %2!stack -4!zero.pri!stor.s.pri %2!;$exp!",
ds@1952
   928
      ";$lcl %1 %2!push.c 0!;$exp!",
ds@1952
   929
    #else
ds@1952
   930
      "\224lcl\332\227ack -4!\373\227or\222\230\252",
ds@1952
   931
      "\224lcl\332\331 0!\252",
ds@1952
   932
    #endif
ds@1952
   933
    seqsize(3,2) - seqsize(1,1)
ds@1952
   934
  },
ds@1952
   935
  /* During a calculation, the intermediate result must sometimes
ds@1952
   936
   * be moved from PRI to ALT, like in:
ds@1952
   937
   *    push.pri                move.alt
ds@1952
   938
   *    load.s.pri n1           load.s.pri n1
ds@1952
   939
   *    pop.alt                 -
ds@1952
   940
   *
ds@1952
   941
   * The above also accurs for "load.pri" and for "const.pri",
ds@1952
   942
   * so add another two cases.
ds@1952
   943
   */
ds@1952
   944
  {
ds@1952
   945
    #ifdef SCPACK
ds@1952
   946
      "push.pri!load.s.pri %1!pop.alt!",
ds@1952
   947
      "move.alt!load.s.pri %1!",
ds@1952
   948
    #else
ds@1952
   949
      "\244\333\241",
ds@1952
   950
      "\306\333",
ds@1952
   951
    #endif
ds@1952
   952
    seqsize(3,1) - seqsize(2,1)
ds@1952
   953
  },
ds@1952
   954
  {
ds@1952
   955
    #ifdef SCPACK
ds@1952
   956
      "push.pri!load.pri %1!pop.alt!",
ds@1952
   957
      "move.alt!load.pri %1!",
ds@1952
   958
    #else
ds@1952
   959
      "\244\311\241",
ds@1952
   960
      "\306\311",
ds@1952
   961
    #endif
ds@1952
   962
    seqsize(3,1) - seqsize(2,1)
ds@1952
   963
  },
ds@1952
   964
  {
ds@1952
   965
    #ifdef SCPACK
ds@1952
   966
      "push.pri!const.pri %1!pop.alt!",
ds@1952
   967
      "move.alt!const.pri %1!",
ds@1952
   968
    #else
ds@1952
   969
      "\244\330\241",
ds@1952
   970
      "\306\330",
ds@1952
   971
    #endif
ds@1952
   972
    seqsize(3,1) - seqsize(2,1)
ds@1952
   973
  },
ds@1952
   974
  {
ds@1952
   975
    #ifdef SCPACK
ds@1952
   976
      "push.pri!zero.pri!pop.alt!",
ds@1952
   977
      "move.alt!zero.pri!",
ds@1952
   978
    #else
ds@1952
   979
      "\244\373\241",
ds@1952
   980
      "\306\373",
ds@1952
   981
    #endif
ds@1952
   982
    seqsize(3,0) - seqsize(2,0)
ds@1952
   983
  },
ds@1952
   984
  /* saving PRI and then loading from its address
ds@1952
   985
   * occurs when indexing a multi-dimensional array
ds@1952
   986
   */
ds@1952
   987
  {
ds@1952
   988
    #ifdef SCPACK
ds@1952
   989
      "push.pri!load.i!pop.alt!",
ds@1952
   990
      "move.alt!load.i!",
ds@1952
   991
    #else
ds@1952
   992
      "\244\342i\266",
ds@1952
   993
      "\306\342\355",
ds@1952
   994
    #endif
ds@1952
   995
    seqsize(3,0) - seqsize(2,0)
ds@1952
   996
  },
ds@1952
   997
  /* An even simpler PUSH/POP optimization (occurs in
ds@1952
   998
   * switch statements):
ds@1952
   999
   *    push.pri                move.alt
ds@1952
  1000
   *    pop.alt                 -
ds@1952
  1001
   */
ds@1952
  1002
  {
ds@1952
  1003
    #ifdef SCPACK
ds@1952
  1004
      "push.pri!pop.alt!",
ds@1952
  1005
      "move.alt!",
ds@1952
  1006
    #else
ds@1952
  1007
      "\244\241",
ds@1952
  1008
      "\306",
ds@1952
  1009
    #endif
ds@1952
  1010
    seqsize(2,0) - seqsize(1,0)
ds@1952
  1011
  },
ds@1952
  1012
  /* Some simple arithmetic sequences
ds@1952
  1013
   */
ds@1952
  1014
  {
ds@1952
  1015
    #ifdef SCPACK
ds@1952
  1016
      "move.alt!load.s.pri %1!add!",
ds@1952
  1017
      "load.s.alt %1!add!",
ds@1952
  1018
    #else
ds@1952
  1019
      "\306\333\271",
ds@1952
  1020
      "\375\271",
ds@1952
  1021
    #endif
ds@1952
  1022
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1023
  },
ds@1952
  1024
  {
ds@1952
  1025
    #ifdef SCPACK
ds@1952
  1026
      "move.alt!load.pri %1!add!",
ds@1952
  1027
      "load.alt %1!add!",
ds@1952
  1028
    #else
ds@1952
  1029
      "\306\311\271",
ds@1952
  1030
      "\374\271",
ds@1952
  1031
    #endif
ds@1952
  1032
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1033
  },
ds@1952
  1034
  {
ds@1952
  1035
    #ifdef SCPACK
ds@1952
  1036
      "move.alt!const.pri %1!add!",
ds@1952
  1037
      "const.alt %1!add!",
ds@1952
  1038
    #else
ds@1952
  1039
      "\306\330\271",
ds@1952
  1040
      "\356\271",
ds@1952
  1041
    #endif
ds@1952
  1042
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1043
  },
ds@1952
  1044
  {
ds@1952
  1045
    #ifdef SCPACK
ds@1952
  1046
      "move.alt!load.s.pri %1!sub.alt!",
ds@1952
  1047
      "load.s.alt %1!sub!",
ds@1952
  1048
    #else
ds@1952
  1049
      "\306\333sub\223",
ds@1952
  1050
      "\375sub!",
ds@1952
  1051
    #endif
ds@1952
  1052
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1053
  },
ds@1952
  1054
  {
ds@1952
  1055
    #ifdef SCPACK
ds@1952
  1056
      "move.alt!load.pri %1!sub.alt!",
ds@1952
  1057
      "load.alt %1!sub!",
ds@1952
  1058
    #else
ds@1952
  1059
      "\306\311sub\223",
ds@1952
  1060
      "\374sub!",
ds@1952
  1061
    #endif
ds@1952
  1062
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1063
  },
ds@1952
  1064
  {
ds@1952
  1065
    #ifdef SCPACK
ds@1952
  1066
      "move.alt!const.pri %1!sub.alt!",
ds@1952
  1067
      "const.alt %1!sub!",
ds@1952
  1068
    #else
ds@1952
  1069
      "\306\330sub\223",
ds@1952
  1070
      "\356sub!",
ds@1952
  1071
    #endif
ds@1952
  1072
    seqsize(3,1) - seqsize(2,1)
ds@1952
  1073
  },
ds@1952
  1074
  /* User-defined operators first load the operands into registers and
ds@1952
  1075
   * then have them pushed onto the stack. This can give rise to sequences
ds@1952
  1076
   * like:
ds@1952
  1077
   *    const.pri n1            push.c n1
ds@1952
  1078
   *    const.alt n2            push.c n2
ds@1952
  1079
   *    push.pri                -
ds@1952
  1080
   *    push.alt                -
ds@1952
  1081
   * A similar sequence occurs with the two PUSH.pri/alt instructions inverted.
ds@1952
  1082
   * The first, second, or both CONST.pri/alt instructions can also be
ds@1952
  1083
   * LOAD.pri/alt.
ds@1952
  1084
   * This gives 2 x 4 cases.
ds@1952
  1085
   */
ds@1952
  1086
  {
ds@1952
  1087
    #ifdef SCPACK
ds@1952
  1088
      "const.pri %1!const.alt %2!push.pri!push.alt!",
ds@1952
  1089
      "push.c %1!push.c %2!",
ds@1952
  1090
    #else
ds@1952
  1091
      "\330\233\304\244\354",
ds@1952
  1092
      "\331\202\331\221",
ds@1952
  1093
    #endif
ds@1952
  1094
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1095
  },
ds@1952
  1096
  {
ds@1952
  1097
    #ifdef SCPACK
ds@1952
  1098
      "const.pri %1!const.alt %2!push.alt!push.pri!",
ds@1952
  1099
      "push.c %2!push.c %1!",
ds@1952
  1100
    #else
ds@1952
  1101
      "\330\233\304\354\244",
ds@1952
  1102
      "\331\221\331\202",
ds@1952
  1103
    #endif
ds@1952
  1104
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1105
  },
ds@1952
  1106
  {
ds@1952
  1107
    #ifdef SCPACK
ds@1952
  1108
      "const.pri %1!load.alt %2!push.pri!push.alt!",
ds@1952
  1109
      "push.c %1!push %2!",
ds@1952
  1110
    #else
ds@1952
  1111
      "\330\362\244\354",
ds@1952
  1112
      "\331\202\216\221",
ds@1952
  1113
    #endif
ds@1952
  1114
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1115
  },
ds@1952
  1116
  {
ds@1952
  1117
    #ifdef SCPACK
ds@1952
  1118
      "const.pri %1!load.alt %2!push.alt!push.pri!",
ds@1952
  1119
      "push %2!push.c %1!",
ds@1952
  1120
    #else
ds@1952
  1121
      "\330\362\354\244",
ds@1952
  1122
      "\216\221\331\202",
ds@1952
  1123
    #endif
ds@1952
  1124
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1125
  },
ds@1952
  1126
  {
ds@1952
  1127
    #ifdef SCPACK
ds@1952
  1128
      "load.pri %1!const.alt %2!push.pri!push.alt!",
ds@1952
  1129
      "push %1!push.c %2!",
ds@1952
  1130
    #else
ds@1952
  1131
      "\311\233\304\244\354",
ds@1952
  1132
      "\216\202\331\221",
ds@1952
  1133
    #endif
ds@1952
  1134
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1135
  },
ds@1952
  1136
  {
ds@1952
  1137
    #ifdef SCPACK
ds@1952
  1138
      "load.pri %1!const.alt %2!push.alt!push.pri!",
ds@1952
  1139
      "push.c %2!push %1!",
ds@1952
  1140
    #else
ds@1952
  1141
      "\311\233\304\354\244",
ds@1952
  1142
      "\331\221\216\202",
ds@1952
  1143
    #endif
ds@1952
  1144
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1145
  },
ds@1952
  1146
  {
ds@1952
  1147
    #ifdef SCPACK
ds@1952
  1148
      "load.pri %1!load.alt %2!push.pri!push.alt!",
ds@1952
  1149
      "push %1!push %2!",
ds@1952
  1150
    #else
ds@1952
  1151
      "\311\362\244\354",
ds@1952
  1152
      "\216\202\216\221",
ds@1952
  1153
    #endif
ds@1952
  1154
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1155
  },
ds@1952
  1156
  {
ds@1952
  1157
    #ifdef SCPACK
ds@1952
  1158
      "load.pri %1!load.alt %2!push.alt!push.pri!",
ds@1952
  1159
      "push %2!push %1!",
ds@1952
  1160
    #else
ds@1952
  1161
      "\311\362\354\244",
ds@1952
  1162
      "\216\221\216\202",
ds@1952
  1163
    #endif
ds@1952
  1164
    seqsize(4,2) - seqsize(2,2)
ds@1952
  1165
  },
ds@1952
  1166
  /* Function calls (parameters are passed on the stack)
ds@1952
  1167
   *    load.s.pri n1           push.s n1
ds@1952
  1168
   *    push.pri                -
ds@1952
  1169
   *    --------------------------------------
ds@1952
  1170
   *    load.pri n1             push n1
ds@1952
  1171
   *    push.pri                -
ds@1952
  1172
   *    --------------------------------------
ds@1952
  1173
   *    const.pri n1            push.c n1
ds@1952
  1174
   *    push.pri                -
ds@1952
  1175
   *    --------------------------------------
ds@1952
  1176
   *    zero.pri                push.c 0
ds@1952
  1177
   *    push.pri                -
ds@1952
  1178
   *    --------------------------------------
ds@1952
  1179
   *    addr.pri n1             push.adr n1
ds@1952
  1180
   *    push.pri                -
ds@1952
  1181
   *
ds@1952
  1182
   * However, PRI must not be needed after this instruction
ds@1952
  1183
   * if this shortcut is used. Check for the ;$par comment.
ds@1952
  1184
   */
ds@1952
  1185
  {
ds@1952
  1186
    #ifdef SCPACK
ds@1952
  1187
      "load.s.pri %1!push.pri!;$par!",
ds@1952
  1188
      "push.s %1!;$par!",
ds@1952
  1189
    #else
ds@1952
  1190
      "\226\264\255",
ds@1952
  1191
      "\216\222\202\255",
ds@1952
  1192
    #endif
ds@1952
  1193
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1194
  },
ds@1952
  1195
  {
ds@1952
  1196
    #ifdef SCPACK
ds@1952
  1197
      "load.pri %1!push.pri!;$par!",
ds@1952
  1198
      "push %1!;$par!",
ds@1952
  1199
    #else
ds@1952
  1200
      "\217\264\255",
ds@1952
  1201
      "\216\202\255",
ds@1952
  1202
    #endif
ds@1952
  1203
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1204
  },
ds@1952
  1205
  {
ds@1952
  1206
    #ifdef SCPACK
ds@1952
  1207
      "const.pri %1!push.pri!;$par!",
ds@1952
  1208
      "push.c %1!;$par!",
ds@1952
  1209
    #else
ds@1952
  1210
      "\233\264\255",
ds@1952
  1211
      "\331\202\255",
ds@1952
  1212
    #endif
ds@1952
  1213
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1214
  },
ds@1952
  1215
  {
ds@1952
  1216
    #ifdef SCPACK
ds@1952
  1217
      "zero.pri!push.pri!;$par!",
ds@1952
  1218
      "push.c 0!;$par!",
ds@1952
  1219
    #else
ds@1952
  1220
      "\373\244\255",
ds@1952
  1221
      "\331 0!\255",
ds@1952
  1222
    #endif
ds@1952
  1223
    seqsize(2,0) - seqsize(1,1)
ds@1952
  1224
  },
ds@1952
  1225
  {
ds@1952
  1226
    #ifdef SCPACK
ds@1952
  1227
      "addr.pri %1!push.pri!;$par!",
ds@1952
  1228
      "push.adr %1!;$par!",
ds@1952
  1229
    #else
ds@1952
  1230
      "\265\264\255",
ds@1952
  1231
      "\216\326\202\255",
ds@1952
  1232
    #endif
ds@1952
  1233
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1234
  },
ds@1952
  1235
  /* References with a default value generate new cells on the heap
ds@1952
  1236
   * dynamically. That code often ends with:
ds@1952
  1237
   *    move.pri                push.alt
ds@1952
  1238
   *    push.pri                -
ds@1952
  1239
   */
ds@1952
  1240
  {
ds@1952
  1241
    #ifdef SCPACK
ds@1952
  1242
      "move.pri!push.pri!",
ds@1952
  1243
      "push.alt!",
ds@1952
  1244
    #else
ds@1952
  1245
      "\300\236\244",
ds@1952
  1246
      "\354",
ds@1952
  1247
    #endif
ds@1952
  1248
    seqsize(2,0) - seqsize(1,0)
ds@1952
  1249
  },
ds@1952
  1250
  /* Simple arithmetic operations on constants. Noteworthy is the
ds@1952
  1251
   * subtraction of a constant, since it is converted to the addition
ds@1952
  1252
   * of the inverse value.
ds@1952
  1253
   *    const.alt n1            add.c n1
ds@1952
  1254
   *    add                     -
ds@1952
  1255
   *    --------------------------------------
ds@1952
  1256
   *    const.alt n1            add.c -n1
ds@1952
  1257
   *    sub                     -
ds@1952
  1258
   *    --------------------------------------
ds@1952
  1259
   *    const.alt n1            smul.c n1
ds@1952
  1260
   *    smul                    -
ds@1952
  1261
   *    --------------------------------------
ds@1952
  1262
   *    const.alt n1            eq.c.pri n1
ds@1952
  1263
   *    eq                      -
ds@1952
  1264
   */
ds@1952
  1265
  {
ds@1952
  1266
    #ifdef SCPACK
ds@1952
  1267
      "const.alt %1!add!",
ds@1952
  1268
      "add.c %1!",
ds@1952
  1269
    #else
ds@1952
  1270
      "\356\271",
ds@1952
  1271
      "\235\242\202",
ds@1952
  1272
    #endif
ds@1952
  1273
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1274
  },
ds@1952
  1275
  {
ds@1952
  1276
    #ifdef SCPACK
ds@1952
  1277
      "const.alt %1!sub!",
ds@1952
  1278
      "add.c -%1!",
ds@1952
  1279
    #else
ds@1952
  1280
      "\356sub!",
ds@1952
  1281
      "\235\242 -\201",
ds@1952
  1282
    #endif
ds@1952
  1283
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1284
  },
ds@1952
  1285
  {
ds@1952
  1286
    #ifdef SCPACK
ds@1952
  1287
      "const.alt %1!smul!",
ds@1952
  1288
      "smul.c %1!",
ds@1952
  1289
    #else
ds@1952
  1290
      "\356smul!",
ds@1952
  1291
      "smu\307\202",
ds@1952
  1292
    #endif
ds@1952
  1293
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1294
  },
ds@1952
  1295
  {
ds@1952
  1296
    #ifdef SCPACK
ds@1952
  1297
      "const.alt %1!eq!",
ds@1952
  1298
      "eq.c.pri %1!",
ds@1952
  1299
    #else
ds@1952
  1300
      "\356\325",
ds@1952
  1301
      "\262\242\225",
ds@1952
  1302
    #endif
ds@1952
  1303
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1304
  },
ds@1952
  1305
  /* Some operations use the alternative subtraction operation --these
ds@1952
  1306
   * can also be optimized.
ds@1952
  1307
   *    const.pri n1            load.s.pri n2
ds@1952
  1308
   *    load.s.alt n2           add.c -n1
ds@1952
  1309
   *    sub.alt                 -
ds@1952
  1310
   *    --------------------------------------
ds@1952
  1311
   *    const.pri n1            load.pri n2
ds@1952
  1312
   *    load.alt n2             add.c -n1
ds@1952
  1313
   *    sub.alt                 -
ds@1952
  1314
   */
ds@1952
  1315
  {
ds@1952
  1316
    #ifdef SCPACK
ds@1952
  1317
      "const.pri %1!load.s.alt %2!sub.alt!",
ds@1952
  1318
      "load.s.pri %2!add.c -%1!",
ds@1952
  1319
    #else
ds@1952
  1320
      "\330\226\304sub\223",
ds@1952
  1321
      "\246\235\242 -\201",
ds@1952
  1322
    #endif
ds@1952
  1323
    seqsize(3,2) - seqsize(2,2)
ds@1952
  1324
  },
ds@1952
  1325
  {
ds@1952
  1326
    #ifdef SCPACK
ds@1952
  1327
      "const.pri %1!load.alt %2!sub.alt!",
ds@1952
  1328
      "load.pri %2!add.c -%1!",
ds@1952
  1329
    #else
ds@1952
  1330
      "\330\362sub\223",
ds@1952
  1331
      "\334\235\242 -\201",
ds@1952
  1332
    #endif
ds@1952
  1333
    seqsize(3,2) - seqsize(2,2)
ds@1952
  1334
  },
ds@1952
  1335
  /* With arrays indexed with constants that come from enumerations, it happens
ds@1952
  1336
   * multiple add.c opcodes follow in sequence.
ds@1952
  1337
   *    add.c n1                add.c n1+n2
ds@1952
  1338
   *    add.c n2                -
ds@1952
  1339
   */
ds@1952
  1340
  {
ds@1952
  1341
    #ifdef SCPACK
ds@1952
  1342
      "add.c %1!add.c %2!",
ds@1952
  1343
      "add.c %1+%2!",
ds@1952
  1344
    #else
ds@1952
  1345
      "\235\242\202\235\242\221",
ds@1952
  1346
      "\235\242\267+%2!",
ds@1952
  1347
    #endif
ds@1952
  1348
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1349
  },
ds@1952
  1350
  /* Compare and jump
ds@1952
  1351
   *    eq                      jneq n1
ds@1952
  1352
   *    jzer n1                 -
ds@1952
  1353
   *    --------------------------------------
ds@1952
  1354
   *    eq                      jeq n1
ds@1952
  1355
   *    jnz n1                  -
ds@1952
  1356
   *    --------------------------------------
ds@1952
  1357
   *    neq                     jeq n1
ds@1952
  1358
   *    jzer n1                 -
ds@1952
  1359
   *    --------------------------------------
ds@1952
  1360
   *    neq                     jneq n1
ds@1952
  1361
   *    jnz n1                  -
ds@1952
  1362
   * Compares followed by jzer occur much more
ds@1952
  1363
   * often than compares followed with jnz. So we
ds@1952
  1364
   * take the easy route here.
ds@1952
  1365
   *    less                    jgeq n1
ds@1952
  1366
   *    jzer n1                 -
ds@1952
  1367
   *    --------------------------------------
ds@1952
  1368
   *    leq                     jgrtr n1
ds@1952
  1369
   *    jzer n1                 -
ds@1952
  1370
   *    --------------------------------------
ds@1952
  1371
   *    grtr                    jleq n1
ds@1952
  1372
   *    jzer n1                 -
ds@1952
  1373
   *    --------------------------------------
ds@1952
  1374
   *    geq                     jless n1
ds@1952
  1375
   *    jzer n1                 -
ds@1952
  1376
   *    --------------------------------------
ds@1952
  1377
   *    sless                   jsgeq n1
ds@1952
  1378
   *    jzer n1                 -
ds@1952
  1379
   *    --------------------------------------
ds@1952
  1380
   *    sleq                    jsgrtr n1
ds@1952
  1381
   *    jzer n1                 -
ds@1952
  1382
   *    --------------------------------------
ds@1952
  1383
   *    sgrtr                   jsleq n1
ds@1952
  1384
   *    jzer n1                 -
ds@1952
  1385
   *    --------------------------------------
ds@1952
  1386
   *    sgeq                    jsless n1
ds@1952
  1387
   *    jzer n1                 -
ds@1952
  1388
   */
ds@1952
  1389
  {
ds@1952
  1390
    #ifdef SCPACK
ds@1952
  1391
      "eq!jzer %1!",
ds@1952
  1392
      "jneq %1!",
ds@1952
  1393
    #else
ds@1952
  1394
      "\325\323",
ds@1952
  1395
      "jn\357",
ds@1952
  1396
    #endif
ds@1952
  1397
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1398
  },
ds@1952
  1399
  {
ds@1952
  1400
    #ifdef SCPACK
ds@1952
  1401
      "eq!jnz %1!",
ds@1952
  1402
      "jeq %1!",
ds@1952
  1403
    #else
ds@1952
  1404
      "\325jnz\202",
ds@1952
  1405
      "j\357",
ds@1952
  1406
    #endif
ds@1952
  1407
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1408
  },
ds@1952
  1409
  {
ds@1952
  1410
    #ifdef SCPACK
ds@1952
  1411
      "neq!jzer %1!",
ds@1952
  1412
      "jeq %1!",
ds@1952
  1413
    #else
ds@1952
  1414
      "n\325\323",
ds@1952
  1415
      "j\357",
ds@1952
  1416
    #endif
ds@1952
  1417
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1418
  },
ds@1952
  1419
  {
ds@1952
  1420
    #ifdef SCPACK
ds@1952
  1421
      "neq!jnz %1!",
ds@1952
  1422
      "jneq %1!",
ds@1952
  1423
    #else
ds@1952
  1424
      "n\325jnz\202",
ds@1952
  1425
      "jn\357",
ds@1952
  1426
    #endif
ds@1952
  1427
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1428
  },
ds@1952
  1429
  {
ds@1952
  1430
    #ifdef SCPACK
ds@1952
  1431
      "less!jzer %1!",
ds@1952
  1432
      "jgeq %1!",
ds@1952
  1433
    #else
ds@1952
  1434
      "l\352!\323",
ds@1952
  1435
      "jg\357",
ds@1952
  1436
    #endif
ds@1952
  1437
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1438
  },
ds@1952
  1439
  {
ds@1952
  1440
    #ifdef SCPACK
ds@1952
  1441
      "leq!jzer %1!",
ds@1952
  1442
      "jgrtr %1!",
ds@1952
  1443
    #else
ds@1952
  1444
      "l\325\323",
ds@1952
  1445
      "jg\353r\202",
ds@1952
  1446
    #endif
ds@1952
  1447
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1448
  },
ds@1952
  1449
  {
ds@1952
  1450
    #ifdef SCPACK
ds@1952
  1451
      "grtr!jzer %1!",
ds@1952
  1452
      "jleq %1!",
ds@1952
  1453
    #else
ds@1952
  1454
      "g\353\237\323",
ds@1952
  1455
      "jl\357",
ds@1952
  1456
    #endif
ds@1952
  1457
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1458
  },
ds@1952
  1459
  {
ds@1952
  1460
    #ifdef SCPACK
ds@1952
  1461
      "geq!jzer %1!",
ds@1952
  1462
      "jless %1!",
ds@1952
  1463
    #else
ds@1952
  1464
      "g\325\323",
ds@1952
  1465
      "jl\352\202",
ds@1952
  1466
    #endif
ds@1952
  1467
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1468
  },
ds@1952
  1469
  {
ds@1952
  1470
    #ifdef SCPACK
ds@1952
  1471
      "sless!jzer %1!",
ds@1952
  1472
      "jsgeq %1!",
ds@1952
  1473
    #else
ds@1952
  1474
      "\372!\323",
ds@1952
  1475
      "j\320\357",
ds@1952
  1476
    #endif
ds@1952
  1477
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1478
  },
ds@1952
  1479
  {
ds@1952
  1480
    #ifdef SCPACK
ds@1952
  1481
      "sleq!jzer %1!",
ds@1952
  1482
      "jsgrtr %1!",
ds@1952
  1483
    #else
ds@1952
  1484
      "\321\325\323",
ds@1952
  1485
      "j\371r\202",
ds@1952
  1486
    #endif
ds@1952
  1487
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1488
  },
ds@1952
  1489
  {
ds@1952
  1490
    #ifdef SCPACK
ds@1952
  1491
      "sgrtr!jzer %1!",
ds@1952
  1492
      "jsleq %1!",
ds@1952
  1493
    #else
ds@1952
  1494
      "\371\237\323",
ds@1952
  1495
      "j\321\357",
ds@1952
  1496
    #endif
ds@1952
  1497
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1498
  },
ds@1952
  1499
  {
ds@1952
  1500
    #ifdef SCPACK
ds@1952
  1501
      "sgeq!jzer %1!",
ds@1952
  1502
      "jsless %1!",
ds@1952
  1503
    #else
ds@1952
  1504
      "\320\325\323",
ds@1952
  1505
      "j\372\202",
ds@1952
  1506
    #endif
ds@1952
  1507
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1508
  },
ds@1952
  1509
  /* Test for zero (common case, especially for strings)
ds@1952
  1510
   * E.g. the test expression of: "for (i=0; str{i}!=0; ++i)"
ds@1952
  1511
   *
ds@1952
  1512
   *    zero.alt                jzer n1
ds@1952
  1513
   *    jeq n1                  -
ds@1952
  1514
   *    --------------------------------------
ds@1952
  1515
   *    zero.alt                jnz n1
ds@1952
  1516
   *    jneq n1                 -
ds@1952
  1517
   */
ds@1952
  1518
  {
ds@1952
  1519
    #ifdef SCPACK
ds@1952
  1520
      "zero.alt!jeq %1!",
ds@1952
  1521
      "jzer %1!",
ds@1952
  1522
    #else
ds@1952
  1523
      "\340\223j\357",
ds@1952
  1524
      "\323",
ds@1952
  1525
    #endif
ds@1952
  1526
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1527
  },
ds@1952
  1528
  {
ds@1952
  1529
    #ifdef SCPACK
ds@1952
  1530
      "zero.alt!jneq %1!",
ds@1952
  1531
      "jnz %1!",
ds@1952
  1532
    #else
ds@1952
  1533
      "\340\223jn\357",
ds@1952
  1534
      "jnz\202",
ds@1952
  1535
    #endif
ds@1952
  1536
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1537
  },
ds@1952
  1538
  /* Incrementing and decrementing leaves a value in
ds@1952
  1539
   * in PRI which may not be used (for example, as the
ds@1952
  1540
   * third expression in a "for" loop).
ds@1952
  1541
   *    inc n1                  inc n1  ; ++n
ds@1952
  1542
   *    load.pri n1             ;$exp
ds@1952
  1543
   *    ;$exp                   -
ds@1952
  1544
   *    --------------------------------------
ds@1952
  1545
   *    load.pri n1             inc n1  ; n++, e.g. "for (n=0; n<10; n++)"
ds@1952
  1546
   *    inc n1                  ;$exp
ds@1952
  1547
   *    ;$exp                   -
ds@1952
  1548
   * Plus the varieties for stack relative increments
ds@1952
  1549
   * and decrements.
ds@1952
  1550
   */
ds@1952
  1551
  {
ds@1952
  1552
    #ifdef SCPACK
ds@1952
  1553
      "inc %1!load.pri %1!;$exp!",
ds@1952
  1554
      "inc %1!;$exp!",
ds@1952
  1555
    #else
ds@1952
  1556
      "inc\202\311\252",
ds@1952
  1557
      "inc\301",
ds@1952
  1558
    #endif
ds@1952
  1559
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1560
  },
ds@1952
  1561
  {
ds@1952
  1562
    #ifdef SCPACK
ds@1952
  1563
      "load.pri %1!inc %1!;$exp!",
ds@1952
  1564
      "inc %1!;$exp!",
ds@1952
  1565
    #else
ds@1952
  1566
      "\311inc\301",
ds@1952
  1567
      "inc\301",
ds@1952
  1568
    #endif
ds@1952
  1569
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1570
  },
ds@1952
  1571
  {
ds@1952
  1572
    #ifdef SCPACK
ds@1952
  1573
      "inc.s %1!load.s.pri %1!;$exp!",
ds@1952
  1574
      "inc.s %1!;$exp!",
ds@1952
  1575
    #else
ds@1952
  1576
      "inc\222\202\333\252",
ds@1952
  1577
      "inc\222\301",
ds@1952
  1578
    #endif
ds@1952
  1579
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1580
  },
ds@1952
  1581
  {
ds@1952
  1582
    #ifdef SCPACK
ds@1952
  1583
      "load.s.pri %1!inc.s %1!;$exp!",
ds@1952
  1584
      "inc.s %1!;$exp!",
ds@1952
  1585
    #else
ds@1952
  1586
      "\333inc\222\301",
ds@1952
  1587
      "inc\222\301",
ds@1952
  1588
    #endif
ds@1952
  1589
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1590
  },
ds@1952
  1591
  {
ds@1952
  1592
    #ifdef SCPACK
ds@1952
  1593
      "dec %1!load.pri %1!;$exp!",
ds@1952
  1594
      "dec %1!;$exp!",
ds@1952
  1595
    #else
ds@1952
  1596
      "dec\202\311\252",
ds@1952
  1597
      "dec\301",
ds@1952
  1598
    #endif
ds@1952
  1599
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1600
  },
ds@1952
  1601
  {
ds@1952
  1602
    #ifdef SCPACK
ds@1952
  1603
      "load.pri %1!dec %1!;$exp!",
ds@1952
  1604
      "dec %1!;$exp!",
ds@1952
  1605
    #else
ds@1952
  1606
      "\311dec\301",
ds@1952
  1607
      "dec\301",
ds@1952
  1608
    #endif
ds@1952
  1609
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1610
  },
ds@1952
  1611
  {
ds@1952
  1612
    #ifdef SCPACK
ds@1952
  1613
      "dec.s %1!load.s.pri %1!;$exp!",
ds@1952
  1614
      "dec.s %1!;$exp!",
ds@1952
  1615
    #else
ds@1952
  1616
      "dec\222\202\333\252",
ds@1952
  1617
      "dec\222\301",
ds@1952
  1618
    #endif
ds@1952
  1619
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1620
  },
ds@1952
  1621
  {
ds@1952
  1622
    #ifdef SCPACK
ds@1952
  1623
      "load.s.pri %1!dec.s %1!;$exp!",
ds@1952
  1624
      "dec.s %1!;$exp!",
ds@1952
  1625
    #else
ds@1952
  1626
      "\333dec\222\301",
ds@1952
  1627
      "dec\222\301",
ds@1952
  1628
    #endif
ds@1952
  1629
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1630
  },
ds@1952
  1631
  /* ??? the same (increments and decrements) for references */
ds@1952
  1632
  /* Loading the constant zero has a special opcode.
ds@1952
  1633
   * When storing zero in memory, the value of PRI must not be later on.
ds@1952
  1634
   *    const.pri 0             zero n1
ds@1952
  1635
   *    stor.pri n1             ;$exp
ds@1952
  1636
   *    ;$exp                   -
ds@1952
  1637
   *    --------------------------------------
ds@1952
  1638
   *    const.pri 0             zero.s n1
ds@1952
  1639
   *    stor.s.pri n1           ;$exp
ds@1952
  1640
   *    ;$exp                   -
ds@1952
  1641
   *    --------------------------------------
ds@1952
  1642
   *    zero.pri                zero n1
ds@1952
  1643
   *    stor.pri n1             ;$exp
ds@1952
  1644
   *    ;$exp                   -
ds@1952
  1645
   *    --------------------------------------
ds@1952
  1646
   *    zero.pri                zero.s n1
ds@1952
  1647
   *    stor.s.pri n1           ;$exp
ds@1952
  1648
   *    ;$exp                   -
ds@1952
  1649
   *    --------------------------------------
ds@1952
  1650
   *    const.pri 0             zero.pri
ds@1952
  1651
   *    --------------------------------------
ds@1952
  1652
   *    const.alt 0             zero.alt
ds@1952
  1653
   * The last two alternatives save more memory than they save
ds@1952
  1654
   * time, but anyway...
ds@1952
  1655
   */
ds@1952
  1656
  {
ds@1952
  1657
    #ifdef SCPACK
ds@1952
  1658
      "const.pri 0!stor.pri %1!;$exp!",
ds@1952
  1659
      "zero %1!;$exp!",
ds@1952
  1660
    #else
ds@1952
  1661
      "\233\206 0!\227or\225\252",
ds@1952
  1662
      "\340\301",
ds@1952
  1663
    #endif
ds@1952
  1664
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1665
  },
ds@1952
  1666
  {
ds@1952
  1667
    #ifdef SCPACK
ds@1952
  1668
      "const.pri 0!stor.s.pri %1!;$exp!",
ds@1952
  1669
      "zero.s %1!;$exp!",
ds@1952
  1670
    #else
ds@1952
  1671
      "\233\206 0!\227or\222\225\252",
ds@1952
  1672
      "\340\222\301",
ds@1952
  1673
    #endif
ds@1952
  1674
    seqsize(2,2) - seqsize(1,1)
ds@1952
  1675
  },
ds@1952
  1676
  {
ds@1952
  1677
    #ifdef SCPACK
ds@1952
  1678
      "zero.pri!stor.pri %1!;$exp!",
ds@1952
  1679
      "zero %1!;$exp!",
ds@1952
  1680
    #else
ds@1952
  1681
      "\373\227or\225\252",
ds@1952
  1682
      "\340\301",
ds@1952
  1683
    #endif
ds@1952
  1684
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1685
  },
ds@1952
  1686
  {
ds@1952
  1687
    #ifdef SCPACK
ds@1952
  1688
      "zero.pri!stor.s.pri %1!;$exp!",
ds@1952
  1689
      "zero.s %1!;$exp!",
ds@1952
  1690
    #else
ds@1952
  1691
      "\373\227or\222\225\252",
ds@1952
  1692
      "\340\222\301",
ds@1952
  1693
    #endif
ds@1952
  1694
    seqsize(2,1) - seqsize(1,1)
ds@1952
  1695
  },
ds@1952
  1696
  {
ds@1952
  1697
    #ifdef SCPACK
ds@1952
  1698
      "const.pri 0!",
ds@1952
  1699
      "zero.pri!",
ds@1952
  1700
    #else
ds@1952
  1701
      "\233\206 0!",
ds@1952
  1702
      "\373",
ds@1952
  1703
    #endif
ds@1952
  1704
    seqsize(1,1) - seqsize(1,0)
ds@1952
  1705
  },
ds@1952
  1706
  {
ds@1952
  1707
    #ifdef SCPACK
ds@1952
  1708
      "const.alt 0!",
ds@1952
  1709
      "zero.alt!",
ds@1952
  1710
    #else
ds@1952
  1711
      "\233\212 0!",
ds@1952
  1712
      "\340\223",
ds@1952
  1713
    #endif
ds@1952
  1714
    seqsize(1,1) - seqsize(1,0)
ds@1952
  1715
  },
ds@1952
  1716
ds@1952
  1717
  /* ------------------ */
ds@1952
  1718
  /* Macro instructions */
ds@1952
  1719
  /* ------------------ */
ds@1952
  1720
ds@1952
  1721
  { "", "", 0 },    /* separator, so optimizer can stop before generating macro opcodes */
ds@1952
  1722
ds@1952
  1723
  /* optimizing the calling of native functions (which always have a parameter
ds@1952
  1724
   * count pushed before, and the stack pointer restored afterwards
ds@1952
  1725
   */
ds@1952
  1726
  {
ds@1952
  1727
    #ifdef SCPACK
ds@1952
  1728
      "push.c %1!sysreq.c %2!stack %3!",        //note: %3 == %1 + 4
ds@1952
  1729
      "sysreq.n %2 %1!",
ds@1952
  1730
    #else
ds@1952
  1731
      "\331\202sysr\262\242\221\227ack\256",
ds@1952
  1732
      "sysr\262.n\220\202",
ds@1952
  1733
    #endif
ds@1952
  1734
    seqsize(3,3) - seqsize(1,2)
ds@1952
  1735
  },
ds@1952
  1736
  /* ----- */
ds@1952
  1737
  /* Functions with many parameters with the same "type" have sequences like:
ds@1952
  1738
   *    push.c n1               push3.c n1 n2 n3
ds@1952
  1739
   *    ;$par                   ;$par
ds@1952
  1740
   *    push.c n2               -
ds@1952
  1741
   *    ;$par                   -
ds@1952
  1742
   *    push.c n3               -
ds@1952
  1743
   *    ;$par                   -
ds@1952
  1744
   *    etc.                    etc.
ds@1952
  1745
   *
ds@1952
  1746
   * Similar sequences occur with PUSH, PUSH.s and PUSHADDR
ds@1952
  1747
   */
ds@1952
  1748
  {
ds@1952
  1749
    #ifdef SCPACK
ds@1952
  1750
      "push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!;$par!push.c %5!",
ds@1952
  1751
      "push5.c %1 %2 %3 %4 %5!",
ds@1952
  1752
    #else
ds@1952
  1753
      "\331\336\242\345\242\256\257\242\335\257\242\2035!",
ds@1952
  1754
      "\2165\242\343\245\302\2035!",
ds@1952
  1755
    #endif
ds@1952
  1756
    seqsize(5,5) - seqsize(1,5)
ds@1952
  1757
  },
ds@1952
  1758
  {
ds@1952
  1759
    #ifdef SCPACK
ds@1952
  1760
      "push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!",
ds@1952
  1761
      "push4.c %1 %2 %3 %4!",
ds@1952
  1762
    #else
ds@1952
  1763
      "\331\336\242\345\242\256\257\242\335",
ds@1952
  1764
      "\2164\242\343\245\335",
ds@1952
  1765
    #endif
ds@1952
  1766
    seqsize(4,4) - seqsize(1,4)
ds@1952
  1767
  },
ds@1952
  1768
  {
ds@1952
  1769
    #ifdef SCPACK
ds@1952
  1770
      "push.c %1!;$par!push.c %2!;$par!push.c %3!",
ds@1952
  1771
      "push3.c %1 %2 %3!",
ds@1952
  1772
    #else
ds@1952
  1773
      "\331\336\242\345\242\256",
ds@1952
  1774
      "\2163\242\343\256",
ds@1952
  1775
    #endif
ds@1952
  1776
    seqsize(3,3) - seqsize(1,3)
ds@1952
  1777
  },
ds@1952
  1778
  {
ds@1952
  1779
    #ifdef SCPACK
ds@1952
  1780
      "push.c %1!;$par!push.c %2!",
ds@1952
  1781
      "push2.c %1 %2!",
ds@1952
  1782
    #else
ds@1952
  1783
      "\331\336\242\221",
ds@1952
  1784
      "\2162\242\332",
ds@1952
  1785
    #endif
ds@1952
  1786
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1787
  },
ds@1952
  1788
  /* ----- */
ds@1952
  1789
  {
ds@1952
  1790
    #ifdef SCPACK
ds@1952
  1791
      "push %1!;$par!push %2!;$par!push %3!;$par!push %4!;$par!push %5!",
ds@1952
  1792
      "push5 %1 %2 %3 %4 %5!",
ds@1952
  1793
    #else
ds@1952
  1794
      "\216\336\345\256\257\335\257\2035!",
ds@1952
  1795
      "\2165\343\245\302\2035!",
ds@1952
  1796
    #endif
ds@1952
  1797
    seqsize(5,5) - seqsize(1,5)
ds@1952
  1798
  },
ds@1952
  1799
  {
ds@1952
  1800
    #ifdef SCPACK
ds@1952
  1801
      "push %1!;$par!push %2!;$par!push %3!;$par!push %4!",
ds@1952
  1802
      "push4 %1 %2 %3 %4!",
ds@1952
  1803
    #else
ds@1952
  1804
      "\216\336\345\256\257\335",
ds@1952
  1805
      "\2164\343\245\335",
ds@1952
  1806
    #endif
ds@1952
  1807
    seqsize(4,4) - seqsize(1,4)
ds@1952
  1808
  },
ds@1952
  1809
  {
ds@1952
  1810
    #ifdef SCPACK
ds@1952
  1811
      "push %1!;$par!push %2!;$par!push %3!",
ds@1952
  1812
      "push3 %1 %2 %3!",
ds@1952
  1813
    #else
ds@1952
  1814
      "\216\336\345\256",
ds@1952
  1815
      "\2163\343\256",
ds@1952
  1816
    #endif
ds@1952
  1817
    seqsize(3,3) - seqsize(1,3)
ds@1952
  1818
  },
ds@1952
  1819
  {
ds@1952
  1820
    #ifdef SCPACK
ds@1952
  1821
      "push %1!;$par!push %2!",
ds@1952
  1822
      "push2 %1 %2!",
ds@1952
  1823
    #else
ds@1952
  1824
      "\216\336\221",
ds@1952
  1825
      "\2162\332",
ds@1952
  1826
    #endif
ds@1952
  1827
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1828
  },
ds@1952
  1829
  /* ----- */
ds@1952
  1830
  {
ds@1952
  1831
    #ifdef SCPACK
ds@1952
  1832
      "push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!;$par!push.s %5!",
ds@1952
  1833
      "push5.s %1 %2 %3 %4 %5!",
ds@1952
  1834
    #else
ds@1952
  1835
      "\216\222\336\222\345\222\256\257\222\335\257\222\2035!",
ds@1952
  1836
      "\2165\222\343\245\302\2035!",
ds@1952
  1837
    #endif
ds@1952
  1838
    seqsize(5,5) - seqsize(1,5)
ds@1952
  1839
  },
ds@1952
  1840
  {
ds@1952
  1841
    #ifdef SCPACK
ds@1952
  1842
      "push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!",
ds@1952
  1843
      "push4.s %1 %2 %3 %4!",
ds@1952
  1844
    #else
ds@1952
  1845
      "\216\222\336\222\345\222\256\257\222\335",
ds@1952
  1846
      "\2164\222\343\245\335",
ds@1952
  1847
    #endif
ds@1952
  1848
    seqsize(4,4) - seqsize(1,4)
ds@1952
  1849
  },
ds@1952
  1850
  {
ds@1952
  1851
    #ifdef SCPACK
ds@1952
  1852
      "push.s %1!;$par!push.s %2!;$par!push.s %3!",
ds@1952
  1853
      "push3.s %1 %2 %3!",
ds@1952
  1854
    #else
ds@1952
  1855
      "\216\222\336\222\345\222\256",
ds@1952
  1856
      "\2163\222\343\256",
ds@1952
  1857
    #endif
ds@1952
  1858
    seqsize(3,3) - seqsize(1,3)
ds@1952
  1859
  },
ds@1952
  1860
  {
ds@1952
  1861
    #ifdef SCPACK
ds@1952
  1862
      "push.s %1!;$par!push.s %2!",
ds@1952
  1863
      "push2.s %1 %2!",
ds@1952
  1864
    #else
ds@1952
  1865
      "\216\222\336\222\221",
ds@1952
  1866
      "\2162\222\332",
ds@1952
  1867
    #endif
ds@1952
  1868
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1869
  },
ds@1952
  1870
  /* ----- */
ds@1952
  1871
  {
ds@1952
  1872
    #ifdef SCPACK
ds@1952
  1873
      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!;$par!push.adr %5!",
ds@1952
  1874
      "push5.adr %1 %2 %3 %4 %5!",
ds@1952
  1875
    #else
ds@1952
  1876
      "\216\326\336\326\345\326\256\257\326\335\257\326\2035!",
ds@1952
  1877
      "\2165\326\343\245\302\2035!",
ds@1952
  1878
    #endif
ds@1952
  1879
    seqsize(5,5) - seqsize(1,5)
ds@1952
  1880
  },
ds@1952
  1881
  {
ds@1952
  1882
    #ifdef SCPACK
ds@1952
  1883
      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!",
ds@1952
  1884
      "push4.adr %1 %2 %3 %4!",
ds@1952
  1885
    #else
ds@1952
  1886
      "\216\326\336\326\345\326\256\257\326\335",
ds@1952
  1887
      "\2164\326\343\245\335",
ds@1952
  1888
    #endif
ds@1952
  1889
    seqsize(4,4) - seqsize(1,4)
ds@1952
  1890
  },
ds@1952
  1891
  {
ds@1952
  1892
    #ifdef SCPACK
ds@1952
  1893
      "push.adr %1!;$par!push.adr %2!;$par!push.adr %3!",
ds@1952
  1894
      "push3.adr %1 %2 %3!",
ds@1952
  1895
    #else
ds@1952
  1896
      "\216\326\336\326\345\326\256",
ds@1952
  1897
      "\2163\326\343\256",
ds@1952
  1898
    #endif
ds@1952
  1899
    seqsize(3,3) - seqsize(1,3)
ds@1952
  1900
  },
ds@1952
  1901
  {
ds@1952
  1902
    #ifdef SCPACK
ds@1952
  1903
      "push.adr %1!;$par!push.adr %2!",
ds@1952
  1904
      "push2.adr %1 %2!",
ds@1952
  1905
    #else
ds@1952
  1906
      "\216\326\336\326\221",
ds@1952
  1907
      "\2162\326\332",
ds@1952
  1908
    #endif
ds@1952
  1909
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1910
  },
ds@1952
  1911
  /* Loading two registers at a time
ds@1952
  1912
   *    load.pri n1             load.both n1 n2
ds@1952
  1913
   *    load.alt n2             -
ds@1952
  1914
   *    --------------------------------------
ds@1952
  1915
   *    load.alt n2             load.both n1 n2
ds@1952
  1916
   *    load.pri n1             -
ds@1952
  1917
   *    --------------------------------------
ds@1952
  1918
   *    load.s.pri n1           load.s.both n1 n2
ds@1952
  1919
   *    load.s.alt n2           -
ds@1952
  1920
   *    --------------------------------------
ds@1952
  1921
   *    load.s.alt n2           load.s.both n1 n2
ds@1952
  1922
   *    load.s.pri n1           -
ds@1952
  1923
   */
ds@1952
  1924
  {
ds@1952
  1925
    #ifdef SCPACK
ds@1952
  1926
      "load.pri %1!load.alt %2!",
ds@1952
  1927
      "load.both %1 %2!",
ds@1952
  1928
    #else
ds@1952
  1929
      "\311\362",
ds@1952
  1930
      "\342\275th\332",
ds@1952
  1931
    #endif
ds@1952
  1932
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1933
  },
ds@1952
  1934
  {
ds@1952
  1935
    #ifdef SCPACK
ds@1952
  1936
      "load.alt %2!load.pri %1!",
ds@1952
  1937
      "load.both %1 %2!",
ds@1952
  1938
    #else
ds@1952
  1939
      "\362\311",
ds@1952
  1940
      "\342\275th\332",
ds@1952
  1941
    #endif
ds@1952
  1942
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1943
  },
ds@1952
  1944
  {
ds@1952
  1945
    #ifdef SCPACK
ds@1952
  1946
      "load.s.pri %1!load.s.alt %2!",
ds@1952
  1947
      "load.s.both %1 %2!",
ds@1952
  1948
    #else
ds@1952
  1949
      "\333\226\304",
ds@1952
  1950
      "\226.\275th\332",
ds@1952
  1951
    #endif
ds@1952
  1952
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1953
  },
ds@1952
  1954
  {
ds@1952
  1955
    #ifdef SCPACK
ds@1952
  1956
      "load.s.alt %2!load.s.pri %1!",
ds@1952
  1957
      "load.s.both %1 %2!",
ds@1952
  1958
    #else
ds@1952
  1959
      "\226\304\333",
ds@1952
  1960
      "\226.\275th\332",
ds@1952
  1961
    #endif
ds@1952
  1962
    seqsize(2,2) - seqsize(1,2)
ds@1952
  1963
  },
ds@1952
  1964
  /* Loading two registers and then pushing them occurs with user operators
ds@1952
  1965
   *    load.both n1 n2         push2 n1 n2
ds@1952
  1966
   *    push.pri                -
ds@1952
  1967
   *    push.alt                -
ds@1952
  1968
   *    --------------------------------------
ds@1952
  1969
   *    load.s.both n1 n2       push2.s n1 n2
ds@1952
  1970
   *    push.pri                -
ds@1952
  1971
   *    push.alt                -
ds@1952
  1972
   */
ds@1952
  1973
  {
ds@1952
  1974
    #ifdef SCPACK
ds@1952
  1975
      "load.both %1 %2!push.pri!push.alt!",
ds@1952
  1976
      "push2 %1 %2!",
ds@1952
  1977
    #else
ds@1952
  1978
      "\342\275th\332\244\354",
ds@1952
  1979
      "\2162\332",
ds@1952
  1980
    #endif
ds@1952
  1981
    seqsize(3,2) - seqsize(1,2)
ds@1952
  1982
  },
ds@1952
  1983
  {
ds@1952
  1984
    #ifdef SCPACK
ds@1952
  1985
      "load.s.both %1 %2!push.pri!push.alt!",
ds@1952
  1986
      "push2.s %1 %2!",
ds@1952
  1987
    #else
ds@1952
  1988
      "\226.\275th\332\244\354",
ds@1952
  1989
      "\2162\222\332",
ds@1952
  1990
    #endif
ds@1952
  1991
    seqsize(3,2) - seqsize(1,2)
ds@1952
  1992
  },
ds@1952
  1993
  /* Load a constant in a variable
ds@1952
  1994
   *    const.pri n1            const n2 n1
ds@1952
  1995
   *    stor.pri n2             -
ds@1952
  1996
   *    --------------------------------------
ds@1952
  1997
   *    const.pri n1            const.s n2 n1
ds@1952
  1998
   *    stor.s.pri n2           -
ds@1952
  1999
   */
ds@1952
  2000
  {
ds@1952
  2001
    #ifdef SCPACK
ds@1952
  2002
      "const.pri %1!stor.pri %2!",
ds@1952
  2003
      "const %2 %1!",
ds@1952
  2004
    #else
ds@1952
  2005
      "\330\227or\230",
ds@1952
  2006
      "\233\220\202",
ds@1952
  2007
    #endif
ds@1952
  2008
    seqsize(2,2) - seqsize(1,2)
ds@1952
  2009
  },
ds@1952
  2010
  {
ds@1952
  2011
    #ifdef SCPACK
ds@1952
  2012
      "const.pri %1!stor.s.pri %2!",
ds@1952
  2013
      "const.s %2 %1!",
ds@1952
  2014
    #else
ds@1952
  2015
      "\330\227or\222\230",
ds@1952
  2016
      "\233\222\220\202",
ds@1952
  2017
    #endif
ds@1952
  2018
    seqsize(2,2) - seqsize(1,2)
ds@1952
  2019
  },
ds@1952
  2020
  /* ----- */
ds@1952
  2021
  { NULL, NULL, 0 }
ds@1952
  2022
};