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)); |