Add some painfully untested FPU instructions.
This commit is contained in:
		
							parent
							
								
									1d6ecddcf4
								
							
						
					
					
						commit
						f8e71d888b
					
				
					 4 changed files with 157 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -156,3 +156,97 @@
 | 
			
		|||
000000<RS-><RT-><RD->00000100110 "xor" RD=gpr ',' RS=gpr ',' RT=gpr
 | 
			
		||||
001110<RS-><RT-><IMM-----------> "xori" RT=gpr ',' RS=gpr ',' IMM=e16
 | 
			
		||||
 | 
			
		||||
# FPU instructions.
 | 
			
		||||
 | 
			
		||||
010001<F-->00000<FS-><FD->000101 "abs." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F--><FT-><FS-><FD->000000 "add." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010011<RS-><FT-><FS-><FD->011110 "alnv.ps" FD=fpr ',' FS=fpr ',' FT=fpr ',' RS=gpr
 | 
			
		||||
010001<F--><FT-><FS-><C>0011<CO> "c." CO=FCOND '.' F=FMT FS=fpr ',' FT=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001010 "ceil.l." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001110 "ceil.w." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
01000100010<RT-><FS->00000000000 "cfc1" RT=gpr ',' FS=fpr
 | 
			
		||||
01000100110<RT-><FS->00000000000 "ctc1" RT=gpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->100001 "cvt.d." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->100101 "cvt.l." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
01000110000<FT-><FS-><FD->100110 "cvt.ps.s" FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->100000 "cvt.s." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
0100011011000000<FS-><FD->101000 "cvt.s.pl" FS=fpr ',' FD=fpr
 | 
			
		||||
0100011011000000<FS-><FD->100000 "cvt.s.pu" FS=fpr ',' FD=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->100100 "cvt.w." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F--><FT-><FS-><FD->000011 "div." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001011 "floor.l." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001111 "floor.w." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
110101<RS-><FT-><IMM-----------> "ldc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
010011<RS-><RT->00000<FD->000001 "ldxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
010011<RS-><RT->00000<FD->000101 "luxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
110001<RS-><FT-><IMM-----------> "lwc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
010011<RS-><RT->00000<FD->000000 "lwxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
010011<FR-><FT-><FS-><FD->100<F> "madd." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000100000<RT-><FS->00000000000 "mfc1" RT=gpr ',' FS=fpr
 | 
			
		||||
01000100011<RT-><FS->00000000000 "mfhc1" RT=gpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->000110 "mov." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
000000<RS-><C>00<RD->00000000001 "movf" RD=gpr ',' RS=gpr ',' C=FCOND
 | 
			
		||||
010001<F--><C>00<FS-><FD->010001 "movf." F=FMT FD=fpr ',' FS=fpr ',' C=FCOND
 | 
			
		||||
010001<F--><RT-><FS-><FD->010011 "movn." F=FMT FD=fpr ',' FS=fpr ',' RT=gpr
 | 
			
		||||
000000<RS-><C>01<RD->00000000001 "movt" RD=gpr ',' RS=gpr ',' C=FCOND
 | 
			
		||||
010001<F--><C>01<FS-><FD->010001 "movt." F=FMT FD=fpr ',' FS=fpr ',' C=FCOND
 | 
			
		||||
010001<F--><RT-><FS-><FD->010010 "movz." F=FMT FD=fpr ',' FS=fpr ',' RT=gpr
 | 
			
		||||
010011<FR-><FT-><FS-><FD->101<F> "msub." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000100100<RT-><FS->00000000000 "mtc1" RT=gpr ',' FS=fpr
 | 
			
		||||
01000100111<RT-><FS->00000000000 "mthc1" RT=gpr ',' FS=fpr
 | 
			
		||||
010001<F--><FT-><FS-><FD->000010 "mul." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->000111 "neg." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010011<FR-><FT-><FS-><FD->110<F> "nmadd." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010011<FR-><FT-><FS-><FD->111<F> "nmsub." F=FMT3 FD=fpr ',' FR=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000110110<FT-><FS-><FD->101100 "pll.ps" FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000110110<FT-><FS-><FD->101101 "plu.ps" FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000110110<FT-><FS-><FD->101110 "pul.ps" FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
01000110110<FT-><FS-><FD->101111 "puu.ps" FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->010101 "recip." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001000 "round.l." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->001100 "round.w." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F-->00000<FS-><FD->010110 "rsqrt." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
111101<RS-><FT-><IMM-----------> "sdc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
010011<RS-><RT->00000<FD->001001 "sdxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
010001<F-->00000<FS-><FD->000100 "sqrt." F=FMT FD=fpr ',' FS=fpr
 | 
			
		||||
