Package org.jnode.assembler.x86

Examples of org.jnode.assembler.x86.X86Assembler


    /**
     * @see org.jnode.vm.x86.compiler.l1a.Item#push(EmitterContext)
     */
    final void push(EmitterContext ec) {
        final X86Assembler os = ec.getStream();
        final VirtualStack stack = ec.getVStack();
        // os.log("LongItem.push "+Integer.toString(getKind()));

        switch (getKind()) {
            case Kind.GPR:
                if (os.isCode32()) {
                    os.writePUSH(msb);
                    os.writePUSH(lsb);
                } else {
                    os.writeLEA(X86Register.RSP, X86Register.RSP, -8); // garbage
                    os.writePUSH(reg);
                }
                break;

            case Kind.LOCAL:
                if (os.isCode32()) {
                    os.writePUSH(X86Register.EBP, getMsbOffsetToFP(ec));
                    os.writePUSH(X86Register.EBP, getLsbOffsetToFP(ec));
                } else {
                    os.writeLEA(X86Register.RSP, X86Register.RSP, -8); // garbage
                    os.writePUSH(X86Register.RBP, getOffsetToFP(ec));
                }
                break;

            case Kind.CONSTANT:
                if (os.isCode64()) {
                    os.writeLEA(X86Register.RSP, X86Register.RSP, -8); // garbage
                }
                pushConstant(ec, os);
                break;

            case Kind.FPUSTACK:
                // Make sure this item is on top of the FPU stack
                final FPUStack fpuStack = stack.fpuStack;
                if (!fpuStack.isTos(this)) {
                    FPUHelper.fxch(os, fpuStack, fpuStack.getRegister(this));
                }
                stack.fpuStack.pop(this);
                // Convert & move to new space on normal stack
                if (os.isCode32()) {
                    os.writeLEA(X86Register.ESP, X86Register.ESP, -8);
                    popFromFPU(os, X86Register.ESP, 0);
                } else {
                    os.writeLEA(X86Register.RSP, X86Register.RSP, -8); // garbage
                    os.writeLEA(X86Register.RSP, X86Register.RSP, -8); // Still 8
                    // bytes
                    popFromFPU(os, X86Register.RSP, 0);
                }
                break;

View Full Code Here


    /**
     * @see org.jnode.vm.x86.compiler.l1a.Item#pushToFPU(EmitterContext)
     */
    final void pushToFPU(EmitterContext ec) {
        final X86Assembler os = ec.getStream();
        final VirtualStack stack = ec.getVStack();

        // os.log("LongItem.push "+Integer.toString(getKind()));
        switch (getKind()) {
            case Kind.GPR:
                if (os.isCode32()) {
                    os.writePUSH(msb);
                    os.writePUSH(lsb);
                    pushToFPU(os, X86Register.ESP, 0);
                    os.writeLEA(X86Register.ESP, X86Register.ESP, 8);
                } else {
                    os.writePUSH(reg);
                    pushToFPU(os, X86Register.RSP, 0);
                    os.writeLEA(X86Register.RSP, X86Register.RSP, 8);
                }
                break;

            case Kind.LOCAL:
                if (os.isCode32()) {
                    pushToFPU(os, X86Register.EBP, getLsbOffsetToFP(ec));
                } else {
                    pushToFPU(os, X86Register.RBP, getOffsetToFP(ec));
                }
                break;

            case Kind.CONSTANT:
                pushConstant(ec, os);
                if (os.isCode32()) {
                    pushToFPU(os, X86Register.ESP, 0);
                    os.writeLEA(X86Register.ESP, X86Register.ESP, 8);
                } else {
                    pushToFPU(os, X86Register.RSP, 0);
                    os.writeLEA(X86Register.RSP, X86Register.RSP, 8);
                }
                break;

            case Kind.FPUSTACK:
                // Assert this item is at the top of the stack
                stack.fpuStack.pop(this);
                stack.fpuStack.push(this);
                return;
            // break;

            case Kind.STACK:
                if (VirtualStack.checkOperandStack) {
                    stack.operandStack.pop(this);
                }
                if (os.isCode32()) {
                    pushToFPU(os, X86Register.ESP, 0);
                    os.writeLEA(X86Register.ESP, X86Register.ESP, 8);
                } else {
                    pushToFPU(os, X86Register.RSP, 0);
                    os.writeLEA(X86Register.RSP, X86Register.RSP, 16); // 8-byte + garbage
                }
                break;
        }

        cleanup(ec);
View Full Code Here

     */
    private void cleanup(EmitterContext ec) {
        // assertCondition(!ec.getVStack().contains(this), "Cannot release while
        // on vstack");
        final X86RegisterPool pool = ec.getGPRPool();
        final X86Assembler os = ec.getStream();

        switch (getKind()) {
            case Kind.GPR:
                if (os.isCode32()) {
                    pool.release(lsb);
                    pool.release(msb);
                } else {
                    pool.release(reg);
                }
View Full Code Here

        this.reg = null;
        setKind((byte) 0);
    }

    private X86Register request(EmitterContext ec, X86RegisterPool pool) {
        final X86Assembler os = ec.getStream();
        final X86Register r;
        if (os.isCode32()) {
            r = pool.request(JvmType.INT);
        } else {
            r = pool.request(getType());
        }
        if (VmUtils.verifyAssertions()) {
View Full Code Here

    /**
     * @see org.jnode.vm.x86.compiler.l1a.Item#spill(EmitterContext, org.jnode.assembler.x86.X86Register)
     */
    final void spill(EmitterContext ec, X86Register reg) {
        final X86Assembler os = ec.getStream();
        if (VmUtils.verifyAssertions()) {
            VmUtils._assert(getKind() == Kind.GPR);
            if (os.isCode32()) {
                VmUtils._assert((this.lsb == reg) || (this.msb == reg), "spill1");
            } else {
                VmUtils._assert((this.reg.getNr() == reg.getNr()), "spill1");
            }
        }
        ec.getVStack().push(ec);
        if (isStack()) {
            return;
        }

        final X86RegisterPool pool = ec.getGPRPool();
        if (os.isCode32()) {
            final X86Register.GPR newLsb = (X86Register.GPR) request(ec, pool);
            final X86Register.GPR newMsb = (X86Register.GPR) request(ec, pool);
            loadTo32(ec, newLsb, newMsb);
            pool.transferOwnerTo(newLsb, this);
            pool.transferOwnerTo(newMsb, this);
View Full Code Here

    /**
     * @see org.jnode.vm.x86.compiler.l1a.Item#clone()
     */
    protected final Item clone(EmitterContext ec) {
        final DoubleWordItem res;
        final X86Assembler os = ec.getStream();

        switch (getKind()) {
            case Kind.GPR:
                res = L1AHelper.requestDoubleWordRegisters(ec, getType());
                if (os.isCode32()) {
                    final GPR lsb = res.getLsbRegister(ec);
                    final GPR msb = res.getMsbRegister(ec);
                    os.writeMOV(INTSIZE, lsb, this.lsb);
                    os.writeMOV(INTSIZE, msb, this.msb);
                } else {
                    final GPR64 reg = res.getRegister(ec);
                    os.writeMOV(BITS64, reg, this.reg);
                }
                break;

            case Kind.LOCAL:
                res = (DoubleWordItem) factory.createLocal(getType(), super
View Full Code Here

     * @see org.jnode.vm.x86.compiler.l1a.Item#load(EmitterContext)
     */
    final void load(EmitterContext ec) {
        if (!isGPR()) {
            final X86RegisterPool pool = ec.getGPRPool();
            final X86Assembler os = ec.getStream();

            if (os.isCode32()) {
                X86Register.GPR l = (X86Register.GPR) pool.request(JvmType.INT,
                    this);
                if (l == null) {
                    final VirtualStack vstack = ec.getVStack();
                    vstack.push(ec);
View Full Code Here

     * @param lsb
     * @param msb
     */
    final void loadTo32(EmitterContext ec, X86Register.GPR lsb,
                        X86Register.GPR msb) {
        final X86Assembler os = ec.getStream();
        final X86RegisterPool pool = ec.getGPRPool();
        final VirtualStack stack = ec.getVStack();
        if (!os.isCode32()) {
            throw new RuntimeException("Can only be used in 32-bit mode.");
        }

        // os.log("LongItem.log called "+Integer.toString(kind));
        if (VmUtils.verifyAssertions()) {
            VmUtils._assert(lsb != msb, "lsb != msb");
            VmUtils._assert(lsb != null, "lsb != null");
            VmUtils._assert(msb != null, "msb != null");
        }

        switch (getKind()) {
            case Kind.GPR:
                // invariant: (msb != lsb) && (this.msb != this.lsb)
                if (msb != this.lsb) {
                    // generic case; avoid only if msb is lsb' (value overwriting)
                    // invariant: (msb != this.lsb) && (msb != lsb) && (this.msb !=
                    // this.lsb)
                    // msb <- msb'
                    // lsb <- lsb'
                    if (msb != this.msb) {
                        os.writeMOV(INTSIZE, msb, this.msb);
                        if (lsb != this.msb) {
                            pool.release(this.msb);
                        }
                    }
                    if (lsb != this.lsb) {
                        // invariant: (msb != this.lsb) && (lsb != this.lsb) && (msb
                        // != lsb) && (this.msb != this.lsb)
                        os.writeMOV(INTSIZE, lsb, this.lsb);
                        // if (msb != this.lsb) { <- enforced by first if()
                        pool.release(this.lsb);
                        // }
                    }
                } else if (lsb != this.msb) {
                    // generic case, assignment sequence inverted; avoid only if lsb
                    // is msb' (overwriting)
                    // invariant: (msb == this.lsb) && (lsb != this.msb)
                    // lsb <- lsb'
                    // msb <- msb'
                    // if (lsb != this.lsb) { <- always true, because msb ==
                    // this.lsb
                    os.writeMOV(INTSIZE, lsb, this.lsb);
                    // if (msb != this.lsb) { <- always false, because of invariant
                    // pool.release(this.lsb);
                    // }
                    // }
                    // if (msb != this.msb) { <- always true, because of invariant
                    os.writeMOV(INTSIZE, msb, this.msb);
                    // if (lsb != this.msb) { <- always true, because of invariant
                    pool.release(this.msb);
                    // }
                    // }
                } else {
                    // invariant: (msb == this.lsb) && (lsb == this.msb)
                    // swap registers
                    os.writeXCHG(this.lsb, this.msb);
                }
                break;

            case Kind.LOCAL:
                final int ofs = super.getOffsetToFP(ec);
                os.writeMOV(INTSIZE, lsb, X86Register.EBP, ofs);
                os.writeMOV(INTSIZE, msb, X86Register.EBP, ofs + 4);
                break;

            case Kind.CONSTANT:
                loadToConstant32(ec, os, (GPR32) lsb, (GPR32) msb);
                break;

            case Kind.FPUSTACK:
                // Make sure this item is on top of the FPU stack
                stack.fpuStack.pop(this);
                // Convert & move to new space on normal stack
                os.writeLEA(X86Register.ESP, X86Register.ESP, -8);
                popFromFPU(os, X86Register.ESP, 0);
                os.writePOP(lsb);
                os.writePOP(msb);
                break;

            case Kind.STACK:
                if (VirtualStack.checkOperandStack) {
                    stack.operandStack.pop(this);
                }
                os.writePOP(lsb);
                os.writePOP(msb);
                break;

        }
        setKind(Kind.GPR);
        this.lsb = (GPR32) lsb;
View Full Code Here

     *
     * @param ec
     * @param reg
     */
    final void loadTo64(EmitterContext ec, X86Register.GPR64 reg) {
        final X86Assembler os = ec.getStream();
//      final X86RegisterPool pool = ec.getGPRPool();
        final VirtualStack stack = ec.getVStack();
        if (!os.isCode64()) {
            throw new RuntimeException("Can only be used in 64-bit mode.");
        }

        if (VmUtils.verifyAssertions()) {
            VmUtils._assert(reg != null, "reg != null");
        }

        switch (getKind()) {
            case Kind.GPR:
                if (this.reg != reg) {
                    os.writeMOV(BITS64, reg, this.reg);
                    cleanup(ec);
                }
                break;

            case Kind.LOCAL:
                os.writeMOV(BITS64, reg, X86Register.RBP, getOffsetToFP(ec));
                break;

            case Kind.CONSTANT:
                loadToConstant64(ec, os, reg);
                break;

            case Kind.FPUSTACK:
                // Make sure this item is on top of the FPU stack
                stack.fpuStack.pop(this);
                // Convert & move to new space on normal stack
                os.writeLEA(X86Register.RSP, X86Register.RSP, -8);
                popFromFPU(os, X86Register.RSP, 0);
                os.writePOP(reg);
                break;

            case Kind.STACK:
                if (VirtualStack.checkOperandStack) {
                    stack.operandStack.pop(this);
                }
                os.writePOP(reg);
                os.writeLEA(X86Register.RSP, X86Register.RSP, 8); // garbage
                break;

        }
        setKind(Kind.GPR);
        this.reg = reg;
View Full Code Here

     *
     * @param ec
     */
    final void loadToGPR(EmitterContext ec) {
        if (!isGPR()) {
            final X86Assembler os = ec.getStream();

            if (os.isCode32()) {
                X86Register.GPR lsb = (X86Register.GPR) ec.getGPRPool()
                    .request(JvmType.INT);
                if (lsb == null) {
                    ec.getVStack().push(ec);
                    lsb = (X86Register.GPR) ec.getGPRPool()
View Full Code Here

TOP

Related Classes of org.jnode.assembler.x86.X86Assembler

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.