251cced1f8
Various minor things done to project files Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way) Updated regex project file and makefile --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
2023 lines
52 KiB
Plaintext
2023 lines
52 KiB
Plaintext
/* Pawn compiler - Peephole optimizer "sequences" strings (plain
|
|
* and compressed formats)
|
|
*
|
|
* Copyright (c) ITB CompuPhase, 2000-2006
|
|
*
|
|
* This software is provided "as-is", without any express or implied warranty.
|
|
* In no event will the authors be held liable for any damages arising from
|
|
* the use of this software.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
* including commercial applications, and to alter it and redistribute it
|
|
* freely, subject to the following restrictions:
|
|
*
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
* claim that you wrote the original software. If you use this software in
|
|
* a product, an acknowledgment in the product documentation would be
|
|
* appreciated but is not required.
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
* misrepresented as being the original software.
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
*
|
|
* Version: $Id$
|
|
*/
|
|
|
|
SC_FUNC int strexpand(char *dest, unsigned char *source, int maxlen, unsigned char pairtable[128][2]);
|
|
|
|
#define SCPACK_TERMINATOR , /* end each section with a comma */
|
|
|
|
#define SCPACK_TABLE sequences_table
|
|
/*-*SCPACK start of pair table, do not change or remove this line */
|
|
unsigned char sequences_table[][2] = {
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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}
|
|
};
|
|
/*-*SCPACK end of pair table, do not change or remove this line */
|
|
|
|
#define seqsize(o,p) (opcodes(o)+opargs(p))
|
|
typedef struct {
|
|
char *find;
|
|
char *replace;
|
|
int savesize; /* number of bytes saved (in bytecode) */
|
|
} SEQUENCE;
|
|
static SEQUENCE sequences_cmp[] = {
|
|
/* A very common sequence in four varieties
|
|
* load.s.pri n1 load.s.pri n2
|
|
* push.pri load.s.alt n1
|
|
* load.s.pri n2 -
|
|
* pop.alt -
|
|
* --------------------------------------
|
|
* load.pri n1 load.s.pri n2
|
|
* push.pri load.alt n1
|
|
* load.s.pri n2 -
|
|
* pop.alt -
|
|
* --------------------------------------
|
|
* load.s.pri n1 load.pri n2
|
|
* push.pri load.s.alt n1
|
|
* load.pri n2 -
|
|
* pop.alt -
|
|
* --------------------------------------
|
|
* load.pri n1 load.pri n2
|
|
* push.pri load.alt n1
|
|
* load.pri n2 -
|
|
* pop.alt -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!push.pri!load.s.pri %2!pop.alt!",
|
|
"load.s.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\226\305\241",
|
|
"\246\375",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!push.pri!load.s.pri %2!pop.alt!",
|
|
"load.s.pri %2!load.alt %1!",
|
|
#else
|
|
"\217\305\241",
|
|
"\246\374",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!push.pri!load.pri %2!pop.alt!",
|
|
"load.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\226\264\334\241",
|
|
"\334\375",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!push.pri!load.pri %2!pop.alt!",
|
|
"load.pri %2!load.alt %1!",
|
|
#else
|
|
"\217\264\334\241",
|
|
"\334\374",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
/* (#1#) The above also occurs with "addr.pri" (array
|
|
* indexing) as the first line; so that adds 2 cases.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!pop.alt!",
|
|
"addr.alt %1!load.s.pri %2!",
|
|
#else
|
|
"\364\241",
|
|
"\365",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.pri %2!pop.alt!",
|
|
"addr.alt %1!load.pri %2!",
|
|
#else
|
|
"\265\264\334\241",
|
|
"\265\243\334",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
/* And the same sequence with const.pri as either the first
|
|
* or the second load instruction: four more cases.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!pop.alt!",
|
|
"load.s.pri %2!const.alt %1!",
|
|
#else
|
|
"\363\241",
|
|
"\246\356",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.pri %2!pop.alt!",
|
|
"load.pri %2!const.alt %1!",
|
|
#else
|
|
"\233\264\334\241",
|
|
"\334\356",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!push.pri!const.pri %2!pop.alt!",
|
|
"const.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\226\264\344\241",
|
|
"\344\375",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!push.pri!const.pri %2!pop.alt!",
|
|
"const.pri %2!load.alt %1!",
|
|
#else
|
|
"\217\264\344\241",
|
|
"\344\374",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
/* The same as above, but now with "addr.pri" (array
|
|
* indexing) on the first line and const.pri on
|
|
* the second.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!const.pri %2!pop.alt!",
|
|
"addr.alt %1!const.pri %2!",
|
|
#else
|
|
"\265\264\344\241",
|
|
"\265\243\344",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!zero.pri!pop.alt!",
|
|
"addr.alt %1!zero.pri!",
|
|
#else
|
|
"\265\264\373\241",
|
|
"\265\243\373",
|
|
#endif
|
|
seqsize(4,1) - seqsize(2,1)
|
|
},
|
|
/* ??? add references */
|
|
/* Chained relational operators can contain sequences like:
|
|
* move.pri load.s.pri n1
|
|
* push.pri -
|
|
* load.s.pri n1 -
|
|
* pop.alt -
|
|
* The above also accurs for "load.pri" and for "const.pri",
|
|
* so add another two cases.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"move.pri!push.pri!load.s.pri %1!pop.alt!",
|
|
"load.s.pri %1!",
|
|
#else
|
|
"\300\236\244\333\241",
|
|
"\333",
|
|
#endif
|
|
seqsize(4,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.pri!push.pri!load.pri %1!pop.alt!",
|
|
"load.pri %1!",
|
|
#else
|
|
"\300\236\244\311\241",
|
|
"\311",
|
|
#endif
|
|
seqsize(4,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.pri!push.pri!const.pri %1!pop.alt!",
|
|
"const.pri %1!",
|
|
#else
|
|
"\300\236\244\330\241",
|
|
"\330",
|
|
#endif
|
|
seqsize(4,1) - seqsize(1,1)
|
|
},
|
|
/* More optimizations for chained relational operators; the
|
|
* continuation sequences can be simplified if they turn out
|
|
* to be termination sequences:
|
|
* xchg sless also for sless, sgeq and sleq
|
|
* sgrtr pop.alt
|
|
* swap.alt and
|
|
* and ;$exp
|
|
* pop.alt -
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* xchg sless also for sless, sgeq and sleq
|
|
* sgrtr pop.alt
|
|
* swap.alt and
|
|
* and jzer n1
|
|
* pop.alt -
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* xchg jsgeq n1 also for sless, sgeq and sleq
|
|
* sgrtr ;$exp (occurs for non-chained comparisons)
|
|
* jzer n1 -
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* xchg sless also for sless, sgeq and sleq
|
|
* sgrtr ;$exp (occurs for non-chained comparisons)
|
|
* ;$exp -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgrtr!swap.alt!and!pop.alt!;$exp!",
|
|
"sless!pop.alt!and!;$exp!",
|
|
#else
|
|
"\274\371\237swa\234\337\266\252",
|
|
"\372\266\337!\252",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sless!swap.alt!and!pop.alt!;$exp!",
|
|
"sgrtr!pop.alt!and!;$exp!",
|
|
#else
|
|
"\274\372!swa\234\337\266\252",
|
|
"\371\237\241\337!\252",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgeq!swap.alt!and!pop.alt!;$exp!",
|
|
"sleq!pop.alt!and!;$exp!",
|
|
#else
|
|
"\274\320\325swa\234\337\266\252",
|
|
"\321\262\266\337!\252",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sleq!swap.alt!and!pop.alt!;$exp!",
|
|
"sgeq!pop.alt!and!;$exp!",
|
|
#else
|
|
"\274\321\325swa\234\337\266\252",
|
|
"\320\262\266\337!\252",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgrtr!swap.alt!and!pop.alt!jzer %1!",
|
|
"sless!pop.alt!and!jzer %1!",
|
|
#else
|
|
"\274\371\237swa\234\337\266\323",
|
|
"\372\266\337!\323",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sless!swap.alt!and!pop.alt!jzer %1!",
|
|
"sgrtr!pop.alt!and!jzer %1!",
|
|
#else
|
|
"\274\372!swa\234\337\266\323",
|
|
"\371\237\241\337!\323",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgeq!swap.alt!and!pop.alt!jzer %1!",
|
|
"sleq!pop.alt!and!jzer %1!",
|
|
#else
|
|
"\274\320\325swa\234\337\266\323",
|
|
"\321\262\266\337!\323",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sleq!swap.alt!and!pop.alt!jzer %1!",
|
|
"sgeq!pop.alt!and!jzer %1!",
|
|
#else
|
|
"\274\321\325swa\234\337\266\323",
|
|
"\320\262\266\337!\323",
|
|
#endif
|
|
seqsize(5,0) - seqsize(3,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgrtr!jzer %1!;$exp!",
|
|
"jsgeq %1!;$exp!",
|
|
#else
|
|
"\274\371\237\303\301",
|
|
"j\320\262\301",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sless!jzer %1!;$exp!",
|
|
"jsleq %1!;$exp!",
|
|
#else
|
|
"\274\372!\303\301",
|
|
"j\321\262\301",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgeq!jzer %1!;$exp!",
|
|
"jsgrtr %1!;$exp!",
|
|
#else
|
|
"\274\320\325\303\301",
|
|
"j\371r\301",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sleq!jzer %1!;$exp!",
|
|
"jsless %1!;$exp!",
|
|
#else
|
|
"\274\321\325\303\301",
|
|
"j\372\301",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgrtr!;$exp!",
|
|
"sless!;$exp!",
|
|
#else
|
|
"\274\371\237\252",
|
|
"\372!\252",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sless!;$exp!",
|
|
"sgrtr!;$exp!",
|
|
#else
|
|
"\274\372!\252",
|
|
"\371\237\252",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sgeq!;$exp!",
|
|
"sleq!;$exp!",
|
|
#else
|
|
"\274\320\325\252",
|
|
"\321\325\252",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"xchg!sleq!;$exp!",
|
|
"sgeq!;$exp!",
|
|
#else
|
|
"\274\321\325\252",
|
|
"\320\325\252",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
/* The entry to chained operators is also opt to optimization
|
|
* load.s.pri n1 load.s.pri n2
|
|
* load.s.alt n2 load.s.alt n1
|
|
* xchg -
|
|
* --------------------------------------
|
|
* load.s.pri n1 load.pri n2
|
|
* load.alt n2 load.s.alt n1
|
|
* xchg -
|
|
* --------------------------------------
|
|
* load.s.pri n1 const.pri n2
|
|
* const.alt n2 load.s.alt n1
|
|
* xchg -
|
|
* --------------------------------------
|
|
* and all permutations...
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!load.s.alt %2!xchg!",
|
|
"load.s.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\333\226\304\274",
|
|
"\246\375",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!load.alt %2!xchg!",
|
|
"load.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\333\362\274",
|
|
"\334\375",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!const.alt %2!xchg!",
|
|
"const.pri %2!load.s.alt %1!",
|
|
#else
|
|
"\333\233\304\274",
|
|
"\344\375",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!load.s.alt %2!xchg!",
|
|
"load.s.pri %2!load.alt %1!",
|
|
#else
|
|
"\311\226\304\274",
|
|
"\246\374",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!load.alt %2!xchg!",
|
|
"load.pri %2!load.alt %1!",
|
|
#else
|
|
"\311\362\274",
|
|
"\334\374",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!const.alt %2!xchg!",
|
|
"const.pri %2!load.alt %1!",
|
|
#else
|
|
"\311\233\304\274",
|
|
"\344\374",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.s.alt %2!xchg!",
|
|
"load.s.pri %2!const.alt %1!",
|
|
#else
|
|
"\330\226\304\274",
|
|
"\246\356",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.alt %2!xchg!",
|
|
"load.pri %2!const.alt %1!",
|
|
#else
|
|
"\330\362\274",
|
|
"\334\356",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
/* some sequences where PRI is moved to ALT can be optimized
|
|
* further when considering what follows
|
|
* move.alt const.alt n1
|
|
* const.pri %1 -
|
|
* xchg -
|
|
* (also for load.s.pri and load.pri)
|
|
* --------------------------------------
|
|
* lref.pri %1 lref.alt %1
|
|
* move.alt [load.pri %2]
|
|
* [load.pri %2] -
|
|
* (where [load.pri %2] may also be another operatrion loading PRI)
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!const.pri %1!xchg!",
|
|
"const.alt %1!",
|
|
#else
|
|
"\306\330\274",
|
|
"\356",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.pri %1!xchg!",
|
|
"load.alt %1!",
|
|
#else
|
|
"\306\311\274",
|
|
"\374",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.s.pri %1!xchg!",
|
|
"load.s.alt %1!",
|
|
#else
|
|
"\306\333\274",
|
|
"\375",
|
|
#endif
|
|
seqsize(3,1) - seqsize(1,1)
|
|
},
|
|
/* ----- */
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.pri %1!move.alt!load.pri %2!",
|
|
"lref.alt %1!load.pri %2!",
|
|
#else
|
|
"\350\225\306\334",
|
|
"\350\243\334",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.pri %1!move.alt!load.s.pri %2!",
|
|
"lref.alt %1!load.s.pri %2!",
|
|
#else
|
|
"\350\225\306\246",
|
|
"\350\310",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.pri %1!move.alt!const.pri %2!",
|
|
"lref.alt %1!const.pri %2!",
|
|
#else
|
|
"\350\225\306\344",
|
|
"\350\243\344",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.s.pri %1!move.alt!load.pri %2!",
|
|
"lref.s.alt %1!load.pri %2!",
|
|
#else
|
|
"\350\222\225\306\334",
|
|
"\350\222\243\334",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.s.pri %1!move.alt!load.s.pri %2!",
|
|
"lref.s.alt %1!load.s.pri %2!",
|
|
#else
|
|
"\350\222\225\306\246",
|
|
"\350\222\310",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"lref.s.pri %1!move.alt!const.pri %2!",
|
|
"lref.s.alt %1!const.pri %2!",
|
|
#else
|
|
"\350\222\225\306\344",
|
|
"\350\222\243\344",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
/* Array indexing can merit from special instructions.
|
|
* Simple indexed array lookup can be optimized quite
|
|
* a bit.
|
|
* addr.pri n1 addr.alt n1
|
|
* push.pri load.s.pri n2
|
|
* load.s.pri n2 bounds n3
|
|
* bounds n3 lidx.b n4
|
|
* shl.c.pri n4 -
|
|
* pop.alt -
|
|
* add -
|
|
* load.i -
|
|
*
|
|
* And to prepare for storing a value in an array
|
|
* addr.pri n1 addr.alt n1
|
|
* push.pri load.s.pri n2
|
|
* load.s.pri n2 bounds n3
|
|
* bounds n3 idxaddr.b n4
|
|
* shl.c.pri n4 -
|
|
* pop.alt -
|
|
* add -
|
|
*
|
|
* Notes (additional cases):
|
|
* 1. instruction addr.pri can also be const.pri (for
|
|
* global arrays)
|
|
* 2. the bounds instruction can be absent
|
|
* 3. when "n4" (the shift value) is the 2 (with 32-bit cells), use the
|
|
* even more optimal instructions LIDX and IDDXADDR
|
|
*
|
|
* If the array index is more complex, one can only optimize
|
|
* the last four instructions:
|
|
* shl.c.pri n1 pop.alt
|
|
* pop.alt lidx.b n1
|
|
* add -
|
|
* loadi -
|
|
* --------------------------------------
|
|
* shl.c.pri n1 pop.alt
|
|
* pop.alt idxaddr.b n1
|
|
* add -
|
|
*/
|
|
#if !defined BIT16
|
|
/* loading from array, "cell" shifted */
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
|
|
"addr.alt %1!load.s.pri %2!bounds %3!lidx!",
|
|
#else
|
|
"\364\316\370\342\355",
|
|
"\365\316\366!",
|
|
#endif
|
|
seqsize(8,4) - seqsize(4,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!load.i!",
|
|
"const.alt %1!load.s.pri %2!bounds %3!lidx!",
|
|
#else
|
|
"\363\316\370\342\355",
|
|
"\376\316\366!",
|
|
#endif
|
|
seqsize(8,4) - seqsize(4,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
|
|
"addr.alt %1!load.s.pri %2!lidx!",
|
|
#else
|
|
"\364\370\342\355",
|
|
"\365\366!",
|
|
#endif
|
|
seqsize(7,3) - seqsize(3,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!load.i!",
|
|
"const.alt %1!load.s.pri %2!lidx!",
|
|
#else
|
|
"\363\370\342\355",
|
|
"\376\366!",
|
|
#endif
|
|
seqsize(7,3) - seqsize(3,2)
|
|
},
|
|
#endif
|
|
/* loading from array, not "cell" shifted */
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
|
|
"addr.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
|
|
#else
|
|
"\364\316\327\302\341\342\355",
|
|
"\365\316\366\367\335",
|
|
#endif
|
|
seqsize(8,4) - seqsize(4,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!load.i!",
|
|
"const.alt %1!load.s.pri %2!bounds %3!lidx.b %4!",
|
|
#else
|
|
"\363\316\327\302\341\342\355",
|
|
"\376\316\366\367\335",
|
|
#endif
|
|
seqsize(8,4) - seqsize(4,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
|
|
"addr.alt %1!load.s.pri %2!lidx.b %3!",
|
|
#else
|
|
"\364\327\256\241\271\342\355",
|
|
"\365\366\367\256",
|
|
#endif
|
|
seqsize(7,3) - seqsize(3,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!load.i!",
|
|
"const.alt %1!load.s.pri %2!lidx.b %3!",
|
|
#else
|
|
"\363\327\256\241\271\342\355",
|
|
"\376\366\367\256",
|
|
#endif
|
|
seqsize(7,3) - seqsize(3,3)
|
|
},
|
|
#if !defined BIT16
|
|
/* array index calculation for storing a value, "cell" aligned */
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
|
|
"addr.alt %1!load.s.pri %2!bounds %3!idxaddr!",
|
|
#else
|
|
"\364\316\370",
|
|
"\365\316\322\235\237",
|
|
#endif
|
|
seqsize(7,4) - seqsize(4,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri 2!pop.alt!add!",
|
|
"const.alt %1!load.s.pri %2!bounds %3!idxaddr!",
|
|
#else
|
|
"\363\316\370",
|
|
"\376\316\322\235\237",
|
|
#endif
|
|
seqsize(7,4) - seqsize(4,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
|
|
"addr.alt %1!load.s.pri %2!idxaddr!",
|
|
#else
|
|
"\364\370",
|
|
"\365\322\235\237",
|
|
#endif
|
|
seqsize(6,3) - seqsize(3,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!shl.c.pri 2!pop.alt!add!",
|
|
"const.alt %1!load.s.pri %2!idxaddr!",
|
|
#else
|
|
"\363\370",
|
|
"\376\322\235\237",
|
|
#endif
|
|
seqsize(6,3) - seqsize(3,2)
|
|
},
|
|
#endif
|
|
/* array index calculation for storing a value, not "cell" packed */
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
|
|
"addr.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
|
|
#else
|
|
"\364\316\327\302\341",
|
|
"\365\316\322\265\367\335",
|
|
#endif
|
|
seqsize(7,4) - seqsize(4,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!bounds %3!shl.c.pri %4!pop.alt!add!",
|
|
"const.alt %1!load.s.pri %2!bounds %3!idxaddr.b %4!",
|
|
#else
|
|
"\363\316\327\302\341",
|
|
"\376\316\322\265\367\335",
|
|
#endif
|
|
seqsize(7,4) - seqsize(4,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
|
|
"addr.alt %1!load.s.pri %2!idxaddr.b %3!",
|
|
#else
|
|
"\364\327\256\241\271",
|
|
"\365\322\265\367\256",
|
|
#endif
|
|
seqsize(6,3) - seqsize(3,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!shl.c.pri %3!pop.alt!add!",
|
|
"const.alt %1!load.s.pri %2!idxaddr.b %3!",
|
|
#else
|
|
"\363\327\256\241\271",
|
|
"\376\322\265\367\256",
|
|
#endif
|
|
seqsize(6,3) - seqsize(3,3)
|
|
},
|
|
#if !defined BIT16
|
|
/* the shorter array indexing sequences, see above for comments */
|
|
{
|
|
#ifdef SCPACK
|
|
"shl.c.pri 2!pop.alt!add!loadi!",
|
|
"pop.alt!lidx!",
|
|
#else
|
|
"\370\217\355",
|
|
"\241\366!",
|
|
#endif
|
|
seqsize(4,1) - seqsize(2,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"shl.c.pri 2!pop.alt!add!",
|
|
"pop.alt!idxaddr!",
|
|
#else
|
|
"\370",
|
|
"\241\322\235\237",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,0)
|
|
},
|
|
#endif
|
|
{
|
|
#ifdef SCPACK
|
|
"shl.c.pri %1!pop.alt!add!loadi!",
|
|
"pop.alt!lidx.b %1!",
|
|
#else
|
|
"\314\225\241\271\217\355",
|
|
"\241\366\367\202",
|
|
#endif
|
|
seqsize(4,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"shl.c.pri %1!pop.alt!add!",
|
|
"pop.alt!idxaddr.b %1!",
|
|
#else
|
|
"\314\225\241\271",
|
|
"\241\322\265\367\202",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
/* For packed arrays, there is another case (packed arrays
|
|
* do not take advantage of the LIDX or IDXADDR instructions).
|
|
* addr.pri n1 addr.alt n1
|
|
* push.pri load.s.pri n2
|
|
* load.s.pri n2 bounds n3
|
|
* bounds n3 -
|
|
* pop.alt -
|
|
*
|
|
* Notes (additional cases):
|
|
* 1. instruction addr.pri can also be const.pri (for
|
|
* global arrays)
|
|
* 2. the bounds instruction can be absent, but that
|
|
* case is already handled (see #1#)
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
|
|
"addr.alt %1!load.s.pri %2!bounds %3!",
|
|
#else
|
|
"\364\316\241",
|
|
"\365\316",
|
|
#endif
|
|
seqsize(5,3) - seqsize(3,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!load.s.pri %2!bounds %3!pop.alt!",
|
|
"const.alt %1!load.s.pri %2!bounds %3!",
|
|
#else
|
|
"\363\316\241",
|
|
"\376\316",
|
|
#endif
|
|
seqsize(5,3) - seqsize(3,3)
|
|
},
|
|
/* Declaration of simple variables often follows the sequence:
|
|
* ;$lcl <name> <stk> ;$lcl <name> <stk>
|
|
* stack -4 push.c <constval>
|
|
* const.pri <constval> ;$exp
|
|
* stor.s.pri <stk> -
|
|
* ;$exp -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
";$lcl %1 %2!stack -4!const.pri %3!stor.s.pri %2!;$exp!",
|
|
";$lcl %1 %2!push.c %3!;$exp!",
|
|
#else
|
|
"\224lcl\332\227ack -4!\233\206\256\227or\222\230\252",
|
|
"\224lcl\332\331\256\252",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
";$lcl %1 %2!stack -4!zero.pri!stor.s.pri %2!;$exp!",
|
|
";$lcl %1 %2!push.c 0!;$exp!",
|
|
#else
|
|
"\224lcl\332\227ack -4!\373\227or\222\230\252",
|
|
"\224lcl\332\331 0!\252",
|
|
#endif
|
|
seqsize(3,2) - seqsize(1,1)
|
|
},
|
|
/* During a calculation, the intermediate result must sometimes
|
|
* be moved from PRI to ALT, like in:
|
|
* push.pri move.alt
|
|
* load.s.pri n1 load.s.pri n1
|
|
* pop.alt -
|
|
*
|
|
* The above also accurs for "load.pri" and for "const.pri",
|
|
* so add another two cases.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!load.s.pri %1!pop.alt!",
|
|
"move.alt!load.s.pri %1!",
|
|
#else
|
|
"\244\333\241",
|
|
"\306\333",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!load.pri %1!pop.alt!",
|
|
"move.alt!load.pri %1!",
|
|
#else
|
|
"\244\311\241",
|
|
"\306\311",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!const.pri %1!pop.alt!",
|
|
"move.alt!const.pri %1!",
|
|
#else
|
|
"\244\330\241",
|
|
"\306\330",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!zero.pri!pop.alt!",
|
|
"move.alt!zero.pri!",
|
|
#else
|
|
"\244\373\241",
|
|
"\306\373",
|
|
#endif
|
|
seqsize(3,0) - seqsize(2,0)
|
|
},
|
|
/* saving PRI and then loading from its address
|
|
* occurs when indexing a multi-dimensional array
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!load.i!pop.alt!",
|
|
"move.alt!load.i!",
|
|
#else
|
|
"\244\342i\266",
|
|
"\306\342\355",
|
|
#endif
|
|
seqsize(3,0) - seqsize(2,0)
|
|
},
|
|
/* An even simpler PUSH/POP optimization (occurs in
|
|
* switch statements):
|
|
* push.pri move.alt
|
|
* pop.alt -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"push.pri!pop.alt!",
|
|
"move.alt!",
|
|
#else
|
|
"\244\241",
|
|
"\306",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
/* Some simple arithmetic sequences
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.s.pri %1!add!",
|
|
"load.s.alt %1!add!",
|
|
#else
|
|
"\306\333\271",
|
|
"\375\271",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.pri %1!add!",
|
|
"load.alt %1!add!",
|
|
#else
|
|
"\306\311\271",
|
|
"\374\271",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!const.pri %1!add!",
|
|
"const.alt %1!add!",
|
|
#else
|
|
"\306\330\271",
|
|
"\356\271",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.s.pri %1!sub.alt!",
|
|
"load.s.alt %1!sub!",
|
|
#else
|
|
"\306\333sub\223",
|
|
"\375sub!",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!load.pri %1!sub.alt!",
|
|
"load.alt %1!sub!",
|
|
#else
|
|
"\306\311sub\223",
|
|
"\374sub!",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"move.alt!const.pri %1!sub.alt!",
|
|
"const.alt %1!sub!",
|
|
#else
|
|
"\306\330sub\223",
|
|
"\356sub!",
|
|
#endif
|
|
seqsize(3,1) - seqsize(2,1)
|
|
},
|
|
/* User-defined operators first load the operands into registers and
|
|
* then have them pushed onto the stack. This can give rise to sequences
|
|
* like:
|
|
* const.pri n1 push.c n1
|
|
* const.alt n2 push.c n2
|
|
* push.pri -
|
|
* push.alt -
|
|
* A similar sequence occurs with the two PUSH.pri/alt instructions inverted.
|
|
* The first, second, or both CONST.pri/alt instructions can also be
|
|
* LOAD.pri/alt.
|
|
* This gives 2 x 4 cases.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!const.alt %2!push.pri!push.alt!",
|
|
"push.c %1!push.c %2!",
|
|
#else
|
|
"\330\233\304\244\354",
|
|
"\331\202\331\221",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!const.alt %2!push.alt!push.pri!",
|
|
"push.c %2!push.c %1!",
|
|
#else
|
|
"\330\233\304\354\244",
|
|
"\331\221\331\202",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.alt %2!push.pri!push.alt!",
|
|
"push.c %1!push %2!",
|
|
#else
|
|
"\330\362\244\354",
|
|
"\331\202\216\221",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.alt %2!push.alt!push.pri!",
|
|
"push %2!push.c %1!",
|
|
#else
|
|
"\330\362\354\244",
|
|
"\216\221\331\202",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!const.alt %2!push.pri!push.alt!",
|
|
"push %1!push.c %2!",
|
|
#else
|
|
"\311\233\304\244\354",
|
|
"\216\202\331\221",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!const.alt %2!push.alt!push.pri!",
|
|
"push.c %2!push %1!",
|
|
#else
|
|
"\311\233\304\354\244",
|
|
"\331\221\216\202",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!load.alt %2!push.pri!push.alt!",
|
|
"push %1!push %2!",
|
|
#else
|
|
"\311\362\244\354",
|
|
"\216\202\216\221",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!load.alt %2!push.alt!push.pri!",
|
|
"push %2!push %1!",
|
|
#else
|
|
"\311\362\354\244",
|
|
"\216\221\216\202",
|
|
#endif
|
|
seqsize(4,2) - seqsize(2,2)
|
|
},
|
|
/* Function calls (parameters are passed on the stack)
|
|
* load.s.pri n1 push.s n1
|
|
* push.pri -
|
|
* --------------------------------------
|
|
* load.pri n1 push n1
|
|
* push.pri -
|
|
* --------------------------------------
|
|
* const.pri n1 push.c n1
|
|
* push.pri -
|
|
* --------------------------------------
|
|
* zero.pri push.c 0
|
|
* push.pri -
|
|
* --------------------------------------
|
|
* addr.pri n1 push.adr n1
|
|
* push.pri -
|
|
*
|
|
* However, PRI must not be needed after this instruction
|
|
* if this shortcut is used. Check for the ;$par comment.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!push.pri!;$par!",
|
|
"push.s %1!;$par!",
|
|
#else
|
|
"\226\264\255",
|
|
"\216\222\202\255",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!push.pri!;$par!",
|
|
"push %1!;$par!",
|
|
#else
|
|
"\217\264\255",
|
|
"\216\202\255",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!push.pri!;$par!",
|
|
"push.c %1!;$par!",
|
|
#else
|
|
"\233\264\255",
|
|
"\331\202\255",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"zero.pri!push.pri!;$par!",
|
|
"push.c 0!;$par!",
|
|
#else
|
|
"\373\244\255",
|
|
"\331 0!\255",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"addr.pri %1!push.pri!;$par!",
|
|
"push.adr %1!;$par!",
|
|
#else
|
|
"\265\264\255",
|
|
"\216\326\202\255",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
/* References with a default value generate new cells on the heap
|
|
* dynamically. That code often ends with:
|
|
* move.pri push.alt
|
|
* push.pri -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"move.pri!push.pri!",
|
|
"push.alt!",
|
|
#else
|
|
"\300\236\244",
|
|
"\354",
|
|
#endif
|
|
seqsize(2,0) - seqsize(1,0)
|
|
},
|
|
/* Simple arithmetic operations on constants. Noteworthy is the
|
|
* subtraction of a constant, since it is converted to the addition
|
|
* of the inverse value.
|
|
* const.alt n1 add.c n1
|
|
* add -
|
|
* --------------------------------------
|
|
* const.alt n1 add.c -n1
|
|
* sub -
|
|
* --------------------------------------
|
|
* const.alt n1 smul.c n1
|
|
* smul -
|
|
* --------------------------------------
|
|
* const.alt n1 eq.c.pri n1
|
|
* eq -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.alt %1!add!",
|
|
"add.c %1!",
|
|
#else
|
|
"\356\271",
|
|
"\235\242\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.alt %1!sub!",
|
|
"add.c -%1!",
|
|
#else
|
|
"\356sub!",
|
|
"\235\242 -\201",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.alt %1!smul!",
|
|
"smul.c %1!",
|
|
#else
|
|
"\356smul!",
|
|
"smu\307\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.alt %1!eq!",
|
|
"eq.c.pri %1!",
|
|
#else
|
|
"\356\325",
|
|
"\262\242\225",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
/* Some operations use the alternative subtraction operation --these
|
|
* can also be optimized.
|
|
* const.pri n1 load.s.pri n2
|
|
* load.s.alt n2 add.c -n1
|
|
* sub.alt -
|
|
* --------------------------------------
|
|
* const.pri n1 load.pri n2
|
|
* load.alt n2 add.c -n1
|
|
* sub.alt -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.s.alt %2!sub.alt!",
|
|
"load.s.pri %2!add.c -%1!",
|
|
#else
|
|
"\330\226\304sub\223",
|
|
"\246\235\242 -\201",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!load.alt %2!sub.alt!",
|
|
"load.pri %2!add.c -%1!",
|
|
#else
|
|
"\330\362sub\223",
|
|
"\334\235\242 -\201",
|
|
#endif
|
|
seqsize(3,2) - seqsize(2,2)
|
|
},
|
|
/* With arrays indexed with constants that come from enumerations, it happens
|
|
* multiple add.c opcodes follow in sequence.
|
|
* add.c n1 add.c n1+n2
|
|
* add.c n2 -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"add.c %1!add.c %2!",
|
|
"add.c %1+%2!",
|
|
#else
|
|
"\235\242\202\235\242\221",
|
|
"\235\242\267+%2!",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
/* Compare and jump
|
|
* eq jneq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* eq jeq n1
|
|
* jnz n1 -
|
|
* --------------------------------------
|
|
* neq jeq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* neq jneq n1
|
|
* jnz n1 -
|
|
* Compares followed by jzer occur much more
|
|
* often than compares followed with jnz. So we
|
|
* take the easy route here.
|
|
* less jgeq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* leq jgrtr n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* grtr jleq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* geq jless n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* sless jsgeq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* sleq jsgrtr n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* sgrtr jsleq n1
|
|
* jzer n1 -
|
|
* --------------------------------------
|
|
* sgeq jsless n1
|
|
* jzer n1 -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"eq!jzer %1!",
|
|
"jneq %1!",
|
|
#else
|
|
"\325\323",
|
|
"jn\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"eq!jnz %1!",
|
|
"jeq %1!",
|
|
#else
|
|
"\325jnz\202",
|
|
"j\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"neq!jzer %1!",
|
|
"jeq %1!",
|
|
#else
|
|
"n\325\323",
|
|
"j\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"neq!jnz %1!",
|
|
"jneq %1!",
|
|
#else
|
|
"n\325jnz\202",
|
|
"jn\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"less!jzer %1!",
|
|
"jgeq %1!",
|
|
#else
|
|
"l\352!\323",
|
|
"jg\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"leq!jzer %1!",
|
|
"jgrtr %1!",
|
|
#else
|
|
"l\325\323",
|
|
"jg\353r\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"grtr!jzer %1!",
|
|
"jleq %1!",
|
|
#else
|
|
"g\353\237\323",
|
|
"jl\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"geq!jzer %1!",
|
|
"jless %1!",
|
|
#else
|
|
"g\325\323",
|
|
"jl\352\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"sless!jzer %1!",
|
|
"jsgeq %1!",
|
|
#else
|
|
"\372!\323",
|
|
"j\320\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"sleq!jzer %1!",
|
|
"jsgrtr %1!",
|
|
#else
|
|
"\321\325\323",
|
|
"j\371r\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"sgrtr!jzer %1!",
|
|
"jsleq %1!",
|
|
#else
|
|
"\371\237\323",
|
|
"j\321\357",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"sgeq!jzer %1!",
|
|
"jsless %1!",
|
|
#else
|
|
"\320\325\323",
|
|
"j\372\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
/* Test for zero (common case, especially for strings)
|
|
* E.g. the test expression of: "for (i=0; str{i}!=0; ++i)"
|
|
*
|
|
* zero.alt jzer n1
|
|
* jeq n1 -
|
|
* --------------------------------------
|
|
* zero.alt jnz n1
|
|
* jneq n1 -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"zero.alt!jeq %1!",
|
|
"jzer %1!",
|
|
#else
|
|
"\340\223j\357",
|
|
"\323",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"zero.alt!jneq %1!",
|
|
"jnz %1!",
|
|
#else
|
|
"\340\223jn\357",
|
|
"jnz\202",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
/* Incrementing and decrementing leaves a value in
|
|
* in PRI which may not be used (for example, as the
|
|
* third expression in a "for" loop).
|
|
* inc n1 inc n1 ; ++n
|
|
* load.pri n1 ;$exp
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* load.pri n1 inc n1 ; n++, e.g. "for (n=0; n<10; n++)"
|
|
* inc n1 ;$exp
|
|
* ;$exp -
|
|
* Plus the varieties for stack relative increments
|
|
* and decrements.
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"inc %1!load.pri %1!;$exp!",
|
|
"inc %1!;$exp!",
|
|
#else
|
|
"inc\202\311\252",
|
|
"inc\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!inc %1!;$exp!",
|
|
"inc %1!;$exp!",
|
|
#else
|
|
"\311inc\301",
|
|
"inc\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"inc.s %1!load.s.pri %1!;$exp!",
|
|
"inc.s %1!;$exp!",
|
|
#else
|
|
"inc\222\202\333\252",
|
|
"inc\222\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!inc.s %1!;$exp!",
|
|
"inc.s %1!;$exp!",
|
|
#else
|
|
"\333inc\222\301",
|
|
"inc\222\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"dec %1!load.pri %1!;$exp!",
|
|
"dec %1!;$exp!",
|
|
#else
|
|
"dec\202\311\252",
|
|
"dec\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!dec %1!;$exp!",
|
|
"dec %1!;$exp!",
|
|
#else
|
|
"\311dec\301",
|
|
"dec\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"dec.s %1!load.s.pri %1!;$exp!",
|
|
"dec.s %1!;$exp!",
|
|
#else
|
|
"dec\222\202\333\252",
|
|
"dec\222\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!dec.s %1!;$exp!",
|
|
"dec.s %1!;$exp!",
|
|
#else
|
|
"\333dec\222\301",
|
|
"dec\222\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
/* ??? the same (increments and decrements) for references */
|
|
/* Loading the constant zero has a special opcode.
|
|
* When storing zero in memory, the value of PRI must not be later on.
|
|
* const.pri 0 zero n1
|
|
* stor.pri n1 ;$exp
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* const.pri 0 zero.s n1
|
|
* stor.s.pri n1 ;$exp
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* zero.pri zero n1
|
|
* stor.pri n1 ;$exp
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* zero.pri zero.s n1
|
|
* stor.s.pri n1 ;$exp
|
|
* ;$exp -
|
|
* --------------------------------------
|
|
* const.pri 0 zero.pri
|
|
* --------------------------------------
|
|
* const.alt 0 zero.alt
|
|
* The last two alternatives save more memory than they save
|
|
* time, but anyway...
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri 0!stor.pri %1!;$exp!",
|
|
"zero %1!;$exp!",
|
|
#else
|
|
"\233\206 0!\227or\225\252",
|
|
"\340\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri 0!stor.s.pri %1!;$exp!",
|
|
"zero.s %1!;$exp!",
|
|
#else
|
|
"\233\206 0!\227or\222\225\252",
|
|
"\340\222\301",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"zero.pri!stor.pri %1!;$exp!",
|
|
"zero %1!;$exp!",
|
|
#else
|
|
"\373\227or\225\252",
|
|
"\340\301",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"zero.pri!stor.s.pri %1!;$exp!",
|
|
"zero.s %1!;$exp!",
|
|
#else
|
|
"\373\227or\222\225\252",
|
|
"\340\222\301",
|
|
#endif
|
|
seqsize(2,1) - seqsize(1,1)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri 0!",
|
|
"zero.pri!",
|
|
#else
|
|
"\233\206 0!",
|
|
"\373",
|
|
#endif
|
|
seqsize(1,1) - seqsize(1,0)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.alt 0!",
|
|
"zero.alt!",
|
|
#else
|
|
"\233\212 0!",
|
|
"\340\223",
|
|
#endif
|
|
seqsize(1,1) - seqsize(1,0)
|
|
},
|
|
|
|
/* ------------------ */
|
|
/* Macro instructions */
|
|
/* ------------------ */
|
|
|
|
{ "", "", 0 }, /* separator, so optimizer can stop before generating macro opcodes */
|
|
|
|
/* optimizing the calling of native functions (which always have a parameter
|
|
* count pushed before, and the stack pointer restored afterwards
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"push.c %1!sysreq.c %2!stack %3!", //note: %3 == %1 + 4
|
|
"sysreq.n %2 %1!",
|
|
#else
|
|
"\331\202sysr\262\242\221\227ack\256",
|
|
"sysr\262.n\220\202",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,2)
|
|
},
|
|
/* ----- */
|
|
/* Functions with many parameters with the same "type" have sequences like:
|
|
* push.c n1 push3.c n1 n2 n3
|
|
* ;$par ;$par
|
|
* push.c n2 -
|
|
* ;$par -
|
|
* push.c n3 -
|
|
* ;$par -
|
|
* etc. etc.
|
|
*
|
|
* Similar sequences occur with PUSH, PUSH.s and PUSHADDR
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!;$par!push.c %5!",
|
|
"push5.c %1 %2 %3 %4 %5!",
|
|
#else
|
|
"\331\336\242\345\242\256\257\242\335\257\242\2035!",
|
|
"\2165\242\343\245\302\2035!",
|
|
#endif
|
|
seqsize(5,5) - seqsize(1,5)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.c %1!;$par!push.c %2!;$par!push.c %3!;$par!push.c %4!",
|
|
"push4.c %1 %2 %3 %4!",
|
|
#else
|
|
"\331\336\242\345\242\256\257\242\335",
|
|
"\2164\242\343\245\335",
|
|
#endif
|
|
seqsize(4,4) - seqsize(1,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.c %1!;$par!push.c %2!;$par!push.c %3!",
|
|
"push3.c %1 %2 %3!",
|
|
#else
|
|
"\331\336\242\345\242\256",
|
|
"\2163\242\343\256",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.c %1!;$par!push.c %2!",
|
|
"push2.c %1 %2!",
|
|
#else
|
|
"\331\336\242\221",
|
|
"\2162\242\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* ----- */
|
|
{
|
|
#ifdef SCPACK
|
|
"push %1!;$par!push %2!;$par!push %3!;$par!push %4!;$par!push %5!",
|
|
"push5 %1 %2 %3 %4 %5!",
|
|
#else
|
|
"\216\336\345\256\257\335\257\2035!",
|
|
"\2165\343\245\302\2035!",
|
|
#endif
|
|
seqsize(5,5) - seqsize(1,5)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push %1!;$par!push %2!;$par!push %3!;$par!push %4!",
|
|
"push4 %1 %2 %3 %4!",
|
|
#else
|
|
"\216\336\345\256\257\335",
|
|
"\2164\343\245\335",
|
|
#endif
|
|
seqsize(4,4) - seqsize(1,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push %1!;$par!push %2!;$par!push %3!",
|
|
"push3 %1 %2 %3!",
|
|
#else
|
|
"\216\336\345\256",
|
|
"\2163\343\256",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push %1!;$par!push %2!",
|
|
"push2 %1 %2!",
|
|
#else
|
|
"\216\336\221",
|
|
"\2162\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* ----- */
|
|
{
|
|
#ifdef SCPACK
|
|
"push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!;$par!push.s %5!",
|
|
"push5.s %1 %2 %3 %4 %5!",
|
|
#else
|
|
"\216\222\336\222\345\222\256\257\222\335\257\222\2035!",
|
|
"\2165\222\343\245\302\2035!",
|
|
#endif
|
|
seqsize(5,5) - seqsize(1,5)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.s %1!;$par!push.s %2!;$par!push.s %3!;$par!push.s %4!",
|
|
"push4.s %1 %2 %3 %4!",
|
|
#else
|
|
"\216\222\336\222\345\222\256\257\222\335",
|
|
"\2164\222\343\245\335",
|
|
#endif
|
|
seqsize(4,4) - seqsize(1,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.s %1!;$par!push.s %2!;$par!push.s %3!",
|
|
"push3.s %1 %2 %3!",
|
|
#else
|
|
"\216\222\336\222\345\222\256",
|
|
"\2163\222\343\256",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.s %1!;$par!push.s %2!",
|
|
"push2.s %1 %2!",
|
|
#else
|
|
"\216\222\336\222\221",
|
|
"\2162\222\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* ----- */
|
|
{
|
|
#ifdef SCPACK
|
|
"push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!;$par!push.adr %5!",
|
|
"push5.adr %1 %2 %3 %4 %5!",
|
|
#else
|
|
"\216\326\336\326\345\326\256\257\326\335\257\326\2035!",
|
|
"\2165\326\343\245\302\2035!",
|
|
#endif
|
|
seqsize(5,5) - seqsize(1,5)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.adr %1!;$par!push.adr %2!;$par!push.adr %3!;$par!push.adr %4!",
|
|
"push4.adr %1 %2 %3 %4!",
|
|
#else
|
|
"\216\326\336\326\345\326\256\257\326\335",
|
|
"\2164\326\343\245\335",
|
|
#endif
|
|
seqsize(4,4) - seqsize(1,4)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.adr %1!;$par!push.adr %2!;$par!push.adr %3!",
|
|
"push3.adr %1 %2 %3!",
|
|
#else
|
|
"\216\326\336\326\345\326\256",
|
|
"\2163\326\343\256",
|
|
#endif
|
|
seqsize(3,3) - seqsize(1,3)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"push.adr %1!;$par!push.adr %2!",
|
|
"push2.adr %1 %2!",
|
|
#else
|
|
"\216\326\336\326\221",
|
|
"\2162\326\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* Loading two registers at a time
|
|
* load.pri n1 load.both n1 n2
|
|
* load.alt n2 -
|
|
* --------------------------------------
|
|
* load.alt n2 load.both n1 n2
|
|
* load.pri n1 -
|
|
* --------------------------------------
|
|
* load.s.pri n1 load.s.both n1 n2
|
|
* load.s.alt n2 -
|
|
* --------------------------------------
|
|
* load.s.alt n2 load.s.both n1 n2
|
|
* load.s.pri n1 -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"load.pri %1!load.alt %2!",
|
|
"load.both %1 %2!",
|
|
#else
|
|
"\311\362",
|
|
"\342\275th\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.alt %2!load.pri %1!",
|
|
"load.both %1 %2!",
|
|
#else
|
|
"\362\311",
|
|
"\342\275th\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.pri %1!load.s.alt %2!",
|
|
"load.s.both %1 %2!",
|
|
#else
|
|
"\333\226\304",
|
|
"\226.\275th\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.alt %2!load.s.pri %1!",
|
|
"load.s.both %1 %2!",
|
|
#else
|
|
"\226\304\333",
|
|
"\226.\275th\332",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* Loading two registers and then pushing them occurs with user operators
|
|
* load.both n1 n2 push2 n1 n2
|
|
* push.pri -
|
|
* push.alt -
|
|
* --------------------------------------
|
|
* load.s.both n1 n2 push2.s n1 n2
|
|
* push.pri -
|
|
* push.alt -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"load.both %1 %2!push.pri!push.alt!",
|
|
"push2 %1 %2!",
|
|
#else
|
|
"\342\275th\332\244\354",
|
|
"\2162\332",
|
|
#endif
|
|
seqsize(3,2) - seqsize(1,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"load.s.both %1 %2!push.pri!push.alt!",
|
|
"push2.s %1 %2!",
|
|
#else
|
|
"\226.\275th\332\244\354",
|
|
"\2162\222\332",
|
|
#endif
|
|
seqsize(3,2) - seqsize(1,2)
|
|
},
|
|
/* Load a constant in a variable
|
|
* const.pri n1 const n2 n1
|
|
* stor.pri n2 -
|
|
* --------------------------------------
|
|
* const.pri n1 const.s n2 n1
|
|
* stor.s.pri n2 -
|
|
*/
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!stor.pri %2!",
|
|
"const %2 %1!",
|
|
#else
|
|
"\330\227or\230",
|
|
"\233\220\202",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
{
|
|
#ifdef SCPACK
|
|
"const.pri %1!stor.s.pri %2!",
|
|
"const.s %2 %1!",
|
|
#else
|
|
"\330\227or\222\230",
|
|
"\233\222\220\202",
|
|
#endif
|
|
seqsize(2,2) - seqsize(1,2)
|
|
},
|
|
/* ----- */
|
|
{ NULL, NULL, 0 }
|
|
};
|