From 0aba449b68c7f1f31699b9cf38026cc8142dec24 Mon Sep 17 00:00:00 2001 From: Zeex Date: Sat, 25 Jan 2014 23:21:33 +0700 Subject: [PATCH] Apply patch from upstream SVN r4641 BUG fix: the optimizer created incorrect code for subtraction a variable from a constant. https://code.google.com/p/pawnscript/source/detail?r=38 Fixes #10. --- source/compiler/sc7.scp | 150 +++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 80 deletions(-) diff --git a/source/compiler/sc7.scp b/source/compiler/sc7.scp index 76180f1..5ca0b26 100644 --- a/source/compiler/sc7.scp +++ b/source/compiler/sc7.scp @@ -30,13 +30,13 @@ SC_FUNC int strexpand(char *dest, unsigned char *source, int maxlen, unsigned ch /*-*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}, {59,36}, {138,33}, {134,130}, {143,146}, {115,116}, {134,145}, {114,33}, {110,151}, {111,154}, {99,155}, {112,148}, {135,100}, {134,33}, - {97,153}, {112,160}, {147,161}, {111,157}, {112,163}, {46,99}, {138,130}, {142,159}, {131,51}, {150,152}, {112,33}, {120,170}, {101,171}, {147,172}, {168,33}, {162,142}, + {131,50}, {144,33}, {46,115}, {59,36}, {138,33}, {134,130}, {143,146}, {134,145}, {115,116}, {114,33}, {110,152}, {111,154}, {99,155}, {112,148}, {135,100}, {134,33}, + {97,153}, {112,160}, {147,161}, {111,157}, {112,163}, {46,99}, {138,130}, {142,159}, {131,51}, {150,151}, {112,33}, {120,170}, {101,171}, {147,172}, {168,33}, {162,142}, {101,113}, {110,100}, {122,101}, {178,114}, {149,167}, {158,114}, {33,164}, {131,49}, {103,33}, {158,33}, {104,184}, {99,186}, {120,187}, {98,111}, {118,101}, {111,190}, {109,191}, {130,173}, {131,52}, {115,103}, {115,108}, {138,145}, {180,169}, {192,148}, {108,165}, {166,169}, {143,149}, {115,174}, {117,177}, {204,203}, {139,200}, {189,205}, - {105,100}, {208,120}, {46,135}, {176,33}, {106,179}, {210,114}, {206,134}, {156,149}, {142,165}, {183,145}, {150,149}, {143,152}, {194,33}, {130,175}, {97,177}, {179,111}, - {212,130}, {182,185}, {143,46}, {183,144}, {156,152}, {145,175}, {114,101}, {230,102}, {196,101}, {108,231}, {232,115}, {234,115}, {195,114}, {236,116}, {142,148}, {105,33}, - {156,166}, {176,130}, {214,32}, {242,50}, {156,198}, {181,198}, {143,197}, {181,201}, {108,209}, {46,98}, {243,225}, {106,110}, {237,153}, {223,159}, {143,166} + {105,100}, {208,120}, {46,135}, {176,33}, {106,179}, {210,114}, {206,134}, {156,149}, {142,165}, {183,145}, {143,151}, {150,149}, {194,33}, {130,175}, {97,177}, {179,111}, + {212,130}, {182,185}, {143,46}, {183,144}, {156,151}, {145,175}, {114,101}, {230,102}, {196,101}, {108,231}, {232,115}, {234,115}, {195,114}, {236,116}, {142,148}, {105,33}, + {176,130}, {214,32}, {156,166}, {241,50}, {156,198}, {181,198}, {143,197}, {181,201}, {108,209}, {46,98}, {243,225}, {106,110}, {237,153}, {223,159}, {143,166} }; /*-*SCPACK end of pair table, do not change or remove this line */ @@ -93,8 +93,8 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!push.pri!load.pri %2!pop.alt!", "load.pri %2!load.s.alt %1!", #else - "\226\264\333\244", - "\333\226\246", + "\226\264\332\244", + "\332\226\246", #endif seqsize(4,2) - seqsize(2,2) }, @@ -103,8 +103,8 @@ static SEQUENCE sequences_cmp[] = { "load.pri %1!push.pri!load.pri %2!pop.alt!", "load.pri %2!load.alt %1!", #else - "\217\264\333\244", - "\333\376", + "\217\264\332\244", + "\332\376", #endif seqsize(4,2) - seqsize(2,2) }, @@ -126,8 +126,8 @@ static SEQUENCE sequences_cmp[] = { "addr.pri %1!push.pri!load.pri %2!pop.alt!", "addr.alt %1!load.pri %2!", #else - "\265\264\333\244", - "\265\246\333", + "\265\264\332\244", + "\265\246\332", #endif seqsize(4,2) - seqsize(2,2) }, @@ -140,7 +140,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %2!const.alt %1!", #else "\364\244", - "\251\360", + "\251\362", #endif seqsize(4,2) - seqsize(2,2) }, @@ -149,8 +149,8 @@ static SEQUENCE sequences_cmp[] = { "const.pri %1!push.pri!load.pri %2!pop.alt!", "load.pri %2!const.alt %1!", #else - "\234\264\333\244", - "\333\360", + "\234\264\332\244", + "\332\362", #endif seqsize(4,2) - seqsize(2,2) }, @@ -212,8 +212,8 @@ static SEQUENCE sequences_cmp[] = { "move.pri!push.pri!load.s.pri %1!pop.alt!", "load.s.pri %1!", #else - "\300\237\247\332\244", - "\332", + "\300\237\247\333\244", + "\333", #endif seqsize(4,1) - seqsize(1,1) }, @@ -443,7 +443,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!load.s.alt %2!xchg!", "load.s.pri %2!load.s.alt %1!", #else - "\332\226\305\274", + "\333\226\305\274", "\251\226\246", #endif seqsize(3,2) - seqsize(2,2) @@ -453,8 +453,8 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!load.alt %2!xchg!", "load.pri %2!load.s.alt %1!", #else - "\332\366\274", - "\333\226\246", + "\333\366\274", + "\332\226\246", #endif seqsize(3,2) - seqsize(2,2) }, @@ -463,7 +463,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!const.alt %2!xchg!", "const.pri %2!load.s.alt %1!", #else - "\332\234\305\274", + "\333\234\305\274", "\344\226\246", #endif seqsize(3,2) - seqsize(2,2) @@ -484,7 +484,7 @@ static SEQUENCE sequences_cmp[] = { "load.pri %2!load.alt %1!", #else "\312\366\274", - "\333\376", + "\332\376", #endif seqsize(3,2) - seqsize(2,2) }, @@ -504,7 +504,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %2!const.alt %1!", #else "\327\226\305\274", - "\251\360", + "\251\362", #endif seqsize(3,2) - seqsize(2,2) }, @@ -514,7 +514,7 @@ static SEQUENCE sequences_cmp[] = { "load.pri %2!const.alt %1!", #else "\327\366\274", - "\333\360", + "\332\362", #endif seqsize(3,2) - seqsize(2,2) }, @@ -536,7 +536,7 @@ static SEQUENCE sequences_cmp[] = { "const.alt %1!", #else "\307\327\274", - "\360", + "\362", #endif seqsize(3,1) - seqsize(1,1) }, @@ -555,7 +555,7 @@ static SEQUENCE sequences_cmp[] = { "move.alt!load.s.pri %1!xchg!", "load.s.alt %1!", #else - "\307\332\274", + "\307\333\274", "\226\246", #endif seqsize(3,1) - seqsize(1,1) @@ -566,8 +566,8 @@ static SEQUENCE sequences_cmp[] = { "lref.pri %1!move.alt!load.pri %2!", "lref.alt %1!load.pri %2!", #else - "\351\225\307\333", - "\351\246\333", + "\351\225\307\332", + "\351\246\332", #endif seqsize(3,2) - seqsize(2,2) }, @@ -596,8 +596,8 @@ static SEQUENCE sequences_cmp[] = { "lref.s.pri %1!move.alt!load.pri %2!", "lref.s.alt %1!load.pri %2!", #else - "\351\222\225\307\333", - "\351\222\246\333", + "\351\222\225\307\332", + "\351\222\246\332", #endif seqsize(3,2) - seqsize(2,2) }, @@ -917,7 +917,7 @@ static SEQUENCE sequences_cmp[] = { ";$lcl %1 %2!stack -4!const.pri %3!stor.s.pri %2!;$exp!", ";$lcl %1 %2!push.c %3!;$exp!", #else - "\223lcl\331\227ack -4!\234\206\256\227or\222\230\255", + "\223lcl\331\230ack -4!\234\206\256\230or\222\227\255", "\223lcl\331\330\256\255", #endif seqsize(3,3) - seqsize(1,1) @@ -927,7 +927,7 @@ static SEQUENCE sequences_cmp[] = { ";$lcl %1 %2!stack -4!zero.pri!stor.s.pri %2!;$exp!", ";$lcl %1 %2!push.c 0!;$exp!", #else - "\223lcl\331\227ack -4!\375\227or\222\230\255", + "\223lcl\331\230ack -4!\375\230or\222\227\255", "\223lcl\331\330 0!\255", #endif seqsize(3,2) - seqsize(1,1) @@ -946,8 +946,8 @@ static SEQUENCE sequences_cmp[] = { "push.pri!load.s.pri %1!pop.alt!", "move.alt!load.s.pri %1!", #else - "\247\332\244", - "\307\332", + "\247\333\244", + "\307\333", #endif seqsize(3,1) - seqsize(2,1) }, @@ -1016,7 +1016,7 @@ static SEQUENCE sequences_cmp[] = { "move.alt!load.s.pri %1!add!", "load.s.alt %1!add!", #else - "\307\332\271", + "\307\333\271", "\226\246\271", #endif seqsize(3,1) - seqsize(2,1) @@ -1037,7 +1037,7 @@ static SEQUENCE sequences_cmp[] = { "const.alt %1!add!", #else "\307\327\271", - "\360\271", + "\362\271", #endif seqsize(3,1) - seqsize(2,1) }, @@ -1046,7 +1046,7 @@ static SEQUENCE sequences_cmp[] = { "move.alt!load.s.pri %1!sub.alt!", "load.s.alt %1!sub!", #else - "\307\332sub\224", + "\307\333sub\224", "\226\246sub!", #endif seqsize(3,1) - seqsize(2,1) @@ -1067,7 +1067,7 @@ static SEQUENCE sequences_cmp[] = { "const.alt %1!sub!", #else "\307\327sub\224", - "\360sub!", + "\362sub!", #endif seqsize(3,1) - seqsize(2,1) }, @@ -1267,27 +1267,17 @@ static SEQUENCE sequences_cmp[] = { "const.alt %1!add!", "add.c %1!", #else - "\360\271", + "\362\271", "\236\245\202", #endif seqsize(2,1) - seqsize(1,1) }, - { - #ifdef SCPACK - "const.alt %1!sub!", - "add.c -%1!", - #else - "\360sub!", - "\236\245 -\201", - #endif - seqsize(2,1) - seqsize(1,1) - }, { #ifdef SCPACK "const.alt %1!smul!", "smul.c %1!", #else - "\360smul!", + "\362smul!", "smu\310\202", #endif seqsize(2,1) - seqsize(1,1) @@ -1297,27 +1287,27 @@ static SEQUENCE sequences_cmp[] = { "const.alt %1!eq!", "eq.c.pri %1!", #else - "\360\323", + "\362\323", "\260\245\225", #endif seqsize(2,1) - seqsize(1,1) }, - /* Some operations use the alternative subtraction operation --these - * can also be optimized. + /* Subtraction of a constant. Note that the subtraction is converted to + * the addition of the inverse value. * const.pri n1 load.s.pri n2 * load.s.alt n2 add.c -n1 - * sub.alt - + * sub - * -------------------------------------- * const.pri n1 load.pri n2 * load.alt n2 add.c -n1 - * sub.alt - + * sub - */ { #ifdef SCPACK - "const.pri %1!load.s.alt %2!sub.alt!", + "const.pri %1!load.s.alt %2!sub!", "load.s.pri %2!add.c -%1!", #else - "\327\226\305sub\224", + "\327\226\305sub!", "\251\236\245 -\201", #endif seqsize(3,2) - seqsize(2,2) @@ -1328,7 +1318,7 @@ static SEQUENCE sequences_cmp[] = { "load.pri %2!add.c -%1!", #else "\327\366sub\224", - "\333\236\245 -\201", + "\332\236\245 -\201", #endif seqsize(3,2) - seqsize(2,2) }, @@ -1393,7 +1383,7 @@ static SEQUENCE sequences_cmp[] = { "jneq %1!", #else "\323\340", - "\373\361", + "\373\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1403,7 +1393,7 @@ static SEQUENCE sequences_cmp[] = { "jeq %1!", #else "\323\373z\202", - "j\361", + "j\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1413,7 +1403,7 @@ static SEQUENCE sequences_cmp[] = { "jeq %1!", #else "n\323\340", - "j\361", + "j\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1423,7 +1413,7 @@ static SEQUENCE sequences_cmp[] = { "jneq %1!", #else "n\323\373z\202", - "\373\361", + "\373\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1433,7 +1423,7 @@ static SEQUENCE sequences_cmp[] = { "jsgeq %1!", #else "\353!\340", - "j\303\361", + "j\303\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1463,7 +1453,7 @@ static SEQUENCE sequences_cmp[] = { "jsleq %1!", #else "\304\323\373z\202", - "j\304\361", + "j\304\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1473,7 +1463,7 @@ static SEQUENCE sequences_cmp[] = { "jsleq %1!", #else "\374\340", - "j\304\361", + "j\304\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1503,7 +1493,7 @@ static SEQUENCE sequences_cmp[] = { "jsgeq %1!", #else "\303\323\373z\202", - "j\303\361", + "j\303\360", #endif seqsize(2,1) - seqsize(1,1) }, @@ -1521,7 +1511,7 @@ static SEQUENCE sequences_cmp[] = { "zero.alt!jeq %1!", "jzer %1!", #else - "\337\224j\361", + "\337\224j\360", "\340", #endif seqsize(2,1) - seqsize(1,1) @@ -1531,7 +1521,7 @@ static SEQUENCE sequences_cmp[] = { "zero.alt!jneq %1!", "jnz %1!", #else - "\337\224\373\361", + "\337\224\373\360", "\373z\202", #endif seqsize(2,1) - seqsize(1,1) @@ -1574,7 +1564,7 @@ static SEQUENCE sequences_cmp[] = { "inc.s %1!load.s.pri %1!;$exp!", "inc.s %1!;$exp!", #else - "inc\222\202\332\255", + "inc\222\202\333\255", "inc\222\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1584,7 +1574,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!inc.s %1!;$exp!", "inc.s %1!;$exp!", #else - "\332inc\222\301", + "\333inc\222\301", "inc\222\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1614,7 +1604,7 @@ static SEQUENCE sequences_cmp[] = { "dec.s %1!load.s.pri %1!;$exp!", "dec.s %1!;$exp!", #else - "dec\222\202\332\255", + "dec\222\202\333\255", "dec\222\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1624,7 +1614,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!dec.s %1!;$exp!", "dec.s %1!;$exp!", #else - "\332dec\222\301", + "\333dec\222\301", "dec\222\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1659,7 +1649,7 @@ static SEQUENCE sequences_cmp[] = { "const.pri 0!stor.pri %1!;$exp!", "zero %1!;$exp!", #else - "\234\206 0!\227or\225\255", + "\234\206 0!\230or\225\255", "\337\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1669,7 +1659,7 @@ static SEQUENCE sequences_cmp[] = { "const.pri 0!stor.s.pri %1!;$exp!", "zero.s %1!;$exp!", #else - "\234\206 0!\227or\222\225\255", + "\234\206 0!\230or\222\225\255", "\337\222\301", #endif seqsize(2,2) - seqsize(1,1) @@ -1679,7 +1669,7 @@ static SEQUENCE sequences_cmp[] = { "zero.pri!stor.pri %1!;$exp!", "zero %1!;$exp!", #else - "\375\227or\225\255", + "\375\230or\225\255", "\337\301", #endif seqsize(2,1) - seqsize(1,1) @@ -1689,7 +1679,7 @@ static SEQUENCE sequences_cmp[] = { "zero.pri!stor.s.pri %1!;$exp!", "zero.s %1!;$exp!", #else - "\375\227or\222\225\255", + "\375\230or\222\225\255", "\337\222\301", #endif seqsize(2,1) - seqsize(1,1) @@ -1729,7 +1719,7 @@ static SEQUENCE sequences_cmp[] = { "push.c %1!sysreq.c %2!stack %3!", //note: %3 == %1 + 4 "sysreq.n %2 %1!", #else - "\330\202sysr\260\245\221\227ack\256", + "\330\202sysr\260\245\221\230ack\256", "sysr\260.n\220\202", #endif seqsize(3,3) - seqsize(1,2) @@ -1947,7 +1937,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.pri %1!load.s.alt %2!", "load.s.both %1 %2!", #else - "\332\226\305", + "\333\226\305", "\226.\275th\331", #endif seqsize(2,2) - seqsize(1,2) @@ -1957,7 +1947,7 @@ static SEQUENCE sequences_cmp[] = { "load.s.alt %2!load.s.pri %1!", "load.s.both %1 %2!", #else - "\226\305\332", + "\226\305\333", "\226.\275th\331", #endif seqsize(2,2) - seqsize(1,2) @@ -2003,7 +1993,7 @@ static SEQUENCE sequences_cmp[] = { "const.pri %1!stor.pri %2!", "const %2 %1!", #else - "\327\227or\230", + "\327\230or\227", "\234\220\202", #endif seqsize(2,2) - seqsize(1,2) @@ -2013,7 +2003,7 @@ static SEQUENCE sequences_cmp[] = { "const.pri %1!stor.s.pri %2!", "const.s %2 %1!", #else - "\327\227or\222\230", + "\327\230or\222\227", "\234\222\220\202", #endif seqsize(2,2) - seqsize(1,2)