< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java

Print this page




 246         profileInstructions(lir, crb);
 247     }
 248 
 249     /**
 250      * Emits the code prior to the verified entry point.
 251      *
 252      * @param installedCodeOwner see {@link LIRGenerationProvider#emitCode}
 253      */
 254     public void emitCodePrefix(ResolvedJavaMethod installedCodeOwner, CompilationResultBuilder crb, AMD64MacroAssembler asm, RegisterConfig regConfig, Label verifiedEntry) {
 255         HotSpotProviders providers = getProviders();
 256         if (installedCodeOwner != null && !installedCodeOwner.isStatic()) {
 257             crb.recordMark(config.MARKID_UNVERIFIED_ENTRY);
 258             CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, new JavaType[]{providers.getMetaAccess().lookupJavaType(Object.class)}, this);
 259             Register inlineCacheKlass = rax; // see definition of IC_Klass in
 260                                              // c1_LIRAssembler_x86.cpp
 261             Register receiver = asRegister(cc.getArgument(0));
 262             AMD64Address src = new AMD64Address(receiver, config.hubOffset);
 263 
 264             if (config.useCompressedClassPointers) {
 265                 Register register = r10;
 266                 AMD64HotSpotMove.decodeKlassPointer(crb, asm, register, providers.getRegisters().getHeapBaseRegister(), src, config);

 267                 if (GeneratePIC.getValue(crb.getOptions())) {
 268                     asm.movq(providers.getRegisters().getHeapBaseRegister(), asm.getPlaceholder(-1));
 269                     crb.recordMark(config.MARKID_NARROW_OOP_BASE_ADDRESS);
 270                 } else {
 271                     if (config.narrowKlassBase != 0) {
 272                         // The heap base register was destroyed above, so restore it
 273                         asm.movq(providers.getRegisters().getHeapBaseRegister(), config.narrowOopBase);




 274                     }
 275                 }
 276                 asm.cmpq(inlineCacheKlass, register);
 277             } else {
 278                 asm.cmpq(inlineCacheKlass, src);
 279             }
 280             AMD64Call.directConditionalJmp(crb, asm, getForeignCalls().lookupForeignCall(IC_MISS_HANDLER), ConditionFlag.NotEqual);
 281         }
 282 
 283         asm.align(config.codeEntryAlignment);
 284         crb.recordMark(config.MARKID_OSR_ENTRY);
 285         asm.bind(verifiedEntry);
 286         crb.recordMark(config.MARKID_VERIFIED_ENTRY);
 287 
 288         if (GeneratePIC.getValue(crb.getOptions())) {
 289             // Check for method state
 290             HotSpotFrameContext frameContext = (HotSpotFrameContext) crb.frameContext;
 291             if (!frameContext.isStub) {
 292                 crb.recordInlineDataInCodeWithNote(new HotSpotSentinelConstant(LIRKind.value(AMD64Kind.QWORD), JavaKind.Long), HotSpotConstantLoadAction.MAKE_NOT_ENTRANT);
 293                 asm.movq(AMD64.rax, asm.getPlaceholder(-1));




 246         profileInstructions(lir, crb);
 247     }
 248 
 249     /**
 250      * Emits the code prior to the verified entry point.
 251      *
 252      * @param installedCodeOwner see {@link LIRGenerationProvider#emitCode}
 253      */
 254     public void emitCodePrefix(ResolvedJavaMethod installedCodeOwner, CompilationResultBuilder crb, AMD64MacroAssembler asm, RegisterConfig regConfig, Label verifiedEntry) {
 255         HotSpotProviders providers = getProviders();
 256         if (installedCodeOwner != null && !installedCodeOwner.isStatic()) {
 257             crb.recordMark(config.MARKID_UNVERIFIED_ENTRY);
 258             CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, new JavaType[]{providers.getMetaAccess().lookupJavaType(Object.class)}, this);
 259             Register inlineCacheKlass = rax; // see definition of IC_Klass in
 260                                              // c1_LIRAssembler_x86.cpp
 261             Register receiver = asRegister(cc.getArgument(0));
 262             AMD64Address src = new AMD64Address(receiver, config.hubOffset);
 263 
 264             if (config.useCompressedClassPointers) {
 265                 Register register = r10;
 266                 Register heapBase = providers.getRegisters().getHeapBaseRegister();
 267                 AMD64HotSpotMove.decodeKlassPointer(crb, asm, register, heapBase, src, config);
 268                 if (GeneratePIC.getValue(crb.getOptions())) {
 269                     asm.movq(heapBase, asm.getPlaceholder(-1));
 270                     crb.recordMark(config.MARKID_NARROW_OOP_BASE_ADDRESS);
 271                 } else {
 272                     if (config.narrowKlassBase != 0) {
 273                         // The heap base register was destroyed above, so restore it
 274                         if (config.narrowOopBase == 0L) {
 275                             asm.xorq(heapBase, heapBase);
 276                         } else {
 277                             asm.movq(heapBase, config.narrowOopBase);
 278                         }
 279                     }
 280                 }
 281                 asm.cmpq(inlineCacheKlass, register);
 282             } else {
 283                 asm.cmpq(inlineCacheKlass, src);
 284             }
 285             AMD64Call.directConditionalJmp(crb, asm, getForeignCalls().lookupForeignCall(IC_MISS_HANDLER), ConditionFlag.NotEqual);
 286         }
 287 
 288         asm.align(config.codeEntryAlignment);
 289         crb.recordMark(config.MARKID_OSR_ENTRY);
 290         asm.bind(verifiedEntry);
 291         crb.recordMark(config.MARKID_VERIFIED_ENTRY);
 292 
 293         if (GeneratePIC.getValue(crb.getOptions())) {
 294             // Check for method state
 295             HotSpotFrameContext frameContext = (HotSpotFrameContext) crb.frameContext;
 296             if (!frameContext.isStub) {
 297                 crb.recordInlineDataInCodeWithNote(new HotSpotSentinelConstant(LIRKind.value(AMD64Kind.QWORD), JavaKind.Long), HotSpotConstantLoadAction.MAKE_NOT_ENTRANT);
 298                 asm.movq(AMD64.rax, asm.getPlaceholder(-1));


< prev index next >