mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-12 00:59:41 +01:00
Merge branch 'master' into vertexcache
This commit is contained in:
commit
8b4deb93ce
3 files changed
+123
-19
No files matched your search
+117
-17
@@ -84,18 +84,14 @@ void Jit::Comp_FPU3op(u32 op)
|
||||
}
|
||||
}
|
||||
|
||||
static u32 GC_ALIGNED16(ssLoadStoreTemp[1]);
|
||||
|
||||
void Jit::Comp_FPULS(u32 op)
|
||||
{
|
||||
CONDITIONAL_DISABLE;
|
||||
if (!g_Config.bFastMemory) {
|
||||
DISABLE;
|
||||
}
|
||||
|
||||
|
||||
s32 offset = (s16)(op&0xFFFF);
|
||||
int ft = ((op>>16)&0x1f);
|
||||
int ft = _FT;
|
||||
int rs = _RS;
|
||||
// u32 addr = R(rs) + offset;
|
||||
|
||||
switch(op >> 26)
|
||||
{
|
||||
@@ -103,14 +99,69 @@ void Jit::Comp_FPULS(u32 op)
|
||||
gpr.Lock(rs);
|
||||
fpr.Lock(ft);
|
||||
fpr.BindToRegister(ft, false, true);
|
||||
|
||||
if (gpr.R(rs).IsImm())
|
||||
{
|
||||
void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset);
|
||||
if (data)
|
||||
{
|
||||
#ifdef _M_IX86
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK));
|
||||
MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset));
|
||||
MOVSS(fpr.RX(ft), M(data));
|
||||
#else
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset));
|
||||
MOVSS(fpr.RX(ft), MDisp(RBX, gpr.R(rs).GetImmValue() + offset));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
MOV(32, M((void *)ssLoadStoreTemp), Imm32(0));
|
||||
MOVSS(fpr.RX(ft), M((void *)ssLoadStoreTemp));
|
||||
}
|
||||
}
|
||||
else if (!g_Config.bFastMemory)
|
||||
{
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
// Is it in physical ram?
|
||||
CMP(32, R(EAX), Imm32(0x08000000));
|
||||
FixupBranch tooLow = J_CC(CC_L);
|
||||
CMP(32, R(EAX), Imm32(0x0A000000));
|
||||
FixupBranch tooHigh = J_CC(CC_GE);
|
||||
|
||||
const u8* safe = GetCodePtr();
|
||||
#ifdef _M_IX86
|
||||
MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset));
|
||||
#else
|
||||
MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset));
|
||||
#endif
|
||||
|
||||
FixupBranch skip = J();
|
||||
SetJumpTarget(tooLow);
|
||||
SetJumpTarget(tooHigh);
|
||||
|
||||
// Might also be the scratchpad.
|
||||
CMP(32, R(EAX), Imm32(0x00010000));
|
||||
FixupBranch tooLow2 = J_CC(CC_L);
|
||||
CMP(32, R(EAX), Imm32(0x00014000));
|
||||
J_CC(CC_L, safe);
|
||||
SetJumpTarget(tooLow2);
|
||||
|
||||
ADD(32, R(EAX), Imm32(offset));
|
||||
ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U32, 1), R(EAX));
|
||||
MOV(32, M((void *)&ssLoadStoreTemp), R(EAX));
|
||||
MOVSS(fpr.RX(ft), M((void *)&ssLoadStoreTemp));
|
||||
|
||||
SetJumpTarget(skip);
|
||||
}
|
||||
else
|
||||
{
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
#ifdef _M_IX86
|
||||
AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK));
|
||||
MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset));
|
||||
#else
|
||||
MOVSS(fpr.RX(ft), MComplex(RBX, RAX, SCALE_1, offset));
|
||||
#endif
|
||||
}
|
||||
|
||||
gpr.UnlockAll();
|
||||
fpr.UnlockAll();
|
||||
break;
|
||||
@@ -118,14 +169,63 @@ void Jit::Comp_FPULS(u32 op)
|
||||
gpr.Lock(rs);
|
||||
fpr.Lock(ft);
|
||||
fpr.BindToRegister(ft, true, false);
|
||||
|
||||
if (gpr.R(rs).IsImm())
|
||||
{
|
||||
void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset);
|
||||
if (data)
|
||||
{
|
||||
#ifdef _M_IX86
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK));
|
||||
MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft));
|
||||
MOVSS(M(data), fpr.RX(ft));
|
||||
#else
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft));
|
||||
MOVSS(MDisp(RBX, gpr.R(rs).GetImmValue() + offset), fpr.RX(ft));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (!g_Config.bFastMemory)
|
||||
{
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
// Is it in physical ram?
|
||||
CMP(32, R(EAX), Imm32(0x08000000));
|
||||
FixupBranch tooLow = J_CC(CC_L);
|
||||
CMP(32, R(EAX), Imm32(0x0A000000));
|
||||
FixupBranch tooHigh = J_CC(CC_GE);
|
||||
|
||||
const u8* safe = GetCodePtr();
|
||||
#ifdef _M_IX86
|
||||
MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft));
|
||||
#else
|
||||
MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft));
|
||||
#endif
|
||||
|
||||
FixupBranch skip = J();
|
||||
SetJumpTarget(tooLow);
|
||||
SetJumpTarget(tooHigh);
|
||||
|
||||
// Might also be the scratchpad.
|
||||
CMP(32, R(EAX), Imm32(0x00010000));
|
||||
FixupBranch tooLow2 = J_CC(CC_L);
|
||||
CMP(32, R(EAX), Imm32(0x00014000));
|
||||
J_CC(CC_L, safe);
|
||||
SetJumpTarget(tooLow2);
|
||||
|
||||
ADD(32, R(EAX), Imm32(offset));
|
||||
MOVSS(M((void *)&ssLoadStoreTemp), fpr.RX(ft));
|
||||
ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U32, 2), M((void *)&ssLoadStoreTemp), R(EAX));
|
||||
|
||||
SetJumpTarget(skip);
|
||||
}
|
||||
else
|
||||
{
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
#ifdef _M_IX86
|
||||
AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK));
|
||||
MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft));
|
||||
#else
|
||||
MOVSS(MComplex(RBX, RAX, SCALE_1, offset), fpr.RX(ft));
|
||||
#endif
|
||||
}
|
||||
|
||||
gpr.UnlockAll();
|
||||
fpr.UnlockAll();
|
||||
break;
|
||||
|
||||
@@ -203,7 +203,7 @@ namespace MIPSComp
|
||||
break;
|
||||
|
||||
case 35: //R(rt) = ReadMem32(addr); break; //lw
|
||||
CompITypeMemRead(op, 32, &XEmitter::MOVZX, (void *) &Memory::Read_U16);
|
||||
CompITypeMemRead(op, 32, &XEmitter::MOVZX, (void *) &Memory::Read_U32);
|
||||
break;
|
||||
|
||||
case 32: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb
|
||||
|
||||
@@ -342,7 +342,11 @@ void GenerateVertexShader(int prim, char *buffer) {
|
||||
|
||||
if (gstate.lightingEnable & 1) {
|
||||
// Sum up ambient, emissive here.
|
||||
WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, 1.0) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient);
|
||||
if (hasColor) {
|
||||
WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, a_color0.a) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient);
|
||||
} else {
|
||||
WRITE(p, " v_color0 = clamp(lightSum0 + u_ambient * vec4(%s, u_matambientalpha.a) + vec4(u_matemissive, 0.0), 0.0, 1.0);\n", ambient);
|
||||
}
|
||||
if (lmode) {
|
||||
WRITE(p, " v_color1 = clamp(lightSum1, 0.0, 1.0);\n");
|
||||
} else {
|
||||
|
||||
Reference in new issue
Block a user