private int floatInst(int ins, long regA)
{
//what are the instructions we run here?
//fpush, fpush1, fpushn1, fpush0, fpushpi, fpop, fadd, fsub, fmul, fdiv,
int returnCycles = 1;
ins = ins & 0xf;
switch (ins) {
case 0://fadd
if (fsp[fss] > 0) {
floatStack[fss, fsp[fss] - 1] += floatStack[fss, fsp[fss]];
fsp[fss] -= 1;
} else {
floatStack[fss, fsp[fss]] += floatStack[fss, fsp[fss] + 1];
}
fsbc[fss] += 2;
break;
case 1://fsub
if (fsp[fss] > 0) {
floatStack[fss, fsp[fss] - 1] -= floatStack[fss, fsp[fss]];
fsp[fss] -= 1;
} else {
floatStack[fss, fsp[fss]] -= floatStack[fss, fsp[fss] + 1];
}
fsbc[fss] += 2;
break;
case 2://fmul
if (fsp[fss] > 0) {
floatStack[fss, fsp[fss] - 1] *= floatStack[fss, fsp[fss]];
fsp[fss] -= 1;
} else {
floatStack[fss, fsp[fss]] *= floatStack[fss, fsp[fss] + 1];
}
fsbc[fss] += 15;
break;
case 3://fdiv
if (fsp[fss] > 0) {
floatStack[fss, fsp[fss] - 1] /= floatStack[fss, fsp[fss]];
fsp[fss] -= 1;
} else {
floatStack[fss, fsp[fss]] /= floatStack[fss, fsp[fss] + 1];
}
fsbc[fss] += 60;
break;
case 4://fmerge
if (fsbc[0] > fsbc[1]) {
fsbc[0] += 1;
fsbc[1] = fsbc[0];
} else {//the merge operation requires both stacks to be synchronised
fsbc[1] += 1;
fsbc[0] = fsbc[1];
}
int fsp1 = fsp[0];
if (fsp1 < 0) fsp1 = 0;
int fsp2 = fsp[1];
if (fsp2 < 0) fsp2 = 0;
floatStack[0, fsp1] += floatStack[1, fsp2];
fsbc[fss] += 2;
break;
case 5://ftoi
floatStack[fss, fsp[fss]] = Util.itof((Int32)floatStack[fss, fsp[fss]]);
fsbc[fss] += 30;
break;
case 6://ftof
floatStack[fss, fsp[fss]] = (float)Util.ftoi(floatStack[fss, fsp[fss]]);
fsbc[fss] += 30;
break;
case 7://fss
register[regA] = (fsp[fss] & 0xffff) | fss<<16;;
fsbc[fss] += 1;
break;
case 8://fpop
register[regA] = Util.ftoi(floatStack[fss, fsp[fss]]);
if (fsp[fss] > -1) {
register[regA] = Util.ftoi(floatStack[fss, fsp[fss]]);
fsp[fss] -= 1;
} else {
register[regA] = Util.ftoi(floatStack[fss, 0]);
}
returnCycles += fsbc[fss];
fsbc[fss] += 1;
break;
case 9://fpush
if (fsp[fss] < 3) {
fsp[fss] += 1;
}
floatStack[fss, fsp[fss]] = Util.itof(register[regA]);
returnCycles += fsbc[fss];
fsbc[fss] += 1;
break;
case 10://fsel0
fss = 0;
break;
case 11://fsel1
fss = 1;
break;
case 12://fflush
for (int i = 0; i < 4; ++i) {
floatStack[fss, i] = 0;
}
fsp[fss] = 0;
fsbc[fss] = 1;
break;
case 13://fpush1
if (fsp[fss] < 3) {
fsp[fss] += 1;
}
floatStack[fss, fsp[fss]] = 1.0f;
fsbc[fss] += 1;
break;
case 14://fpushn1
if (fsp[fss] < 3) {
fsp[fss] += 1;
}
floatStack[fss, fsp[fss]] = -1.0f;
fsbc[fss] += 1;
break;
case 15://fpushpi
if (fsp[fss] < 3) {
fsp[fss] += 1;
}
floatStack[fss, fsp[fss]] = (float)Math.PI;
fsbc[fss] += 1;
break;
default:
spawnException(258);
break;
}
return returnCycles;
}