Search in sources :

Example 1 with BasicRegisterMapper

use of com.taobao.android.dx.ssa.BasicRegisterMapper in project atlas by alibaba.

the class NullRegisterAllocator method allocateRegisters.

/** {@inheritDoc} */
@Override
public RegisterMapper allocateRegisters() {
    int oldRegCount = ssaMeth.getRegCount();
    BasicRegisterMapper mapper = new BasicRegisterMapper(oldRegCount);
    for (int i = 0; i < oldRegCount; i++) {
        mapper.addMapping(i, i * 2, 2);
    }
    return mapper;
}
Also used : BasicRegisterMapper(com.taobao.android.dx.ssa.BasicRegisterMapper)

Example 2 with BasicRegisterMapper

use of com.taobao.android.dx.ssa.BasicRegisterMapper in project atlas by alibaba.

the class SsaToRop method convert.

/**
     * Performs the conversion.
     *
     * @return {@code non-null;} rop-form output
     */
private RopMethod convert() {
    if (DEBUG) {
        interference.dumpToStdout();
    }
    // These are other allocators for debugging or historical comparison:
    // allocator = new NullRegisterAllocator(ssaMeth, interference);
    // allocator = new FirstFitAllocator(ssaMeth, interference);
    RegisterAllocator allocator = new FirstFitLocalCombiningAllocator(optimizer, ssaMeth, interference, minimizeRegisters);
    RegisterMapper mapper = allocator.allocateRegisters();
    if (DEBUG) {
        System.out.println("Printing reg map");
        System.out.println(((BasicRegisterMapper) mapper).toHuman());
    }
    ssaMeth.setBackMode();
    ssaMeth.mapRegisters(mapper);
    removePhiFunctions();
    if (allocator.wantsParamsMovedHigh()) {
        moveParametersToHighRegisters();
    }
    removeEmptyGotos();
    RopMethod ropMethod = new RopMethod(convertBasicBlocks(), ssaMeth.blockIndexToRopLabel(ssaMeth.getEntryBlockIndex()));
    ropMethod = new IdenticalBlockCombiner(ropMethod).process();
    return ropMethod;
}
Also used : BasicRegisterMapper(com.taobao.android.dx.ssa.BasicRegisterMapper) RegisterMapper(com.taobao.android.dx.ssa.RegisterMapper) RopMethod(com.taobao.android.dx.rop.code.RopMethod)

Example 3 with BasicRegisterMapper

use of com.taobao.android.dx.ssa.BasicRegisterMapper in project atlas by alibaba.

the class SsaToRop method moveParametersToHighRegisters.

/**
     * Moves the parameter registers, which allocateRegisters() places
     * at the bottom of the frame, up to the top of the frame to match
     * Dalvik calling convention.
     */
private void moveParametersToHighRegisters() {
    int paramWidth = ssaMeth.getParamWidth();
    BasicRegisterMapper mapper = new BasicRegisterMapper(ssaMeth.getRegCount());
    int regCount = ssaMeth.getRegCount();
    for (int i = 0; i < regCount; i++) {
        if (i < paramWidth) {
            mapper.addMapping(i, regCount - paramWidth + i, 1);
        } else {
            mapper.addMapping(i, i - paramWidth, 1);
        }
    }
    if (DEBUG) {
        System.out.printf("Moving %d registers from 0 to %d\n", paramWidth, regCount - paramWidth);
    }
    ssaMeth.mapRegisters(mapper);
}
Also used : BasicRegisterMapper(com.taobao.android.dx.ssa.BasicRegisterMapper)

Example 4 with BasicRegisterMapper

use of com.taobao.android.dx.ssa.BasicRegisterMapper in project atlas by alibaba.

the class FirstFitAllocator method allocateRegisters.

