Allow unaligned load/store in QVM interpreter/x86 compiler
constructions like (dataMask & ~3) was used to protect against out-of-bound load/store when address is 4-byte closer to dataMask but at the same time it effectively cut low address bits for ALL load/store operations which is totally wrong in terms of conformance to ALLOWED (i.e. generated by q3lcc from C sources) low-level operations like packed binary data parsing
This commit is contained in:
parent
abce15055c
commit
566fb0edfc
4 changed files with 17 additions and 14 deletions
|
@ -436,31 +436,31 @@ nextInstruction2:
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
r0 = opStack[opStackOfs] = *(int *) &image[r0 & dataMask & ~3 ];
|
||||
r0 = opStack[opStackOfs] = *(int *) &image[ r0 & dataMask ];
|
||||
goto nextInstruction2;
|
||||
case OP_LOAD2:
|
||||
r0 = opStack[opStackOfs] = *(unsigned short *)&image[ r0&dataMask&~1 ];
|
||||
r0 = opStack[opStackOfs] = *(unsigned short *)&image[ r0 & dataMask ];
|
||||
goto nextInstruction2;
|
||||
case OP_LOAD1:
|
||||
r0 = opStack[opStackOfs] = image[ r0&dataMask ];
|
||||
r0 = opStack[opStackOfs] = image[ r0 & dataMask ];
|
||||
goto nextInstruction2;
|
||||
|
||||
case OP_STORE4:
|
||||
*(int *)&image[ r1&(dataMask & ~3) ] = r0;
|
||||
*(int *)&image[ r1 & dataMask ] = r0;
|
||||
opStackOfs -= 2;
|
||||
goto nextInstruction;
|
||||
case OP_STORE2:
|
||||
*(short *)&image[ r1&(dataMask & ~1) ] = r0;
|
||||
*(short *)&image[ r1 & dataMask ] = r0;
|
||||
opStackOfs -= 2;
|
||||
goto nextInstruction;
|
||||
case OP_STORE1:
|
||||
image[ r1&dataMask ] = r0;
|
||||
image[ r1 & dataMask ] = r0;
|
||||
opStackOfs -= 2;
|
||||
goto nextInstruction;
|
||||
|
||||
case OP_ARG:
|
||||
// single byte offset from programStack
|
||||
*(int *)&image[ (codeImage[programCounter] + programStack)&dataMask&~3 ] = r0;
|
||||
*(int *)&image[ (codeImage[programCounter] + programStack) & dataMask ] = r0;
|
||||
opStackOfs--;
|
||||
programCounter += 1;
|
||||
goto nextInstruction;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue