if (d == 1) { if (rd != reg1) { new MoveText(rd, reg1); } } else if ((d & (d - 1)) == 0){ int k = 0; while ((d & (1 << k)) == 0) { k++; } new ALUText(ALUText.Op.SRA, reg2, reg1, k - 1); new ALUText(ALUText.Op.SRL, reg2, reg2, 32 - k); new ALUText(ALUText.Op.ADDU, reg2, reg2, reg1); new ALUText(ALUText.Op.SRA, rd, reg2, k); } else { int N = 31; long m = 0; int l = 0; while (true) { l++; m = (long) Math.ceil((double) (1L << (N + l)) / d); if (m * d <= (1L << (N + l)) + (1L << l)) { break; } } if (m < (1L << N)) { new LiText(reg2, (int) m); new MDText(MDText.Op.MULT, reg1, reg2); new MFText(MFText.MFType.MFHI, reg2);
new ALUText(ALUText.Op.SRA, reg2, reg2, l - 1); new ALUText(ALUText.Op.SRL, reg1, reg1, 31); new ALUText(ALUText.Op.ADDU, rd, reg2, reg1); } else { m -= (1L << 32); new LiText(reg2, (int) m); new MDText(MDText.Op.MULT, reg1, reg2); new MFText(MFText.MFType.MFHI,reg2);
new ALUText(ALUText.Op.ADDU, reg2, reg2, reg1); new ALUText(ALUText.Op.SRA, reg2, reg2, l - 1); new ALUText(ALUText.Op.SRL, reg1, reg1, 31);
new ALUText(ALUText.Op.ADDU, rd, reg2, reg1); } }
|