Merge remote-tracking branch 'origin/master' into asmjit

This commit is contained in:
Magnus Norddahl 2018-10-14 22:55:57 +02:00
commit 70f18f87b9
10 changed files with 454 additions and 146 deletions

View file

@ -569,77 +569,77 @@ static int ExecScriptFunc(VMFrameStack *stack, VMReturn *ret, int numret)
assert(f->NumParam < sfunc->MaxParam);
{
VMValue *param = &reg.param[f->NumParam++];
b = B;
if (b == REGT_NIL)
b = BC;
if (a == REGT_NIL)
{
::new(param) VMValue();
}
else
{
switch(b)
switch(a)
{
case REGT_INT:
assert(C < f->NumRegD);
::new(param) VMValue(reg.d[C]);
assert(b < f->NumRegD);
::new(param) VMValue(reg.d[b]);
break;
case REGT_INT | REGT_ADDROF:
assert(C < f->NumRegD);
::new(param) VMValue(&reg.d[C]);
assert(b < f->NumRegD);
::new(param) VMValue(&reg.d[b]);
break;
case REGT_INT | REGT_KONST:
assert(C < sfunc->NumKonstD);
::new(param) VMValue(konstd[C]);
assert(b < sfunc->NumKonstD);
::new(param) VMValue(konstd[b]);
break;
case REGT_STRING:
assert(C < f->NumRegS);
::new(param) VMValue(&reg.s[C]);
assert(b < f->NumRegS);
::new(param) VMValue(&reg.s[b]);
break;
case REGT_STRING | REGT_ADDROF:
assert(C < f->NumRegS);
::new(param) VMValue((void*)&reg.s[C]); // Note that this may not use the FString* version of the constructor!
assert(b < f->NumRegS);
::new(param) VMValue((void*)&reg.s[b]); // Note that this may not use the FString* version of the constructor!
break;
case REGT_STRING | REGT_KONST:
assert(C < sfunc->NumKonstS);
::new(param) VMValue(&konsts[C]);
assert(b < sfunc->NumKonstS);
::new(param) VMValue(&konsts[b]);
break;
case REGT_POINTER:
assert(C < f->NumRegA);
::new(param) VMValue(reg.a[C]);
assert(b < f->NumRegA);
::new(param) VMValue(reg.a[b]);
break;
case REGT_POINTER | REGT_ADDROF:
assert(C < f->NumRegA);
::new(param) VMValue(&reg.a[C]);
assert(b < f->NumRegA);
::new(param) VMValue(&reg.a[b]);
break;
case REGT_POINTER | REGT_KONST:
assert(C < sfunc->NumKonstA);
::new(param) VMValue(konsta[C].v);
assert(b < sfunc->NumKonstA);
::new(param) VMValue(konsta[b].v);
break;
case REGT_FLOAT:
assert(C < f->NumRegF);
::new(param) VMValue(reg.f[C]);
assert(b < f->NumRegF);
::new(param) VMValue(reg.f[b]);
break;
case REGT_FLOAT | REGT_MULTIREG2:
assert(C < f->NumRegF - 1);
assert(b < f->NumRegF - 1);
assert(f->NumParam < sfunc->MaxParam);
::new(param) VMValue(reg.f[C]);
::new(param + 1) VMValue(reg.f[C + 1]);
::new(param) VMValue(reg.f[b]);
::new(param + 1) VMValue(reg.f[b + 1]);
f->NumParam++;
break;
case REGT_FLOAT | REGT_MULTIREG3:
assert(C < f->NumRegF - 2);
assert(b < f->NumRegF - 2);
assert(f->NumParam < sfunc->MaxParam - 1);
::new(param) VMValue(reg.f[C]);
::new(param + 1) VMValue(reg.f[C + 1]);
::new(param + 2) VMValue(reg.f[C + 2]);
::new(param) VMValue(reg.f[b]);
::new(param + 1) VMValue(reg.f[b + 1]);
::new(param + 2) VMValue(reg.f[b + 2]);
f->NumParam += 2;
break;
case REGT_FLOAT | REGT_ADDROF:
assert(C < f->NumRegF);
::new(param) VMValue(&reg.f[C]);
assert(b < f->NumRegF);
::new(param) VMValue(&reg.f[b]);
break;
case REGT_FLOAT | REGT_KONST:
assert(C < sfunc->NumKonstF);
::new(param) VMValue(konstf[C]);
assert(b < sfunc->NumKonstF);
::new(param) VMValue(konstf[b]);
break;
default:
assert(0);