OpenCores
URL https://opencores.org/ocsvn/lxp32/lxp32/trunk

Subversion Repositories lxp32

[/] [lxp32/] [trunk/] [tools/] [src/] [lxp32dump/] [disassembler.cpp] - Diff between revs 6 and 9

Show entire file | Details | Blame | View Log

Rev 6 Rev 9
Line 6... Line 6...
 * This module implements members of the Disassembler class.
 * This module implements members of the Disassembler class.
 */
 */
 
 
#include "disassembler.h"
#include "disassembler.h"
 
 
#include <sstream>
 
#include <stdexcept>
#include <stdexcept>
 
 
/*
/*
 * Disassembler::Operand class members
 * Disassembler::Operand class members
 */
 */
Line 211... Line 210...
        int value=(w>>16)&0xFF;
        int value=(w>>16)&0xFF;
        return Operand(Operand::Register,value);
        return Operand(Operand::Register,value);
}
}
 
 
std::string Disassembler::decodeSimpleInstruction(const std::string &op,Word w) {
std::string Disassembler::decodeSimpleInstruction(const std::string &op,Word w) {
        std::ostringstream oss;
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
        oss<<op<<' '<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
        return op+' '+str(dst)+", "+str(rd1)+", "+str(rd2);
        return oss.str();
 
}
}
 
 
std::string Disassembler::decodeAdd(Word w) {
std::string Disassembler::decodeAdd(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd2.type()==Operand::Direct&&rd2.value()==0&&_preferAliases)
        if(rd2.type()==Operand::Direct&&rd2.value()==0&&_preferAliases)
                oss<<"mov "<<str(dst)<<", "<<str(rd1);
                return "mov "+str(dst)+", "+str(rd1);
        else
        else
                oss<<"add "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
                return "add "+str(dst)+", "+str(rd1)+", "+str(rd2);
 
 
        return oss.str();
 
}
}
 
 
std::string Disassembler::decodeAnd(Word w) {
std::string Disassembler::decodeAnd(Word w) {
        return decodeSimpleInstruction("and",w);
        return decodeSimpleInstruction("and",w);
}
}
Line 337... Line 330...
        if(operand&0x00100000) operand|=0xFFE00000;
        if(operand&0x00100000) operand|=0xFFE00000;
        return "lcs "+str(dst)+", 0x"+hex(operand);
        return "lcs "+str(dst)+", 0x"+hex(operand);
}
}
 
 
std::string Disassembler::decodeLsb(Word w) {
std::string Disassembler::decodeLsb(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd1.type()!=Operand::Register) return decodeWord(w);
        if(rd1.type()!=Operand::Register) return decodeWord(w);
Line 350... Line 341...
 
 
        return "lsb "+str(dst)+", "+str(rd1);
        return "lsb "+str(dst)+", "+str(rd1);
}
}
 
 
std::string Disassembler::decodeLub(Word w) {
std::string Disassembler::decodeLub(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd1.type()!=Operand::Register) return decodeWord(w);
        if(rd1.type()!=Operand::Register) return decodeWord(w);
Line 363... Line 352...
 
 
        return "lub "+str(dst)+", "+str(rd1);
        return "lub "+str(dst)+", "+str(rd1);
}
}
 
 
std::string Disassembler::decodeLw(Word w) {
std::string Disassembler::decodeLw(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd1.type()!=Operand::Register) return decodeWord(w);
        if(rd1.type()!=Operand::Register) return decodeWord(w);
Line 401... Line 388...
std::string Disassembler::decodeOr(Word w) {
std::string Disassembler::decodeOr(Word w) {
        return decodeSimpleInstruction("or",w);
        return decodeSimpleInstruction("or",w);
}
}
 
 
std::string Disassembler::decodeSb(Word w) {
std::string Disassembler::decodeSb(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(dst.value()!=0) return decodeWord(w);
        if(dst.value()!=0) return decodeWord(w);
Line 432... Line 417...
        if(rd2.type()==Operand::Direct&&(rd2.value()<0||rd2.value()>31)) return decodeWord(w);
        if(rd2.type()==Operand::Direct&&(rd2.value()<0||rd2.value()>31)) return decodeWord(w);
        return decodeSimpleInstruction("sru",w);
        return decodeSimpleInstruction("sru",w);
}
}
 
 
std::string Disassembler::decodeSub(Word w) {
std::string Disassembler::decodeSub(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd1.type()==Operand::Direct&&rd1.value()==0&&_preferAliases)
        if(rd1.type()==Operand::Direct&&rd1.value()==0&&_preferAliases)
                oss<<"neg "<<str(dst)<<", "<<str(rd2);
                return "neg "+str(dst)+", "+str(rd2);
        else
        else
                oss<<"sub "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
                return "sub "+str(dst)+", "+str(rd1)+", "+str(rd2);
 
 
        return oss.str();
 
}
}
 
 
std::string Disassembler::decodeSw(Word w) {
std::string Disassembler::decodeSw(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(dst.value()!=0) return decodeWord(w);
        if(dst.value()!=0) return decodeWord(w);
Line 460... Line 439...
 
 
        return "sw "+str(rd1)+", "+str(rd2);
        return "sw "+str(rd1)+", "+str(rd2);
}
}
 
 
std::string Disassembler::decodeXor(Word w) {
std::string Disassembler::decodeXor(Word w) {
        std::ostringstream oss;
 
 
 
        auto dst=decodeDstOperand(w);
        auto dst=decodeDstOperand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd1=decodeRd1Operand(w);
        auto rd2=decodeRd2Operand(w);
        auto rd2=decodeRd2Operand(w);
 
 
        if(rd2.type()==Operand::Direct&&rd2.value()==-1&&_preferAliases)
        if(rd2.type()==Operand::Direct&&rd2.value()==-1&&_preferAliases)
                oss<<"not "<<str(dst)<<", "<<str(rd1);
                return "not "+str(dst)+", "+str(rd1);
        else
        else
                oss<<"xor "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
                return "xor "+str(dst)+", "+str(rd1)+", "+str(rd2);
 
 
        return oss.str();
 
}
}
 
 
std::string Disassembler::decodeWord(Word w) {
std::string Disassembler::decodeWord(Word w) {
        return ".word 0x"+hex(w);
        return ".word 0x"+hex(w);
}
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.