e576bb | 2002-10-11 | Martin Nilsson | | |
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | || $Id: peep.c,v 1.87 2003/12/02 13:49:58 grubba Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #include "global.h"
#include "language.h"
#include "stralloc.h"
#include "dynamic_buffer.h"
#include "program.h"
#include "las.h"
#include "docode.h"
#include "main.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #include "lex.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | #include "peep.h"
|
062e9d | 1998-03-04 | Fredrik Hübinette (Hubbe) | | #include "dmalloc.h"
|
731001 | 1998-05-01 | Henrik Grubbström (Grubba) | | #include "stuff.h"
|
327b99 | 1999-10-25 | Fredrik Hübinette (Hubbe) | | #include "bignum.h"
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | #include "opcodes.h"
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | | #include "builtin_functions.h"
#include "constants.h"
|
6a2170 | 2001-07-17 | Fredrik Hübinette (Hubbe) | | #include "interpret.h"
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | #include "pikecode.h"
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | RCSID("$Id: peep.c,v 1.87 2003/12/02 13:49:58 grubba Exp $");
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | static void asm_opt(void);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
dynamic_buffer instrbuf;
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | static int hasarg(int opcode)
{
return instrs[opcode-F_OFFSET].flags & I_HASARG;
}
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | static int hasarg2(int opcode)
{
return instrs[opcode-F_OFFSET].flags & I_HASARG2;
}
static void dump_instr(p_instr *p)
{
if(!p) return;
fprintf(stderr,"%s",get_token_name(p->opcode));
if(hasarg(p->opcode))
{
fprintf(stderr,"(%d",p->arg);
if(hasarg2(p->opcode))
fprintf(stderr,",%d",p->arg2);
fprintf(stderr,")");
}
}
#endif
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void init_bytecode(void)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
041256 | 2002-10-04 | Marcus Comstedt | | initialize_buf(&instrbuf);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void exit_bytecode(void)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t e, length;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | p_instr *c;
c=(p_instr *)instrbuf.s.str;
length=instrbuf.s.len / sizeof(p_instr);
for(e=0;e<length;e++) free_string(c->file);
toss_buffer(&instrbuf);
}
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t insert_opcode2(unsigned int f,
INT32 b,
INT32 c,
INT32 current_line,
struct pike_string *current_file)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
p_instr *p;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | if(!hasarg2(f) && c)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg2(%d) is wrong!\n",f);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
p=(p_instr *)low_make_buf_space(sizeof(p_instr), &instrbuf);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(!instrbuf.s.len)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Low make buf space failed!!!!!!\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
p->opcode=f;
p->line=current_line;
copy_shared_string(p->file, current_file);
p->arg=b;
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | p->arg2=c;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
return p - (p_instr *)instrbuf.s.str;
}
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t insert_opcode1(unsigned int f,
INT32 b,
INT32 current_line,
struct pike_string *current_file)
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | {
#ifdef PIKE_DEBUG
if(!hasarg(f) && b)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg(%d) is wrong!\n",f);
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #endif
return insert_opcode2(f,b,0,current_line,current_file);
}
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t insert_opcode0(int f,int current_line, struct pike_string *current_file)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(hasarg(f))
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg(%d) is wrong!\n",f);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | return insert_opcode1(f,0,current_line, current_file);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | |
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | void update_arg(int instr,INT32 arg)
{
p_instr *p;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
645e26 | 1996-04-23 | Fredrik Hübinette (Hubbe) | | if(instr > (long)instrbuf.s.len / (long)sizeof(p_instr) || instr < 0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("update_arg outside known space.\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
p=(p_instr *)instrbuf.s.str;
p[instr].arg=arg;
}
|
80fe61 | 2001-07-21 | Fredrik Hübinette (Hubbe) | | #ifndef FLUSH_CODE_GENERATOR_STATE
#define FLUSH_CODE_GENERATOR_STATE()
#endif
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | INT32 assemble(int store_linenumbers)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | INT32 entry_point;
|
33a8f1 | 2003-09-26 | Henrik Grubbström (Grubba) | | INT32 max_label=-1,tmp;
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | INT32 *labels, *jumps, *uses;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t e, length;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | p_instr *c;
|
738697 | 2001-06-30 | Fredrik Hübinette (Hubbe) | | int reoptimize=!(debug_options & NO_PEEP_OPTIMIZING);
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | #ifdef PIKE_PORTABLE_BYTECODE
struct pike_string *tripples = NULL;
#endif /* PIKE_PORTABLE_BYTECODE */
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | #ifdef PIKE_DEBUG
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | INT32 max_pointer=-1;
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | int synch_depth = 0;
|
4974fa | 2002-11-07 | Henrik Grubbström (Grubba) | | size_t fun_start = Pike_compiler->new_program->num_program;
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | #endif
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
c=(p_instr *)instrbuf.s.str;
length=instrbuf.s.len / sizeof(p_instr);
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
33a8f1 | 2003-09-26 | Henrik Grubbström (Grubba) | | if((a_flag > 1 && store_linenumbers) || a_flag > 2)
{
for (e = 0; e < length; e++) {
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | if (c[e].opcode == F_POP_SYNCH_MARK) synch_depth--;
fprintf(stderr, "~~~%4d %4lx %*s", c[e].line,
|
3bc7a6 | 2002-09-24 | Henrik Grubbström (Grubba) | | DO_NOT_WARN((unsigned long)e), synch_depth, "");
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | dump_instr(c+e);
fprintf(stderr,"\n");
if (c[e].opcode == F_SYNCH_MARK) synch_depth++;
}
|
33a8f1 | 2003-09-26 | Henrik Grubbström (Grubba) | | if (synch_depth) {
Pike_fatal("Unbalanced sync_mark/pop_sync_mark: %d\n",
synch_depth);
}
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | }
#endif
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | #ifdef PIKE_PORTABLE_BYTECODE
if (store_linenumbers) {
p_wchar2 *current_tripple;
struct pike_string *previous_file = NULL;
int previous_line = 0;
ptrdiff_t num_linedirectives = 0;
for (e=0; e < length; e++) {
if (c[e].file != previous_file) {
previous_file = c[e].file;
num_linedirectives++;
}
if (c[e].line != previous_line) {
previous_line = c[e].line;
num_linedirectives++;
}
}
if (!(tripples = begin_wide_shared_string(3*(length+num_linedirectives),
2))) {
Pike_fatal("Failed to allocate wide string of length %d 3*(%d + %d).\n",
3*(length+num_linedirectives), length, num_linedirectives);
}
previous_file = NULL;
previous_line = 0;
current_tripple = STR2(tripples);
for (e = 0; e < length; e++) {
if (c[e].file != previous_file) {
current_tripple[0] = F_FILENAME;
current_tripple[1] = store_prog_string(c[e].file);
current_tripple[2] = 0;
current_tripple += 3;
previous_file = c[e].file;
}
if (c[e].line != previous_line) {
current_tripple[0] = F_LINE;
current_tripple[1] = c[e].line;
current_tripple[2] = 0;
current_tripple += 3;
previous_line = c[e].line;
}
current_tripple[0] = c[e].opcode;
current_tripple[1] = c[e].arg;
current_tripple[2] = c[e].arg2;
current_tripple += 3;
}
#ifdef PIKE_DEBUG
if (current_tripple != STR2(tripples) + 3*(length + num_linedirectives)) {
Pike_fatal("Tripple length mismatch %d != %d 3*(%d + %d)\n",
current_tripple - STR2(tripples),
3*(length + num_linedirectives),
length, num_linedirectives);
}
#endif /* PIKE_DEBUG */
tripples = end_shared_string(tripples);
}
#endif /* PIKE_PORTABLE_BYTECODE */
|
33a8f1 | 2003-09-26 | Henrik Grubbström (Grubba) | | for(e=0;e<length;e++,c++) {
if(c->opcode == F_LABEL) {
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(c->arg > max_label)
max_label = c->arg;
|
33a8f1 | 2003-09-26 | Henrik Grubbström (Grubba) | | }
#ifdef PIKE_DEBUG
else if (instrs[c->opcode - F_OFFSET].flags & I_POINTER) {
if (c->arg > max_pointer)
max_pointer = c->arg;
}
#endif /* PIKE_DEBUG */
}
#ifdef PIKE_DEBUG
if (max_pointer > max_label) {
fprintf(stderr,
"Reference to undefined label %d > %d\n"
"Bad instructions are marked with '***':\n",
max_pointer, max_label);
c=(p_instr *)instrbuf.s.str;
for(e=0;e<length;e++,c++) {
if (c->opcode == F_POP_SYNCH_MARK) synch_depth--;
fprintf(stderr, " * %4d %4lx ",
c->line, DO_NOT_WARN((unsigned long)e));
dump_instr(c);
if ((instrs[c->opcode - F_OFFSET].flags & I_POINTER) &&
(c->arg > max_label)) {
fprintf(stderr, " ***\n");
} else {
fprintf(stderr, "\n");
}
if (c->opcode == F_SYNCH_MARK) synch_depth++;
}
Pike_fatal("Reference to undefined label %d > %d\n",
max_pointer, max_label);
}
#endif /* PIKE_DEBUG */
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | labels=(INT32 *)xalloc(sizeof(INT32) * 3 * (max_label+2));
jumps = labels + max_label + 2;
uses = jumps + max_label + 2;
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | |
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | while(reoptimize)
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | {
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | reoptimize=0;
for(e=0;e<=max_label;e++)
{
labels[e]=jumps[e]=-1;
uses[e]=0;
}
c=(p_instr *)instrbuf.s.str;
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | length=instrbuf.s.len / sizeof(p_instr);
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | for(e=0;e<length;e++)
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | if(c[e].opcode == F_LABEL && c[e].arg>=0) {
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | labels[c[e].arg]=DO_NOT_WARN((INT32)e);
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | }
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
for(e=0;e<length;e++)
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | {
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | if(instrs[c[e].opcode-F_OFFSET].flags & I_POINTER)
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | {
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | while(1)
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | {
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | int tmp;
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | tmp=labels[c[e].arg];
while(tmp<length &&
(c[tmp].opcode == F_LABEL ||
c[tmp].opcode == F_NOP)) tmp++;
if(tmp>=length) break;
if(c[tmp].opcode==F_BRANCH)
{
c[e].arg=c[tmp].arg;
continue;
}
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | #define TWOO(X,Y) (((X)<<8)+(Y))
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
switch(TWOO(c[e].opcode,c[tmp].opcode))
{
case TWOO(F_LOR,F_BRANCH_WHEN_NON_ZERO):
c[e].opcode=F_BRANCH_WHEN_NON_ZERO;
case TWOO(F_LOR,F_LOR):
c[e].arg=c[tmp].arg;
continue;
case TWOO(F_LAND,F_BRANCH_WHEN_ZERO):
c[e].opcode=F_BRANCH_WHEN_ZERO;
case TWOO(F_LAND,F_LAND):
c[e].arg=c[tmp].arg;
continue;
case TWOO(F_LOR, F_RETURN):
c[e].opcode=F_RETURN_IF_TRUE;
|
e97613 | 2003-10-10 | Martin Stjernholm | | goto pointer_opcode_done;
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
case TWOO(F_BRANCH, F_RETURN):
case TWOO(F_BRANCH, F_RETURN_0):
case TWOO(F_BRANCH, F_RETURN_1):
case TWOO(F_BRANCH, F_RETURN_LOCAL):
if(c[e].file) free_string(c[e].file);
c[e]=c[tmp];
if(c[e].file) add_ref(c[e].file);
|
e97613 | 2003-10-10 | Martin Stjernholm | | goto pointer_opcode_done;
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | }
|
71c5b9 | 2000-11-27 | Fredrik Hübinette (Hubbe) | | break;
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | }
|
e97613 | 2003-10-10 | Martin Stjernholm | | #ifdef PIKE_DEBUG
if (c[e].arg < 0 || c[e].arg > max_label)
Pike_fatal ("Invalid index into uses: %d\n", c[e].arg);
#endif
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | uses[c[e].arg]++;
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }
|
e97613 | 2003-10-10 | Martin Stjernholm | | pointer_opcode_done:;
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | |
for(e=0;e<=max_label;e++)
{
if(!uses[e] && labels[e]>=0)
{
c[labels[e]].opcode=F_NOP;
reoptimize++;
}
}
if(!reoptimize) break;
asm_opt();
|
3bc7a6 | 2002-09-24 | Henrik Grubbström (Grubba) | | #if 1
|
e97613 | 2003-10-10 | Martin Stjernholm | | #ifdef PIKE_DEBUG
if (a_flag > 3)
fprintf(stderr, "Rerunning optimizer.\n");
#endif
|
3bc7a6 | 2002-09-24 | Henrik Grubbström (Grubba) | | #else /* !1 */
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | reoptimize=0;
|
3bc7a6 | 2002-09-24 | Henrik Grubbström (Grubba) | | #endif /* 1 */
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | |
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | c=(p_instr *)instrbuf.s.str;
length=instrbuf.s.len / sizeof(p_instr);
for(e=0;e<=max_label;e++) labels[e]=jumps[e]=-1;
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | #ifdef ALIGN_PIKE_FUNCTION_BEGINNINGS
while( ( (((INT32) PIKE_PC)+2) & (ALIGN_PIKE_JUMPS-1)))
ins_byte(0);
#endif
#ifdef PIKE_PORTABLE_BYTECODE
if (store_linenumbers) {
ins_data(store_prog_string(tripples));
free_string(tripples);
} else {
ins_data(NULL);
}
#endif /* PIKE_PORTABLE_BYTECODE */
entry_point = PIKE_PC;
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | #ifdef PIKE_DEBUG
synch_depth = 0;
#endif
|
80fe61 | 2001-07-21 | Fredrik Hübinette (Hubbe) | | FLUSH_CODE_GENERATOR_STATE();
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | for(e=0;e<length;e++)
{
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | if (c != (((p_instr *)instrbuf.s.str)+e)) {
Pike_fatal("Instruction loop deviates. 0x%04x != 0x%04x\n",
e, DO_NOT_WARN((INT32)(c - ((p_instr *)instrbuf.s.str))));
}
|
2ba919 | 1999-10-23 | Fredrik Hübinette (Hubbe) | | if((a_flag > 2 && store_linenumbers) || a_flag > 3)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | if (c->opcode == F_POP_SYNCH_MARK) synch_depth--;
fprintf(stderr, "===%4d %4lx %*s", c->line,
|
1302b1 | 2001-08-14 | Martin Stjernholm | | DO_NOT_WARN((unsigned long)PIKE_PC), synch_depth, "");
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | dump_instr(c);
fprintf(stderr,"\n");
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | if (c->opcode == F_SYNCH_MARK) synch_depth++;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
#endif
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | if(store_linenumbers) {
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | store_linenumber(c->line, c->file);
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (c->opcode < F_MAX_OPCODE)
ADD_COMPILED(c->opcode);
#endif /* PIKE_DEBUG */
}
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
switch(c->opcode)
{
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | case F_NOP:
|
928f95 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | case F_NOTREACHED:
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | case F_START_FUNCTION:
break;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | case F_ALIGN:
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | ins_align(c->arg);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | break;
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | case F_BYTE:
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | ins_byte((unsigned char)(c->arg));
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | break;
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | case F_DATA:
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | ins_data(c->arg);
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | break;
|
a468a0 | 2001-07-24 | Henrik Grubbström (Grubba) | | case F_ENTRY:
#ifdef INS_ENTRY
INS_ENTRY();
#endif /* INS_ENTRY */
break;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | case F_LABEL:
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | if(c->arg == -1) break;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(c->arg > max_label || c->arg < 0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("max_label calculation failed!\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
if(labels[c->arg] != -1)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Duplicate label!\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
80fe61 | 2001-07-21 | Fredrik Hübinette (Hubbe) | | FLUSH_CODE_GENERATOR_STATE();
|
b783bb | 2001-08-15 | Marcus Comstedt | | labels[c->arg] = DO_NOT_WARN((INT32)PIKE_PC);
|
9be560 | 2002-11-12 | Henrik Grubbström (Grubba) | | if ((e+1 < length) &&
(c[1].opcode != F_LABEL) &&
(c[1].opcode != F_BYTE) &&
(c[1].opcode != F_DATA)) {
UPDATE_PC();
}
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | break;
|
395899 | 2001-06-23 | Fredrik Hübinette (Hubbe) | | case F_VOLATILE_RETURN:
ins_f_byte(F_RETURN);
break;
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | case F_POINTER:
#ifdef PIKE_DEBUG
if(c->arg > max_label || c->arg < 0)
Pike_fatal("Jump to unknown label?\n");
#endif
tmp = DO_NOT_WARN((INT32)PIKE_PC);
ins_pointer(jumps[c->arg]);
jumps[c->arg]=tmp;
break;
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | default:
|
5bb0f1 | 2002-05-11 | Martin Stjernholm | | switch(instrs[c->opcode - F_OFFSET].flags & I_IS_MASK)
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | {
case I_ISJUMP:
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | #ifdef INS_F_JUMP
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | tmp=INS_F_JUMP(c->opcode, (labels[c->arg] != -1));
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | if(tmp != -1)
{
|
2dea8f | 2001-08-16 | Marcus Comstedt | | UPDATE_F_JUMP(tmp, jumps[c->arg]);
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | jumps[c->arg]=~tmp;
break;
}
#endif
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | ins_f_byte(c->opcode);
|
795194 | 2000-04-20 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | if(c->arg > max_label || c->arg < 0)
Pike_fatal("Jump to unknown label?\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
1302b1 | 2001-08-14 | Martin Stjernholm | | tmp = DO_NOT_WARN((INT32)PIKE_PC);
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | ins_pointer(jumps[c->arg]);
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | jumps[c->arg]=tmp;
break;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | case I_ISJUMPARGS:
|
b40153 | 2002-11-02 | Henrik Grubbström (Grubba) | | #ifdef INS_F_JUMP_WITH_TWO_ARGS
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | tmp = INS_F_JUMP_WITH_TWO_ARGS(c->opcode, c->arg, c->arg2,
(labels[c[1].arg] != -1));
|
b40153 | 2002-11-02 | Henrik Grubbström (Grubba) | | if(tmp != -1)
{
#ifdef ADJUST_PIKE_PC
if (instrs[c->opcode - F_OFFSET].flags & I_PC_AT_NEXT)
ADJUST_PIKE_PC (PIKE_PC);
#endif
#ifdef PIKE_DEBUG
if (c[1].opcode != F_POINTER) {
Pike_fatal("Expected opcode %s to be followed by a pointer\n",
instrs[c->opcode - F_OFFSET].name);
}
#endif /* PIKE_DEBUG */
c++;
e++;
UPDATE_F_JUMP(tmp, jumps[c->arg]);
jumps[c->arg]=~tmp;
break;
}
#endif /* INS_F_JUMP_WITH_TWO_ARGS */
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | case I_TWO_ARGS:
ins_f_byte_with_2_args(c->opcode, c->arg, c->arg2);
break;
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | |
case I_ISJUMPARG:
|
b40153 | 2002-11-02 | Henrik Grubbström (Grubba) | | #ifdef INS_F_JUMP_WITH_ARG
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | | tmp = INS_F_JUMP_WITH_ARG(c->opcode, c->arg, (labels[c[1].arg] != -1));
|
b40153 | 2002-11-02 | Henrik Grubbström (Grubba) | | if(tmp != -1)
{
#ifdef ADJUST_PIKE_PC
if (instrs[c->opcode - F_OFFSET].flags & I_PC_AT_NEXT)
ADJUST_PIKE_PC (PIKE_PC);
#endif
#ifdef PIKE_DEBUG
if (c[1].opcode != F_POINTER) {
Pike_fatal("Expected opcode %s to be followed by a pointer\n",
instrs[c->opcode - F_OFFSET].name);
}
#endif /* PIKE_DEBUG */
c++;
e++;
UPDATE_F_JUMP(tmp, jumps[c->arg]);
jumps[c->arg]=~tmp;
break;
}
#endif /* INS_F_JUMP_WITH_ARG */
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | case I_HASARG:
ins_f_byte_with_arg(c->opcode, c->arg);
break;
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | |
case 0:
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | ins_f_byte(c->opcode);
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | break;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | default:
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Unknown instruction type.\n");
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | #endif
}
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | |
|
5bb0f1 | 2002-05-11 | Martin Stjernholm | | #ifdef ADJUST_PIKE_PC
if (instrs[c->opcode - F_OFFSET].flags & I_PC_AT_NEXT)
ADJUST_PIKE_PC (PIKE_PC);
#endif
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (instrs[c->opcode - F_OFFSET].flags & I_HASPOINTER) {
|
dabab3 | 2002-11-04 | Henrik Grubbström (Grubba) | | if ((e+1 >= length) || (c[1].opcode != F_POINTER)) {
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | Pike_fatal("Expected instruction %s to be followed by a pointer.\n"
|
dabab3 | 2002-11-04 | Henrik Grubbström (Grubba) | | "Got %s (%d != %d)\n.",
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | instrs[c->opcode - F_OFFSET].name,
|
dabab3 | 2002-11-04 | Henrik Grubbström (Grubba) | | (e+1 < length)?instrs[c[1].opcode - F_OFFSET].name:"EOI",
(e+1 < length)?c[1].opcode:0, F_POINTER);
|
042070 | 2002-11-02 | Henrik Grubbström (Grubba) | | }
}
#endif /* PIKE_DEBUG */
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | #ifdef ALIGN_PIKE_JUMPS
if(e+1 < length)
{
|
b40153 | 2002-11-02 | Henrik Grubbström (Grubba) | |
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | switch(c->opcode)
{
case F_RETURN:
case F_VOLATILE_RETURN:
case F_BRANCH:
case F_RETURN_0:
case F_RETURN_1:
case F_RETURN_LOCAL:
#define CALLS(X) \
case PIKE_CONCAT3(F_,X,_AND_RETURN): \
case PIKE_CONCAT3(F_MARK_,X,_AND_RETURN):
CALLS(APPLY)
CALLS(CALL_FUNCTION)
CALLS(CALL_LFUN)
CALLS(CALL_BUILTIN)
|
1302b1 | 2001-08-14 | Martin Stjernholm | | while( ((INT32) PIKE_PC & (ALIGN_PIKE_JUMPS-1) ) )
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | ins_byte(0);
}
}
#endif
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
c++;
}
for(e=0;e<=max_label;e++)
{
|
c69624 | 2001-07-18 | Henrik Grubbström (Grubba) | | INT32 tmp2=labels[e];
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
while(jumps[e]!=-1)
{
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(labels[e]==-1)
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | Pike_fatal("Hyperspace error: unknown jump point %ld(%ld) at %d (pc=%x).\n",
PTRDIFF_T_TO_LONG(e), PTRDIFF_T_TO_LONG(max_label),
labels[e], jumps[e]);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | #ifdef INS_F_JUMP
if(jumps[e] < 0)
{
|
2dea8f | 2001-08-16 | Marcus Comstedt | | tmp = READ_F_JUMP(~jumps[e]);
|
852c15 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | UPDATE_F_JUMP(~jumps[e], tmp2);
jumps[e]=tmp;
continue;
}
#endif
|
dd6bca | 2001-07-20 | Henrik Grubbström (Grubba) | | tmp = read_pointer(jumps[e]);
upd_pointer(jumps[e], tmp2 - jumps[e]);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | jumps[e]=tmp;
}
}
free((char *)labels);
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | |
|
4974fa | 2002-11-07 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (a_flag > 6) {
size_t len = (Pike_compiler->new_program->num_program - fun_start)*
sizeof(PIKE_OPCODE_T);
|
2abf52 | 2002-11-07 | Henrik Grubbström (Grubba) | | fprintf(stderr, "Code at offset %d through %d:\n",
fun_start, Pike_compiler->new_program->num_program-1);
|
4974fa | 2002-11-07 | Henrik Grubbström (Grubba) | | #ifdef DISASSEMBLE_CODE
DISASSEMBLE_CODE(Pike_compiler->new_program->program + fun_start, len);
#else /* !DISASSEMBLE_CODE */
{
}
#endif /* DISASSEMBLE_CODE */
}
#endif /* PIKE_DEBUG */
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
exit_bytecode();
|
10f5bd | 2003-12-02 | Henrik Grubbström (Grubba) | |
return entry_point;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | int remove_clear_locals=0x7fffffff;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | static int fifo_len;
static ptrdiff_t eye, len;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | static p_instr *instructions;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
9cdf3f | 2000-12-02 | Henrik Grubbström (Grubba) | | static INLINE ptrdiff_t insopt2(int f, INT32 a, INT32 b,
int cl, struct pike_string *cf)
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | {
p_instr *p;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | if(!hasarg2(f) && b)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg2(%d /*%s */) is wrong!\n",f,get_f_name(f));
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | #endif
p=(p_instr *)low_make_buf_space(sizeof(p_instr), &instrbuf);
if(fifo_len)
{
MEMMOVE(p-fifo_len+1,p-fifo_len,fifo_len*sizeof(p_instr));
p-=fifo_len;
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | if(!instrbuf.s.len)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Low make buf space failed!!!!!!\n");
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | #endif
p->opcode=f;
|
e7df5b | 1997-03-17 | Fredrik Hübinette (Hubbe) | | p->line=cl;
|
9cdf3f | 2000-12-02 | Henrik Grubbström (Grubba) | | copy_shared_string(p->file, cf);
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | p->arg=a;
p->arg2=b;
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | |
return p - (p_instr *)instrbuf.s.str;
}
|
9cdf3f | 2000-12-02 | Henrik Grubbström (Grubba) | | static INLINE ptrdiff_t insopt1(int f, INT32 a, int cl, struct pike_string *cf)
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | {
#ifdef PIKE_DEBUG
if(!hasarg(f) && a)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg(%d /* %s */) is wrong!\n",f,get_f_name(f));
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #endif
return insopt2(f,a,0,cl, cf);
}
|
8d553a | 2000-12-02 | Henrik Grubbström (Grubba) | | static INLINE ptrdiff_t insopt0(int f, int cl, struct pike_string *cf)
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | if(hasarg(f))
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("hasarg(%d /* %s */) is wrong!\n",f,get_f_name(f));
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | #endif
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | return insopt2(f,0,0,cl, cf);
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | }
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | static void debug(void)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
645e26 | 1996-04-23 | Fredrik Hübinette (Hubbe) | | if(fifo_len > (long)instrbuf.s.len / (long)sizeof(p_instr))
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | fifo_len=(long)instrbuf.s.len / (long)sizeof(p_instr);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(eye < 0)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Popped beyond start of code.\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
if(instrbuf.s.len)
{
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | p_instr *p;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | p=(p_instr *)low_make_buf_space(0, &instrbuf);
if(!p[-1].file)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("No file name on last instruction!\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
#endif
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | static INLINE p_instr *instr(int offset)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
p_instr *p;
debug();
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | if(offset < fifo_len)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | p=(p_instr *)low_make_buf_space(0, &instrbuf);
p-=fifo_len;
p+=offset;
if(((char *)p)<instrbuf.s.str) return 0;
return p;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }else{
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | offset-=fifo_len;
offset+=eye;
if(offset >= len) return 0;
return instructions+offset;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
}
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | static INLINE int opcode(int offset)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
p_instr *a;
a=instr(offset);
if(a) return a->opcode;
return -1;
}
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | static INLINE int argument(int offset)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
p_instr *a;
a=instr(offset);
if(a) return a->arg;
return -1;
}
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | static INLINE int argument2(int offset)
{
p_instr *a;
a=instr(offset);
if(a) return a->arg2;
return -1;
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | static void advance(void)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
if(fifo_len)
{
fifo_len--;
}else{
p_instr *p;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | if((p=instr(0)))
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | insert_opcode2(p->opcode, p->arg, p->arg2, p->line, p->file);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | eye++;
}
debug();
}
static void pop_n_opcodes(int n)
{
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | int e,d;
if(fifo_len)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | p_instr *p;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | d=n;
if(d>fifo_len) d=fifo_len;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | if((long)d > (long)instrbuf.s.len / (long)sizeof(p_instr))
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Popping out of instructions.\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | |
|
b95670 | 2000-11-25 | Henrik Grubbström (Grubba) | |
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | p=(p_instr *)low_make_buf_space(0, &instrbuf);
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | p-=fifo_len;
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | for(e=0;e<d;e++) free_string(p[e].file);
fifo_len-=d;
if(fifo_len) MEMMOVE(p,p+d,fifo_len*sizeof(p_instr));
n-=d;
|
419fab | 1997-03-09 | Fredrik Hübinette (Hubbe) | | low_make_buf_space(-((INT32)sizeof(p_instr))*d, &instrbuf);
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | eye+=n;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
|
b95670 | 2000-11-25 | Henrik Grubbström (Grubba) | | #define DO_OPTIMIZATION_PREQUEL(topop) do { \
struct pike_string *cf; \
INT32 cl=instr(0)->line; \
\
DO_IF_DEBUG( \
if(a_flag>5) \
{ \
int e; \
fprintf(stderr,"PEEP at %d:",cl); \
for(e=0;e<topop;e++) \
{ \
fprintf(stderr," "); \
dump_instr(instr(e)); \
} \
fprintf(stderr," => "); \
} \
) \
\
copy_shared_string(cf,instr(0)->file); \
pop_n_opcodes(topop)
#define DO_OPTIMIZATION_POSTQUEL(q) \
fifo_len+=q; \
free_string(cf); \
debug(); \
\
DO_IF_DEBUG( \
if(a_flag>5) \
{ \
int e; \
for(e=0;e<q;e++) \
{ \
fprintf(stderr," "); \
dump_instr(instr(e)); \
} \
fprintf(stderr,"\n"); \
} \
) \
\
fifo_len += q + 3; \
} while(0)
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | |
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | static void do_optimization(int topop, ...)
{
va_list arglist;
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | int q=0;
int oplen;
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | |
|
b95670 | 2000-11-25 | Henrik Grubbström (Grubba) | | DO_OPTIMIZATION_PREQUEL(topop);
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | va_start(arglist, topop);
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | while((oplen = va_arg(arglist, int)))
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | {
q++;
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | switch(oplen)
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | {
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
default:
Pike_fatal("Unsupported argument number: %d\n", oplen);
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | break;
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | #endif /* PIKE_DEBUG */
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | case 1:
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | {
int i=va_arg(arglist, int);
insopt0(i,cl,cf);
}
break;
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | case 2:
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | {
int i=va_arg(arglist, int);
int j=va_arg(arglist, int);
insopt1(i,j,cl,cf);
}
break;
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | case 3:
|
c6c623 | 2002-08-30 | Henrik Grubbström (Grubba) | | {
int i=va_arg(arglist, int);
int j=va_arg(arglist, int);
int k=va_arg(arglist, int);
insopt2(i,j,k,cl,cf);
}
break;
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | }
}
va_end(arglist);
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | |
|
b95670 | 2000-11-25 | Henrik Grubbström (Grubba) | | DO_OPTIMIZATION_POSTQUEL(q);
|
8ebb6a | 1998-04-27 | Fredrik Hübinette (Hubbe) | | }
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
66d51c | 1997-03-04 | Fredrik Hübinette (Hubbe) | | static void asm_opt(void)
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(a_flag > 3)
{
p_instr *c;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t e, length;
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | int synch_depth = 0;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | |
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | c=(p_instr *)instrbuf.s.str;
length=instrbuf.s.len / sizeof(p_instr);
|
e97613 | 2003-10-10 | Martin Stjernholm | | fprintf(stderr,"Before peep optimization:\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | for(e=0;e<length;e++,c++)
{
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | if (c->opcode == F_POP_SYNCH_MARK) synch_depth--;
|
e97613 | 2003-10-10 | Martin Stjernholm | | fprintf(stderr,"<<<%4d: %*s",c->line,synch_depth,"");
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | dump_instr(c);
fprintf(stderr,"\n");
|
85f4f5 | 2001-01-31 | Martin Stjernholm | | if (c->opcode == F_SYNCH_MARK) synch_depth++;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
}
#endif
|
701881 | 1999-11-08 | Henrik Grubbström (Grubba) | | #ifndef IN_TPIKE
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #include "peep_engine.c"
|
701881 | 1999-11-08 | Henrik Grubbström (Grubba) | | #endif /* IN_TPIKE */
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | if(a_flag > 4)
{
p_instr *c;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t e, length;
|
e97613 | 2003-10-10 | Martin Stjernholm | | int synch_depth = 0;
|
7a35a4 | 2000-08-14 | Henrik Grubbström (Grubba) | |
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | c=(p_instr *)instrbuf.s.str;
length=instrbuf.s.len / sizeof(p_instr);
|
e97613 | 2003-10-10 | Martin Stjernholm | | fprintf(stderr,"After peep optimization:\n");
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | for(e=0;e<length;e++,c++)
{
|
e97613 | 2003-10-10 | Martin Stjernholm | | if (c->opcode == F_POP_SYNCH_MARK) synch_depth--;
fprintf(stderr,">>>%4d: %*s",c->line,synch_depth,"");
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | dump_instr(c);
fprintf(stderr,"\n");
|
e97613 | 2003-10-10 | Martin Stjernholm | | if (c->opcode == F_SYNCH_MARK) synch_depth++;
|
2199ed | 1996-04-13 | Fredrik Hübinette (Hubbe) | | }
}
#endif
}
|