Package org.jnode.assembler.x86

Examples of org.jnode.assembler.x86.X86Register


        final RefItem ref = vstack.popRef();

        // Load value & ref
        val.load(eContext);
        ref.load(eContext);
        final GPR refr = ref.getRegister();

        if (!wide) {
            final WordItem wval = (WordItem) val;
            final GPR valr = wval.getRegister();
            final char fieldType = field.getSignature().charAt(0);

            // Store field
            switch (fieldType) {
                case 'Z': // boolean
                case 'B': // byte
                    wval.loadToBITS8GPR(eContext);
                    os.writeMOV(BITS8, refr, offset, wval.getRegister());
                    break;
                case 'C': // char
                case 'S': // short
                    os.writeMOV(BITS16, refr, offset, valr);
                    break;
                case 'F': // float
                case 'I': // int
                case 'L': // Object
                case '[': // array
                    os.writeMOV(valr.getSize(), refr, offset, valr);
                    break;
                default:
                    throw new IllegalArgumentException("Unknown fieldType: " + fieldType);
            }
            // Writebarrier
            if (!inf.isPrimitive() && helper.needsWriteBarrier()) {
                final GPR tmp = (GPR) L1AHelper.requestRegister(eContext,
                    JvmType.REFERENCE, false);
                helper.writePutfieldWriteBarrier(inf, refr, valr, tmp);
                L1AHelper.releaseRegister(eContext, tmp);
            }
        } else {
View Full Code Here


        val.load(eContext);

        // Put static field
        if (!fieldRef.isWide()) {
            final WordItem wval = (WordItem) val;
            final GPR valr = wval.getRegister();

            if (os.isCode32() || (wval.getType() != JvmType.REFERENCE)) {
                if (sf.isShared()) {
                    helper.writePutStaticsEntry(curInstrLabel, valr, sf);
                } else {
                    final GPR tmp = (GPR) L1AHelper.requestRegister(eContext,
                        JvmType.REFERENCE, false);
                    helper.writePutStaticsEntry(curInstrLabel, valr, sf, tmp);
                    L1AHelper.releaseRegister(eContext, tmp);
                }
            } else {
                if (sf.isShared()) {
                    helper.writePutStaticsEntry64(curInstrLabel, (GPR64) valr, sf);
                } else {
                    final GPR tmp = (GPR) L1AHelper.requestRegister(eContext, JvmType.REFERENCE, false);
                    helper.writePutStaticsEntry64(curInstrLabel, (GPR64) valr, sf, tmp);
                    L1AHelper.releaseRegister(eContext, tmp);
                }
            }
            if (!sf.isPrimitive() && helper.needsWriteBarrier()) {
                final GPR tmp = (GPR) L1AHelper.requestRegister(eContext, JvmType.INT, false);
                helper.writePutstaticWriteBarrier(sf, valr, tmp);
                L1AHelper.releaseRegister(eContext, tmp);
            }
        } else {
            final DoubleWordItem dval = (DoubleWordItem) val;
            if (os.isCode32()) {
                if (sf.isShared()) {
                    helper.writePutStaticsEntry64(curInstrLabel, dval.getLsbRegister(eContext), dval
                        .getMsbRegister(eContext), sf);
                } else {
                    final GPR tmp = (GPR) L1AHelper.requestRegister(eContext, JvmType.REFERENCE, false);
                    helper.writePutStaticsEntry64(curInstrLabel, dval.getLsbRegister(eContext),
                        dval.getMsbRegister(eContext), sf, tmp);
                    L1AHelper.releaseRegister(eContext, tmp);
                }
            } else {
                if (sf.isShared()) {
                    helper.writePutStaticsEntry64(curInstrLabel, dval.getRegister(eContext), sf);
                } else {
                    final GPR tmp = (GPR) L1AHelper.requestRegister(eContext, JvmType.REFERENCE, false);
                    helper.writePutStaticsEntry64(curInstrLabel, dval.getRegister(eContext), sf, tmp);
                    L1AHelper.releaseRegister(eContext, tmp);
                }
            }
        }
View Full Code Here

     */
    public final void visit_tableswitch(int defAddress, int lowValue, int highValue, int[] addresses) {
        // IMPROVE: check Jaos implementation
        final IntItem val = vstack.popInt();
        val.load(eContext);
        GPR valr = val.getRegister();
        vstack.push(eContext);

        final int n = addresses.length;
        if ((n > 4) && os.isCode32()) {
            // Optimized version.  Needs some overhead, so only useful for
            // larger tables.
            counters.getCounter("tableswitch-opt").inc();

            final GPR tmp = (GPR) L1AHelper.requestRegister(eContext, JvmType.REFERENCE, false);
            if (os.isCode64()) {
                GPR64 valr64 = L1AHelper.get64BitReg(eContext, valr);
                os.writeMOVSXD(valr64, (GPR32) valr);
                valr = valr64;
            }
View Full Code Here

                throw new IllegalArgumentException("Invalid type " + jvmType);
        }

        // Create result
        final WordItem result;
        final GPR resultr;
        result = L1AHelper.requestWordRegister(eContext, resultType,
            (valSize == BYTESIZE));
        resultr = result.getRegister();

        // Load
        idx.loadIf(eContext, ~Item.Kind.CONSTANT);
        ref.load(eContext);
        final GPR refr = ref.getRegister();

        // Verify
        checkBounds(ref, idx);

        if (jvmType == JvmType.CHAR) {
            // Clear resultr, so we avoid a MOVZX afterwards.
            os.writeXOR(resultr, resultr);
        }

        // Load data
        if (idx.isConstant()) {
            final int offset = idx.getValue() * scale;
            os.writeMOV(valSize, resultr, refr, offset + arrayDataOffset);
        } else {
            GPR idxr = idx.getRegister();
            if (os.isCode64()) {
                final GPR64 idxr64 = (GPR64) eContext.getGPRPool().getRegisterInSameGroup(idxr, JvmType.LONG);
                os.writeMOVSXD(idxr64, (GPR32) idxr);
                idxr = idxr64;
            }
View Full Code Here

        } else {
            val.load(eContext);
        }
        idx.loadIf(eContext, ~Item.Kind.CONSTANT | extraLoadIdxMask);
        ref.load(eContext);
        final GPR refr = ref.getRegister();
        final GPR valr = val.getRegister();
        final X86RegisterPool pool = eContext.getGPRPool();

        // Verify
        checkBounds(ref, idx);

        //todo spec issue: add type compatibility check (elemType <- valueType), throw ArrayStoreException

        // Store
        if (idx.isConstant()) {
            final int offset = idx.getValue() * scale;
            os.writeMOV(valSize, refr, offset + arrayDataOffset, valr);
        } else {
            GPR idxr = idx.getRegister();
            if (os.isCode64()) {
                final GPR64 idxr64 = (GPR64) pool.getRegisterInSameGroup(idxr, JvmType.LONG);
                os.writeMOVSXD(idxr64, (GPR32) idxr);
                idxr = idxr64;
            }
            os.writeMOV(valSize, refr, idxr, scale, arrayDataOffset, valr);
        }

        // Call write barrier (reference only)
        if ((jvmType == JvmType.REFERENCE) && useBarrier) {
            // the write barrier could easily be modified to avoid using a
            // scratch register
            final GPR idxr;
            if (os.isCode32()) {
                idxr = idx.getRegister();
            } else {
                idxr = (GPR) eContext.getGPRPool().getRegisterInSameGroup(idx.getRegister(), JvmType.LONG);
            }
            final GPR scratch = (GPR) pool.request(JvmType.INT);
            helper.writeArrayStoreWriteBarrier(refr, idxr, valr, scratch);
            pool.release(scratch);
        }

        // Release
View Full Code Here

    /**
     * Pop a word item of the stack and return it to the caller
     */
    private void wreturn(int jvmType, boolean callVisitReturn) {
        final WordItem val = (WordItem) vstack.pop(jvmType);
        final GPR reg;
        if (os.isCode32() || (jvmType != JvmType.REFERENCE)) {
            reg = X86Register.EAX;
        } else {
            reg = X86Register.RAX;
        }
View Full Code Here

            .getDeclaringClass();
        if (!declClass.isAlwaysInitialized()) {
            final Label curInstrLabel = getCurInstrLabel();

            // Allocate a register to hold the class
            final GPR classReg = (GPR) L1AHelper.requestRegister(eContext, JvmType.REFERENCE, false);

            // Load classRef into the register
            // Load the class from the statics table
            if (os.isCode32()) {
                helper.writeGetStaticsEntry(new Label(curInstrLabel + "$$ic"),
View Full Code Here

            }
            os.writePOP(helper.BP, disp);
        } else {
            // Load into register
            val.load(eContext);
            final GPR valr = val.getRegister();
            // Store
            os.writeMOV(valr.getSize(), helper.BP, disp, valr);
        }

        // Release
        val.release(eContext);
    }
View Full Code Here

        final Label curInstrLabel = getCurInstrLabel();
        final Label test = new Label(curInstrLabel + "$$cbtest");
        final Label failed = new Label(curInstrLabel + "$$cbfailed");

        assertCondition(ref.isGPR(), "ref must be in a register");
        final GPR refr = ref.getRegister();

        os.writeJMP(test);
        os.setObjectRef(failed);
        // Call SoftByteCodes.throwArrayOutOfBounds
        os.writePUSH(refr);
View Full Code Here

        final RefItem ref = vstack.popRef();

        val.load(eContext);
        idx.loadIf(eContext, ~Item.Kind.CONSTANT);
        ref.load(eContext);
        final GPR refr = ref.getRegister();

        // Check bound
        checkBounds(ref, idx);

        // Store
View Full Code Here

TOP

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

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.