-
flxg非常队 authored477a9aa1
#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; }