Mercurial > hg > graal-compiler
changeset 22867:801aa3ecb166
[SPARC] Load compressed HotSpotObjectConstants constants inline
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Fri, 16 Oct 2015 15:02:39 +0200 |
parents | 1e5e5561ae64 |
children | 6e1b3bbd2e1d |
files | graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotMove.java |
diffstat | 3 files changed, 103 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java Fri Oct 16 10:47:19 2015 +0200 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCMacroAssembler.java Fri Oct 16 15:02:39 2015 +0200 @@ -185,6 +185,18 @@ jmpl(i7, 8, g0); } + /** + * Generates sethi hi22(value), dst; or dst, lo10(value), dst; code. + */ + public void setw(int value, Register dst, boolean forceRelocatable) { + if (!forceRelocatable && isSimm13(value)) { + or(g0, value, dst); + } else { + sethi(hi22(value), dst); + or(dst, lo10(value), dst); + } + } + public void setx(long value, Register dst, boolean forceRelocatable) { int lo = (int) (value & ~0); sethix(value, dst, forceRelocatable);
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Oct 16 10:47:19 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Oct 16 15:02:39 2015 +0200 @@ -30,6 +30,7 @@ import static com.oracle.graal.lir.LIRValueUtil.isJavaConstant; import static jdk.vm.ci.hotspot.HotSpotCompressedNullConstant.COMPRESSED_NULL; import static jdk.vm.ci.meta.JavaConstant.INT_0; +import static jdk.vm.ci.meta.JavaConstant.LONG_0; import static jdk.vm.ci.sparc.SPARC.d32; import static jdk.vm.ci.sparc.SPARC.d34; import static jdk.vm.ci.sparc.SPARC.d36; @@ -77,6 +78,7 @@ import jdk.vm.ci.code.StackSlot; import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant; +import jdk.vm.ci.hotspot.HotSpotConstant; import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant; import jdk.vm.ci.hotspot.HotSpotObjectConstant; import jdk.vm.ci.hotspot.HotSpotVMConfig; @@ -98,6 +100,7 @@ import com.oracle.graal.compiler.common.spi.LIRKindTool; import com.oracle.graal.compiler.sparc.SPARCArithmeticLIRGenerator; import com.oracle.graal.compiler.sparc.SPARCLIRGenerator; +import com.oracle.graal.debug.TTY; import com.oracle.graal.hotspot.HotSpotBackend; import com.oracle.graal.hotspot.HotSpotForeignCallLinkage; import com.oracle.graal.hotspot.HotSpotLIRGenerator; @@ -118,7 +121,6 @@ import com.oracle.graal.lir.sparc.SPARCControlFlow.StrategySwitchOp; import com.oracle.graal.lir.sparc.SPARCFrameMapBuilder; import com.oracle.graal.lir.sparc.SPARCImmediateAddressValue; -import com.oracle.graal.lir.sparc.SPARCMove; import com.oracle.graal.lir.sparc.SPARCMove.CompareAndSwapOp; import com.oracle.graal.lir.sparc.SPARCMove.LoadOp; import com.oracle.graal.lir.sparc.SPARCMove.NullCheckOp; @@ -333,11 +335,18 @@ Constant usedSource; if (COMPRESSED_NULL.equals(src)) { usedSource = INT_0; + } else if (src instanceof HotSpotObjectConstant && ((HotSpotObjectConstant) src).isNull()) { + usedSource = LONG_0; } else { usedSource = src; } - if (usedSource instanceof HotSpotMetaspaceConstant) { - return new SPARCMove.LoadConstantFromTable(usedSource, getConstantTableBase(), dst); + if (usedSource instanceof HotSpotConstant) { + HotSpotConstant constant = (HotSpotConstant) usedSource; + if (constant.isCompressed()) { + return new SPARCHotSpotMove.LoadHotSpotObjectConstantInline(constant, dst); + } else { + return new SPARCHotSpotMove.LoadHotSpotObjectConstantFromTable(constant, dst, getConstantTableBase()); + } } else { return super.createMoveConstant(dst, usedSource); }
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotMove.java Fri Oct 16 10:47:19 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotMove.java Fri Oct 16 15:02:39 2015 +0200 @@ -24,23 +24,102 @@ import static com.oracle.graal.lir.LIRInstruction.OperandFlag.ILLEGAL; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.REG; +import static com.oracle.graal.lir.LIRInstruction.OperandFlag.STACK; +import static com.oracle.graal.lir.sparc.SPARCMove.loadFromConstantTable; import static jdk.vm.ci.code.ValueUtil.asRegister; import jdk.vm.ci.code.Register; +import jdk.vm.ci.code.ValueUtil; +import jdk.vm.ci.hotspot.HotSpotConstant; import jdk.vm.ci.hotspot.HotSpotVMConfig.CompressEncoding; import jdk.vm.ci.meta.AllocatableValue; +import jdk.vm.ci.meta.Constant; import com.oracle.graal.asm.Label; +import com.oracle.graal.asm.sparc.SPARCAddress; import com.oracle.graal.asm.sparc.SPARCAssembler.Annul; import com.oracle.graal.asm.sparc.SPARCAssembler.BranchPredict; import com.oracle.graal.asm.sparc.SPARCAssembler.CC; import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag; import com.oracle.graal.asm.sparc.SPARCAssembler.RCondition; import com.oracle.graal.asm.sparc.SPARCMacroAssembler; +import com.oracle.graal.asm.sparc.SPARCMacroAssembler.ScratchRegister; import com.oracle.graal.lir.LIRInstructionClass; +import com.oracle.graal.lir.StandardOp.LoadConstantOp; import com.oracle.graal.lir.asm.CompilationResultBuilder; +import com.oracle.graal.lir.sparc.SPARCDelayedControlTransfer; import com.oracle.graal.lir.sparc.SPARCLIRInstruction; +import com.oracle.graal.lir.sparc.SPARCTailDelayedLIRInstruction; public class SPARCHotSpotMove { + + public static class LoadHotSpotObjectConstantInline extends SPARCLIRInstruction implements SPARCTailDelayedLIRInstruction, LoadConstantOp { + public static final LIRInstructionClass<LoadHotSpotObjectConstantInline> TYPE = LIRInstructionClass.create(LoadHotSpotObjectConstantInline.class); + + public static final SizeEstimate SIZE = SizeEstimate.create(8); + private HotSpotConstant constant; + @Def({REG, STACK}) AllocatableValue result; + + public LoadHotSpotObjectConstantInline(HotSpotConstant constant, AllocatableValue result) { + super(TYPE, SIZE); + this.constant = constant; + this.result = result; + } + + @Override + protected void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + crb.recordInlineDataInCode(constant); + if (constant.isCompressed()) { + masm.setw(0, asRegister(result), true); + } else { + masm.setx(0, asRegister(result), true); + } + } + + @Override + public AllocatableValue getResult() { + return result; + } + + @Override + public Constant getConstant() { + return constant; + } + } + + public static class LoadHotSpotObjectConstantFromTable extends SPARCLIRInstruction implements SPARCTailDelayedLIRInstruction { + public static final LIRInstructionClass<LoadHotSpotObjectConstantFromTable> TYPE = LIRInstructionClass.create(LoadHotSpotObjectConstantFromTable.class); + + public static final SizeEstimate SIZE = SizeEstimate.create(2, 8); + private final HotSpotConstant constant; + @Use({REG}) private AllocatableValue constantTableBase; + @Def({REG, STACK}) AllocatableValue result; + + public LoadHotSpotObjectConstantFromTable(HotSpotConstant constant, AllocatableValue result, AllocatableValue constantTableBase) { + super(TYPE, SIZE); + this.constant = constant; + this.result = result; + this.constantTableBase = constantTableBase; + } + + @Override + protected void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + try (ScratchRegister scratch = masm.getScratchRegister()) { + boolean isStack = ValueUtil.isStackSlot(result); + Register register; + if (isStack) { + register = scratch.getRegister(); + } else { + register = asRegister(result); + } + int bytes = result.getPlatformKind().getSizeInBytes(); + loadFromConstantTable(crb, masm, bytes, asRegister(constantTableBase), constant, register, SPARCDelayedControlTransfer.DUMMY); + if (isStack) { + masm.st(register, (SPARCAddress) crb.asAddress(result), bytes); + } + } + } + } + public static final class CompressPointer extends SPARCLIRInstruction { public static final LIRInstructionClass<CompressPointer> TYPE = LIRInstructionClass.create(CompressPointer.class); public static final SizeEstimate SIZE = SizeEstimate.create(5);