address CppInterpreterGenerator::generate_result_handler_for( BasicType type) { assembler()->advance(1); return ShouldNotCallThisStub(); }
static void pick_scanline(context_t* c) { #if (!defined(DEBUG__CODEGEN_ONLY) || (DEBUG__CODEGEN_ONLY == 0)) #if ANDROID_CODEGEN == ANDROID_CODEGEN_GENERIC c->init_y = init_y; c->step_y = step_y__generic; c->scanline = scanline; return; #endif //printf("*** needs [%08lx:%08lx:%08lx:%08lx]\n", // c->state.needs.n, c->state.needs.p, // c->state.needs.t[0], c->state.needs.t[1]); // first handle the special case that we cannot test with a filter const uint32_t cb_format = GGL_READ_NEEDS(CB_FORMAT, c->state.needs.n); if (GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0]) == cb_format) { if (c->state.needs.match(noblend1to1)) { // this will match regardless of dithering state, since both // src and dest have the same format anyway, there is no dithering // to be done. const GGLFormat* f = &(c->formats[GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0])]); if ((f->components == GGL_RGB) || (f->components == GGL_RGBA) || (f->components == GGL_LUMINANCE) || (f->components == GGL_LUMINANCE_ALPHA)) { // format must have all of RGB components // (so the current color doesn't show through) c->scanline = scanline_memcpy; c->init_y = init_y_noop; return; } } } if (c->state.needs.match(fill16noblend)) { c->init_y = init_y_packed; switch (c->formats[cb_format].size) { case 1: c->scanline = scanline_memset8; return; case 2: c->scanline = scanline_memset16; return; case 4: c->scanline = scanline_memset32; return; } } const int numFilters = sizeof(shortcuts)/sizeof(shortcut_t); for (int i=0 ; i<numFilters ; i++) { if (c->state.needs.match(shortcuts[i].filter)) { c->scanline = shortcuts[i].scanline; c->init_y = shortcuts[i].init_y; return; } } #endif // DEBUG__CODEGEN_ONLY c->init_y = init_y; c->step_y = step_y__generic; #if ANDROID_ARM_CODEGEN // we're going to have to generate some code... // here, generate code for our pixel pipeline const AssemblyKey<needs_t> key(c->state.needs); sp<Assembly> assembly = gCodeCache.lookup(key); if (assembly == 0) { // create a new assembly region sp<ScanlineAssembly> a = new ScanlineAssembly(c->state.needs, ASSEMBLY_SCRATCH_SIZE); // initialize our assembler GGLAssembler assembler( new ARMAssembler(a) ); //GGLAssembler assembler( // new ARMAssemblerOptimizer(new ARMAssembler(a)) ); // generate the scanline code for the given needs int err = assembler.scanline(c->state.needs, c); if (ggl_likely(!err)) { // finally, cache this assembly err = gCodeCache.cache(a->key(), a); } if (ggl_unlikely(err)) { LOGE("error generating or caching assembly. Reverting to NOP."); c->scanline = scanline_noop; c->init_y = init_y_noop; c->step_y = step_y__nop; return; } assembly = a; } // release the previous assembly if (c->scanline_as) { c->scanline_as->decStrong(c); } //LOGI("using generated pixel-pipeline"); c->scanline_as = assembly.get(); c->scanline_as->incStrong(c); // hold on to assembly c->scanline = (void(*)(context_t* c))assembly->base(); #else // LOGW("using generic (slow) pixel-pipeline"); c->scanline = scanline; #endif }
static void patchProloge(void*, uint8_t* start) { JSC::X86Assembler assembler(reinterpret_cast<char*>(start), 2); assembler.movl_rr(JSC::X86Registers::ebp, JSC::X86Registers::ecx); }
address CppInterpreterGenerator::generate_stack_to_native_abi_converter( BasicType type) { assembler()->advance(1); return ShouldNotCallThisStub(); }