010001<F--><FT-><FS-><FD->000001 "sub." F=FMT FD=fpr ',' FS=fpr ',' FT=fpr
 | 
			
		||||
010011<RS-><RT->00000<FD->001101 "suxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
111001<RS-><FT-><IMM-----------> "swc1" FT=fpr ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
010011<RS-><RT->00000<FD->001000 "swxc1" FD=fpr ',' RT=gpr '(' RS=gpr ')'
 | 
			
		||||
 | 
			
		||||
# Generic coprocessor instructions.
 | 
			
		||||
 | 
			
		||||
01000101000<C>00<OFF-----------> "bc1f" C=u3 ',' OFF=offset16
 | 
			
		||||
0100010100000000<OFF-----------> "bc1f" OFF=offset16
 | 
			
		||||
01000101000<C>10<OFF-----------> "bc1fl" C=u3 ',' OFF=offset16
 | 
			
		||||
0100010100000010<OFF-----------> "bc1fl" OFF=offset16
 | 
			
		||||
01000101000<C>01<OFF-----------> "bc1t" C=u3 ',' OFF=offset16
 | 
			
		||||
0100010100000001<OFF-----------> "bc1t" OFF=offset16
 | 
			
		||||
01000101000<C>11<OFF-----------> "bc1tl" C=u3 ',' OFF=offset16
 | 
			
		||||
0100010100000011<OFF-----------> "bc1tl" OFF=offset16
 | 
			
		||||
01001001000<C>00<OFF-----------> "bc2f" C=u3 ',' OFF=offset16
 | 
			
		||||
0100100100000000<OFF-----------> "bc2f" OFF=offset16
 | 
			
		||||
01001001000<C>10<OFF-----------> "bc2fl" C=u3 ',' OFF=offset16
 | 
			
		||||
0100100100000010<OFF-----------> "bc2fl" OFF=offset16
 | 
			
		||||
01001001000<C>01<OFF-----------> "bc2t" C=u3 ',' OFF=offset16
 | 
			
		||||
0100100100000001<OFF-----------> "bc2t" OFF=offset16
 | 
			
		||||
01001001000<C>11<OFF-----------> "bc2tl" C=u3 ',' OFF=offset16
 | 
			
		||||
0100100100000011<OFF-----------> "bc2tl" OFF=offset16
 | 
			
		||||
01001000010<RT-><IMM-----------> "cfc2" RT=gpr ',' IMM=u16
 | 
			
		||||
01001000110<RT-><IMM-----------> "ctc2" RT=gpr ',' IMM=u16
 | 
			
		||||
0100101<FUN--------------------> "cop2" FUN=u25
 | 
			
		||||
110110<RS-><RT-><IMM-----------> "ldc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
110010<RS-><RT-><IMM-----------> "lwc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
01000000000<RT-><RD->00000000<S> "mfc0" RT=gpr ',' RD=u5 ',' S=u3
 | 
			
		||||
01001000000<RT-><IMM-----------> "mfc2" RT=gpr ',' IMM=u16
 | 
			
		||||
01000000010<RT-><RD->00000000<S> "mfhc0" RT=gpr ',' RD=u5 ',' S=u3
 | 
			
		||||
01001000011<RT-><IMM-----------> "mfhc2" RT=gpr ',' IMM=u16
 | 
			
		||||
01000000100<RT-><RD->00000000<S> "mtc0" RT=gpr ',' RD=u5 ',' S=u3
 | 
			
		||||
01001000100<RT-><IMM-----------> "mtc2" RT=gpr ',' IMM=u16
 | 
			
		||||
01000000110<RT-><RD->00000000<S> "mthc0" RT=gpr ',' RD=u5 ',' S=u3
 | 
			
		||||
01001000111<RT-><IMM-----------> "mthc2" RT=gpr ',' IMM=u16
 | 
			
		||||
111110<RS-><RT-><IMM-----------> "sdc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
111010<RS-><RT-><IMM-----------> "swc2" RT=u5 ',' IMM=e16 '(' RS=gpr ')'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,12 @@
 | 
			
		|||
