// Register. private static bool r1(uint uInstr, XCore200Disassembler dasm) { var iReg = uInstr & 0xF; dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); return(true); }
// Register with immediate. private static bool rus(uint uInstr, XCore200Disassembler dasm) { var base3 = (uInstr >> 6) & 0x1F; if (base3 < 27) { return(false); } if (Bits.IsBitSet(uInstr, 5)) { if (base3 == 31) { return(false); } base3 += 5; } base3 -= 27; var imm = uInstr & 0x03; var iReg = (uInstr >> 2) & 0x03; imm += (base3 % 3) << 2; base3 = base3 / 3; iReg += (base3 % 3) << 2; if (iReg >= 12) { return(false); } dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); dasm.ops.Add(new RegisterOperand(Registers.GpRegs[imm])); return(true); }
// Register with immediate. private static bool rus_bitp(uint uInstr, XCore200Disassembler dasm) { var base3 = (uInstr >> 6) & 0x1F; if (base3 < 27) { return(false); } if (Bits.IsBitSet(uInstr, 5)) { if (base3 == 31) { return(false); } base3 += 5; } base3 -= 27; var imm = uInstr & 0x03; var iReg = (uInstr >> 2) & 0x03; imm += (base3 % 3) << 2; base3 = base3 / 3; iReg += (base3 % 3) << 2; if (iReg >= 12 || imm >= bitpos32.Length) { return(false); } imm = bitpos32[imm]; dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); dasm.ops.Add(ImmediateOperand.Word32(imm)); return(true); }
// 6-bit immediate private static bool u6(uint uInstr, XCore200Disassembler dasm) { var u = uInstr & 0x3F; dasm.ops.Add(ImmediateOperand.Word32(u)); return(false); }
private static bool r2us_bitp(uint uInstr, XCore200Disassembler dasm) { // Get low bits first. var imm3 = uInstr & 0x03; var iReg2 = (uInstr >> 2) & 0x03; var iReg1 = (uInstr >> 4) & 0x03; // Extract base3 field. var base3 = (uInstr >> 6) & 0x1F; imm3 += (base3 % 3) << 2; base3 = base3 / 3; iReg2 += (base3 % 3) << 2; base3 = base3 / 3; iReg1 += (base3 % 3) << 2; if (iReg1 >= 12) { return(false); } imm3 = bitpos32[imm3]; dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg1])); dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg2])); dasm.ops.Add(ImmediateOperand.Word32(imm3)); return(true); }
private static bool PcRel11_2(uint uInstr, XCore200Disassembler dasm) { var offset = pcRe11Field.ReadSigned(uInstr); var addr = dasm.addr + 2 * offset; dasm.ops.Add(AddressOperand.Create(addr)); return(true); }
// 10-bit pc-relative negative displacement private static bool u10_m_pc(uint uInstr, XCore200Disassembler dasm) { var displacement = (int)(uInstr & Bits.Mask(0, 10)) << 1; var addr = dasm.addr - displacement; dasm.ops.Add(AddressOperand.Create(addr)); return(true); }
public override XCoreInstruction Decode(uint wInstr, XCore200Disassembler dasm) { if (!dasm.rdr.TryReadLeUInt16(out ushort u2)) { return(dasm.CreateInvalidInstruction()); } wInstr = (wInstr << 16) | u2; return(subDecoder.Decode(wInstr, dasm)); }
//Register with 6-bit immediate private static bool ru6(uint uInstr, XCore200Disassembler dasm) { var iReg = (uInstr >> 6) & 0xF; var imm = (uInstr & 0x3F); dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); dasm.ops.Add(ImmediateOperand.Word32(imm)); return(true); }
//Register with 6-bit immediate added to PC private static bool ru6_p_pc(uint uInstr, XCore200Disassembler dasm) { var iReg = (uInstr >> 6) & 0xF; var imm = (uInstr & 0x3F) << 1; var addr = dasm.addr + imm; dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); dasm.ops.Add(AddressOperand.Create(addr)); return(true); }
//Register with 6-bit immediate subtracted from PC private static bool ru6_m_pc(uint uInstr, XCore200Disassembler dasm) { var iReg = (uInstr >> 6) & 0xF; var imm = uInstr & 0x3F; if ((imm & 1) != 0) { return(false); // Illegal address. } var addr = dasm.addr - imm; dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg])); dasm.ops.Add(AddressOperand.Create(addr)); return(true); }
public override XCoreInstruction Decode(uint wInstr, XCore200Disassembler dasm) { foreach (var m in mutators) { if (!m(wInstr, dasm)) { return(dasm.CreateInvalidInstruction()); } } var instr = new XCoreInstruction { InstructionClass = iclass, Mnemonic = mnemonic, Operands = dasm.ops.ToArray() }; return(instr); }
// Six registers long. private static bool l6r(uint uInstr, XCore200Disassembler dasm) { return(false); }