| 
									
										
										
										
											2009-07-28 21:32:10 +00:00
										 |  |  | // Copyright (C) 2003 Dolphin Project.
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // This program 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, version 2.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This program 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 2.0 for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Additional copyrights go to Duddie and Tratax (c) 2004
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HELPER FUNCTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DSPIntCCUtil.h"
 | 
					
						
							|  |  |  | #include "DSPCore.h"
 | 
					
						
							|  |  |  | #include "DSPInterpreter.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace DSPInterpreter { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 10:35:28 +00:00
										 |  |  | void Update_SR_Register64(s64 _Value, bool carry, bool overflow) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	g_dsp.r.sr &= ~SR_CMP_MASK; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x01
 | 
					
						
							|  |  |  | 	if (carry) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_CARRY; | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 	// 0x02 and 0x80
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	if (overflow) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_OVERFLOW; | 
					
						
							|  |  |  | 		g_dsp.r.sr  |= SR_OVERFLOW_STICKY;  | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x04
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	if (_Value == 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_ARITH_ZERO; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x08
 | 
					
						
							|  |  |  | 	if (_Value < 0) | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_SIGN; | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 10:35:28 +00:00
										 |  |  | 	// 0x10
 | 
					
						
							|  |  |  | 	if (_Value != (s32)_Value) | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_OVER_S32; | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 17:10:36 +00:00
										 |  |  | 	// 0x20 - Checks if top bits of m are equal
 | 
					
						
							| 
									
										
										
										
											2010-02-17 02:33:21 +00:00
										 |  |  | 	if (((_Value & 0xc0000000) == 0) || ((_Value & 0xc0000000) == 0xc0000000)) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_TOP2BITS; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-14 10:40:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 10:35:28 +00:00
										 |  |  | void Update_SR_Register16(s16 _Value, bool carry, bool overflow, bool overS32) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	g_dsp.r.sr &= ~SR_CMP_MASK; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x01
 | 
					
						
							|  |  |  | 	if (carry) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_CARRY; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 	// 0x02 and 0x80
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	if (overflow) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_OVERFLOW; | 
					
						
							|  |  |  | 		g_dsp.r.sr  |= SR_OVERFLOW_STICKY; | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-03-08 21:25:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x04
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	if (_Value == 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_ARITH_ZERO; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 19:10:31 +00:00
										 |  |  | 	// 0x08 
 | 
					
						
							|  |  |  | 	if (_Value < 0) | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_SIGN; | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 10:35:28 +00:00
										 |  |  | 	// 0x10
 | 
					
						
							|  |  |  | 	if (overS32)  | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_OVER_S32; | 
					
						
							| 
									
										
										
										
											2009-09-07 10:46:22 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 17:10:36 +00:00
										 |  |  | 	// 0x20 - Checks if top bits of m are equal
 | 
					
						
							| 
									
										
										
										
											2010-02-17 10:21:25 +00:00
										 |  |  | 	if ((((u16)_Value >> 14) == 0) || (((u16)_Value >> 14) == 3)) | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_TOP2BITS; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | void Update_SR_LZ(bool value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-01 20:38:42 +00:00
										 |  |  | 	if (value == true)  | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr |= SR_LOGIC_ZERO; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 		g_dsp.r.sr &= ~SR_LOGIC_ZERO; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-14 10:55:07 +00:00
										 |  |  | inline int GetMultiplyModifier() | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_MUL_MODIFY)?1:2; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | inline bool isCarry() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_CARRY) ? true : false; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | inline bool isOverflow() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_OVERFLOW) ? true : false; | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | inline bool isOverS32() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_OVER_S32) ? true : false; | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | inline bool isLess() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (!(g_dsp.r.sr & SR_OVERFLOW) != !(g_dsp.r.sr & SR_SIGN)); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | inline bool isZero() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_ARITH_ZERO) ? true : false; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | inline bool isLogicZero() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (g_dsp.r.sr & SR_LOGIC_ZERO) ? true : false; | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | inline bool isConditionA() { | 
					
						
							| 
									
										
										
										
											2010-12-29 20:20:52 +00:00
										 |  |  | 	return (((g_dsp.r.sr & SR_OVER_S32) || (g_dsp.r.sr & SR_TOP2BITS)) && !(g_dsp.r.sr & SR_ARITH_ZERO)) ? true : false; | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 17:10:36 +00:00
										 |  |  | //see DSPCore.h for flags
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | bool CheckCondition(u8 _Condition) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	switch (_Condition & 0xf) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2010-06-08 18:46:02 +00:00
										 |  |  | 	case 0xf: // Always true.
 | 
					
						
							|  |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 	case 0x0: // GE - Greater Equal
 | 
					
						
							|  |  |  | 		return !isLess(); | 
					
						
							|  |  |  | 	case 0x1: // L - Less
 | 
					
						
							|  |  |  | 		return isLess(); | 
					
						
							|  |  |  | 	case 0x2: // G - Greater
 | 
					
						
							|  |  |  | 		return !isLess() && !isZero(); | 
					
						
							|  |  |  | 	case 0x3: // LE - Less Equal
 | 
					
						
							|  |  |  | 		return isLess() || isZero(); | 
					
						
							|  |  |  | 	case 0x4: // NZ - Not Zero
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 		return !isZero(); | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 	case 0x5: // Z - Zero 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 		return isZero(); | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 	case 0x6: // NC - Not carry
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 		return !isCarry(); | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 	case 0x7: // C - Carry 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 		return isCarry(); | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | 	case 0x8: // ? - Not over s32
 | 
					
						
							|  |  |  | 		return !isOverS32(); | 
					
						
							|  |  |  | 	case 0x9: // ? - Over s32
 | 
					
						
							|  |  |  | 		return isOverS32(); | 
					
						
							|  |  |  | 	case 0xa: // ?
 | 
					
						
							|  |  |  | 		return isConditionA(); | 
					
						
							|  |  |  | 	case 0xb: // ?
 | 
					
						
							|  |  |  | 		return !isConditionA(); | 
					
						
							| 
									
										
										
										
											2009-07-07 10:01:34 +00:00
										 |  |  | 	case 0xc: // LNZ  - Logic Not Zero
 | 
					
						
							|  |  |  | 		return !isLogicZero(); | 
					
						
							|  |  |  | 	case 0xd: // LZ - Logic Zero
 | 
					
						
							|  |  |  | 		return isLogicZero(); | 
					
						
							| 
									
										
										
										
											2010-03-24 14:51:04 +00:00
										 |  |  | 	case 0xe: // 0 - Overflow
 | 
					
						
							|  |  |  | 		return isOverflow(); | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2010-03-28 17:10:36 +00:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2009-07-06 02:10:26 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 |