mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 20:33:05 +00:00
'likely' hint for IFs
This commit is contained in:
parent
ca2b414c7c
commit
b1425dfcf1
3 changed files with 15 additions and 0 deletions
2
ast.c
2
ast.c
|
@ -1538,6 +1538,8 @@ bool ast_binary_codegen(ast_binary *self, ast_function *func, bool lvalue, ir_va
|
||||||
if (!ir_block_create_if(func->curblock, left, merge, other))
|
if (!ir_block_create_if(func->curblock, left, merge, other))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* use the unlikely flag */
|
||||||
|
vec_last(func->curblock->instr)->likely = false;
|
||||||
|
|
||||||
func->curblock = other;
|
func->curblock = other;
|
||||||
cgen = self->right->expression.codegen;
|
cgen = self->right->expression.codegen;
|
||||||
|
|
10
ir.c
10
ir.c
|
@ -654,6 +654,8 @@ ir_instr* ir_instr_new(ir_block* owner, int op)
|
||||||
self->params = NULL;
|
self->params = NULL;
|
||||||
|
|
||||||
self->eid = 0;
|
self->eid = 0;
|
||||||
|
|
||||||
|
self->likely = true;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2501,6 +2503,13 @@ tailcall:
|
||||||
}
|
}
|
||||||
/* neither ontrue nor onfalse exist */
|
/* neither ontrue nor onfalse exist */
|
||||||
stmt.opcode = INSTR_IFNOT;
|
stmt.opcode = INSTR_IFNOT;
|
||||||
|
if (!instr->likely) {
|
||||||
|
/* Honor the likelyhood hint */
|
||||||
|
ir_block *tmp = onfalse;
|
||||||
|
stmt.opcode = INSTR_IF;
|
||||||
|
onfalse = ontrue;
|
||||||
|
ontrue = tmp;
|
||||||
|
}
|
||||||
stidx = vec_size(code_statements);
|
stidx = vec_size(code_statements);
|
||||||
vec_push(code_statements, stmt);
|
vec_push(code_statements, stmt);
|
||||||
/* on false we jump, so add ontrue-path */
|
/* on false we jump, so add ontrue-path */
|
||||||
|
@ -2512,6 +2521,7 @@ 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);
|
||||||
|
stmt.opcode = vec_last(code_statements).opcode;
|
||||||
/* may have been generated in the previous recursive call */
|
/* may have been generated in the previous recursive call */
|
||||||
stmt.opcode = INSTR_GOTO;
|
stmt.opcode = INSTR_GOTO;
|
||||||
stmt.o1.s1 = (onfalse->code_start) - vec_size(code_statements);
|
stmt.o1.s1 = (onfalse->code_start) - vec_size(code_statements);
|
||||||
|
|
3
ir.h
3
ir.h
|
@ -133,6 +133,9 @@ typedef struct ir_instr_s
|
||||||
/* For the temp-allocation */
|
/* For the temp-allocation */
|
||||||
size_t eid;
|
size_t eid;
|
||||||
|
|
||||||
|
/* For IFs */
|
||||||
|
bool likely;
|
||||||
|
|
||||||
struct ir_block_s *owner;
|
struct ir_block_s *owner;
|
||||||
} ir_instr;
|
} ir_instr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue