config for x86 (32 bit only, for SH2 drc), add/revive profiling

This commit is contained in:
kub 2019-03-20 20:33:43 +01:00
parent 78d817c370
commit c1d15f7397
7 changed files with 91 additions and 15 deletions

View file

@ -13,6 +13,10 @@ CFLAGS += -falign-functions=2
endif endif
LDFLAGS += -Wl,--gc-sections LDFLAGS += -Wl,--gc-sections
# profiling
pprof ?= 0
gperf ?= 0
all: config.mak target_ all: config.mak target_
ifndef NO_CONFIG_MAK ifndef NO_CONFIG_MAK
@ -118,6 +122,8 @@ OBJS += platform/gp2x/emu.o
OBJS += platform/gp2x/vid_mmsp2.o OBJS += platform/gp2x/vid_mmsp2.o
OBJS += platform/gp2x/vid_pollux.o OBJS += platform/gp2x/vid_pollux.o
OBJS += platform/gp2x/warm.o OBJS += platform/gp2x/warm.o
OBJS += platform/gp2x/host_dasm.o
OBJS += cpu/sh2/mame/sh2dasm.o
USE_FRONTEND = 1 USE_FRONTEND = 1
PLATFORM_MP3 = 1 PLATFORM_MP3 = 1
PLATFORM_ZLIB = 1 PLATFORM_ZLIB = 1
@ -204,7 +210,7 @@ else
endif endif
pprof: platform/linux/pprof.c pprof: platform/linux/pprof.c
$(CC) -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@ $(CC) $(CFLAGS) -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@ $(LDFLAGS) $(LDLIBS)
tools/textfilter: tools/textfilter.c tools/textfilter: tools/textfilter.c
make -C tools/ textfilter make -C tools/ textfilter

View file

@ -9,7 +9,7 @@ CFLAGS += -fno-gcse -funswitch-loops -fweb -ftree-loop-im #-fpredictive-commonin
CFLAGS += -I/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/include -I/home/build/src/gp2x/armroot-eabi/include CFLAGS += -I/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/include -I/home/build/src/gp2x/armroot-eabi/include
ASFLAGS += -mfloat-abi=soft -mcpu=arm920t ASFLAGS += -mfloat-abi=soft -mcpu=arm920t
LDFLAGS += -B/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/lib/gcc/arm-gph-linux-gnueabi/4.2.4 -B/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/lib -L/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/lib -L/home/build/src/gp2x/armroot-eabi/lib -static LDFLAGS += -B/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/lib/gcc/arm-gph-linux-gnueabi/4.2.4 -B/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/lib -L/home/build/opt/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi/arm-gph-linux-gnueabi/sys-root/usr/lib -L/home/build/src/gp2x/armroot-eabi/lib -static
LDLIBS += -lpng -lm -ldl -lprofiler -lstdc++ LDLIBS += -lpng -lm -ldl
ARCH = arm ARCH = arm
PLATFORM = gp2x PLATFORM = gp2x

15
config.x86 Normal file
View file

@ -0,0 +1,15 @@
# Automatically generated by configure
# Configured with: './configure' '--platform=generic'
CC = gcc
CXX = g++
AS = as
STRIP = strip
CFLAGS += -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -Wno-unused-result -m32 #-DGPERF -pg
ASFLAGS +=
LDFLAGS += -m32 #-pg
LDLIBS += -L$(HOME)/opt/binutils-i386/usr/lib/ -lbfd-2.24-multiarch -lopcodes-2.24-multiarch
LDLIBS += -L/usr/lib/i386-linux-gnu/debug -L/home/build/opt/lib32 -lSDL-1.2 -lasound -lpng -lz -lm -ldl
ARCH = x86
PLATFORM = generic
SOUND_DRIVERS = oss alsa sdl

View file

