mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 20:33:05 +00:00
More jump removal
This commit is contained in:
parent
19deac0707
commit
dccafd65ac
3 changed files with 20 additions and 2 deletions
6
code.c
6
code.c
|
@ -39,6 +39,12 @@ void code_push_statement(prog_section_statement *stmt, int linenum)
|
||||||
vec_push(code_linenums, linenum);
|
vec_push(code_linenums, linenum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void code_pop_statement()
|
||||||
|
{
|
||||||
|
vec_pop(code_statements);
|
||||||
|
vec_pop(code_linenums);
|
||||||
|
}
|
||||||
|
|
||||||
void code_init() {
|
void code_init() {
|
||||||
prog_section_function empty_function = {0,0,0,0,0,0,0,{0}};
|
prog_section_function empty_function = {0,0,0,0,0,0,0,{0}};
|
||||||
prog_section_statement empty_statement = {0,{0},{0},{0}};
|
prog_section_statement empty_statement = {0,{0},{0},{0}};
|
||||||
|
|
1
gmqcc.h
1
gmqcc.h
|
@ -573,6 +573,7 @@ qcint code_alloc_field (size_t qcsize);
|
||||||
|
|
||||||
/* this function is used to keep statements and linenumbers together */
|
/* this function is used to keep statements and linenumbers together */
|
||||||
void code_push_statement(prog_section_statement *stmt, int linenum);
|
void code_push_statement(prog_section_statement *stmt, int linenum);
|
||||||
|
void code_pop_statement();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A shallow copy of a lex_file to remember where which ast node
|
* A shallow copy of a lex_file to remember where which ast node
|
||||||
|
|
15
ir.c
15
ir.c
|
@ -2743,8 +2743,7 @@ tailcall:
|
||||||
ontrue = tmp;
|
ontrue = tmp;
|
||||||
}
|
}
|
||||||
stidx = vec_size(code_statements);
|
stidx = vec_size(code_statements);
|
||||||
if (stmt.o2.s1 != 1)
|
code_push_statement(&stmt, instr->context.line);
|
||||||
code_push_statement(&stmt, instr->context.line);
|
|
||||||
/* on false we jump, so add ontrue-path */
|
/* on false we jump, so add ontrue-path */
|
||||||
if (!gen_blocks_recursive(func, ontrue))
|
if (!gen_blocks_recursive(func, ontrue))
|
||||||
return false;
|
return false;
|
||||||
|
@ -2754,6 +2753,12 @@ tailcall:
|
||||||
if (onfalse->generated) {
|
if (onfalse->generated) {
|
||||||
/* fixup the jump address */
|
/* fixup the jump address */
|
||||||
code_statements[stidx].o2.s1 = (onfalse->code_start) - (stidx);
|
code_statements[stidx].o2.s1 = (onfalse->code_start) - (stidx);
|
||||||
|
if (code_statements[stidx].o2.s1 == 1) {
|
||||||
|
code_statements[stidx] = code_statements[stidx+1];
|
||||||
|
if (code_statements[stidx].o1.s1 < 0)
|
||||||
|
code_statements[stidx].o1.s1++;
|
||||||
|
code_pop_statement();
|
||||||
|
}
|
||||||
stmt.opcode = vec_last(code_statements).opcode;
|
stmt.opcode = vec_last(code_statements).opcode;
|
||||||
if (stmt.opcode == INSTR_GOTO ||
|
if (stmt.opcode == INSTR_GOTO ||
|
||||||
stmt.opcode == INSTR_IF ||
|
stmt.opcode == INSTR_IF ||
|
||||||
|
@ -2773,6 +2778,12 @@ tailcall:
|
||||||
code_push_statement(&stmt, instr->context.line);
|
code_push_statement(&stmt, instr->context.line);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (code_statements[stidx].o2.s1 == 1) {
|
||||||
|
code_statements[stidx] = code_statements[stidx+1];
|
||||||
|
if (code_statements[stidx].o1.s1 < 0)
|
||||||
|
code_statements[stidx].o1.s1++;
|
||||||
|
code_pop_statement();
|
||||||
|
}
|
||||||
/* if not, generate now */
|
/* if not, generate now */
|
||||||
block = onfalse;
|
block = onfalse;
|
||||||
goto tailcall;
|
goto tailcall;
|
||||||
|
|
Loading…
Reference in a new issue