ProgCom.CPUem.floatInst C# (CSharp) Method

floatInst() private method

private floatInst ( int ins, long regA ) : int
ins int
regA long
return int
        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;
        }