recompiler speedups (M-HT)
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3478
This commit is contained in:
		
							parent
							
								
									b8138ed477
								
							
						
					
					
						commit
						c11bc7e1ef
					
				
					 3 changed files with 113 additions and 52 deletions
				
			
		| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* $Id: decoder.h,v 1.57 2009-03-29 17:32:20 qbix79 Exp $ */
 | 
			
		||||
/* $Id: decoder.h,v 1.58 2009-10-08 20:01:31 c2woody Exp $ */
 | 
			
		||||
 | 
			
		||||
#define X86_DYNFPU_DH_ENABLED
 | 
			
		||||
#define X86_INLINED_MEMACCESS
 | 
			
		||||
| 
						 | 
				
			
			@ -187,13 +187,19 @@ static INLINE void decode_increase_wmapmask(Bitu size) {
 | 
			
		|||
 | 
			
		||||
static bool decode_fetchb_imm(Bitu & val) {
 | 
			
		||||
	if (decode.page.index<4096) {
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(1);
 | 
			
		||||
			decode.code++;
 | 
			
		||||
			decode.page.index++;
 | 
			
		||||
			return true;
 | 
			
		||||
		if (decode.page.invmap != NULL) {
 | 
			
		||||
			if (decode.page.invmap[decode.page.index] == 0) {
 | 
			
		||||
				val=(Bit32u)decode_fetchb();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
			HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
			if (tlb_addr) {
 | 
			
		||||
				val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
				decode_increase_wmapmask(1);
 | 
			
		||||
				decode.code++;
 | 
			
		||||
				decode.page.index++;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	val=(Bit32u)decode_fetchb();
 | 
			
		||||
| 
						 | 
				
			
			@ -201,13 +207,21 @@ static bool decode_fetchb_imm(Bitu & val) {
 | 
			
		|||
}
 | 
			
		||||
static bool decode_fetchw_imm(Bitu & val) {
 | 
			
		||||
	if (decode.page.index<4095) {
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(2);
 | 
			
		||||
			decode.code+=2;
 | 
			
		||||
			decode.page.index+=2;
 | 
			
		||||
			return true;
 | 
			
		||||
        if (decode.page.invmap != NULL) {
 | 
			
		||||
            if ((decode.page.invmap[decode.page.index] == 0) &&
 | 
			
		||||
                (decode.page.invmap[decode.page.index + 1] == 0)
 | 
			
		||||
            ) {
 | 
			
		||||
				val=decode_fetchw();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
			HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
			if (tlb_addr) {
 | 
			
		||||
				val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
				decode_increase_wmapmask(2);
 | 
			
		||||
				decode.code+=2;
 | 
			
		||||
				decode.page.index+=2;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	val=decode_fetchw();
 | 
			
		||||
| 
						 | 
				
			
			@ -215,13 +229,23 @@ static bool decode_fetchw_imm(Bitu & val) {
 | 
			
		|||
}
 | 
			
		||||
static bool decode_fetchd_imm(Bitu & val) {
 | 
			
		||||
	if (decode.page.index<4093) {
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(4);
 | 
			
		||||
			decode.code+=4;
 | 
			
		||||
			decode.page.index+=4;
 | 
			
		||||
			return true;
 | 
			
		||||
        if (decode.page.invmap != NULL) {
 | 
			
		||||
            if ((decode.page.invmap[decode.page.index] == 0) &&
 | 
			
		||||
                (decode.page.invmap[decode.page.index + 1] == 0) &&
 | 
			
		||||
                (decode.page.invmap[decode.page.index + 2] == 0) &&
 | 
			
		||||
                (decode.page.invmap[decode.page.index + 3] == 0)
 | 
			
		||||
            ) {
 | 
			
		||||
				val=decode_fetchd();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
			HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
			if (tlb_addr) {
 | 
			
		||||
				val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
				decode_increase_wmapmask(4);
 | 
			
		||||
				decode.code+=4;
 | 
			
		||||
				decode.page.index+=4;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	val=decode_fetchd();
 | 
			
		||||
| 
						 | 
				
			
			@ -2649,8 +2673,13 @@ restart_prefix:
 | 
			
		|||
			goto illegalopcode;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/* Normal exit because of max opcodes reached */
 | 
			
		||||
	// link to next block because the maximal number of opcodes has been reached
 | 
			
		||||
	dyn_set_eip_end();
 | 
			
		||||
	dyn_reduce_cycles();
 | 
			
		||||
	dyn_save_critical_regs();
 | 
			
		||||
	gen_jmp_ptr(&decode.block->link[0].to,offsetof(CacheBlock,cache.start));
 | 
			
		||||
	dyn_closeblock();
 | 
			
		||||
	goto finish_block;
 | 
			
		||||
core_close_block:
 | 
			
		||||
	dyn_reduce_cycles();
 | 
			
		||||
	dyn_save_critical_regs();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* $Id: decoder.h,v 1.6 2009-05-27 09:15:41 qbix79 Exp $ */
 | 
			
		||||
/* $Id: decoder.h,v 1.7 2009-10-08 20:01:31 c2woody Exp $ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "decoder_basic.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -574,8 +574,12 @@ restart_prefix:
 | 
			
		|||
			goto illegalopcode;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// normal exit because the maximal number of opcodes has been reached
 | 
			
		||||
	// link to next block because the maximal number of opcodes has been reached
 | 
			
		||||
	dyn_set_eip_end();
 | 
			
		||||
	dyn_reduce_cycles();
 | 
			
		||||
	gen_jmp_ptr(&decode.block->link[0].to,offsetof(CacheBlockDynRec,cache.start));
 | 
			
		||||
	dyn_closeblock();
 | 
			
		||||
    goto finish_block;
 | 
			
		||||
core_close_block:
 | 
			
		||||
	dyn_reduce_cycles();
 | 
			
		||||
	dyn_return(BR_Normal);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* $Id: decoder_basic.h,v 1.15 2009-05-27 09:15:41 qbix79 Exp $ */
 | 
			
		||||
/* $Id: decoder_basic.h,v 1.16 2009-10-08 20:01:31 c2woody Exp $ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -290,16 +290,24 @@ static bool decode_fetchb_imm(Bitu & val) {
 | 
			
		|||
	if (GCC_UNLIKELY(decode.page.index>=4096)) {
 | 
			
		||||
		decode_advancepage();
 | 
			
		||||
	}
 | 
			
		||||
	HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
	// see if position is directly accessible
 | 
			
		||||
	if (tlb_addr) {
 | 
			
		||||
		val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
		decode_increase_wmapmask(1);
 | 
			
		||||
		decode.code++;
 | 
			
		||||
		decode.page.index++;
 | 
			
		||||
		return true;
 | 
			
		||||
	if (decode.page.invmap != NULL) {
 | 
			
		||||
		if (decode.page.invmap[decode.page.index] == 0) {
 | 
			
		||||
			// position not yet modified
 | 
			
		||||
			val=(Bit32u)decode_fetchb();
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(1);
 | 
			
		||||
			decode.code++;
 | 
			
		||||
			decode.page.index++;
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// not directly accessible, just fetch the value
 | 
			
		||||
	// first time decoding or not directly accessible, just fetch the value
 | 
			
		||||
	val=(Bit32u)decode_fetchb();
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -308,17 +316,26 @@ static bool decode_fetchb_imm(Bitu & val) {
 | 
			
		|||
// otherwise val contains the current value read from the position
 | 
			
		||||
static bool decode_fetchw_imm(Bitu & val) {
 | 
			
		||||
	if (decode.page.index<4095) {
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		// see if position is directly accessible
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(2);
 | 
			
		||||
			decode.code+=2;
 | 
			
		||||
			decode.page.index+=2;
 | 
			
		||||
			return true;
 | 
			
		||||
		if (decode.page.invmap != NULL) {
 | 
			
		||||
			if ((decode.page.invmap[decode.page.index] == 0) &&
 | 
			
		||||
				(decode.page.invmap[decode.page.index + 1] == 0)) {
 | 
			
		||||
				// position not yet modified
 | 
			
		||||
				val=decode_fetchw();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
			// see if position is directly accessible
 | 
			
		||||
			if (tlb_addr) {
 | 
			
		||||
				val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
				decode_increase_wmapmask(2);
 | 
			
		||||
				decode.code+=2;
 | 
			
		||||
				decode.page.index+=2;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// not directly accessible, just fetch the value
 | 
			
		||||
	// first time decoding or not directly accessible, just fetch the value
 | 
			
		||||
	val=decode_fetchw();
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -327,17 +344,28 @@ static bool decode_fetchw_imm(Bitu & val) {
 | 
			
		|||
// otherwise val contains the current value read from the position
 | 
			
		||||
static bool decode_fetchd_imm(Bitu & val) {
 | 
			
		||||
	if (decode.page.index<4093) {
 | 
			
		||||
		HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
		// see if position is directly accessible
 | 
			
		||||
		if (tlb_addr) {
 | 
			
		||||
			val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
			decode_increase_wmapmask(4);
 | 
			
		||||
			decode.code+=4;
 | 
			
		||||
			decode.page.index+=4;
 | 
			
		||||
			return true;
 | 
			
		||||
		if (decode.page.invmap != NULL) {
 | 
			
		||||
			if ((decode.page.invmap[decode.page.index] == 0) &&
 | 
			
		||||
				(decode.page.invmap[decode.page.index + 1] == 0) &&
 | 
			
		||||
				(decode.page.invmap[decode.page.index + 2] == 0) &&
 | 
			
		||||
				(decode.page.invmap[decode.page.index + 3] == 0)) {
 | 
			
		||||
				// position not yet modified
 | 
			
		||||
				val=decode_fetchd();
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			HostPt tlb_addr=get_tlb_read(decode.code);
 | 
			
		||||
			// see if position is directly accessible
 | 
			
		||||
			if (tlb_addr) {
 | 
			
		||||
				val=(Bitu)(tlb_addr+decode.code);
 | 
			
		||||
				decode_increase_wmapmask(4);
 | 
			
		||||
				decode.code+=4;
 | 
			
		||||
				decode.page.index+=4;
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// not directly accessible, just fetch the value
 | 
			
		||||
	// first time decoding or not directly accessible, just fetch the value
 | 
			
		||||
	val=decode_fetchd();
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue