Hopefully fixed Linux/GCC compiles of vtlb.cpp with this update (should be no functional changes for Win32 users)

git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@465 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
Jake.Stine 2008-12-20 13:37:58 +00:00 committed by Gregory Hainaut
parent c8e246fbfe
commit 274c92b832
4 changed files with 81 additions and 70 deletions

View File

@ -423,6 +423,11 @@ __unused static void AtomicExchange( u32& Target, u32 value )
InterlockedExchange( (volatile LONG*)&Target, value );
}
__unused static void AtomicExchangeAdd( u32& Target, u32 value )
{
InterlockedExchangeAdd( (volatile LONG*)&Target, value );
}
__unused static void AtomicIncrement( u32& Target )
{
InterlockedIncrement( (volatile LONG*)&Target );
@ -438,6 +443,11 @@ __unused static void AtomicExchange( s32& Target, s32 value )
InterlockedExchange( (volatile LONG*)&Target, value );
}
__unused static void AtomicExchangeAdd( s32& Target, u32 value )
{
InterlockedExchangeAdd( (volatile LONG*)&Target, value );
}
__unused static void AtomicIncrement( s32& Target )
{
InterlockedIncrement( (volatile LONG*)&Target );

View File

@ -68,6 +68,37 @@
#define COMMONdefs
#endif
// jASSUME - give hints to the optimizer
// This is primarily useful for the default case switch optimizer, which enables VC to
// generate more compact switches.
#ifdef NDEBUG
# define jBREAKPOINT() ((void) 0)
# ifdef _MSC_VER
# define jASSUME(exp) (__assume(exp))
# else
# define jASSUME(exp) ((void) sizeof(exp))
# endif
#else
# if defined(_MSC_VER)
# define jBREAKPOINT() do { __asm int 3 } while(0)
# else
# define jBREAKPOINT() ((void) *(volatile char *) 0)
# endif
# define jASSUME(exp) if(exp) ; else jBREAKPOINT()
#endif
// disable the default case in a switch
#define jNO_DEFAULT \
{ \
break; \
\
default: \
jASSUME(0); \
break; \
}
// PS2EgetLibType returns (may be OR'd)
#define PS2E_LT_GS 0x01
#define PS2E_LT_PAD 0x02 // -=[ OBSOLETE ]=-

View File

@ -32,7 +32,7 @@ const u32 VTLB_PAGE_SIZE=(4096);
const u32 VTLB_PMAP_ITEMS=(0x20000000/VTLB_PAGE_SIZE);
const u32 VTLB_PMAP_SZ=0x20000000;
const u32 VTLB_VMAP_ITEMS=(0x100000000/VTLB_PAGE_SIZE);
const u32 VTLB_VMAP_ITEMS=(0x100000000ULL/VTLB_PAGE_SIZE);
s32 pmap[VTLB_PMAP_ITEMS]; //512KB
s32 vmap[VTLB_VMAP_ITEMS]; //4MB
@ -48,70 +48,7 @@ vtlbHandler UnmappedVirtHandler1;
vtlbHandler UnmappedPhyHandler0;
vtlbHandler UnmappedPhyHandler1;
template<int typ,bool Write>
struct TemplateHelper
{
};
template<>
struct TemplateHelper<8,false>
{
static const int sidx=0;
typedef vltbMemR8FP HandlerType;
};
template<>
struct TemplateHelper<8,true>
{
static const int sidx=0;
typedef vltbMemW8FP HandlerType;
};
template<>
struct TemplateHelper<16,false>
{
static const int sidx=1;
typedef vltbMemR16FP HandlerType;
};
template<>
struct TemplateHelper<16,true>
{
static const int sidx=1;
typedef vltbMemW16FP HandlerType;
};
template<>
struct TemplateHelper<32,false>
{
static const int sidx=2;
typedef vltbMemR32FP HandlerType;
};
template<>
struct TemplateHelper<32,true>
{
static const int sidx=2;
typedef vltbMemW32FP HandlerType;
};
template<>
struct TemplateHelper<64,false>
{
static const int sidx=3;
typedef vltbMemR64FP HandlerType;
};
template<>
struct TemplateHelper<64,true>
{
static const int sidx=3;
typedef vltbMemW64FP HandlerType;
};
template<>
struct TemplateHelper<128,false>
{
static const int sidx=4;
typedef vltbMemR128FP HandlerType;
};
template<>
struct TemplateHelper<128,true>
{
static const int sidx=4;
typedef vltbMemW128FP HandlerType;
};
/*
__asm
{
@ -136,11 +73,14 @@ callfunction:
//edx = data ptr
jmp [readfunctions8-0x800000+eax];
}*/
template<int DataSize,typename DataType>
__forceinline int __fastcall MemOp_r(u32 addr,DataType* data)
__forceinline int __fastcall MemOp_r(u32 addr, DataType* data)
{
u32 vmv=vmap[addr>>VTLB_PAGE_BITS];
s32 ppf=addr+vmv;
if (!(ppf<0))
{
data[0]=*reinterpret_cast<DataType*>(ppf);
@ -154,11 +94,24 @@ __forceinline int __fastcall MemOp_r(u32 addr,DataType* data)
u32 hand=(u8)vmv;
u32 paddr=ppf-hand+0x80000000;
//SysPrintf("Translted 0x%08X to 0x%08X\n",addr,paddr);
return reinterpret_cast<TemplateHelper<DataSize,false>::HandlerType*>(RWFT[TemplateHelper<DataSize,false>::sidx][0][hand])(paddr,data);
//return reinterpret_cast<TemplateHelper<DataSize,false>::HandlerType*>(RWFT[TemplateHelper<DataSize,false>::sidx][0][hand])(paddr,data);
switch( DataSize )
{
case 8: return ((vltbMemRFP*)RWFT[0][0][hand])(paddr, data);
case 16: return ((vltbMemRFP*)RWFT[1][0][hand])(paddr, data);
case 32: return ((vltbMemRFP*)RWFT[2][0][hand])(paddr, data);
case 64: return ((vltbMemRFP*)RWFT[3][0][hand])(paddr, data);
case 128: return ((vltbMemRFP*)RWFT[4][0][hand])(paddr, data);
jNO_DEFAULT;
}
}
}
template<int DataSize,typename DataType>
__forceinline void __fastcall MemOp_w0(u32 addr,DataType data)
__forceinline void __fastcall MemOp_w0(u32 addr, DataType data)
{
u32 vmv=vmap[addr>>VTLB_PAGE_BITS];
s32 ppf=addr+vmv;
@ -172,7 +125,15 @@ __forceinline void __fastcall MemOp_w0(u32 addr,DataType data)
u32 hand=(u8)vmv;
u32 paddr=ppf-hand+0x80000000;
//SysPrintf("Translted 0x%08X to 0x%08X\n",addr,paddr);
reinterpret_cast<TemplateHelper<DataSize,true>::HandlerType*>(RWFT[TemplateHelper<DataSize,true>::sidx][1][hand])(paddr,data);
switch( DataSize )
{
case 8: return ((vltbMemW8FP*)RWFT[0][1][hand])(paddr, (u8)data);
case 16: return ((vltbMemW16FP*)RWFT[1][1][hand])(paddr, (u16)data);
case 32: return ((vltbMemW32FP*)RWFT[2][1][hand])(paddr, (u32)data);
jNO_DEFAULT;
}
}
}
template<int DataSize,typename DataType>
@ -193,7 +154,13 @@ __forceinline void __fastcall MemOp_w1(u32 addr,const DataType* data)
u32 hand=(u8)vmv;
u32 paddr=ppf-hand+0x80000000;
//SysPrintf("Translted 0x%08X to 0x%08X\n",addr,paddr);
reinterpret_cast<TemplateHelper<DataSize,true>::HandlerType*>(RWFT[TemplateHelper<DataSize,true>::sidx][1][hand])(paddr,data);
switch( DataSize )
{
case 64: return ((vltbMemW64FP*)RWFT[3][1][hand])(paddr, data);
case 128: return ((vltbMemW128FP*)RWFT[4][1][hand])(paddr, data);
jNO_DEFAULT;
}
}
}
int __fastcall vtlb_memRead8(u32 mem, u8 *out)

View File

@ -11,6 +11,9 @@
#define mem64_t u64
#define mem128_t u64
// unsafe version needed to avoid template hell on gcc. :/
typedef int __fastcall vltbMemRFP(u32 addr,void* data);
typedef int __fastcall vltbMemR8FP(u32 addr,mem8_t* data);
typedef int __fastcall vltbMemR16FP(u32 addr,mem16_t* data);
typedef int __fastcall vltbMemR32FP(u32 addr,mem32_t* data);