Instruction.h 20.54 KiB
#ifndef MISAKA_INSTRUCTION
#define MISAKA_INSTRUCTION
#include <string>
#include <map>
#include "Value.h"
#include "User.h"
#include "Type.h"
#include "Constant.h"
#include "BasicBlock.h"
#include "Function.h"
class BasicBlock;
class Function;
class IRVisitor;
namespace ASM {
    class Operand2;
    class Reg;
    class VIntReg;
    class RIntReg;
    class VFpReg;
    class RFpReg;
    class Constant;
    class ConstantInt;
    class ConstantFloat;
    class ShiftReg;
    class ShiftVal;
    class ASMInstruction;
    class Condition;
    class SMark;
    class Func;
    class Block;
class Instruction;
class BinaryInstr;
class CmpInstr;
class FCmpInstr;
class CallInstr;
class BranchInstr;
class ReturnInstr;
class GetElementPtrInstr;
class StoreInstr;
class LoadInstr;
class AllocaInstr;
class ZextInstr;
class FpToSiInstr;
class SiToFpInstr;
class PhiInstr;
// FIXME:有没有必要添加id?id的用处是什么?
class Instruction : public User
public:
    enum InstrID
        // 终止指令
        ret,
        br,
        // 整数二元运算
        add,
        sub,
        mul,
        sdiv,
        srem,
        // 浮点数二元运算
        fadd,
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
fsub, fmul, fdiv, // 内存操作 alloca, load, store, // 其他指令 cmp, fcmp, phi, call, getelementptr, // 格式转换指令 zext, fptosi, sitofp, bitcast, }; Instruction(Type *type, InstrID iID, BasicBlock *parent); virtual ~Instruction(); BasicBlock *get_parent() const { return parent; } void set_parent(BasicBlock *parent); // Module *get_module(){return this->parent->get_parent()->get_parent();} InstrID get_instruction_ID() { return iID; } std::string get_name_of_instruction() { switch (iID) { case ret: return "ret"; break; case br: return "br"; break; case add: return "add"; break; case sub: return "sub"; break; case mul: return "mul"; break; case sdiv: return "sdiv"; break; case srem: return "srem"; break; case fadd: return "fadd"; break; case fsub: return "fsub"; break; case fmul: return "fmul"; break; case fdiv: return "fdiv"; break; case alloca: return "alloca"; break; case load: return "load";
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
break; case store: return "store"; break; case cmp: return "icmp"; break; case fcmp: return "fcmp"; break; case phi: return "phi"; break; case call: return "call"; break; case getelementptr: return "getelementptr"; break; case zext: return "zext"; break; case fptosi: return "fptosi"; break; case sitofp: return "sitofp"; break; case bitcast: return "bitcast"; break; default: return ""; break; } } bool is_void(); bool is_phi() { return iID == phi; } bool is_store() { return iID == store; } bool is_alloca() { return iID == alloca; } bool is_ret() { return iID == ret; } bool is_load() { return iID == load; } bool is_br() { return iID == br; } bool is_add() { return iID == add; } bool is_sub() { return iID == sub; } bool is_mul() { return iID == mul; } bool is_div() { return iID == sdiv; } bool is_rem() { return iID == srem; } bool is_fadd() { return iID == fadd; } bool is_fsub() { return iID == fsub; } bool is_fmul() { return iID == fmul; } bool is_fdiv() { return iID == fdiv; } bool is_cmp() { return iID == cmp; } bool is_fcmp() { return iID == fcmp; } // bool is_cmpbr() { return iID == cmpbr; } bool is_call() { return iID == call; } bool is_gep() { return iID == getelementptr; }