sourcemod/compiler-init/sc7.scp
David Anderson 75481e352b initial import of compiler test
--HG--
branch : dvander
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/branches/dvander%402
2006-07-13 20:03:46 +00:00

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: sc7.sch 3577 2006-06-02 16:22:52Z thiadmer $
*/
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 }
};