mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-06 07:51:18 +00:00
[gamecode] Move pushregs and popregs into with
This frees up another two instructions.
This commit is contained in:
parent
a14b9f8252
commit
38ab0f0243
2 changed files with 58 additions and 47 deletions
|
@ -28,9 +28,9 @@ bitmap_txt = """
|
||||||
1 1011 01ss any
|
1 1011 01ss any
|
||||||
1 1011 0100
|
1 1011 0100
|
||||||
1 1011 10ss all
|
1 1011 10ss all
|
||||||
1 1011 1000 pushregs
|
1 1011 1000
|
||||||
1 1011 11ss none
|
1 1011 11ss none
|
||||||
1 1011 1100 popregs
|
1 1011 1100
|
||||||
1 1101 01oo move
|
1 1101 01oo move
|
||||||
1 1101 11oo memset
|
1 1101 11oo memset
|
||||||
1 1110 d1xx
|
1 1110 d1xx
|
||||||
|
|
|
@ -1861,42 +1861,6 @@ pr_jump_mode (progs_t *pr, const dstatement_t *st)
|
||||||
return jump_offs - 1; // for st++
|
return jump_offs - 1; // for st++
|
||||||
}
|
}
|
||||||
|
|
||||||
static pr_pointer_t __attribute__((pure))
|
|
||||||
pr_with (progs_t *pr, const dstatement_t *st)
|
|
||||||
{
|
|
||||||
pointer_t edict_area = pr->pr_edict_area - pr->pr_globals;
|
|
||||||
pr_type_t *op_b = pr->pr_globals + PR_BASE (pr, st, B) + st->b;
|
|
||||||
|
|
||||||
switch (st->a) {
|
|
||||||
// fixed offset
|
|
||||||
case 0:
|
|
||||||
// hard-0 base
|
|
||||||
return st->b;
|
|
||||||
case 1:
|
|
||||||
// relative to current base
|
|
||||||
return PR_BASE (pr, st, B) + st->b;
|
|
||||||
case 2:
|
|
||||||
// relative to stack (-ve offset)
|
|
||||||
return *pr->globals.stack + (pr_short_t) st->b;
|
|
||||||
case 3:
|
|
||||||
// relative to edict_area (+ve only)
|
|
||||||
return edict_area + st->b;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
// hard-0 base
|
|
||||||
return pr->pr_globals[st->b].pointer_var;
|
|
||||||
case 5:
|
|
||||||
return OPB(pointer);
|
|
||||||
case 6:
|
|
||||||
// relative to stack (-ve offset)
|
|
||||||
return *pr->globals.stack + OPB(int);
|
|
||||||
case 7:
|
|
||||||
// relative to edict_area (+ve only)
|
|
||||||
return edict_area + OPB(uint);
|
|
||||||
}
|
|
||||||
PR_RunError (pr, "Invalid with index: %u", st->a);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pr_type_t *
|
static pr_type_t *
|
||||||
pr_stack_push (progs_t *pr)
|
pr_stack_push (progs_t *pr)
|
||||||
{
|
{
|
||||||
|
@ -1923,6 +1887,59 @@ pr_stack_pop (progs_t *pr)
|
||||||
return stk;
|
return stk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pr_with (progs_t *pr, const dstatement_t *st)
|
||||||
|
{
|
||||||
|
pointer_t edict_area = pr->pr_edict_area - pr->pr_globals;
|
||||||
|
pr_type_t *op_b = pr->pr_globals + PR_BASE (pr, st, B) + st->b;
|
||||||
|
pr_type_t *stk;
|
||||||
|
|
||||||
|
switch (st->a) {
|
||||||
|
// fixed offset
|
||||||
|
case 0:
|
||||||
|
// hard-0 base
|
||||||
|
pr->pr_bases[st->c & 3] = st->b;
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
// relative to current base
|
||||||
|
pr->pr_bases[st->c & 3] = PR_BASE (pr, st, B) + st->b;
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
// relative to stack (-ve offset)
|
||||||
|
pr->pr_bases[st->c & 3] = *pr->globals.stack + (pr_short_t) st->b;
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
// relative to edict_area (+ve only)
|
||||||
|
pr->pr_bases[st->c & 3] = edict_area + st->b;
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
// hard-0 base
|
||||||
|
pr->pr_bases[st->c & 3] = pr->pr_globals[st->b].pointer_var;
|
||||||
|
return;
|
||||||
|
case 5:
|
||||||
|
pr->pr_bases[st->c & 3] = OPB(pointer);
|
||||||
|
return;
|
||||||
|
case 6:
|
||||||
|
// relative to stack (-ve offset)
|
||||||
|
pr->pr_bases[st->c & 3] = *pr->globals.stack + OPB(int);
|
||||||
|
return;
|
||||||
|
case 7:
|
||||||
|
// relative to edict_area (+ve only)
|
||||||
|
pr->pr_bases[st->c & 3] = edict_area + OPB(uint);
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
stk = pr_stack_push (pr);
|
||||||
|
STK(uivec4) = pr->pr_bases;
|
||||||
|
return;
|
||||||
|
case 9:
|
||||||
|
stk = pr_stack_pop (pr);
|
||||||
|
pr->pr_bases = STK(uivec4);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PR_RunError (pr, "Invalid with index: %u", st->a);
|
||||||
|
}
|
||||||
|
|
||||||
static pr_ivec4_t
|
static pr_ivec4_t
|
||||||
pr_swizzle_f (pr_ivec4_t vec, pr_ushort_t swiz)
|
pr_swizzle_f (pr_ivec4_t vec, pr_ushort_t swiz)
|
||||||
{
|
{
|
||||||
|
@ -2980,7 +2997,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_WITH:
|
case OP_WITH:
|
||||||
pr->pr_bases[st->c & 3] = pr_with (pr, st);
|
pr_with (pr, st);
|
||||||
break;
|
break;
|
||||||
case OP_STATE_ft:
|
case OP_STATE_ft:
|
||||||
{
|
{
|
||||||
|
@ -3349,10 +3366,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth)
|
||||||
case OP_ANY_4:
|
case OP_ANY_4:
|
||||||
OPC(int) = any4i (OPA(ivec4));
|
OPC(int) = any4i (OPA(ivec4));
|
||||||
break;
|
break;
|
||||||
case OP_PUSHREGS:
|
// spare
|
||||||
stk = pr_stack_push (pr);
|
|
||||||
STK(uivec4) = pr->pr_bases;
|
|
||||||
break;
|
|
||||||
case OP_ALL_2:
|
case OP_ALL_2:
|
||||||
OPC(int) = all2i (OPA(ivec2));
|
OPC(int) = all2i (OPA(ivec2));
|
||||||
break;
|
break;
|
||||||
|
@ -3366,10 +3380,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth)
|
||||||
case OP_ALL_4:
|
case OP_ALL_4:
|
||||||
OPC(int) = all4i (OPA(ivec4));
|
OPC(int) = all4i (OPA(ivec4));
|
||||||
break;
|
break;
|
||||||
case OP_POPREGS:
|
// spare
|
||||||
stk = pr_stack_pop (pr);
|
|
||||||
pr->pr_bases = STK(uivec4);
|
|
||||||
break;
|
|
||||||
case OP_NONE_2:
|
case OP_NONE_2:
|
||||||
OPC(int) = none2i (OPA(ivec2));
|
OPC(int) = none2i (OPA(ivec2));
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue