...
case INST_MUL:
case INST_IDIV:
case INST_DIV:
switch (i)
{
case 0:
vdata->registerWriteCount++;
var->vflags |= VARIABLE_ALLOC_WRITE | VARIABLE_ALLOC_SPECIAL; <-- Should be VARIABLE_ALLOC_READWRITE
var->regMask = Util::maskFromIndex(REG_INDEX_EDX);
gpRestrictMask &= ~var->regMask;
break;
case 1:
vdata->registerRWCount++;
var->vflags |= VARIABLE_ALLOC_READWRITE | VARIABLE_ALLOC_SPECIAL;
var->regMask = Util::maskFromIndex(REG_INDEX_EAX);
gpRestrictMask &= ~var->regMask;
break;
case 2:
vdata->registerReadCount++;
var->vflags |= VARIABLE_ALLOC_READ;
break;
(includes also patches for other register allocator bugs I have found).