Ejemplo n.º 1
0
 public PaRiscRewriter(PaRiscArchitecture 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 PaRiscDisassembler(arch, rdr).GetEnumerator();
     this.instr  = null !;
     this.m      = null !;
 }
Ejemplo n.º 2
0
        public IEnumerator <RtlInstructionCluster> GetEnumerator()
        {
            while (dasm.MoveNext())
            {
                this.instr  = dasm.Current;
                this.iclass = instr.InstructionClass;
                switch (instr.Mnemonic)
                {
                default:
                    EmitUnitTest();
                    goto case Mnemonic.invalid;

                case Mnemonic.invalid: m.Invalid(); break;

                case Mnemonic.add: RewriteAdd(true); break;

                case Mnemonic.add_c: RewriteAdd_c(); break;

                case Mnemonic.add_l: RewriteAdd(false); break;

                case Mnemonic.addb: RewriteAddb(); break;

                case Mnemonic.addi: RewriteAddi(false); break;

                case Mnemonic.addi_tc: RewriteAddi(true); break;

                case Mnemonic.addib: RewriteAddb(); break;

                case Mnemonic.addil: RewriteAddi(false); break;

                case Mnemonic.and: RewriteLogical(m.And); break;

                case Mnemonic.andcm: RewriteLogical((a, b) => m.And(a, m.Comp(b))); break;

                case Mnemonic.bb: RewriteBb(); break;

                case Mnemonic.b_l: RewriteBranch(); break;

                case Mnemonic.be: RewriteBe(false); break;

                case Mnemonic.be_l: RewriteBe(true); break;

                case Mnemonic.bv: RewriteBv(); break;

                case Mnemonic.cmpb: RewriteCmpb(0, 1); break;

                case Mnemonic.cmpclr: RewriteCmpclr(0, 1); break;

                case Mnemonic.cmpib: RewriteCmpb(1, 0); break;

                case Mnemonic.cmpiclr: RewriteCmpclr(1, 0); break;

                case Mnemonic.@break: RewriteBreak(); break;

                case Mnemonic.depw: RewriteDepw(); break;

                case Mnemonic.depwi: RewriteDepwi(); break;

                case Mnemonic.diag: RewriteDiag(); break;

                case Mnemonic.ds: RewriteDs(); break;

                case Mnemonic.extrw: RewriteExtrw(); break;

                case Mnemonic.fadd: RewriteFpArithmetic(m.FAdd); break;

                case Mnemonic.fcnv: RewriteFcnv(); break;

                case Mnemonic.fcnvxf: RewriteFcnvxf(); break;

                case Mnemonic.fcpy: RewriteFcpy(); break;

                case Mnemonic.fid: RewriteFid(); break;

                case Mnemonic.fldd: RewriteFld(PrimitiveType.Real64); break;

                case Mnemonic.fldw: RewriteFld(PrimitiveType.Real32); break;

                case Mnemonic.fmpy: RewriteFpArithmetic(m.FMul); break;

                case Mnemonic.fstd: RewriteFst(PrimitiveType.Real64); break;

                case Mnemonic.fstw: RewriteFst(PrimitiveType.Real32); break;

                case Mnemonic.fsub: RewriteFpArithmetic(m.FSub); break;

                case Mnemonic.ldb: RewriteLd(PrimitiveType.Byte); break;

                case Mnemonic.ldd: RewriteLd(PrimitiveType.Word64); break;

                case Mnemonic.ldh: RewriteLd(PrimitiveType.Word16); break;

                case Mnemonic.ldil: RewriteLdil(); break;

                case Mnemonic.ldo: RewriteLdo(); break;

                case Mnemonic.ldsid: RewriteLdsid(); break;

                case Mnemonic.ldw: RewriteLd(PrimitiveType.Word32); break;

                case Mnemonic.ldwa: RewriteLd(PrimitiveType.Word32); break;

                case Mnemonic.mfctl: RewriteMfctl(); break;

                case Mnemonic.mfctl_w: RewriteMfctl(); break;

                case Mnemonic.movb: RewriteMovb(); break;

                case Mnemonic.mtctl: RewriteMtctl(); break;

                case Mnemonic.mtsm: RewriteMtsm(); break;

                case Mnemonic.mtsp: RewriteMtsp(); break;

                case Mnemonic.or: RewriteOr(); break;

                case Mnemonic.rfi: RewriteRfi("__rfi"); break;

                case Mnemonic.rfi_r: RewriteRfi("__rfi_r"); break;

                case Mnemonic.shladd: RewriteShladd(); break;

                case Mnemonic.shrpd: RewriteShrp(PrimitiveType.Word64, PrimitiveType.Word128); break;

                case Mnemonic.shrpw: RewriteShrp(PrimitiveType.Word32, PrimitiveType.Word64); break;

                case Mnemonic.stb: RewriteSt(PrimitiveType.Byte); break;

                case Mnemonic.std: RewriteSt(PrimitiveType.Word64); break;

                case Mnemonic.stda: RewriteSt(PrimitiveType.Word64); break;

                case Mnemonic.sth: RewriteSt(PrimitiveType.Word16); break;

                case Mnemonic.stw: RewriteSt(PrimitiveType.Word32); break;

                case Mnemonic.sub: RewriteSub(); break;

                case Mnemonic.sub_b: RewriteSub_b(); break;

                case Mnemonic.subi: RewriteSubi(); break;

                case Mnemonic.xor: RewriteLogical(m.Xor); break;
                }
                yield return(m.MakeCluster(instr.Address, instr.Length, iclass));

                instrs.Clear();
            }
        }
