< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Move.java

Print this page

        

*** 20,31 **** --- 20,34 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.lir.amd64; + import static org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag.Equal; + import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.COMPOSITE; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT; + import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.UNINITIALIZED; import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant; import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant;
*** 33,48 **** --- 36,55 ---- import static java.lang.Float.floatToRawIntBits; import static jdk.vm.ci.code.ValueUtil.asRegister; import static jdk.vm.ci.code.ValueUtil.isRegister; import static jdk.vm.ci.code.ValueUtil.isStackSlot; + import org.graalvm.compiler.asm.Label; + import org.graalvm.compiler.core.common.CompressEncoding; + import org.graalvm.compiler.core.common.LIRKind; import org.graalvm.compiler.core.common.NumUtil; import org.graalvm.compiler.asm.amd64.AMD64Address; import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MIOp; import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64MOp; import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize; import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler; + import org.graalvm.compiler.core.common.spi.LIRKindTool; import org.graalvm.compiler.core.common.type.DataPointerConstant; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.lir.LIRFrameState; import org.graalvm.compiler.lir.LIRInstructionClass; import org.graalvm.compiler.lir.Opcode;
*** 738,743 **** --- 745,856 ---- break; default: throw GraalError.shouldNotReachHere("Unknown result Kind: " + result.getPlatformKind()); } } + + public abstract static class Pointer extends AMD64LIRInstruction { + protected final LIRKindTool lirKindTool; + protected final CompressEncoding encoding; + protected final boolean nonNull; + + @Def({REG, HINT}) private AllocatableValue result; + @Use({REG}) private AllocatableValue input; + @Alive({REG, ILLEGAL}) private AllocatableValue baseRegister; + + protected Pointer(LIRInstructionClass<? extends Pointer> type, AllocatableValue result, AllocatableValue input, AllocatableValue baseRegister, CompressEncoding encoding, boolean nonNull, + LIRKindTool lirKindTool) { + super(type); + this.result = result; + this.input = input; + this.baseRegister = baseRegister; + this.encoding = encoding; + this.nonNull = nonNull; + this.lirKindTool = lirKindTool; + } + + protected boolean hasBase(CompilationResultBuilder crb) { + return GeneratePIC.getValue(crb.getOptions()) || encoding.hasBase(); + } + + protected final Register getResultRegister() { + return asRegister(result); + } + + protected final Register getBaseRegister() { + return asRegister(baseRegister); + } + + protected final int getShift() { + return encoding.getShift(); + } + + protected final void move(LIRKind kind, CompilationResultBuilder crb, AMD64MacroAssembler masm) { + AMD64Move.move((AMD64Kind) kind.getPlatformKind(), crb, masm, result, input); + } + } + + public static final class CompressPointer extends Pointer { + public static final LIRInstructionClass<CompressPointer> TYPE = LIRInstructionClass.create(CompressPointer.class); + + public CompressPointer(AllocatableValue result, AllocatableValue input, AllocatableValue baseRegister, CompressEncoding encoding, boolean nonNull, LIRKindTool lirKindTool) { + super(TYPE, result, input, baseRegister, encoding, nonNull, lirKindTool); + } + + @Override + public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { + move(lirKindTool.getObjectKind(), crb, masm); + + Register resReg = getResultRegister(); + if (hasBase(crb)) { + Register baseReg = getBaseRegister(); + if (!nonNull) { + masm.testq(resReg, resReg); + masm.cmovq(Equal, resReg, baseReg); + } + masm.subq(resReg, baseReg); + } + + int shift = getShift(); + if (shift != 0) { + masm.shrq(resReg, shift); + } + } + } + + public static final class UncompressPointer extends Pointer { + public static final LIRInstructionClass<UncompressPointer> TYPE = LIRInstructionClass.create(UncompressPointer.class); + + public UncompressPointer(AllocatableValue result, AllocatableValue input, AllocatableValue baseRegister, CompressEncoding encoding, boolean nonNull, LIRKindTool lirKindTool) { + super(TYPE, result, input, baseRegister, encoding, nonNull, lirKindTool); + } + + @Override + public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { + move(lirKindTool.getNarrowOopKind(), crb, masm); + + Register resReg = getResultRegister(); + int shift = getShift(); + if (shift != 0) { + masm.shlq(resReg, shift); + } + + if (hasBase(crb)) { + Register baseReg = getBaseRegister(); + if (nonNull) { + masm.addq(resReg, baseReg); + return; + } + + if (shift == 0) { + // if encoding.shift != 0, the flags are already set by the shlq + masm.testq(resReg, resReg); + } + + Label done = new Label(); + masm.jccb(Equal, done); + masm.addq(resReg, baseReg); + masm.bind(done); + } + } + } }
< prev index next >