diff --git a/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java b/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java
index 7c17b9604fea9d307fe5e6f407ec64849a0b8e04..7c4ba4461ff7f62cf8a3937edee22f0a3a6b3b67 100644
--- a/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java
+++ b/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java
@@ -7,7 +7,7 @@ import cn.edu.nju.software.ir.value.ValueRef;
 
 import java.util.ArrayList;
 
-public class BasicBlockRef {
+public class BasicBlockRef extends ValueRef {
     private final static ArrayList<String> usedNameList = new ArrayList<String>(){{add("");}};
     private final static ArrayList<Integer> usedFreqList = new ArrayList<Integer>(){{add(0);}};
     private final String name;
@@ -81,4 +81,9 @@ public class BasicBlockRef {
     public LocalVar createLocalVar(TypeRef type, String name) {
         return function.createLocalVar(type, name);
     }
+
+    @Override
+    public String toString() {
+        return "%" + name;
+    }
 }
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java b/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java
new file mode 100644
index 0000000000000000000000000000000000000000..0042784e22acbfde5ce802193fe0e0d495dba1c8
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java
@@ -0,0 +1,25 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.Pointer;
+import cn.edu.nju.software.ir.type.TypeRef;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Allocate extends Instruction {
+    // please make sure that pointer(lVal) is a pointer type variable
+    public Allocate(ValueRef pointer) {
+        operator = getOperator(OpEnum.ALLOC);
+        lVal = pointer;
+    }
+
+    @Override
+    public boolean isAlloc() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        TypeRef base = ((Pointer)lVal.getType()).getBase();
+        return lVal + " = alloca " + base + ", align " + base.getWidth();
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java b/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cea8045355b4378febc971be75033414dd96cd9
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java
@@ -0,0 +1,17 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.TypeRef;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Arithmetic extends Binary {
+    public Arithmetic(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) {
+        super(lVal, op, operand1, operand2);
+    }
+
+    @Override
+    public boolean isArithmetic() {
+        return true;
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java b/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java
new file mode 100644
index 0000000000000000000000000000000000000000..13a78fc7c0a5f0ebf55896214485f4356d915317
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java
@@ -0,0 +1,19 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Binary extends Instruction {
+    public Binary(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) {
+        this.lVal = lVal;
+        operator = getOperator(op);
+        operands = new ValueRef[]{operand1, operand2};
+    }
+
+    @Override
+    public String toString() {
+        return operator + " " + operands[0].getType() + " " + operands[0] + ", "
+                + operands[1].getType() + " " + operands[1];
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Br.java b/src/main/java/cn/edu/nju/software/ir/instruction/Br.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f0dbafd11863668bd4306ec074df8ee7d5a6a01
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Br.java
@@ -0,0 +1,25 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.basicblock.BasicBlockRef;
+
+import static cn.edu.nju.software.ir.instruction.OpEnum.BR;
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Br extends Instruction {
+    public Br(BasicBlockRef target) {
+        operator = getOperator(BR);
+        operands = new BasicBlockRef[]{target};
+    }
+
+    public BasicBlockRef getTarget() {
+        return (BasicBlockRef) operands[0];
+    }
+    @Override
+    public boolean isBr() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        return "br label " + operands[0];
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Call.java b/src/main/java/cn/edu/nju/software/ir/instruction/Call.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ff768b8898f52756dc1567a5efb6382516b853b
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Call.java
@@ -0,0 +1,62 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.FunctionType;
+import cn.edu.nju.software.ir.type.Pointer;
+import cn.edu.nju.software.ir.type.VoidType;
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.FunctionValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import java.util.ArrayList;
+
+import static cn.edu.nju.software.ir.instruction.OpEnum.CALL;
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Call extends Instruction {
+    private final ArrayList<ValueRef> realParams;
+    private final FunctionValue function;
+    public Call(FunctionValue function, ArrayList<ValueRef> realParams) {
+        operator = getOperator(CALL);
+        this.function = function;
+        this.realParams = realParams;
+    }
+
+    public Call(ValueRef lVal, FunctionValue function, ArrayList<ValueRef> realParams) {
+        this.lVal = lVal;
+        operator = getOperator(CALL);
+        this.function = function;
+        this.realParams = realParams;
+    }
+
+    @Override
+    public boolean isCall() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        FunctionType ft = (FunctionType) function.getType();
+        StringBuilder instr = new StringBuilder();
+        if (!(ft.getReturnType() instanceof VoidType)) {
+            instr.append(lVal).append(" = ");
+        }
+        instr.append("call ").append(ft.getReturnType()).append(" ").append(function).append("(");
+        for (int i = 0; i < realParams.size(); i++) {
+            ValueRef param = realParams.get(i);
+            if (param instanceof ConstValue) {
+                instr.append(param);
+            } else {
+                if (ft.getFParameter(i) instanceof Pointer) {
+                    Pointer paramPtr = new Pointer(param);
+                    instr.append(paramPtr).append(" ");
+                } else {
+                    instr.append(param.getType()).append(" ");
+                }
+                instr.append(param);
+            }
+            if (i < realParams.size() - 1) {
+                instr.append(", ");
+            }
+        }
+        return instr.append(")").toString();
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java b/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c54332a351c633ceca1002ea55a126be335a932
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java
@@ -0,0 +1,36 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.Operator.*;
+
+public class Cmp extends Instruction {
+    private final String type;
+    public Cmp(ValueRef lVal, OpEnum op, int type, ValueRef operand1, ValueRef operand2) {
+        this.lVal = lVal;
+        operator = getOperator(op);
+        this.type = cmpType[type];
+        operands = new ValueRef[]{operand1, operand2};
+    }
+
+    @Override
+    public boolean isCmp() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        String instr = lVal + " = " + operator + " " + type + " " + operands[0].getType() + " ";
+        if (operands[0] instanceof ConstValue) {
+            instr += ((ConstValue) operands[0]).getValue() + ", ";
+        } else {
+            instr += operands[0] + ", ";
+        }
+        if (operands[1] instanceof ConstValue) {
+            instr += ((ConstValue) operands[1]).getValue();
+        } else {
+            instr += operands[1];
+        }
+        return instr;
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java b/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java
new file mode 100644
index 0000000000000000000000000000000000000000..20656ac0862863dce46a0ba2e829047c6417eda3
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java
@@ -0,0 +1,33 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.basicblock.BasicBlockRef;
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.OpEnum.BR;
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class CondBr extends Instruction {
+    public CondBr(ValueRef cond, BasicBlockRef ifTrue, BasicBlockRef ifFalse) {
+        operator = getOperator(BR);
+        operands = new ValueRef[]{cond, ifTrue, ifFalse};
+    }
+
+    public BasicBlockRef getTrueBlock() {
+        return (BasicBlockRef) operands[1];
+    }
+
+    public BasicBlockRef getFalseBlock() {
+        return (BasicBlockRef) operands[2];
+    }
+
+    @Override
+    public String toString() {
+        if (operands[0] instanceof ConstValue) {
+            return "br " + operands[0] + ", label " + operands[1] + ", label " + operands[2];
+        } else {
+            return "br " + operands[0].getType() + " " + operands[0] +
+                    ", label " + operands[1] + ", label " + operands[2];
+        }
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java b/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c74b48fbea4fbe06df768c5ee16b86e414ae2d1
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java
@@ -0,0 +1,16 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class FloatToInt extends Instruction {
+    public FloatToInt(ValueRef lVal, ValueRef floatVal) {
+        this.lVal = lVal;
+        operator = "fptosi";
+        operands = new ValueRef[]{floatVal};
+    }
+
+    @Override
+    public String toString() {
+        return lVal + " = fptosi float " + operands[0] + " to i32";
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java b/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java
new file mode 100644
index 0000000000000000000000000000000000000000..32c32f9224e616ec19d21e668b2767ae62477152
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java
@@ -0,0 +1,30 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.ArrayType;
+import cn.edu.nju.software.ir.type.Pointer;
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class GEP extends Instruction {
+    private final ArrayType arrayType;
+    public GEP(ValueRef lVal, ArrayType arrayType, ValueRef[] operands) {
+        this.lVal = lVal;
+        operator = "getelementptr";
+        this.arrayType = arrayType;
+        this.operands = operands;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder instr = new StringBuilder(lVal + " = ");
+        instr.append(operator).append(" ").append(arrayType).append(", ").append(new Pointer(arrayType)).append(" ").append(operands[0]);
+        for (int i = 1; i < operands.length; i++) {
+            if (operands[i] instanceof ConstValue) {
+                instr.append(", ").append(operands[i]);
+            } else {
+                instr.append(", ").append(operands[i].getType()).append(" ").append(operands[i]);
+            }
+        }
+        return instr.toString();
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java b/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java
index f5781d0c6e4b7b2e4fc68010f1901cf4f6cf2268..626abf8d9314212f921ee9c02d917ab9dc04ca64 100644
--- a/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java
@@ -1,4 +1,67 @@
 package cn.edu.nju.software.ir.instruction;
 
-public class Instruction {
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public abstract class Instruction {
+    protected ValueRef[] operands;
+    protected int numberOfOperands;
+    protected String operator;
+    protected ValueRef lVal;
+//    protected final static String DELIMITER = ", ";
+
+    public ValueRef getOperand(int index) {
+        return operands[index];
+    }
+
+    public int getNumberOfOperands() {
+        return numberOfOperands;
+    }
+
+    public OpEnum getOp() {
+        return Operator.getOp(operator);
+    }
+
+    public boolean isArithmetic() {
+        return false;
+    }
+
+    public boolean isLogic() {
+        return false;
+    }
+
+    public boolean isCmp() {
+        return false;
+    }
+
+    public boolean isCall() {
+        return false;
+    }
+
+    public boolean isReturn() {
+        return false;
+    }
+
+    public boolean isZExt() {
+        return false;
+    }
+
+    public boolean isAlloc() {
+        return false;
+    }
+
+    public boolean isStore() {
+        return false;
+    }
+
+    public boolean isLoad() {
+        return false;
+    }
+
+    public boolean isGEP() {
+        return false;
+    }
+
+    public boolean isBr() {
+        return false;
+    }
 }
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java b/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java
new file mode 100644
index 0000000000000000000000000000000000000000..bee1e5267f1691455454943befb92864414fe545
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java
@@ -0,0 +1,16 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class IntToFloat extends Instruction {
+    public IntToFloat(ValueRef lVal, ValueRef intVal) {
+        this.lVal = lVal;
+        operator = "fptosi";
+        operands = new ValueRef[]{intVal};
+    }
+
+    @Override
+    public String toString() {
+        return lVal + " = sitofp i32 " + operands[0] + " to float";
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Load.java b/src/main/java/cn/edu/nju/software/ir/instruction/Load.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b01b0c2d9be36df9f226881539f3c902ae0d8d6
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Load.java
@@ -0,0 +1,22 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class Load extends Instruction {
+    // please first implement pointer type (allocate), then use this class
+    public Load(ValueRef lVal, ValueRef pointer) {
+        this.lVal = lVal;
+        operator = "load";
+        operands = new ValueRef[]{pointer};
+    }
+
+    @Override
+    public boolean isLoad() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        return lVal + " = load " + lVal.getType() + ", " + operands[0].getType() + " " + operands[0]
+                + ", align " + lVal.getType().getWidth();
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java b/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java
new file mode 100644
index 0000000000000000000000000000000000000000..614ece94b1b9689fedb15df1fe6c5ca32455d25f
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java
@@ -0,0 +1,14 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class Logic extends Binary {
+    public Logic(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) {
+        super(lVal, op, operand1, operand2);
+    }
+
+    @Override
+    public boolean isLogic() {
+        return true;
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java b/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a2bc5db9cabf9e94eb3168519f7486922ba3ea5
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java
@@ -0,0 +1,27 @@
+package cn.edu.nju.software.ir.instruction;
+
+public enum OpEnum {
+     ADD,
+     SUB,
+     MUL,
+     DIV,
+     MOD,
+     AND,
+     OR,
+     F2I,
+     I2F,
+     BR,
+     ICMP,
+     XOR,
+     ZEXT, // unsigned extension
+     LOAD,
+     STORE,
+     ALLOC,
+     GEP,
+     CALL,
+     RETURN,
+     FADD,
+     FSUB,
+     FMUL,
+     FDIV
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java b/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac9ea6823f49aa3d7161fcbd4ffd895419290121
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java
@@ -0,0 +1,37 @@
+package cn.edu.nju.software.ir.instruction;
+
+import java.util.Arrays;
+
+public class Operator {
+    private final static String[] operators = new String[]{
+            "add", "sub", "mul", "sdiv", "srem", "and", "or",
+            "fptosi", "sitofp", "br", "icmp", "xor", "zext",
+            "load", "store", "alloca", "getelementptr",
+            "call", "ret", "fadd", "fsub", "fmul", "fdiv"
+    };
+
+    public final static int CmpNE = 0; // !=
+    public final static int CmpEQ = 1; // ==
+    public final static int CmpSGT = 2; // >
+    public final static int CmpSLT = 3; // <
+    public final static int CmpSGE = 4; // >=
+    public final static int CmpSLE = 5; // <=
+
+    public final static String[] cmpType = new String[]{
+            "ne", "eq", "sgt", "slt", "sge", "sle"
+    };
+
+    protected static String getOperator(OpEnum index) {
+        return operators[index.ordinal()];
+    }
+
+    protected static OpEnum getOp(String op) {
+        int index = Arrays.binarySearch(operators, op);
+        for (OpEnum opEnum : OpEnum.values()) {
+            if (opEnum.ordinal() == index) {
+                return opEnum;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java b/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java
new file mode 100644
index 0000000000000000000000000000000000000000..8eca18ad5d1c9bf66347b4068a0e781c7fe4ea54
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java
@@ -0,0 +1,27 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.TypeRef;
+import cn.edu.nju.software.ir.type.VoidType;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+import static cn.edu.nju.software.ir.instruction.OpEnum.RETURN;
+import static cn.edu.nju.software.ir.instruction.Operator.getOperator;
+
+public class Ret extends Instruction {
+    protected final TypeRef retType;
+    public Ret(VoidType retType) {
+        operator = getOperator(RETURN);
+        this.retType = retType;
+    }
+
+    public Ret(TypeRef retType, ValueRef retVal) {
+        operator = getOperator(RETURN);
+        this.retType = retType;
+        operands = new ValueRef[]{retVal};
+    }
+
+    @Override
+    public boolean isReturn() {
+        return true;
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java b/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ef0f7fcdea3e4bb12551fe9acde78bd21cbe8ce
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java
@@ -0,0 +1,20 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.TypeRef;
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class RetValue extends Ret {
+    public RetValue(TypeRef retType, ValueRef retVal) {
+        super(retType, retVal);
+    }
+
+    @Override
+    public String toString() {
+        if (operands[0] instanceof ConstValue) {
+            return "ret " + operands[0];
+        } else {
+            return "ret " + retType + " " + operands[0];
+        }
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java b/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java
new file mode 100644
index 0000000000000000000000000000000000000000..48f8d4e18931298ed8ead3ff4c7bc22ba5aad9dd
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java
@@ -0,0 +1,14 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.type.VoidType;
+
+public class RetVoid extends Ret {
+    public RetVoid(VoidType voidType) {
+        super(voidType);
+    }
+
+    @Override
+    public String toString() {
+        return "ret void";
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Store.java b/src/main/java/cn/edu/nju/software/ir/instruction/Store.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c754cc58a812a5994349070eaa1e12b35b3f11a
--- /dev/null
+++ b/src/main/java/cn/edu/nju/software/ir/instruction/Store.java
@@ -0,0 +1,27 @@
+package cn.edu.nju.software.ir.instruction;
+
+import cn.edu.nju.software.ir.value.ConstValue;
+import cn.edu.nju.software.ir.value.ValueRef;
+
+public class Store extends Instruction {
+    // please first implement pointer type (allocate), then use this class
+    public Store(ValueRef value, ValueRef pointer) {
+        operator = "store";
+        operands = new ValueRef[]{value, pointer};
+    }
+
+    @Override
+    public boolean isStore() {
+        return true;
+    }
+    @Override
+    public String toString() {
+        if (operands[0] instanceof ConstValue) {
+            return "store " + operands[0] + ", " + operands[1].getType() + " " + operands[1]
+                    + ", align 4";
+        } else {
+            return "store " + operands[0].getType() + " " + operands[0] + ", "
+                    + operands[1].getType() + " " + operands[1] + ", align " + operands[0].getType().getWidth();
+        }
+    }
+}
diff --git a/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java b/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java
index ab885139fed56d1f469b4b91c54fe7f47c731d36..a3db2039c2e46d7efad594c45a951936d53fb91f 100644
--- a/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java
+++ b/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java
@@ -97,6 +97,11 @@ public class FunctionValue extends ValueRef {
         blockNum--;
     }
 
+    @Override
+    public String toString() {
+        return "@" + name;
+    }
+
     /**
      * This method should be call only if entering a new module
      */
diff --git a/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java b/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java
index 8eaeff2b35678a4f2cee9e89444c3e795813ade9..e0a86d7dc2269f9269b589a7ba88e1d5e8ffa1cf 100644
--- a/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java
+++ b/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java
@@ -36,4 +36,8 @@ public class GlobalVar extends ValueRef {
                 .forEach(ArrayList::clear);
     }
 
+    @Override
+    public String toString() {
+        return "@" + name;
+    }
 }
diff --git a/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java b/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java
index 71fcb9bfd7a06cb1207e819c44a400e4ce33e843..5974d53eeb43832f241d2790be01b21b7d51d1d1 100644
--- a/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java
+++ b/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java
@@ -6,4 +6,9 @@ public class LocalVar extends ValueRef {
     public LocalVar(TypeRef type, String name) {
         super(type, name);
     }
+
+    @Override
+    public String toString() {
+        return "%" + name;
+    }
 }