x86bytecodevisitor.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 2,035 行 · 第 1/5 页

JAVA
2,035
字号
        os.writeMOV(INTSIZE, T1, S0, 4);
        helper.writePUSH64(T0, T1);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dastore()
     */
    public final void visit_dastore() {
        os.writeMOV(INTSIZE, T0, SP, 8); // Index
        os.writeMOV(INTSIZE, S0, SP, 12); // Arrayref
        checkBounds(S0, T0);
        os.writeLEA(S0, S0, T0, 8, VmArray.DATA_OFFSET * 4);
        helper.writePOP64(T0, T1); // Value
        os.writeMOV(INTSIZE, S0, 0, T0);
        os.writeMOV(INTSIZE, S0, 4, T1);
        os.writeLEA(SP, SP, 8); // Remove index, arrayref
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dcmpg()
     */
    public final void visit_dcmpg() {
        visit_dfcmp(true, false);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dcmpl()
     */
    public final void visit_dcmpl() {
        visit_dfcmp(false, false);
    }

    /**
     * @param value
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dconst(double)
     */
    public final void visit_dconst(double value) {
        visit_lconst(Double.doubleToLongBits(value));
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_ddiv()
     */
    public final void visit_ddiv() {
        os.writeFLD64(SP, 8);
        os.writeFDIV64(SP, 0);
        os.writeLEA(SP, SP, 8);
        os.writeFSTP64(SP, 0);
    }

    /**
     * @param index
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dload(int)
     */
    public final void visit_dload(int index) {
        int ebpOfs = stackFrame.getWideEbpOffset(index);
        os.writeMOV(INTSIZE, Register.EAX, FP, ebpOfs);
        os.writeMOV(INTSIZE, Register.EDX, FP, ebpOfs + 4);
        helper.writePUSH64(Register.EAX, Register.EDX);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dmul()
     */
    public final void visit_dmul() {
        os.writeFLD64(SP, 8);
        os.writeFMUL64(SP, 0);
        os.writeLEA(SP, SP, 8);
        os.writeFSTP64(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dneg()
     */
    public final void visit_dneg() {
        os.writeFLD64(SP, 0);
        os.writeFCHS();
        os.writeFSTP64(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_drem()
     */
    public final void visit_drem() {
        os.writeFLD64(SP, 8);
        os.writeFLD64(SP, 0);
        os.writeFPREM();
        os.writeLEA(SP, SP, 8);
        os.writeFSTP64(SP, 0);
        os.writeFFREE(Register.ST0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dreturn()
     */
    public final void visit_dreturn() {
        helper.writePOP64(Register.EAX, Register.EDX);
        visit_return();
    }

    /**
     * @param index
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dstore(int)
     */
    public final void visit_dstore(int index) {
        int ebpOfs = stackFrame.getWideEbpOffset(index);
        helper.writePOP64(Register.EAX, Register.EDX);
        os.writeMOV(INTSIZE, FP, ebpOfs, Register.EAX);
        os.writeMOV(INTSIZE, FP, ebpOfs + 4, Register.EDX);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dsub()
     */
    public final void visit_dsub() {
        os.writeFLD64(SP, 8);
        os.writeFSUB64(SP, 0);
        os.writeLEA(SP, SP, 8);
        os.writeFSTP64(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup_x1()
     */
    public final void visit_dup_x1() {
        os.log("dup_x1");
        helper.writePOP(T0); // Value1
        helper.writePOP(S0); // Value2
        helper.writePUSH(T0); // Value1
        helper.writePUSH(S0); // Value2
        helper.writePUSH(T0); // Value1
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup_x2()
     */
    public final void visit_dup_x2() {
        os.log("dup_x2");
        helper.writePOP(T0); // Value1
        helper.writePOP(T1); // Value2
        helper.writePOP(S0); // Value3
        helper.writePUSH(T0); // Value1
        helper.writePUSH(S0); // Value3
        helper.writePUSH(T1); // Value2
        helper.writePUSH(T0); // Value1
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup()
     */
    public final void visit_dup() {
        os.log("dup");
        os.writeMOV(INTSIZE, T0, SP, 0); // Value1, leave on stack
        helper.writePUSH(T0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2_x1()
     */
    public final void visit_dup2_x1() {
        os.log("dup2_x1");
        helper.writePOP(T0); // Value1
        helper.writePOP(T1); // Value2
        helper.writePOP(S0); // Value3
        helper.writePUSH(T1); // Value2
        helper.writePUSH(T0); // Value1
        helper.writePUSH(S0); // Value3
        helper.writePUSH(T1); // Value2
        helper.writePUSH(T0); // Value1
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2_x2()
     */
    public final void visit_dup2_x2() {
        os.log("dup2_x2");
        helper.writePOP(Register.EAX); // Value1
        helper.writePOP(Register.EBX); // Value2
        helper.writePOP(Register.ECX); // Value3
        helper.writePOP(Register.EDX); // Value4
        helper.writePUSH(Register.EBX); // Value2
        helper.writePUSH(Register.EAX); // Value1
        helper.writePUSH(Register.EDX); // Value4
        helper.writePUSH(Register.ECX); // Value3
        helper.writePUSH(Register.EBX); // Value2
        helper.writePUSH(Register.EAX); // Value1
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2()
     */
    public final void visit_dup2() {
        os.log("dup2");
        os.writeMOV(INTSIZE, T0, SP, 0); // value1
        os.writeMOV(INTSIZE, S0, SP, 4); // value2
        helper.writePUSH(S0);
        helper.writePUSH(T0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2d()
     */
    public final void visit_f2d() {
        os.writeFLD32(SP, 0);
        os.writeLEA(SP, SP, -4);
        os.writeFSTP64(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2i()
     */
    public final void visit_f2i() {
        os.writeFLD32(SP, 0);
        os.writeFISTP32(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2l()
     */
    public final void visit_f2l() {
        os.writeFLD32(SP, 0);
        os.writeLEA(SP, SP, -4);
        os.writeFISTP64(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fadd()
     */
    public final void visit_fadd() {
        os.writeFLD32(SP, 4);
        os.writeFADD32(SP, 0);
        os.writeLEA(SP, SP, 4);
        os.writeFSTP32(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_faload()
     */
    public final void visit_faload() {
        helper.writePOP(T0); // Index
        helper.writePOP(S0); // Arrayref
        checkBounds(S0, T0);
        os.writeMOV(INTSIZE, T0, S0, T0, 4, VmArray.DATA_OFFSET * 4);
        helper.writePUSH(T0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fastore()
     */
    public final void visit_fastore() {
        helper.writePOP(T1); // Value
        helper.writePOP(T0); // Index
        helper.writePOP(S0); // Arrayref
        checkBounds(S0, T0);
        os.writeMOV(INTSIZE, S0, T0, 4, VmArray.DATA_OFFSET * 4, T1);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fcmpg()
     */
    public final void visit_fcmpg() {
        visit_dfcmp(true, true);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fcmpl()
     */
    public final void visit_fcmpl() {
        visit_dfcmp(false, true);
    }

    private void visit_dfcmp(boolean gt, boolean isfloat) {
        if (isfloat) {
            if (gt) {
                os.writeFLD32(SP, 4); // reverse order
                os.writeFLD32(SP, 0);
            } else {
                os.writeFLD32(SP, 0);
                os.writeFLD32(SP, 4);
            }
            os.writeLEA(SP, SP, 8);
        } else {
            if (gt) {
                os.writeFLD64(SP, 8); // reverse order
                os.writeFLD64(SP, 0);
            } else {
                os.writeFLD64(SP, 0);
                os.writeFLD64(SP, 8);
            }
            os.writeLEA(SP, SP, 16);
        }
        os.writeFUCOMPP(); // Compare, Pop twice
        os.writeFNSTSW_AX(); // Store fp status word in AX
        os.writeSAHF(); // Store AH to Flags
        Label eqLabel = new Label(this.curInstrLabel + "eq");
        Label ltLabel = new Label(this.curInstrLabel + "lt");
        Label endLabel = new Label(this.curInstrLabel + "end");
        os.writeJCC(eqLabel, X86Constants.JE);
        os.writeJCC(ltLabel, X86Constants.JB);
        // Greater
        if (gt) {
            os.writeMOV_Const(Register.ECX, -1);
        } else {
            os.writeMOV_Const(Register.ECX, 1);
        }
        os.writeJMP(endLabel);
        // Equal
        os.setObjectRef(eqLabel);
        os.writeXOR(Register.ECX, Register.ECX);
        os.writeJMP(endLabel);
        // Less
        os.setObjectRef(ltLabel);
        if (gt) {
            os.writeMOV_Const(Register.ECX, 1);
        } else {
            os.writeMOV_Const(Register.ECX, -1);
        }
        // End
        os.setObjectRef(endLabel);
        helper.writePUSH(Register.ECX);
    }

    /**
     * @param value
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fconst(float)
     */
    public final void visit_fconst(float value) {
        os.writeMOV_Const(Register.EAX, Float.floatToIntBits(value));
        helper.writePUSH(Register.EAX);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fdiv()
     */
    public final void visit_fdiv() {
        os.writeFLD32(SP, 4);
        os.writeFDIV32(SP, 0);
        os.writeLEA(SP, SP, 4);
        os.writeFSTP32(SP, 0);
    }

    /**
     * @param index
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fload(int)
     */
    public final void visit_fload(int index) {
        final int ebpOfs = stackFrame.getEbpOffset(index);
        os.writeMOV(INTSIZE, T0, FP, ebpOfs);
        helper.writePUSH(T0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fmul()
     */
    public final void visit_fmul() {
        os.writeFLD32(SP, 4);
        os.writeFMUL32(SP, 0);
        os.writeLEA(SP, SP, 4);
        os.writeFSTP32(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fneg()
     */
    public final void visit_fneg() {
        os.writeFLD32(SP, 0);
        os.writeFCHS();
        os.writeFSTP32(SP, 0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_frem()
     */
    public final void visit_frem() {
        // reverse because pushing on fp stack
        os.writeFLD32(SP, 0);
        os.writeFLD32(SP, 4);
        os.writeFPREM();
        os.writeLEA(SP, SP, 4);
        os.writeFSTP32(SP, 0);
        os.writeFFREE(Register.ST0);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_freturn()
     */
    public final void visit_freturn() {
        helper.writePOP(Register.EAX);
        visit_return();
    }

    /**
     * @param index
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fstore(int)
     */
    public final void visit_fstore(int index) {
        int ebpOfs = stackFrame.getEbpOffset(index);
        helper.writePOP(FP, ebpOfs);
    }

    /**
     * @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fsub()
     */
    public final void visit_fsub() {
        os.writeFLD32(SP, 4);
        os.writeFSUB32(SP, 0);
        os.writeLEA(SP, SP, 4);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?