| 
									
										
										
										
											2010-03-29 09:26:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Defines.h"
 | 
					
						
							|  |  |  | #include "Instructions.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum Modify | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	MOD_CR0 = (1 << 0), | 
					
						
							|  |  |  | 	MOD_CR1 = (1 << 1), | 
					
						
							|  |  |  | 	MOD_SR = (1 << 2), | 
					
						
							|  |  |  | 	MOD_XER = (1 << 3), | 
					
						
							|  |  |  | 	MOD_FPSCR = (1 << 4) | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | enum IOput | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	IO_ARG1 = (1 << 0), | 
					
						
							|  |  |  | 	IO_ARG2 = (1 << 1), | 
					
						
							|  |  |  | 	IO_ARG3 = (1 << 2), | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | enum inst_type | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	TYPE_INTEGER, | 
					
						
							|  |  |  | 	TYPE_FLOAT | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct inst | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char name[16]; | 
					
						
							|  |  |  | 	u32 Modifies; // Flag modification
 | 
					
						
							|  |  |  | 	u8 numInput; | 
					
						
							|  |  |  | 	u32 Input; | 
					
						
							|  |  |  | 	u32 Ouput; | 
					
						
							|  |  |  | 	inst_type type; | 
					
						
							|  |  |  | 	void (*Call)(u32*, u32*, u32*, u32*); | 
					
						
							|  |  |  | 	void (*CallFP)(float*, float*, float*, float*); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inst instructions[] = { | 
					
						
							| 
									
										
										
										
											2010-04-01 05:10:39 +00:00
										 |  |  | 	{ "add", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, add}, | 
					
						
							|  |  |  | 	{ "add.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, add}, | 
					
						
							| 
									
										
										
										
											2010-03-29 09:26:19 +00:00
										 |  |  | 	{ "subfc", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfc}, | 
					
						
							|  |  |  | 	{ "subfc.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfcRC}, | 
					
						
							|  |  |  | 	{ "divw", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1, TYPE_INTEGER, divw}, | 
					
						
							|  |  |  | 	{ "divw.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, divwRC}, | 
					
						
							|  |  |  | 	{ "divwo", MOD_XER, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, divwo}, | 
					
						
							|  |  |  | 	{ "divwo.", MOD_CR0 | MOD_XER, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1, TYPE_INTEGER, divwoRC}, | 
					
						
							|  |  |  | 	//{ "fsqrt", MOD_FPSCR, 2, IO_ARG1 | IO_ARG2, IO_ARG1,TYPE_FLOAT, NULL, fsqrt},
 | 
					
						
							|  |  |  | 	//{ "fsqrt.", MOD_CR1 | MOD_FPSCR, 2, IO_ARG1 | IO_ARG2, IO_ARG1,TYPE_FLOAT, NULL, fsqrtRC}
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-02 20:35:12 +00:00
										 |  |  | void RunInstruction(u32 inst); |