%token <y_word> GPR
 | 
			
		||||
%token <y_word> FPR
 | 
			
		||||
%token <y_word> FMT
 | 
			
		||||
%token <y_word> FMT3
 | 
			
		||||
%token <y_word> FCOND
 | 
			
		||||
 | 
			
		||||
%type <y_word> gpr
 | 
			
		||||
%type <y_word> gpr fpr
 | 
			
		||||
%type <y_word> e16 e9
 | 
			
		||||
%type <y_word> u20 u5
 | 
			
		||||
%type <y_word> u25 u20 u16 u5 u3
 | 
			
		||||
%type <y_word> abs26 offset16
 | 
			
		||||
 | 
			
		||||
%type <y_word> extmsblsb insmsblsb
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,6 +74,36 @@
 | 
			
		|||
0,     FPR,        30,         "f30",
 | 
			
		||||
0,     FPR,        31,         "f31",
 | 
			
		||||
 | 
			
		||||
/* Floating-point comparison values */
 | 
			
		||||
 | 
			
		||||
0,     FCOND,      0,          "f",
 | 
			
		||||
0,     FCOND,      1,          "un",
 | 
			
		||||
0,     FCOND,      2,          "eq",
 | 
			
		||||
0,     FCOND,      3,          "ueq",
 | 
			
		||||
0,     FCOND,      4,          "olt",
 | 
			
		||||
0,     FCOND,      5,          "ult",
 | 
			
		||||
0,     FCOND,      6,          "ole",
 | 
			
		||||
0,     FCOND,      7,          "ule",
 | 
			
		||||
0,     FCOND,      8,          "sf",
 | 
			
		||||
0,     FCOND,      9,          "ngle",
 | 
			
		||||
0,     FCOND,      10,         "seq",
 | 
			
		||||
0,     FCOND,      11,         "ngl",
 | 
			
		||||
0,     FCOND,      12,         "lt",
 | 
			
		||||
0,     FCOND,      13,         "nge",
 | 
			
		||||
0,     FCOND,      14,         "le",
 | 
			
		||||
0,     FCOND,      15,         "ngt",
 | 
			
		||||
 | 
			
		||||
0,     FMT,        16,         "s",
 | 
			
		||||
0,     FMT,        17,         "d",
 | 
			
		||||
0,     FMT,        20,         "w",
 | 
			
		||||
0,     FMT,        21,         "l",
 | 
			
		||||
0,     FMT,        22,         "ps",
 | 
			
		||||
 | 
			
		||||
0,     FMT3,       0,          "s",
 | 
			
		||||
0,     FMT3,       1,          "d",
 | 
			
		||||
0,     FMT3,       4,          "w",
 | 
			
		||||
0,     FMT3,       5,          "l",
 | 
			
		||||
0,     FMT3,       6,          "ps",
 | 
			
		||||
 | 
			
		||||
#include "tokens.y"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#include "rules.y"
 | 
			
		||||
 | 
			
		||||
gpr: GPR
 | 
			
		||||
fpr: FPR
 | 
			
		||||
 | 
			
		||||
e16
 | 
			
		||||
	: absexp
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +23,15 @@ e9
 | 
			
		|||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
u25
 | 
			
		||||
	: absexp
 | 
			
		||||
	{
 | 
			
		||||
		if (($1 < 0) || ($1 > 0x1ffffff))
 | 
			
		||||
			serror("25-bit unsigned value out of range");
 | 
			
		||||
		$$ = $1;
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
u20
 | 
			
		||||
	: absexp
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +41,14 @@ u20
 | 
			
		|||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
u16
 | 
			
		||||
	: absexp
 | 
			
		||||
	{
 | 
			
		||||
		if (($1 < 0) || ($1 > 0xffff))
 | 
			
		||||
			serror("16-bit unsigned value out of range");
 | 
			
		||||
		$$ = $1;
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
u5
 | 
			
		||||
	: absexp
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +59,15 @@ u5
 | 
			
		|||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
u3
 | 
			
		||||
	: absexp
 | 
			
		||||
	{
 | 
			
		||||
		if (($1 < 0) || ($1 > 0x7))
 | 
			
		||||
			serror("3-bit unsigned value out of range");
 | 
			
		||||
		$$ = $1;
 | 
			
		||||
	}
 | 
			
		||||
	;
 | 
			
		||||
 | 
			
		||||
offset16
 | 
			
		||||
	: expr
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue