public LatticeMico32Rewriter(LatticeMico32Architecture arch, EndianImageReader rdr, ProcessorState state, IStorageBinder binder, IRewriterHost host) { this.arch = arch; this.rdr = rdr; this.state = state; this.binder = binder; this.host = host; this.dasm = new LatticeMico32Disassembler(arch, rdr).GetEnumerator(); this.instr = null !; this.m = null !; }
public IEnumerator <RtlInstructionCluster> GetEnumerator() { while (dasm.MoveNext()) { this.instr = dasm.Current; this.iclass = instr.InstructionClass; var rtls = new List <RtlInstruction>(); this.m = new RtlEmitter(rtls); switch (instr.Mnemonic) { default: EmitUnitTest(); goto case Mnemonic.Invalid; case Mnemonic.Invalid: case Mnemonic.reserved: m.Invalid(); break; case Mnemonic.add: RewriteBinop(m.IAdd); break; case Mnemonic.addi: RewriteBinop(m.IAdd); break; case Mnemonic.and: RewriteBinop(m.And); break; case Mnemonic.andhi: RewriteHiImm(m.And); break; case Mnemonic.andi: RewriteBinop(m.And); break; case Mnemonic.b: RewriteIndirectGoto(); break; case Mnemonic.be: RewriteBranch(m.Eq); break; case Mnemonic.bg: RewriteBranch(m.Gt); break; case Mnemonic.bge: RewriteBranch(m.Ge); break; case Mnemonic.bgeu: RewriteBranch(m.Uge); break; case Mnemonic.bgu: RewriteBranch(m.Ugt); break; case Mnemonic.bi: RewriteGoto(); break; case Mnemonic.bne: RewriteBranch(m.Ne); break; case Mnemonic.call: RewriteCall(); break; case Mnemonic.calli: RewriteCall(); break; case Mnemonic.cmpe: RewriteCmp(m.Eq); break; case Mnemonic.cmpei: RewriteCmp(m.Eq); break; case Mnemonic.cmpg: RewriteCmp(m.Gt); break; case Mnemonic.cmpgi: RewriteCmp(m.Gt); break; case Mnemonic.cmpge: RewriteCmp(m.Ge); break; case Mnemonic.cmpgei: RewriteCmp(m.Ge); break; case Mnemonic.cmpgeu: RewriteCmp(m.Uge); break; case Mnemonic.cmpgeui: RewriteCmp(m.Uge); break; case Mnemonic.cmpgu: RewriteCmp(m.Ugt); break; case Mnemonic.cmpgui: RewriteCmp(m.Ugt); break; case Mnemonic.cmpne: RewriteCmp(m.Ne); break; case Mnemonic.cmpnei: RewriteCmp(m.Ne); break; case Mnemonic.div: RewriteBinop(m.SDiv); break; case Mnemonic.divu: RewriteBinop(m.UDiv); break; case Mnemonic.lb: RewriteLoad(PrimitiveType.Int32); break; case Mnemonic.lbu: RewriteLoad(PrimitiveType.Word32); break; case Mnemonic.lh: RewriteLoad(PrimitiveType.Int32); break; case Mnemonic.lhu: RewriteLoad(PrimitiveType.Word32); break; case Mnemonic.lw: RewriteLoad(PrimitiveType.Word32); break; case Mnemonic.mod: RewriteBinop(m.Mod); break; case Mnemonic.modu: RewriteBinop(m.Mod); break; case Mnemonic.mul: RewriteBinop(m.IMul); break; case Mnemonic.muli: RewriteBinop(m.IMul); break; case Mnemonic.nor: RewriteBinop(Nor); break; case Mnemonic.nori: RewriteBinop(Nor); break; case Mnemonic.or: RewriteBinop(m.Or); break; case Mnemonic.orhi: RewriteHiImm(m.Or); break; case Mnemonic.ori: RewriteBinop(m.Or); break; case Mnemonic.sb: RewriteStore(); break; case Mnemonic.sextb: RewriteSext(PrimitiveType.SByte); break; case Mnemonic.sexth: RewriteSext(PrimitiveType.Int16); break; case Mnemonic.sh: RewriteStore(); break; case Mnemonic.sl: RewriteBinop(m.Shl); break; case Mnemonic.sli: RewriteBinop(m.Shl); break; case Mnemonic.sr: RewriteBinop(m.Sar); break; case Mnemonic.sri: RewriteBinop(m.Sar); break; case Mnemonic.sru: RewriteBinop(m.Shr); break; case Mnemonic.srui: RewriteBinop(m.Shr); break; case Mnemonic.sub: RewriteBinop(m.ISub); break; case Mnemonic.sw: RewriteStore(); break; case Mnemonic.xnor: RewriteBinop(Xnor); break; case Mnemonic.xnori: RewriteBinop(Xnor); break; case Mnemonic.xor: RewriteBinop(m.Xor); break; case Mnemonic.xori: RewriteBinop(m.Xor); break; } yield return(new RtlInstructionCluster(instr.Address, instr.Length, rtls.ToArray()) { Class = iclass }); } }