use of org.graalvm.compiler.core.common.CompressEncoding in project graal by oracle.
the class AArch64HotSpotLIRGenerator method emitNullCheck.
@Override
public void emitNullCheck(Value address, LIRFrameState state) {
if (address.getValueKind().getPlatformKind() == AArch64Kind.DWORD) {
CompressEncoding encoding = config.getOopEncoding();
Value uncompressed = emitUncompress(address, encoding, false);
append(new AArch64Move.NullCheckOp(asAddressValue(uncompressed), state));
} else {
super.emitNullCheck(address, state);
}
}
use of org.graalvm.compiler.core.common.CompressEncoding in project graal by oracle.
the class AMD64HotSpotMove method decodeKlassPointer.
public static void decodeKlassPointer(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register register, Register scratch, AMD64Address address, GraalHotSpotVMConfig config) {
CompressEncoding encoding = config.getKlassEncoding();
masm.movl(register, address);
if (encoding.getShift() != 0) {
masm.shlq(register, encoding.getShift());
}
boolean pic = GeneratePIC.getValue(crb.getOptions());
if (pic || encoding.hasBase()) {
if (pic) {
masm.movq(scratch, masm.getPlaceholder(-1));
crb.recordMark(config.MARKID_NARROW_KLASS_BASE_ADDRESS);
} else {
assert encoding.getBase() != 0;
masm.movq(scratch, encoding.getBase());
}
masm.addq(register, scratch);
}
}
use of org.graalvm.compiler.core.common.CompressEncoding in project graal by oracle.
the class SPARCTruffleCallBoundaryInstumentationFactory method createBuilder.
@Override
public CompilationResultBuilder createBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, DataBuilder dataBuilder, FrameContext frameContext, OptionValues options, DebugContext debug, CompilationResult compilationResult) {
return new TruffleCallBoundaryInstrumentation(metaAccess, codeCache, foreignCalls, frameMap, asm, dataBuilder, frameContext, options, debug, compilationResult, config, registers) {
@Override
protected void injectTailCallCode(int installedCodeOffset, int entryPointOffset) {
SPARCMacroAssembler masm = (SPARCMacroAssembler) this.asm;
try (ScratchRegister scratch = masm.getScratchRegister()) {
Register thisRegister = codeCache.getRegisterConfig().getCallingConventionRegisters(JavaCall, Object).get(0);
Register spillRegister = scratch.getRegister();
Label doProlog = new Label();
if (config.useCompressedOops) {
CompressEncoding encoding = config.getOopEncoding();
masm.ld(new SPARCAddress(thisRegister, installedCodeOffset), spillRegister, 4, false);
Register baseReg = encoding.hasBase() ? registers.getHeapBaseRegister() : null;
SPARCHotSpotMove.UncompressPointer.emitUncompressCode(masm, spillRegister, spillRegister, baseReg, encoding.getShift(), true);
} else {
masm.ldx(new SPARCAddress(thisRegister, installedCodeOffset), spillRegister);
}
masm.ldx(new SPARCAddress(spillRegister, entryPointOffset), spillRegister);
masm.compareBranch(spillRegister, 0, Equal, Xcc, doProlog, PREDICT_NOT_TAKEN, null);
masm.jmp(spillRegister);
masm.nop();
masm.bind(doProlog);
}
}
};
}
use of org.graalvm.compiler.core.common.CompressEncoding in project graal by oracle.
the class AMD64TruffleCallBoundaryInstrumentationFactory method createBuilder.
@Override
public CompilationResultBuilder createBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, DataBuilder dataBuilder, FrameContext frameContext, OptionValues options, DebugContext debug, CompilationResult compilationResult) {
return new TruffleCallBoundaryInstrumentation(metaAccess, codeCache, foreignCalls, frameMap, asm, dataBuilder, frameContext, options, debug, compilationResult, config, registers) {
@Override
protected void injectTailCallCode(int installedCodeOffset, int entryPointOffset) {
AMD64MacroAssembler masm = (AMD64MacroAssembler) this.asm;
Register thisRegister = codeCache.getRegisterConfig().getCallingConventionRegisters(JavaCall, JavaKind.Object).get(0);
Register spillRegister = AMD64.r10;
Label doProlog = new Label();
int pos = masm.position();
if (config.useCompressedOops) {
// First instruction must be at least 5 bytes long to be safe for patching
masm.movl(spillRegister, new AMD64Address(thisRegister, installedCodeOffset), true);
assert masm.position() - pos >= AMD64HotSpotBackend.PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
CompressEncoding encoding = config.getOopEncoding();
Register heapBaseRegister = AMD64Move.UncompressPointerOp.hasBase(options, encoding) ? registers.getHeapBaseRegister() : null;
AMD64Move.UncompressPointerOp.emitUncompressCode(masm, spillRegister, encoding.getShift(), heapBaseRegister, true);
} else {
// First instruction must be at least 5 bytes long to be safe for patching
masm.movq(spillRegister, new AMD64Address(thisRegister, installedCodeOffset), true);
assert masm.position() - pos >= AMD64HotSpotBackend.PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
}
masm.movq(spillRegister, new AMD64Address(spillRegister, entryPointOffset));
masm.testq(spillRegister, spillRegister);
masm.jcc(ConditionFlag.Equal, doProlog);
masm.jmp(spillRegister);
masm.bind(doProlog);
}
};
}
use of org.graalvm.compiler.core.common.CompressEncoding in project graal by oracle.
the class NativeImageGenerator method createSuites.
public static Suites createSuites(FeatureHandler featureHandler, RuntimeConfiguration runtimeConfig, SnippetReflectionProvider snippetReflection, boolean hosted) {
Providers runtimeCallProviders = runtimeConfig.getBackendForNormalMethod().getProviders();
OptionValues options = hosted ? HostedOptionValues.singleton() : RuntimeOptionValues.singleton();
Suites suites = GraalConfiguration.instance().createSuites(options, hosted);
PhaseSuite<HighTierContext> highTier = suites.getHighTier();
PhaseSuite<MidTierContext> midTier = suites.getMidTier();
PhaseSuite<LowTierContext> lowTier = suites.getLowTier();
ListIterator<BasePhase<? super HighTierContext>> position;
if (hosted) {
position = GraalConfiguration.instance().createHostedInliners(highTier);
} else {
/* Find the runtime inliner. */
position = highTier.findPhase(InliningPhase.class);
}
if (position != null) {
/* These two phases must be after all method inlining. */
position.add(new DeadStoreRemovalPhase());
position.add(new RemoveUnwindPhase());
} else {
/* There is no inlining, so prepend them in reverse order. */
highTier.prependPhase(new RemoveUnwindPhase());
highTier.prependPhase(new DeadStoreRemovalPhase());
}
highTier.appendPhase(new StackValuePhase());
lowTier.addBeforeLast(new OptimizeExceptionCallsPhase());
CompressEncoding compressEncoding = ImageSingletons.lookup(CompressEncoding.class);
SubstrateAMD64RegisterConfig registerConfig = (SubstrateAMD64RegisterConfig) runtimeCallProviders.getCodeCache().getRegisterConfig();
SubstrateAMD64AddressLowering addressLowering = new SubstrateAMD64AddressLowering(compressEncoding, registerConfig);
lowTier.findPhase(FixReadsPhase.class).add(new AddressLoweringPhase(addressLowering));
if (SubstrateOptions.MultiThreaded.getValue()) {
/*
* Graal inserts only loop safepoints. We want a SafepointNode also before every return.
*/
midTier.findPhase(LoopSafepointInsertionPhase.class).add(new MethodSafepointInsertionPhase());
} else {
/* No need for safepoints when we have only one thread. */
VMError.guarantee(midTier.removePhase(LoopSafepointInsertionPhase.class));
}
if (hosted) {
lowTier.appendPhase(new VerifyNoGuardsPhase());
/* Disable the Graal method inlining, since we have our own inlining system. */
highTier.removePhase(InliningPhase.class);
/* Remove phases that are not suitable for AOT compilation. */
highTier.findPhase(ConvertDeoptimizeToGuardPhase.class, true).remove();
midTier.findPhase(DeoptimizationGroupingPhase.class).remove();
} else {
ListIterator<BasePhase<? super MidTierContext>> it = midTier.findPhase(DeoptimizationGroupingPhase.class);
it.previous();
it.add(new CollectDeoptimizationSourcePositionsPhase());
}
featureHandler.forEachGraalFeature(feature -> feature.registerGraalPhases(runtimeCallProviders, snippetReflection, suites, hosted));
return suites;
}
Aggregations