/** {@inheritDoc} */
@Override
public RegisterMapper allocateRegisters() {
    int oldRegCount = ssaMeth.getRegCount();
    BasicRegisterMapper mapper = new BasicRegisterMapper(oldRegCount);
    int nextNewRegister = 0;
    if (PRESLOT_PARAMS) {
        /*
             * Reserve space for the params at the bottom of the register
             * space. Later, we'll flip the params to the end of the register
             * space.
             */
        nextNewRegister = ssaMeth.getParamWidth();
    }
    for (int i = 0; i < oldRegCount; i++) {
        if (mapped.get(i)) {
            // we already got this one
            continue;
        }
        int maxCategory = getCategoryForSsaReg(i);
        IntSet current = new BitIntSet(oldRegCount);
        interference.mergeInterferenceSet(i, current);
        boolean isPreslotted = false;
        int newReg = 0;
        if (PRESLOT_PARAMS && isDefinitionMoveParam(i)) {
            // Any move-param definition must be a NormalSsaInsn
            NormalSsaInsn defInsn = (NormalSsaInsn) ssaMeth.getDefinitionForRegister(i);
            newReg = paramNumberFromMoveParam(defInsn);
            mapper.addMapping(i, newReg, maxCategory);
            isPreslotted = true;
        } else {
            mapper.addMapping(i, nextNewRegister, maxCategory);
            newReg = nextNewRegister;
        }
        for (int j = i + 1; j < oldRegCount; j++) {
            if (mapped.get(j) || isDefinitionMoveParam(j)) {
                continue;
            }
            /*
                 * If reg j doesn't interfere with the current mapping.
                 * Also, if this is a pre-slotted method parameter, we
                 * can't use more than the original param width.
                 */
            if (!current.has(j) && !(isPreslotted && (maxCategory < getCategoryForSsaReg(j)))) {
                interference.mergeInterferenceSet(j, current);
                maxCategory = Math.max(maxCategory, getCategoryForSsaReg(j));
                mapper.addMapping(j, newReg, maxCategory);
                mapped.set(j);
            }
        }
        mapped.set(i);
        if (!isPreslotted) {
            nextNewRegister += maxCategory;
        }
    }
    return mapper;
}
Also used : NormalSsaInsn(com.taobao.android.dx.ssa.NormalSsaInsn) BasicRegisterMapper(com.taobao.android.dx.ssa.BasicRegisterMapper) BitIntSet(com.taobao.android.dx.util.BitIntSet) IntSet(com.taobao.android.dx.util.IntSet) BitIntSet(com.taobao.android.dx.util.BitIntSet)

Example 5 with BasicRegisterMapper

use of com.taobao.android.dx.ssa.BasicRegisterMapper in project atlas by alibaba.

the class OutputFinisher method shiftParameters.

private void shiftParameters(int delta) {
    int insnSize = insns.size();
    int lastParameter = unreservedRegCount + reservedCount + reservedParameterCount;
    int firstParameter = lastParameter - paramSize;
    BasicRegisterMapper mapper = new BasicRegisterMapper(lastParameter);
    for (int i = 0; i < lastParameter; i++) {
        if (i >= firstParameter) {
            mapper.addMapping(i, i + delta, 1);
        } else {
            mapper.addMapping(i, i, 1);
        }
    }
    for (int i = 0; i < insnSize; i++) {
        DalvInsn insn = insns.get(i);
        // avoid to update all TargetInsn that contain a reference to CodeAddress
        if (!(insn instanceof CodeAddress)) {
            insns.set(i, insn.withMapper(mapper));
        }
    }
}
Also used : BasicRegisterMapper(com.taobao.android.dx.ssa.BasicRegisterMapper)

Aggregations

BasicRegisterMapper (com.taobao.android.dx.ssa.BasicRegisterMapper)5 RopMethod (com.taobao.android.dx.rop.code.RopMethod)1 NormalSsaInsn (com.taobao.android.dx.ssa.NormalSsaInsn)1 RegisterMapper (com.taobao.android.dx.ssa.RegisterMapper)1 BitIntSet (com.taobao.android.dx.util.BitIntSet)1 IntSet (com.taobao.android.dx.util.IntSet)1