static List<CStatement> Stw_C(uint pc, uint instruction) { Instruction i = new Instruction(instruction); CStatement stat = new CStatement(CStatement.Kinds.Assignment); stat.OperandSizes = CStatement.Sizes.Int; if (i.RS() == 0) stat.Op2 = new CStatement.COperand(0); else stat.Op2 = new CStatement.COperand(RegName(i.RS())); int ds = (int)i.SIMM(); if (i.RA() != 0) stat.Op1 = new CStatement.COperand(RegName(i.RA()), ds); else { stat.Op1 = new CStatement.COperand(); stat.Op1.Kind = CStatement.OperandKinds.AddressPointer; stat.Op1.Offset = ds; } List<CStatement> stats = new List<CStatement>(); stats.Add(stat); return stats; }
static List<CStatement> Addi_C(uint pc, uint instruction) { Instruction i = new Instruction(instruction); CStatement stat = new CStatement(CStatement.Kinds.Assignment, RegName(i.RD())); if (i.RA() == 0) stat.Op2 = new CStatement.COperand((ulong)(long)i.SIMM()); else if (i.SIMM() == 0) stat.Op2 = new CStatement.COperand(RegName(i.RA())); else { CStatement add = new CStatement(CStatement.Kinds.Addition, RegName(i.RA()), (ulong)(long)i.SIMM()); long val = (long)add.Op2.Value; if (val < 0) { add.Kind = CStatement.Kinds.Subtraction; add.Op2.Value = (ulong)-val; } stat.Op2 = new CStatement.COperand(add); } List<CStatement> stats = new List<CStatement>(); stats.Add(stat); return stats; }
static List<CStatement> Stwu_C(uint pc, uint instruction) { Instruction i = new Instruction(instruction); List<CStatement> stats = Stw_C(pc, instruction); if (i.SIMM() == 0) return stats; CStatement add = new CStatement(CStatement.Kinds.Addition, RegName(i.RA()), (ulong)(long)i.SIMM()); CStatement stat = new CStatement(CStatement.Kinds.Assignment, RegName(i.RA()), add); stat.OperandSizes = CStatement.Sizes.Int; stats.Add(stat); return stats; }