From 38ab0f0243b754e8a7d94e4f9aeea8aae6e794a4 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 15 Jan 2022 16:51:59 +0900 Subject: [PATCH] [gamecode] Move pushregs and popregs into with This frees up another two instructions. --- libs/gamecode/opcodes.py | 4 +- libs/gamecode/pr_exec.c | 101 ++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/libs/gamecode/opcodes.py b/libs/gamecode/opcodes.py index 5e491510b..ceccba4a7 100644 --- a/libs/gamecode/opcodes.py +++ b/libs/gamecode/opcodes.py @@ -28,9 +28,9 @@ bitmap_txt = """ 1 1011 01ss any 1 1011 0100 1 1011 10ss all -1 1011 1000 pushregs +1 1011 1000 1 1011 11ss none -1 1011 1100 popregs +1 1011 1100 1 1101 01oo move 1 1101 11oo memset 1 1110 d1xx diff --git a/libs/gamecode/pr_exec.c b/libs/gamecode/pr_exec.c index 80f9161af..b3a4afae9 100644 --- a/libs/gamecode/pr_exec.c +++ b/libs/gamecode/pr_exec.c @@ -1861,42 +1861,6 @@ pr_jump_mode (progs_t *pr, const dstatement_t *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 * pr_stack_push (progs_t *pr) { @@ -1923,6 +1887,59 @@ pr_stack_pop (progs_t *pr) 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 pr_swizzle_f (pr_ivec4_t vec, pr_ushort_t swiz) { @@ -2980,7 +2997,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth) } break; case OP_WITH: - pr->pr_bases[st->c & 3] = pr_with (pr, st); + pr_with (pr, st); break; case OP_STATE_ft: { @@ -3349,10 +3366,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth) case OP_ANY_4: OPC(int) = any4i (OPA(ivec4)); break; - case OP_PUSHREGS: - stk = pr_stack_push (pr); - STK(uivec4) = pr->pr_bases; - break; + // spare case OP_ALL_2: OPC(int) = all2i (OPA(ivec2)); break; @@ -3366,10 +3380,7 @@ pr_exec_ruamoko (progs_t *pr, int exitdepth) case OP_ALL_4: OPC(int) = all4i (OPA(ivec4)); break; - case OP_POPREGS: - stk = pr_stack_pop (pr); - pr->pr_bases = STK(uivec4); - break; + // spare case OP_NONE_2: OPC(int) = none2i (OPA(ivec2)); break;