mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-01-22 06:30:16 +00:00
Support NetBSD 2.0 for x86:
- implement trunc() function, isless() and isgreater() macros - execute genexec.pl through a real perl executable - disable generation of debug info from dyngen u-ops
This commit is contained in:
parent
df0d5d2a41
commit
7df6429591
@ -24,6 +24,7 @@ LIBS = @LIBS@
|
|||||||
SYSSRCS = @SYSSRCS@
|
SYSSRCS = @SYSSRCS@
|
||||||
CPUSRCS = @CPUSRCS@
|
CPUSRCS = @CPUSRCS@
|
||||||
MONSRCS = @MONSRCS@
|
MONSRCS = @MONSRCS@
|
||||||
|
PERL = @PERL@
|
||||||
USE_DYNGEN = @USE_DYNGEN@
|
USE_DYNGEN = @USE_DYNGEN@
|
||||||
DYNGENSRCS = @DYNGENSRCS@
|
DYNGENSRCS = @DYNGENSRCS@
|
||||||
DYNGEN_CC = @DYNGEN_CC@
|
DYNGEN_CC = @DYNGEN_CC@
|
||||||
@ -142,7 +143,7 @@ $(OBJ_DIR)/%.o : %.S
|
|||||||
|
|
||||||
# Kheperix CPU emulator
|
# Kheperix CPU emulator
|
||||||
kpxsrcdir = ../kpx_cpu/src
|
kpxsrcdir = ../kpx_cpu/src
|
||||||
GENEXEC = $(kpxsrcdir)/cpu/ppc/genexec.pl
|
GENEXECPL = $(kpxsrcdir)/cpu/ppc/genexec.pl
|
||||||
DYNGEN = dyngen$(EXEEXT)
|
DYNGEN = dyngen$(EXEEXT)
|
||||||
|
|
||||||
ifeq ($(USE_DYNGEN),yes)
|
ifeq ($(USE_DYNGEN),yes)
|
||||||
@ -167,8 +168,8 @@ $(OBJ_DIR)/sheepshaver_glue.o $(OBJ_DIR)/ppc-cpu.o $(OBJ_DIR)/ppc-decode.o $(OBJ
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
$(OBJ_DIR)/ppc-execute.o: ppc-execute-impl.cpp
|
$(OBJ_DIR)/ppc-execute.o: ppc-execute-impl.cpp
|
||||||
ppc-execute-impl.cpp: $(kpxsrcdir)/cpu/ppc/ppc-decode.cpp $(GENEXEC) $(DYNGENDEPS)
|
ppc-execute-impl.cpp: $(kpxsrcdir)/cpu/ppc/ppc-decode.cpp $(GENEXECPL) $(DYNGENDEPS)
|
||||||
$(CPP) $(CPPFLAGS) -DGENEXEC $< | $(GENEXEC) > $@
|
$(CPP) $(CPPFLAGS) -DGENEXEC $< | $(PERL) $(GENEXECPL) > $@
|
||||||
|
|
||||||
# PowerPC CPU tester
|
# PowerPC CPU tester
|
||||||
TESTSRCS_ = mathlib/ieeefp.cpp cpu/ppc/ppc-cpu.cpp cpu/ppc/ppc-decode.cpp cpu/ppc/ppc-execute.cpp cpu/ppc/ppc-translate.cpp test/test-powerpc.cpp $(MONSRCS) vm_alloc.cpp
|
TESTSRCS_ = mathlib/ieeefp.cpp cpu/ppc/ppc-cpu.cpp cpu/ppc/ppc-decode.cpp cpu/ppc/ppc-execute.cpp cpu/ppc/ppc-translate.cpp test/test-powerpc.cpp $(MONSRCS) vm_alloc.cpp
|
||||||
|
@ -48,7 +48,8 @@ AC_PROG_CXX
|
|||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_EGREP
|
AC_PROG_EGREP
|
||||||
AC_CHECK_PROGS(FILE, [file false])
|
AC_PATH_PROGS(FILE, [file false])
|
||||||
|
AC_PATH_PROG(PERL, [perl])
|
||||||
|
|
||||||
dnl Check for PowerPC target CPU.
|
dnl Check for PowerPC target CPU.
|
||||||
HAVE_PPC=no
|
HAVE_PPC=no
|
||||||
@ -305,7 +306,7 @@ AC_CHECK_FUNCS(sigaction signal)
|
|||||||
AC_CHECK_FUNCS(mmap mprotect munmap)
|
AC_CHECK_FUNCS(mmap mprotect munmap)
|
||||||
AC_CHECK_FUNCS(vm_allocate vm_deallocate vm_protect)
|
AC_CHECK_FUNCS(vm_allocate vm_deallocate vm_protect)
|
||||||
AC_CHECK_FUNCS(posix_memalign memalign valloc)
|
AC_CHECK_FUNCS(posix_memalign memalign valloc)
|
||||||
AC_CHECK_FUNCS(exp2f log2f exp2 log2)
|
AC_CHECK_FUNCS(exp2f log2f exp2 log2 trunc)
|
||||||
|
|
||||||
dnl Darwin seems to define mach_task_self() instead of task_self().
|
dnl Darwin seems to define mach_task_self() instead of task_self().
|
||||||
AC_CHECK_FUNCS(mach_task_self task_self)
|
AC_CHECK_FUNCS(mach_task_self task_self)
|
||||||
@ -1070,7 +1071,7 @@ if [[ "x$EMULATED_PPC" = "xyes" ]]; then
|
|||||||
AC_CHECK_HEADERS(mmintrin.h xmmintrin.h emmintrin.h)
|
AC_CHECK_HEADERS(mmintrin.h xmmintrin.h emmintrin.h)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000"
|
DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000 -g0"
|
||||||
if [[ "x$HAVE_GCC30" = "xyes" ]]; then
|
if [[ "x$HAVE_GCC30" = "xyes" ]]; then
|
||||||
DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -fno-reorder-blocks -fno-optimize-sibling-calls"
|
DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -fno-reorder-blocks -fno-optimize-sibling-calls"
|
||||||
fi
|
fi
|
||||||
@ -1123,6 +1124,7 @@ if [[ "x$WANT_JIT" = "xyes" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Generate Makefile.
|
dnl Generate Makefile.
|
||||||
|
AC_SUBST(PERL)
|
||||||
AC_SUBST(USE_DYNGEN, [$ac_cv_use_dyngen])
|
AC_SUBST(USE_DYNGEN, [$ac_cv_use_dyngen])
|
||||||
AC_SUBST(DYNGENSRCS)
|
AC_SUBST(DYNGENSRCS)
|
||||||
AC_SUBST(DYNGEN_CC)
|
AC_SUBST(DYNGEN_CC)
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "mathlib/ieeefp.hpp"
|
|
||||||
#include "cpu/vm.hpp"
|
#include "cpu/vm.hpp"
|
||||||
#include "cpu/ppc/ppc-cpu.hpp"
|
#include "cpu/ppc/ppc-cpu.hpp"
|
||||||
#include "cpu/ppc/ppc-bitfields.hpp"
|
#include "cpu/ppc/ppc-bitfields.hpp"
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#define PPC_OPERATIONS_H
|
#define PPC_OPERATIONS_H
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "mathlib/ieeefp.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define an unary/binary/trinary operation
|
* Define an unary/binary/trinary operation
|
||||||
|
@ -108,3 +108,21 @@ int fesetround(int round)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Truncate double value
|
||||||
|
#ifndef HAVE_TRUNC
|
||||||
|
#define HAVE_TRUNC
|
||||||
|
double trunc(double x)
|
||||||
|
{
|
||||||
|
volatile unsigned short int cw;
|
||||||
|
volatile unsigned short int cwtmp;
|
||||||
|
double value;
|
||||||
|
|
||||||
|
__asm__ __volatile__("fnstcw %0" : "=m" (cw));
|
||||||
|
cwtmp = (cw & 0xf3ff) | 0x0c00; /* toward zero */
|
||||||
|
__asm__ __volatile__("fldcw %0" : : "m" (cwtmp));
|
||||||
|
__asm__ __volatile__("frndint" : "=t" (value) : "0" (x));
|
||||||
|
__asm__ __volatile__("fldcw %0" : : "m" (cw));
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* ieeefp-i386.hpp - Access to FPU environment, x86 specific code
|
* ieeefp-i386.hpp - IEEE754 Floating-Point Math library, x86 specific code
|
||||||
*
|
*
|
||||||
* Kheperix (C) 2003-2005 Gwenole Beauchesne
|
* Kheperix (C) 2003-2005 Gwenole Beauchesne
|
||||||
|
* Code derived from the GNU C Library
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,8 +19,11 @@
|
|||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IEEEFP_FENV_I386_H
|
#ifndef IEEEFP_I386_H
|
||||||
#define IEEEFP_FENV_I386_H
|
#define IEEEFP_I386_H
|
||||||
|
|
||||||
|
// 7.6 Floating-point environment <fenv.h>
|
||||||
|
#ifndef HAVE_FENV_H
|
||||||
|
|
||||||
// Exceptions
|
// Exceptions
|
||||||
enum {
|
enum {
|
||||||
@ -49,4 +53,25 @@ enum {
|
|||||||
#define FE_TOWARDZERO FE_TOWARDZERO
|
#define FE_TOWARDZERO FE_TOWARDZERO
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* IEEEFP_FENV_I386_H */
|
#endif
|
||||||
|
|
||||||
|
// 7.12.14 Comparison macros
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#ifndef isless
|
||||||
|
#define isless(x, y) \
|
||||||
|
({ register char __result; \
|
||||||
|
__asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al" \
|
||||||
|
: "=a" (__result) : "u" (x), "t" (y) : "cc", "st", "st(1)"); \
|
||||||
|
__result; })
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef isgreater
|
||||||
|
#define isgreater(x, y) \
|
||||||
|
({ register char __result; \
|
||||||
|
__asm__ ("fucompp; fnstsw; testb $0x45, %%ah; setz %%al" \
|
||||||
|
: "=a" (__result) : "u" (y), "t" (x) : "cc", "st", "st(1)"); \
|
||||||
|
__result; })
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* IEEEFP_I386_H */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* ieeefp.hpp - Access to FPU environment
|
* ieeefp.hpp - IEEE754 Floating-Point Math library
|
||||||
*
|
*
|
||||||
* Kheperix (C) 2003-2005 Gwenole Beauchesne
|
* Kheperix (C) 2003-2005 Gwenole Beauchesne
|
||||||
*
|
*
|
||||||
@ -18,21 +18,35 @@
|
|||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IEEEFP_FENV_H
|
#ifndef IEEEFP_H
|
||||||
#define IEEEFP_FENV_H
|
#define IEEEFP_H
|
||||||
|
|
||||||
#ifdef HAVE_FENV_H
|
|
||||||
#include <fenv.h>
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Arch-dependent definitions
|
// Arch-dependent definitions
|
||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
#include "mathlib/ieeefp-i386.hpp"
|
#include "mathlib/ieeefp-i386.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FENV_H
|
||||||
|
#include <fenv.h>
|
||||||
|
#else
|
||||||
|
|
||||||
// Rounding control
|
// Rounding control
|
||||||
extern "C" int fegetround(void);
|
extern "C" int fegetround(void);
|
||||||
extern "C" int fesetround(int);
|
extern "C" int fesetround(int);
|
||||||
|
|
||||||
#endif /* FENV_H */
|
#endif /* FENV_H */
|
||||||
#endif /* IEEEFP_FENV_H */
|
|
||||||
|
// Rounding
|
||||||
|
#ifndef HAVE_TRUNC
|
||||||
|
extern "C" double trunc(double);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Comparison macros
|
||||||
|
#ifndef isless
|
||||||
|
#define isless(x, y) ((x) < (y))
|
||||||
|
#endif
|
||||||
|
#ifndef isgreater
|
||||||
|
#define isgreater(x, y) ((x) > (y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* IEEEFP_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user