Beispiel #1
0
/* update 24/06/2003 : replace dcbz by dcbzl to get
   the intended effect (Apple "fixed" dcbz)
   unfortunately this cannot be used unless the assembler
   knows about dcbzl ... */
static long check_dcbzl_effect(void)
{
    register char *fakedata = av_malloc(1024);
    register char *fakedata_middle;
    register long zero = 0;
    register long i = 0;
    long count = 0;

    if (!fakedata) {
        return 0L;
    }

    fakedata_middle = (fakedata + 512);
	
    XMemSet(fakedata, 0xFF, 1024);

    /* below the constraint "b" seems to mean "Address base register"
       in gcc-3.3 / RS/6000 speaks. seems to avoid using r0, so.... */
    //__asm__ volatile("dcbzl %0, %1" : : "b" (fakedata_middle), "r" (zero));
	__dcbz128(i,fakedata_middle);

    for (i = 0; i < 1024 ; i ++) {
        if (fakedata[i] == (char)0)
            count++;
    }

    av_free(fakedata);

    return count;
}
Beispiel #2
0
/* same as above, when dcbzl clear a whole 128B cache line
   i.e. the PPC970 aka G5 */
static void clear_blocks_dcbz128_ppc(DCTELEM *blocks)
{
    register int misal = ((unsigned long)blocks & 0x0000007f);
    register int i = 0;
#if 1
    if (misal) {
        // we could probably also optimize this case,
        // but there's not much point as the machines
        // aren't available yet (2003-06-26)
        //memset(blocks, 0, sizeof(DCTELEM)*6*64);
		XMemSet(blocks, 0, sizeof(DCTELEM)*6*64);
    }
    else
        for ( ; i < sizeof(DCTELEM)*6*64 ; i += 128) {
            //__asm__ volatile("dcbzl %0,%1" : : "b" (blocks), "r" (i) : "memory");
			__dcbz128(i,blocks);
        }
#else
    XMemSet(blocks, 0, sizeof(DCTELEM)*6*64);
#endif
POWERPC_PERF_STOP_COUNT(powerpc_clear_blocks_dcbz128, 1);
}
Beispiel #3
0
int BurnClearScreen()
{
	const struct BurnDriver* pbd = pDriver[nBurnDrvSelect];
	int w, h;
	int condition = pbd->flags & BDF_ORIENTATION_VERTICAL;

	unsigned char* pl;
	int y;

	w = condition ? pbd->nHeight : pbd->nWidth;
	h = condition ? pbd->nWidth : pbd->nHeight;

	w *= nBurnBpp;

	// clear the screen to zero
	for (pl = pBurnDraw, y = 0; y < h; pl += nBurnPitch, y++)
		XMemSet(pl, 0x00, w);

	return 0;
}