- minor VM optimization: Precalculate a function's frame size when compiling it instead of doing it each time it gets called.

This made up ca. 10% of the 'call' instruction's execution time.
This commit is contained in:
Christoph Oelckers 2017-04-01 10:42:47 +02:00
parent 893607c96c
commit 41f2f61b94
3 changed files with 3 additions and 3 deletions

View File

@ -139,6 +139,7 @@ void VMFunctionBuilder::MakeFunction(VMScriptFunction *func)
func->NumRegA = Registers[REGT_POINTER].MostUsed;
func->NumRegS = Registers[REGT_STRING].MostUsed;
func->MaxParam = MaxParam;
func->StackSize = VMFrame::FrameSize(func->NumRegD, func->NumRegF, func->NumRegS, func->NumRegA, func->MaxParam, func->ExtraSpace);
// Technically, there's no reason why we can't end the function with
// entries on the parameter stack, but it means the caller probably

View File

@ -716,6 +716,7 @@ public:
int ExtraSpace;
int CodeSize; // Size of code in instructions (not bytes)
unsigned LineInfoCount;
unsigned StackSize;
VM_UBYTE NumRegD;
VM_UBYTE NumRegF;
VM_UBYTE NumRegS;

View File

@ -273,10 +273,8 @@ VMFrameStack::~VMFrameStack()
VMFrame *VMFrameStack::AllocFrame(VMScriptFunction *func)
{
int size = VMFrame::FrameSize(func->NumRegD, func->NumRegF, func->NumRegS, func->NumRegA,
func->MaxParam, func->ExtraSpace);
VMFrame *frame = Alloc(size);
frame->Func = func;
VMFrame *frame = Alloc(func->StackSize);
frame->NumRegD = func->NumRegD;
frame->NumRegF = func->NumRegF;
frame->NumRegS = func->NumRegS;