[gamecode] Move pushregs and popregs into with

This frees up another two instructions.
This commit is contained in:
Bill Currie 2022-01-15 16:51:59 +09:00
parent a14b9f8252
commit 38ab0f0243
2 changed files with 58 additions and 47 deletions

View file

@ -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

View file

@ -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;