| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | // Copyright (C) 2003 Dolphin Project.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _DSPEMITTER_H
 | 
					
						
							|  |  |  | #define _DSPEMITTER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DSPCommon.h"
 | 
					
						
							|  |  |  | #include "x64Emitter.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define COMPILED_CODE_SIZE sizeof(void *) * 0x200000
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAX_BLOCKS 0x10000
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef void (*CompiledCode)(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DSPEmitter : public Gen::XCodeBlock | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CompiledCode *blocks; | 
					
						
							|  |  |  | 	u16 blockSize[0x10000]; | 
					
						
							|  |  |  | 	bool *endBlock; | 
					
						
							| 
									
										
										
										
											2010-04-11 18:06:29 +00:00
										 |  |  | 	u16 compileSR; | 
					
						
							| 
									
										
										
										
											2010-04-19 13:02:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The index of the last stored ext value (compile time).
 | 
					
						
							| 
									
										
										
										
											2010-04-19 13:29:05 +00:00
										 |  |  | 	int storeIndex; | 
					
						
							| 
									
										
										
										
											2010-04-19 13:02:24 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-04-09 15:11:02 +00:00
										 |  |  | 	DISALLOW_COPY_AND_ASSIGN(DSPEmitter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-16 13:32:13 +00:00
										 |  |  | 	void ToMask(Gen::X64Reg value_reg = Gen::EDI, Gen::X64Reg temp_reg = Gen::ESI); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 	DSPEmitter(); | 
					
						
							|  |  |  | 	~DSPEmitter(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const u8 *m_compiledCode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void WriteCallInterpreter(UDSPInstruction inst); | 
					
						
							|  |  |  | 	void unknown_instruction(UDSPInstruction inst); | 
					
						
							|  |  |  | 	void Default(UDSPInstruction _inst); | 
					
						
							|  |  |  | 	void ClearIRAM(); | 
					
						
							|  |  |  | 	const u8 *Compile(int start_addr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void STACKALIGN RunBlock(int cycles); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-11 18:06:29 +00:00
										 |  |  | 	// Register helpers
 | 
					
						
							| 
									
										
										
										
											2010-04-11 20:03:38 +00:00
										 |  |  | 	void setCompileSR(u16 bit); | 
					
						
							|  |  |  | 	void clrCompileSR(u16 bit); | 
					
						
							| 
									
										
										
										
											2010-04-16 10:50:52 +00:00
										 |  |  | 	void checkExceptions(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 	// Memory helper functions
 | 
					
						
							|  |  |  | 	void increment_addr_reg(int reg); | 
					
						
							|  |  |  | 	void decrement_addr_reg(int reg); | 
					
						
							|  |  |  | 	void increase_addr_reg(int reg); | 
					
						
							|  |  |  | 	void decrease_addr_reg(int reg); | 
					
						
							|  |  |  | 	void ext_dmem_write(u32 src, u32 dest); | 
					
						
							| 
									
										
										
										
											2010-04-11 16:36:00 +00:00
										 |  |  | 	void ext_dmem_read(u16 addr); | 
					
						
							| 
									
										
										
										
											2010-04-19 13:02:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Ext command helpers
 | 
					
						
							|  |  |  | 	void pushExtValueFromReg(u16 dreg, u16 sreg); | 
					
						
							|  |  |  | 	void popExtValueToReg(); | 
					
						
							| 
									
										
										
										
											2010-04-19 13:29:05 +00:00
										 |  |  | 	void pushExtValueFromMem(u16 dreg, u16 sreg); | 
					
						
							| 
									
										
										
										
											2010-04-18 18:39:54 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 	// Ext commands
 | 
					
						
							|  |  |  | 	void l(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ln(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ls(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsnm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sl(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sln(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void slm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void slnm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void s(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ld(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ldn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ldm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ldnm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mv(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void dr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ir(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void nr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void nop(const UDSPInstruction opc) {} | 
					
						
							| 
									
										
										
										
											2010-04-11 18:06:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Commands
 | 
					
						
							|  |  |  | 	void dar(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void iar(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void subarn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void addarn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sbclr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sbset(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void srbith(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | };									   | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // _DSPEMITTER_H
 | 
					
						
							|  |  |  | 
 |