| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 21:43:57 +00:00
										 |  |  | typedef u32 (*CompiledCode)(); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-15 05:29:10 +00:00
										 |  |  | class DSPEmitter : public Gen::XCodeBlock, NonCopyable | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	DSPEmitter(); | 
					
						
							|  |  |  | 	~DSPEmitter(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const u8 *m_compiledCode; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | 	void EmitInstruction(UDSPInstruction inst); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 	void unknown_instruction(UDSPInstruction inst); | 
					
						
							|  |  |  | 	void ClearIRAM(); | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void CompileDispatcher(); | 
					
						
							| 
									
										
										
										
											2010-11-28 13:06:52 +00:00
										 |  |  | 	const u8 *CompileStub(); | 
					
						
							| 
									
										
										
										
											2010-11-28 05:28:21 +00:00
										 |  |  | 	void Compile(int start_addr); | 
					
						
							| 
									
										
										
										
											2010-12-15 22:13:31 +00:00
										 |  |  | 	void ClearCallFlag(); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-16 23:27:38 +00:00
										 |  |  | 	void Default(UDSPInstruction inst); | 
					
						
							| 
									
										
										
										
											2010-12-15 01:42:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-29 21:34:34 +00:00
										 |  |  | 	int STACKALIGN RunForCycles(int cycles); | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	// CC Util
 | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void Update_SR_Register64(Gen::X64Reg val = Gen::EAX); | 
					
						
							|  |  |  | 	void Update_SR_Register64_Carry(Gen::X64Reg val = Gen::EAX); | 
					
						
							|  |  |  | 	void Update_SR_Register64_Carry2(Gen::X64Reg val = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void Update_SR_Register16(Gen::X64Reg val = Gen::EAX); | 
					
						
							|  |  |  | 	void Update_SR_Register16_OverS32(Gen::X64Reg val = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-10-09 21:43:57 +00:00
										 |  |  | 	void checkExceptions(u32 retval); | 
					
						
							| 
									
										
										
										
											2010-04-16 10:50:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2010-12-17 03:34:50 +00:00
										 |  |  | 	void imem_read(); | 
					
						
							| 
									
										
										
										
											2010-12-16 23:27:38 +00:00
										 |  |  | 	void dmem_read(); | 
					
						
							|  |  |  | 	void dmem_read_imm(u16 addr); | 
					
						
							| 
									
										
										
										
											2010-12-17 03:34:50 +00:00
										 |  |  | 	void dmem_write(); | 
					
						
							|  |  |  | 	void dmem_write_imm(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-11-07 23:43:26 +00:00
										 |  |  | 	void pushExtValueFromMem2(u16 dreg, u16 sreg); | 
					
						
							| 
									
										
										
										
											2010-10-31 23:26:18 +00:00
										 |  |  | 	void zeroWriteBackLog(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-11-07 23:43:26 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-27 23:40:09 +00:00
										 |  |  | 	// Command helpers
 | 
					
						
							|  |  |  | 	void dsp_reg_stack_push(int stack_reg); | 
					
						
							|  |  |  | 	void dsp_reg_stack_pop(int stack_reg); | 
					
						
							| 
									
										
										
										
											2010-12-26 12:34:38 +00:00
										 |  |  | 	void dsp_reg_store_stack(int stack_reg, Gen::X64Reg host_sreg = Gen::EDX); | 
					
						
							|  |  |  | 	void dsp_reg_load_stack(int stack_reg, Gen::X64Reg host_dreg = Gen::EDX); | 
					
						
							| 
									
										
										
										
											2010-11-27 23:40:09 +00:00
										 |  |  | 	void dsp_reg_store_stack_imm(int stack_reg, u16 val); | 
					
						
							|  |  |  | 	void dsp_op_write_reg(int reg, Gen::X64Reg host_sreg); | 
					
						
							|  |  |  | 	void dsp_op_write_reg_imm(int reg, u16 val); | 
					
						
							|  |  |  | 	void dsp_conditional_extend_accum(int reg); | 
					
						
							|  |  |  | 	void dsp_conditional_extend_accum_imm(int reg, u16 val); | 
					
						
							|  |  |  | 	void dsp_op_read_reg(int reg, Gen::X64Reg host_dreg); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-12-15 01:42:32 +00:00
										 |  |  | 	void lri(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-11-27 23:40:09 +00:00
										 |  |  | 	void lris(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mrr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void nx(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	// Branch
 | 
					
						
							| 
									
										
										
										
											2010-12-26 12:34:38 +00:00
										 |  |  | 	void HandleLoop(); | 
					
						
							| 
									
										
										
										
											2010-12-15 01:42:32 +00:00
										 |  |  | 	void jcc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void jmprcc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void call(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void callr(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-26 12:34:38 +00:00
										 |  |  | 	void loop(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void loopi(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void bloop(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void bloopi(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-15 01:42:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-16 23:27:38 +00:00
										 |  |  | 	// Load/Store
 | 
					
						
							|  |  |  | 	void srs(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lrs(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void si(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-17 03:34:50 +00:00
										 |  |  | 	void lrr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lrrd(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lrri(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void srr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void srrd(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void srri(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ilrr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ilrrd(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ilrri(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-16 23:27:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-09 11:52:31 +00:00
										 |  |  | 	// Arithmetic
 | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void clr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void clrl(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void andcf(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void andf(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void tst(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void tstaxh(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void cmp(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void cmpar(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void cmpi(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void cmpis(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void xorr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void andr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void orr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void andc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void orc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void xorc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void notc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void xori(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void andi(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void ori(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-09 11:52:31 +00:00
										 |  |  | 	void addr(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void addax(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void add(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void addp(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void addaxl(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void addi(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void addis(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void incm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void inc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void subr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void subax(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void sub(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void subp(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void decm(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void dec(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void neg(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void abs(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void movr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void movax(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mov(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-09 11:52:31 +00:00
										 |  |  | 	void lsl16(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void lsr16(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void asr16(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-09 11:52:31 +00:00
										 |  |  | 	void lsl(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void lsr(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void asl(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void asr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsrn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void asrn(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsrnrx(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void asrnrx(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void lsrnr(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void asrnr(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-09 11:52:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	// Multipliers
 | 
					
						
							|  |  |  | 	void multiply(); | 
					
						
							| 
									
										
										
										
											2010-12-04 23:20:31 +00:00
										 |  |  | 	void multiply_add(); | 
					
						
							|  |  |  | 	void multiply_sub(); | 
					
						
							| 
									
										
										
										
											2010-12-26 03:12:29 +00:00
										 |  |  | 	void multiply_mulx(u8 axh0, u8 axh1); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	void clrp(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void tstprod(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void movp(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void movnp(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void movpz(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-26 03:12:29 +00:00
										 |  |  | 	void addpaxz(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	void mulaxh(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mul(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-04 23:20:31 +00:00
										 |  |  | 	void mulac(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	void mulmv(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulmvz(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-26 03:12:29 +00:00
										 |  |  | 	void mulx(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulxac(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulxmv(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulxmvz(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	void mulc(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-04 23:20:31 +00:00
										 |  |  | 	void mulcac(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulcmv(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void mulcmvz(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void maddx(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void msubx(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-04 23:20:31 +00:00
										 |  |  | 	void maddc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void msubc(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void madd(const UDSPInstruction opc); | 
					
						
							|  |  |  | 	void msub(const UDSPInstruction opc); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-28 05:28:21 +00:00
										 |  |  | 	// CALL this to start the dispatcher
 | 
					
						
							|  |  |  | 	const u8 *enterDispatcher; | 
					
						
							| 
									
										
										
										
											2010-12-15 01:42:32 +00:00
										 |  |  | 	u16 compilePC; | 
					
						
							| 
									
										
										
										
											2010-12-15 07:08:36 +00:00
										 |  |  | 	CompiledCode *blockLinks; | 
					
						
							| 
									
										
										
										
											2010-11-28 05:28:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 	CompiledCode *blocks; | 
					
						
							| 
									
										
										
										
											2010-12-15 07:08:36 +00:00
										 |  |  | 	const u8 *blockLinkEntry; | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | 	u16 *blockSize; | 
					
						
							|  |  |  | 	u16 compileSR; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// The index of the last stored ext value (compile time).
 | 
					
						
							|  |  |  | 	int storeIndex; | 
					
						
							| 
									
										
										
										
											2010-11-07 23:43:26 +00:00
										 |  |  | 	int storeIndex2; | 
					
						
							| 
									
										
										
										
											2010-05-29 18:22:50 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-05-29 21:34:34 +00:00
										 |  |  | 	// Counts down.
 | 
					
						
							|  |  |  | 	// int cycles;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void Update_SR_Register(Gen::X64Reg val = Gen::EAX); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-27 15:05:18 +00:00
										 |  |  | 	void ToMask(Gen::X64Reg value_reg = Gen::EDI); | 
					
						
							| 
									
										
										
										
											2010-06-30 16:17:20 +00:00
										 |  |  | 	void dsp_increment_one(Gen::X64Reg ar = Gen::EAX, Gen::X64Reg wr = Gen::EDX, Gen::X64Reg wr_pow = Gen::EDI, Gen::X64Reg temp_reg = Gen::ESI); | 
					
						
							|  |  |  | 	void dsp_decrement_one(Gen::X64Reg ar = Gen::EAX, Gen::X64Reg wr = Gen::EDX, Gen::X64Reg wr_pow = Gen::EDI, Gen::X64Reg temp_reg = Gen::ESI); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void get_long_prod(Gen::X64Reg long_prod = Gen::RAX); | 
					
						
							|  |  |  | 	void get_long_prod_round_prodl(Gen::X64Reg long_prod = Gen::RAX); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | 	void set_long_prod(); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void round_long_acc(Gen::X64Reg long_acc = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void set_long_acc(int _reg, Gen::X64Reg acc = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void get_acc_m(int _reg, Gen::X64Reg acc = Gen::EAX); | 
					
						
							|  |  |  | 	void set_acc_m(int _reg); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void get_long_acx(int _reg, Gen::X64Reg acx = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-23 15:27:49 +00:00
										 |  |  | 	void get_ax_l(int _reg, Gen::X64Reg acx = Gen::EAX); | 
					
						
							|  |  |  | 	void get_ax_h(int _reg, Gen::X64Reg acc = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-21 14:48:05 +00:00
										 |  |  | 	void get_long_acc(int _reg, Gen::X64Reg acc = Gen::EAX); | 
					
						
							| 
									
										
										
										
											2010-12-03 13:59:14 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-04-07 15:04:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // _DSPEMITTER_H
 | 
					
						
							|  |  |  | 
 |