@ -40,6 +40,10 @@ ifeq "$(pprof)" "1"
DEFINES += PPROF DEFINES += PPROF
SRCS_COMMON += $(R)platform/linux/pprof.c SRCS_COMMON += $(R)platform/linux/pprof.c
endif endif
ifeq "$(gperf)" "1"
DEFINES += GPERF
LDFLAGS += -lprofiler -lstdc++
endif
# ARM asm stuff # ARM asm stuff
ifeq "$(ARCH)" "arm" ifeq "$(ARCH)" "arm"

View file

@ -90,6 +90,10 @@ int main(int argc, char *argv[])
emu_init(); emu_init();
menu_init(); menu_init();
#ifdef GPERF
ProfilerStart("gperf.out");
#endif
engineState = PGS_Menu; engineState = PGS_Menu;
if (argc > 1) if (argc > 1)
@ -145,6 +149,9 @@ int main(int argc, char *argv[])
} }
endloop: endloop:
#ifdef GPERF
ProfilerStop();
#endif
emu_finish(); emu_finish();
plat_finish(); plat_finish();

View file

@ -1,21 +1,46 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <sys/mman.h>
#include <pico/pico_int.h> #include <pico/pico_int.h>
int rc_mem[pp_total_points];
struct pp_counters *pp_counters; struct pp_counters *pp_counters;
int *refcounts = rc_mem;
static int shmemid; static int shmemid;
static unsigned long devMem;
volatile unsigned long *gp2x_memregl;
volatile unsigned short *gp2x_memregs;
void pprof_init(void) void pprof_init(void)
{ {
int this_is_new_shmem = 1; int this_is_new_shmem = 1;
key_t shmemkey; key_t shmemkey;
void *shmem; void *shmem;
#if 0
devMem = open("/dev/mem", O_RDWR);
if (devMem == -1)
{
perror("pprof: open failed");
return;
}
gp2x_memregl = (unsigned long *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, devMem, 0xc0000000);
if (gp2x_memregl == (unsigned long *)-1)
{
perror("pprof: mmap failed");
return;
}
gp2x_memregs = (unsigned short *)gp2x_memregl;
#endif
#ifndef PPROF_TOOL #ifndef PPROF_TOOL
unsigned int tmp = pprof_get_one(); unsigned int tmp = pprof_get_one();
printf("pprof: measured diff is %u\n", pprof_get_one() - tmp); printf("pprof: measured diff is %u\n", pprof_get_one() - tmp);
@ -28,11 +53,11 @@ void pprof_init(void)
return; return;
} }
#ifndef PPROF_TOOL //#ifndef PPROF_TOOL
shmemid = shmget(shmemkey, sizeof(*pp_counters), shmemid = shmget(shmemkey, sizeof(*pp_counters),
IPC_CREAT | IPC_EXCL | 0644); IPC_CREAT | IPC_EXCL | 0644);
if (shmemid == -1) if (shmemid == -1)
#endif //#endif
{ {
shmemid = shmget(shmemkey, sizeof(*pp_counters), shmemid = shmget(shmemkey, sizeof(*pp_counters),
0644); 0644);
@ -76,15 +101,18 @@ static const struct {
IT(draw), IT(draw),
IT(sound), IT(sound),
IT(m68k), IT(m68k),
IT(s68k),
IT(mem68),
IT(z80), IT(z80),
IT(msh2), IT(msh2),
IT(ssh2), IT(ssh2),
IT(memsh),
IT(dummy), IT(dummy),
}; };
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
unsigned long long old[pp_total_points], new[pp_total_points]; pp_type old[pp_total_points], new[pp_total_points];
int base = 0; int base = 0;
int l, i; int l, i;
@ -107,11 +135,12 @@ int main(int argc, char *argv[])
memcpy(new, pp_counters->counter, sizeof(new)); memcpy(new, pp_counters->counter, sizeof(new));
for (i = 0; i < ARRAY_SIZE(pp_tab); i++) for (i = 0; i < ARRAY_SIZE(pp_tab); i++)
{ {
unsigned long long idiff = new[i] - old[i]; pp_type idiff = new[i] - old[i];
unsigned long long bdiff = (new[base] - old[base]) | 1; pp_type bdiff = (new[base] - old[base]) | 1;
printf("%6.2f ", (double)idiff * 100.0 / bdiff); printf("%6.2f ", (double)idiff * 100.0 / bdiff);
} }
printf("\n"); printf("\n");
fflush(stdout);
memcpy(old, new, sizeof(old)); memcpy(old, new, sizeof(old));
if (argc < 3) if (argc < 3)

View file

@ -7,21 +7,22 @@ enum pprof_points {
pp_draw, pp_draw,
pp_sound, pp_sound,
pp_m68k, pp_m68k,
pp_s68k,
pp_mem68,
pp_z80, pp_z80,
pp_msh2, pp_msh2,
pp_ssh2, pp_ssh2,
pp_memsh,
pp_dummy, pp_dummy,
pp_total_points pp_total_points
}; };
struct pp_counters
{
unsigned long long counter[pp_total_points];
};
extern struct pp_counters *pp_counters; extern struct pp_counters *pp_counters;
extern int *refcounts;
#ifdef __i386__ #ifdef __i386__
typedef unsigned long long pp_type;
static __attribute__((always_inline)) inline unsigned int pprof_get_one(void) static __attribute__((always_inline)) inline unsigned int pprof_get_one(void)
{ {
unsigned long long ret; unsigned long long ret;
@ -31,24 +32,38 @@ static __attribute__((always_inline)) inline unsigned int pprof_get_one(void)
#define unglitch_timer(x) #define unglitch_timer(x)
#elif defined(__GP2X__) #elif defined(__GP2X__)
typedef unsigned long pp_type;
#if 0
// XXX: MMSP2 only, timer sometimes seems to return lower vals? // XXX: MMSP2 only, timer sometimes seems to return lower vals?
extern volatile unsigned long *gp2x_memregl; extern volatile unsigned long *gp2x_memregl;
#define pprof_get_one() (unsigned int)gp2x_memregl[0x0a00 >> 2] #define pprof_get_one() (unsigned int)gp2x_memregl[0x0a00 >> 2]
#define unglitch_timer(di) \ #define unglitch_timer(di) \
if ((signed int)(di) < 0) di = 0 if ((signed int)(di) < 0) di = 0
#else
extern unsigned int (*gp2x_get_ticks_us)(void);
#define pprof_get_one() gp2x_get_ticks_us()
#define unglitch_timer(di) \
if ((signed int)(di) < 0) di = 0
#endif
#else #else
#error no timer #error no timer
#endif #endif
struct pp_counters
{
pp_type counter[pp_total_points];
};
#define pprof_start(point) { \ #define pprof_start(point) { \
unsigned int pp_start_##point = pprof_get_one() unsigned int pp_start_##point = pprof_get_one(); refcounts[pp_##point]++
#define pprof_end(point) \ #define pprof_end(point) \
{ \ { \
unsigned int di = pprof_get_one() - pp_start_##point; \ unsigned int di = pprof_get_one() - pp_start_##point; \
unglitch_timer(di); \ unglitch_timer(di); \
pp_counters->counter[pp_##point] += di; \ if (!--refcounts[pp_##point]) pp_counters->counter[pp_##point] += di; \
} \ } \
} }
@ -57,7 +72,7 @@ extern volatile unsigned long *gp2x_memregl;
{ \ { \
unsigned int di = pprof_get_one() - pp_start_##point; \ unsigned int di = pprof_get_one() - pp_start_##point; \
unglitch_timer(di); \ unglitch_timer(di); \
pp_counters->counter[pp_##point] -= di; \ if (--refcounts[pp_##point]) pp_counters->counter[pp_##point] -= di; \
} \ } \
} }