Exemplo n.º 1
0
 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 !;
 }
Exemplo n.º 2
0
        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
                });
            }
        }