/* * This handler is a bit odd - it may be called via chaining or * from static code and is expected to cause control to flow * to the interpreter. The problem is where to find the Dalvik * PC of the next instruction. When called via chaining, the dPC * will be located at *rp. When called from static code, rPC is * valid and rp is a real return pointer (that should be ignored). * The Arm target deals with this by using the link register as * a flag. If it is zero, we know we were called from static code. * If non-zero, it points to the chain cell containing dPC. * For x86, we'll infer the source by looking where rp points. * If it points to anywhere within the code cache, we'll assume * we got here via chaining. Otherwise, we'll assume rPC is valid. * * On entry: * (TOS)<- return pointer or pointer to dPC */ /* * FIXME - this won't work as-is. The cache boundaries are not * set up until later. Perhaps rething this whole thing. Do we * really need an interpret teplate? */ movl rSELF,%ecx movl $$.LinterpPunt,%edx pop %eax /*cmpl %eax,offThread_jitCacheEnd(%ecx)*/ ja 1f /*cmpl %eax,offThread_jitCacheStart(%ecx)*/ jb 1f movl %eax,rPC 1: jmp *(%edx) .LinterpPunt: .long dvmJitToInterpPunt