Fixed OP_BLOCK_COPY implementation based on ioquake3 code.

This commit is contained in:
Artem Kharytoniuk 2016-07-05 00:05:49 +03:00
parent ee7b1bc5ad
commit e2e32bca15

View File

@ -465,31 +465,25 @@ nextInstruction2:
programCounter += 1; programCounter += 1;
goto nextInstruction; goto nextInstruction;
case OP_BLOCK_COPY: case OP_BLOCK_COPY:
{ {
int *src, *dest; int src = r0;
int i, count, srci, desti; int dest = r1;
size_t n = r2;
count = r2; if ((dest & dataMask) != dest
// MrE: copy range check || (src & dataMask) != src
srci = r0 & dataMask; || ((dest + n) & dataMask) != dest + n
desti = r1 & dataMask; || ((src + n) & dataMask) != src + n)
count = ((srci + count) & dataMask) - srci; {
count = ((desti + count) & dataMask) - desti; Com_Error(ERR_DROP, "OP_BLOCK_COPY out of range!");
}
src = (int *)&image[ r0&dataMask ]; Com_Memcpy(vm->dataBase + dest, vm->dataBase + src, n);
dest = (int *)&image[ r1&dataMask ]; programCounter += 4;
if ( ( (intptr_t)src | (intptr_t)dest | count ) & 3 ) { opStack -= 2;
Com_Error( ERR_DROP, "OP_BLOCK_COPY not dword aligned" ); }
} goto nextInstruction;
count >>= 2;
for ( i = count-1 ; i>= 0 ; i-- ) {
dest[i] = src[i];
}
programCounter += 4;
opStack -= 2;
}
goto nextInstruction;
case OP_CALL: case OP_CALL:
// save current program counter // save current program counter