Ejemplo n.º 3
0
        public IEnumerator <RtlInstructionCluster> GetEnumerator()
        {
            while (dasm.MoveNext())
            {
                this.instr  = dasm.Current;
                this.iclass = instr.InstructionClass;
                var instrs = new List <RtlInstruction>();
                m = new RtlEmitter(instrs);
                switch (instr.Opcode)
                {
                default:
                    EmitUnitTest();
                    goto case Opcode.invalid;

                case Opcode.invalid: m.Invalid(); break;

                case Opcode.add: RewriteAdd(true); break;

                case Opcode.add_c: RewriteAdd_c(); break;

                case Opcode.add_l: RewriteAdd(false); break;

                case Opcode.addb: RewriteAddb(); break;

                case Opcode.addi: RewriteAddi(false); break;

                case Opcode.addi_tc: RewriteAddi(true); break;

                case Opcode.addib: RewriteAddb(); break;

                case Opcode.addil: RewriteAddi(false); break;

                case Opcode.and: RewriteLogical(m.And); break;

                case Opcode.andcm: RewriteLogical((a, b) => m.And(a, m.Comp(b))); break;

                case Opcode.b_l: RewriteBranch(); break;

                case Opcode.be: RewriteBe(); break;

                case Opcode.be_l: RewriteBe(); break;

                case Opcode.bv: RewriteBv(); break;

                case Opcode.cmpb: RewriteCmpb(0, 1); break;

                case Opcode.cmpib: RewriteCmpb(1, 0); break;

                case Opcode.@break: RewriteBreak(); break;

                case Opcode.depwi: RewriteDepwi(); break;

                case Opcode.diag: RewriteDiag(); break;

                case Opcode.extrw: RewriteExtrw(); break;

                case Opcode.fadd: RewriteFpArithmetic(m.FAdd); break;

                case Opcode.fcpy: RewriteFcpy(); break;

                case Opcode.fid: RewriteFid(); break;

                case Opcode.fldd: RewriteFld(PrimitiveType.Real64); break;

                case Opcode.fldw: RewriteFld(PrimitiveType.Real32); break;

                case Opcode.fmpy: RewriteFpArithmetic(m.FMul); break;

                case Opcode.fstd: RewriteFst(PrimitiveType.Real64); break;

                case Opcode.fstw: RewriteFst(PrimitiveType.Real32); break;

                case Opcode.fsub: RewriteFpArithmetic(m.FSub); break;

                case Opcode.ldb: RewriteLd(PrimitiveType.Byte); break;

                case Opcode.ldd: RewriteLd(PrimitiveType.Word64); break;

                case Opcode.ldh: RewriteLd(PrimitiveType.Word16); break;

                case Opcode.ldil: RewriteLdil(); break;

                case Opcode.ldo: RewriteLdo(); break;

                case Opcode.ldsid: RewriteLdsid(); break;

                case Opcode.ldw: RewriteLd(PrimitiveType.Word32); break;

                case Opcode.ldwa: RewriteLd(PrimitiveType.Word32); break;

                case Opcode.mfctl: RewriteMfctl(); break;

                case Opcode.mfctl_w: RewriteMfctl(); break;

                case Opcode.mtctl: RewriteMtctl(); break;

                case Opcode.mtsm: RewriteMtsm(); break;

                case Opcode.mtsp: RewriteMtsp(); break;

                case Opcode.or: RewriteOr(); break;

                case Opcode.rfi: RewriteRfi("__rfi"); break;

                case Opcode.rfi_r: RewriteRfi("__rfi_r"); break;

                case Opcode.shladd: RewriteShladd(); break;

                case Opcode.shrpd: RewriteShrp(PrimitiveType.Word64, PrimitiveType.Word128); break;

                case Opcode.shrpw: RewriteShrp(PrimitiveType.Word32, PrimitiveType.Word64); break;

                case Opcode.stb: RewriteSt(PrimitiveType.Byte); break;

                case Opcode.std: RewriteSt(PrimitiveType.Word64); break;

                case Opcode.stda: RewriteSt(PrimitiveType.Word64); break;

                case Opcode.sth: RewriteSt(PrimitiveType.Word16); break;

                case Opcode.stw: RewriteSt(PrimitiveType.Word32); break;

                case Opcode.sub: RewriteSub(); break;

                case Opcode.subi: RewriteSubi(); break;
                }
                yield return(new RtlInstructionCluster(instr.Address, instr.Length, instrs.ToArray())
                {
                    Class = iclass,
                });
            }
        }