From 4a6d4865759a8e9d7ddcda934e820f929cdd73c1 Mon Sep 17 00:00:00 2001 From: Frode Solheim Date: Sun, 6 Sep 2015 22:50:35 +0200 Subject: [PATCH] JIT: reorganized compemu.h (and removed unused stuff) --- jit/compemu.h | 239 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 162 insertions(+), 77 deletions(-) diff --git a/jit/compemu.h b/jit/compemu.h index 46719193..7eb78070 100644 --- a/jit/compemu.h +++ b/jit/compemu.h @@ -1,47 +1,83 @@ - -#include "flags_x86.h" - +/* + * compiler/compemu.h - Public interface and definitions + * + * Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS) + * + * Inspired by Christian Bauer's Basilisk II + * + * This file is part of the ARAnyM project which builds a new and powerful + * TOS/FreeMiNT compatible virtual machine running on almost any hardware. + * + * JIT compiler m68k -> IA-32 and AMD64 + * + * Original 68040 JIT compiler for UAE, copyright 2000-2002 Bernd Meyer + * Adaptation for Basilisk II and improvements, copyright 2000-2004 Gwenole Beauchesne + * Portions related to CPU detection come from linux/arch/i386/kernel/setup.c + * + * ARAnyM is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * ARAnyM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with ARAnyM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef COMPEMU_H +#define COMPEMU_H + +#include "newcpu.h" + +#ifdef UAE #ifdef CPU_64_BIT typedef uae_u64 uintptr; #else typedef uae_u32 uintptr; #endif - -#ifndef CPU_x86_64 -#define JIT_EXCEPTION_HANDLER +#define USE_JIT #endif -/* ARAnyM uses fpu_register name, used in scratch_t */ -/* FIXME: check that no ARAnyM code assumes different floating point type */ -typedef fptype fpu_register; +#ifdef USE_JIT + +#ifdef JIT_DEBUG +/* dump some information (m68k block, x86 block addresses) about the compiler state */ +extern void compiler_dumpstate(void); +#endif -/* Flags for Bernie during development/debugging. Should go away eventually */ -#define DISTRUST_CONSISTENT_MEM 0 #define TAGMASK 0x000fffff #define TAGSIZE (TAGMASK+1) #define MAXRUN 1024 +#define cacheline(x) (((uintptr)x)&TAGMASK) extern uae_u8* start_pc_p; extern uae_u32 start_pc; -#define cacheline(x) (((uae_u32)x)&TAGMASK) +struct blockinfo_t; -typedef struct { +struct cpu_history { uae_u16* location; uae_u8 cycles; uae_u8 specmem; uae_u8 dummy2; uae_u8 dummy3; -} cpu_history; +}; -struct blockinfo_t; - -typedef union { - cpuop_func* handler; - struct blockinfo_t* bi; -} cacheline; +union cacheline { + cpuop_func* handler; + blockinfo_t * bi; +}; -extern signed long pissoff; +/* Use new spill/reload strategy when calling external functions */ +#define USE_OPTIMIZED_CALLS 0 +#if USE_OPTIMIZED_CALLS +#error implementation in progress +#endif #define USE_ALIAS 1 #define USE_F_ALIAS 1 @@ -56,12 +92,15 @@ extern signed long pissoff; #endif #define SCALE 2 -#define MAXCYCLES (1000 * CYCLE_UNIT) -#define MAXREGOPT 65536 #define BYTES_PER_INST 10240 /* paranoid ;-) */ +#if defined(CPU_arm) +#define LONGEST_68K_INST 256 /* The number of bytes the longest possible + 68k instruction takes */ +#else #define LONGEST_68K_INST 16 /* The number of bytes the longest possible 68k instruction takes */ +#endif #define MAX_CHECKSUM_LEN 2048 /* The maximum size we calculate checksums for. Anything larger will be flushed unconditionally even with SOFT_FLUSH */ @@ -79,7 +118,15 @@ extern signed long pissoff; #define KILLTHERAT 1 /* Set to 1 to avoid some partial_rat_stalls */ +#if defined(CPU_arm) +#define N_REGS 13 /* really 16, but 13 to 15 are SP, LR, PC */ +#else +#if defined(CPU_x86_64) +#define N_REGS 16 /* really only 15, but they are numbered 0-3,5-15 */ +#else #define N_REGS 8 /* really only 7, but they are numbered 0,1,2,3,5,6,7 */ +#endif +#endif #define N_FREGS 6 /* That leaves us two positions on the stack to play with */ /* Functions exposed to newcpu, or to what was moved from newcpu.c to @@ -97,23 +144,26 @@ extern uae_u32 get_jitted_size(void); #ifdef JIT extern void flush_icache(uaecptr ptr, int n); extern void flush_icache_hard(uaecptr ptr, int n); -#endif -extern void alloc_cache(void); -extern void compile_block(cpu_history* pc_hist, int blocklen, int totcyles); -extern int check_for_cache_miss(void); - static inline void flush_icache(int n) { flush_icache(0, n); } - static inline void flush_icache_hard(int n) { flush_icache(0, n); } +#endif +extern void alloc_cache(void); +extern int check_for_cache_miss(void); -#define scaled_cycles(x) (currprefs.m68k_speed<0?(((x)/SCALE)?(((x)/SCALE