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 !; }
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(); } }
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, }); } }