bugfix, more...

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@116 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard 2008-07-31 21:02:19 +00:00
parent 523ca5a682
commit 0c21d95606
4 changed files with 37 additions and 6 deletions

View File

@ -29,6 +29,14 @@ void ABI_CallFunctionR(void *func, X64Reg reg1) {
ADD(32, R(ESP), Imm8(4)); ADD(32, R(ESP), Imm8(4));
} }
void ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2)
{
PUSH(32, arg1);
PUSH(32, Imm32(param2));
CALL(func);
ADD(32, R(ESP), Imm8(8));
}
void ABI_PushAllCalleeSavedRegsAndAdjustStack() { void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
PUSH(EBP); PUSH(EBP);
PUSH(EBX); PUSH(EBX);
@ -66,6 +74,14 @@ void ABI_CallFunctionR(void *func, X64Reg reg1) {
CALL(func); CALL(func);
} }
void ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2)
{
if (arg1.IsSimpleReg(ABI_PARAM1))
MOV(32, R(ABI_PARAM1), arg1);
MOV(32, R(ABI_PARAM2), Imm32(param2));
CALL(func);
}
#ifdef _WIN32 #ifdef _WIN32
// Win64 Specific Code // Win64 Specific Code
// ==================================== // ====================================
@ -74,7 +90,7 @@ void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
PUSH(RBX); PUSH(RBX);
PUSH(RSI); PUSH(RSI);
PUSH(RDI); PUSH(RDI);
PUSH(RBP); //PUSH(RBP);
PUSH(R12); PUSH(R12);
PUSH(R13); PUSH(R13);
PUSH(R14); PUSH(R14);
@ -89,7 +105,7 @@ void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
POP(R14); POP(R14);
POP(R13); POP(R13);
POP(R12); POP(R12);
POP(RBP); //POP(RBP);
POP(RDI); POP(RDI);
POP(RSI); POP(RSI);
POP(RBX); POP(RBX);
@ -99,11 +115,21 @@ void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
// Unix64 Specific Code // Unix64 Specific Code
// ==================================== // ====================================
void ABI_PushAllCalleeSavedRegsAndAdjustStack() { void ABI_PushAllCalleeSavedRegsAndAdjustStack() {
PUSH(RBX);
PUSH(RBP);
PUSH(R12);
PUSH(R13);
PUSH(R14);
PUSH(R15);
} }
void ABI_PopAllCalleeSavedRegsAndAdjustStack() { void ABI_PopAllCalleeSavedRegsAndAdjustStack() {
POP(R15);
POP(R14);
POP(R13);
POP(R12);
POP(RBP);
POP(RBX);
} }
#endif #endif

View File

@ -83,6 +83,7 @@
// These will destroy the 1 or 2 first "parameter regs". // These will destroy the 1 or 2 first "parameter regs".
void ABI_CallFunctionC(void *func, u32 param1); void ABI_CallFunctionC(void *func, u32 param1);
void ABI_CallFunctionCC(void *func, u32 param1, u32 param2); void ABI_CallFunctionCC(void *func, u32 param1, u32 param2);
void ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2);
// Pass a register as a paremeter. // Pass a register as a paremeter.
void ABI_CallFunctionR(void *func, Gen::X64Reg reg1); void ABI_CallFunctionR(void *func, Gen::X64Reg reg1);

View File

@ -132,7 +132,11 @@ namespace Gen
void WriteNormalOp(bool toRM, NormalOp op, const OpArg &operand, int bits) const; void WriteNormalOp(bool toRM, NormalOp op, const OpArg &operand, int bits) const;
bool IsImm() const {return scale == SCALE_IMM8 || scale == SCALE_IMM16 || scale == SCALE_IMM32 || scale == SCALE_IMM64;} bool IsImm() const {return scale == SCALE_IMM8 || scale == SCALE_IMM16 || scale == SCALE_IMM32 || scale == SCALE_IMM64;}
bool IsSimpleReg() const {return scale == SCALE_NONE;} bool IsSimpleReg() const {return scale == SCALE_NONE;}
bool IsSimpleReg(X64Reg reg) const {
if (!IsSimpleReg())
return false;
return GetSimpleReg() == reg;
}
bool CanDoOpWith(OpArg &other) const bool CanDoOpWith(OpArg &other) const
{ {
if (IsSimpleReg()) return true; if (IsSimpleReg()) return true;