decoder.isa revision 2041
17170Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////
210339Smitch.hayenga@arm.com//
37170Sgblack@eecs.umich.edu// The actual MIPS32 ISA decoder 
47170Sgblack@eecs.umich.edu// -----------------------------
57170Sgblack@eecs.umich.edu// The following instructions are specified in the MIPS32 ISA
67170Sgblack@eecs.umich.edu// Specification. Decoding closely follows the style specified 
77170Sgblack@eecs.umich.edu// in the MIPS32 ISAthe specification document starting with Table
87170Sgblack@eecs.umich.edu// A-2 (document available @ www.mips.com)
97170Sgblack@eecs.umich.edu//
107170Sgblack@eecs.umich.edu//@todo: Distinguish "unknown/future" use insts from "reserved"
117170Sgblack@eecs.umich.edu// ones
127170Sgblack@eecs.umich.edudecode OPCODE_HI default FailUnimpl::unknown() {
137170Sgblack@eecs.umich.edu    
147170Sgblack@eecs.umich.edu    // Derived From ... Table A-2 MIPS32 ISA Manual
157170Sgblack@eecs.umich.edu    0x0: decode OPCODE_LO default FailUnimpl::reserved(){
167170Sgblack@eecs.umich.edu	
177170Sgblack@eecs.umich.edu	0x0: decode FUNCTION_HI {
187170Sgblack@eecs.umich.edu	    0x0: decode FUNCTION_LO {
197170Sgblack@eecs.umich.edu	      0x1: decode MOVCI {
207170Sgblack@eecs.umich.edu		format Move {
217170Sgblack@eecs.umich.edu		  0: movf({{ if( FPConditionCode(CC) == 0) Rd = Rs}});
227170Sgblack@eecs.umich.edu		  1: movt({{ if( FPConditionCode(CC) == 1) Rd = Rs}});
237170Sgblack@eecs.umich.edu		}  
247170Sgblack@eecs.umich.edu	      }
257170Sgblack@eecs.umich.edu
267170Sgblack@eecs.umich.edu	      format BasicOp {
277170Sgblack@eecs.umich.edu
287170Sgblack@eecs.umich.edu		//Table A-3 Note: "1. Specific encodings of the rt, rd, and sa fields 
297170Sgblack@eecs.umich.edu		//are used to distinguish among the SLL, NOP, SSNOP and EHB functions."
307170Sgblack@eecs.umich.edu
317170Sgblack@eecs.umich.edu		0x0: sll({{ Rd = Rt.uw << SA; }});
327170Sgblack@eecs.umich.edu		
337170Sgblack@eecs.umich.edu		0x2: decode SRL {
347170Sgblack@eecs.umich.edu		   0: srl({{ Rd = Rt.uw >> SA; }});
357170Sgblack@eecs.umich.edu
367170Sgblack@eecs.umich.edu		   //Hardcoded assuming 32-bit ISA, probably need parameter here
377170Sgblack@eecs.umich.edu		   1: rotr({{ Rd = (Rt.uw << (32 - SA)) | (Rt.uw >> SA);}});
387170Sgblack@eecs.umich.edu		 }	
397170Sgblack@eecs.umich.edu	
407170Sgblack@eecs.umich.edu		 0x3: sra({{ Rd = Rt.sw >> SA; }});
417170Sgblack@eecs.umich.edu		
427170Sgblack@eecs.umich.edu		 0x4: sllv({{ Rd = Rt.uw << Rs<4:0>; }});
438229Snate@binkert.org
448229Snate@binkert.org		 0x6: decode SRLV {
457170Sgblack@eecs.umich.edu		   0: srlv({{ Rd = Rt.uw >> Rs<4:0>; }});
4610037SARM gem5 Developers
478961Sgblack@eecs.umich.edu		   //Hardcoded assuming 32-bit ISA, probably need parameter here
4810037SARM gem5 Developers		   1: rotrv({{ Rd = (Rt.uw << (32 - Rs<4:0>)) | (Rt.uw >> Rs<4:0>);}});
497170Sgblack@eecs.umich.edu		 }
507853SMatt.Horsnell@ARM.com
517170Sgblack@eecs.umich.edu		 0x7: srav({{ Rd = Rt.sw >> Rs<4:0>; }});
527170Sgblack@eecs.umich.edu	      }
537170Sgblack@eecs.umich.edu	    }
547170Sgblack@eecs.umich.edu
557170Sgblack@eecs.umich.edu	    0x1: decode FUNCTION_LO {
567170Sgblack@eecs.umich.edu	     
577170Sgblack@eecs.umich.edu	      //Table A-3 Note: "Specific encodings of the hint field are used 
587170Sgblack@eecs.umich.edu	      //to distinguish JR from JR.HB and JALR from JALR.HB"
597170Sgblack@eecs.umich.edu	      format Jump {
607170Sgblack@eecs.umich.edu		0x0: jr(IsReturn);
617170Sgblack@eecs.umich.edu		0x1: jalr(IsCall,IsReturn);
627170Sgblack@eecs.umich.edu	      }
637170Sgblack@eecs.umich.edu
6410346Smitch.hayenga@arm.com	      format Move {
658148SAli.Saidi@ARM.com		0x2: movz({{ if (Rt == 0) Rd = Rs; }});
6610346Smitch.hayenga@arm.com		0x3: movn({{ if (Rt != 0) Rd = Rs; }});
6710346Smitch.hayenga@arm.com	      }
6810346Smitch.hayenga@arm.com
6910346Smitch.hayenga@arm.com	      format Trap {
7010346Smitch.hayenga@arm.com	      	0x4: Syscall::syscall({{ xc->syscall()}},IsNonSpeculative);
7110346Smitch.hayenga@arm.com	      	0x5: Break::break({{ }});
7210346Smitch.hayenga@arm.com	      	0x7: Synchronize::sync({{ }});
7310346Smitch.hayenga@arm.com	      }
748148SAli.Saidi@ARM.com	    }
7510346Smitch.hayenga@arm.com
7610346Smitch.hayenga@arm.com	    0x2: decode FUNCTION_LO {
7710346Smitch.hayenga@arm.com	      format IntOp {
7810346Smitch.hayenga@arm.com		0x0: mfhi({{ }});
7910346Smitch.hayenga@arm.com		0x1: mthi({{ }});
8010346Smitch.hayenga@arm.com		0x2: mflo({{ }});
8110346Smitch.hayenga@arm.com		0x3: mtlo({{ }});
8210346Smitch.hayenga@arm.com	      }
8310346Smitch.hayenga@arm.com	    };
848148SAli.Saidi@ARM.com
857170Sgblack@eecs.umich.edu	    0x3: decode FUNCTION_LO {
8610346Smitch.hayenga@arm.com	      format IntOp {
877170Sgblack@eecs.umich.edu		0x0: mult({{ Rd.sw = Rs.sw * Rt.sw; }});
887170Sgblack@eecs.umich.edu		0x1: multu({{ Rd.sw = Rs.uw * Rt.uw;}});
897170Sgblack@eecs.umich.edu		0x2: div({{ Rd.sw = Rs.sw / Rt.sw;}});
907170Sgblack@eecs.umich.edu		0x3: divu({{ Rd.sw = Rs.sw / Rt.uw;}});
917170Sgblack@eecs.umich.edu	      }
927170Sgblack@eecs.umich.edu	    };
937170Sgblack@eecs.umich.edu
947170Sgblack@eecs.umich.edu	    0x4: decode FUNCTION_LO {
957190Sgblack@eecs.umich.edu	      format IntOp {
967190Sgblack@eecs.umich.edu		0x0: add({{  Rd.sw = Rs.sw + Rt.sw;}});
977170Sgblack@eecs.umich.edu		0x1: addu({{ Rd.uw = Rs.uw + Rt.uw;}});
987170Sgblack@eecs.umich.edu		0x2: sub({{ Rd.sw = Rs.sw - Rt.sw;}});
9910346Smitch.hayenga@arm.com		0x3: subu({{ Rd.uw = Rs.uw - Rt.uw;}});	      
10010346Smitch.hayenga@arm.com		0x4: and({{ Rd.sw = Rs.uw & Rt.uw;}});
1017190Sgblack@eecs.umich.edu		0x5: or({{ Rd.sw = Rs.uw | Rt.uw;}});
1027170Sgblack@eecs.umich.edu		0x6: xor({{ Rd.sw = Rs.uw ^ Rt.uw;}});
10310346Smitch.hayenga@arm.com		0x7: nor({{ Rd.sw = ~(Rs.uw | Rt.uw);}});
10410346Smitch.hayenga@arm.com	      }
10510346Smitch.hayenga@arm.com	    }
10610346Smitch.hayenga@arm.com
10710346Smitch.hayenga@arm.com	    0x5: decode FUNCTION_LO {
10810346Smitch.hayenga@arm.com	      format IntOp{
10910346Smitch.hayenga@arm.com		0x2: slt({{  Rd.sw = ( Rs.sw < Rt.sw ) ? 1 : 0}});
11010346Smitch.hayenga@arm.com		0x3: sltu({{ Rd.uw = ( Rs.uw < Rt.uw ) ? 1 : 0}});
1117170Sgblack@eecs.umich.edu	      }
11210346Smitch.hayenga@arm.com	    };
11310346Smitch.hayenga@arm.com
11410346Smitch.hayenga@arm.com	    0x6: decode FUNCTION_LO {
11510346Smitch.hayenga@arm.com	      format Trap {
1167170Sgblack@eecs.umich.edu		 0x0: tge({{ }});
11710346Smitch.hayenga@arm.com		 0x1: tgeu({{ }});
11810346Smitch.hayenga@arm.com		 0x2: tlt({{ }});
11910346Smitch.hayenga@arm.com		 0x3: tltu({{ }});
12010346Smitch.hayenga@arm.com		 0x4: teq({{ }});
1217170Sgblack@eecs.umich.edu		 0x6: tne({{ }});
12210346Smitch.hayenga@arm.com	      }
12310346Smitch.hayenga@arm.com	    }
12410346Smitch.hayenga@arm.com	}
12510346Smitch.hayenga@arm.com
12610346Smitch.hayenga@arm.com	0x1: decode REGIMM_HI {
12710346Smitch.hayenga@arm.com	    0x0: decode REGIMM_LO {
12810346Smitch.hayenga@arm.com	      format Branch {
12910346Smitch.hayenga@arm.com		0x0: bltz({{ }});
13010346Smitch.hayenga@arm.com		0x1: bgez({{ }});
13110346Smitch.hayenga@arm.com
13210346Smitch.hayenga@arm.com		//MIPS obsolete instructions
13310346Smitch.hayenga@arm.com		0x2: bltzl({{ }});
13410346Smitch.hayenga@arm.com		0x3: bgezl({{ }});
13510346Smitch.hayenga@arm.com	      }
13610346Smitch.hayenga@arm.com	    }
13710346Smitch.hayenga@arm.com
13810346Smitch.hayenga@arm.com	    0x1: decode REGIMM_LO {
13910346Smitch.hayenga@arm.com	      format Trap {
14010346Smitch.hayenga@arm.com		 0x0: tgei({{ }});
14110346Smitch.hayenga@arm.com		 0x1: tgeiu({{ }});
14210346Smitch.hayenga@arm.com		 0x2: tlti({{ }});
14310346Smitch.hayenga@arm.com		 0x3: tltiu({{ }});
14410346Smitch.hayenga@arm.com		 0x4: teqi({{ }});
14510346Smitch.hayenga@arm.com		 0x6: tnei({{ }});
14610346Smitch.hayenga@arm.com	      }
14710346Smitch.hayenga@arm.com	    }
14810346Smitch.hayenga@arm.com
14910346Smitch.hayenga@arm.com	    0x2: decode REGIMM_LO {
15010346Smitch.hayenga@arm.com	      format Branch {
15110346Smitch.hayenga@arm.com		0x0: bltzal({{ }});
15210346Smitch.hayenga@arm.com		0x1: bgezal({{ }});
15310346Smitch.hayenga@arm.com
15410346Smitch.hayenga@arm.com		//MIPS obsolete instructions
15510346Smitch.hayenga@arm.com		0x2: bltzall({{ }});
15610346Smitch.hayenga@arm.com		0x3: bgezall({{ }});
15710346Smitch.hayenga@arm.com	      }
15810346Smitch.hayenga@arm.com	    }
15910346Smitch.hayenga@arm.com
16010346Smitch.hayenga@arm.com	    0x3: decode REGIMM_LO {
16110346Smitch.hayenga@arm.com	      format Trap {
16210346Smitch.hayenga@arm.com	      	0x7: synci({{ }});
16310346Smitch.hayenga@arm.com	      }
16410346Smitch.hayenga@arm.com	    }      
16510346Smitch.hayenga@arm.com	}
16610346Smitch.hayenga@arm.com
16710346Smitch.hayenga@arm.com	format Jump {
16810346Smitch.hayenga@arm.com	    0x2: j();
16910346Smitch.hayenga@arm.com	    0x3: jal(IsCall);
17010346Smitch.hayenga@arm.com	}
17110346Smitch.hayenga@arm.com
17210346Smitch.hayenga@arm.com	format Branch {
17310346Smitch.hayenga@arm.com	    0x4: beq({{ }});
1749640Snathanael.premillieu@irisa.fr	    0x5: bne({{ }});
1759640Snathanael.premillieu@irisa.fr	    0x6: blez({{ }});
1769640Snathanael.premillieu@irisa.fr	    0x7: bgtz({{ }});
1779640Snathanael.premillieu@irisa.fr	}
1788148SAli.Saidi@ARM.com    };
17910346Smitch.hayenga@arm.com
18010346Smitch.hayenga@arm.com    0x1: decode OPCODE_LO default FailUnimpl::reserved(){
1817170Sgblack@eecs.umich.edu	format IntOp {
18210346Smitch.hayenga@arm.com	    0x0: addi({{ Rt.sw = Rs.sw + INTIMM; }});
18310346Smitch.hayenga@arm.com	    0x1: addiu({{ Rt.uw = Rs.uw + INTIMM;}});
18410346Smitch.hayenga@arm.com	    0x2: slti({{ Rt.sw = ( Rs.sw < INTIMM ) ? 1 : 0 }});
18510346Smitch.hayenga@arm.com	    0x3: sltiu({{ Rt.uw = ( Rs.uw < INTIMM ) ? 1 : 0 }});
1867170Sgblack@eecs.umich.edu	    0x4: andi({{ Rt.sw = Rs.sw & INTIMM;}});
1877170Sgblack@eecs.umich.edu	    0x5: ori({{ Rt.sw = Rs.sw | INTIMM;}});
18810346Smitch.hayenga@arm.com	    0x6: xori({{ Rt.sw = Rs.sw ^ INTIMM;}});
18910346Smitch.hayenga@arm.com	};
1907170Sgblack@eecs.umich.edu
1917170Sgblack@eecs.umich.edu	format Memory {
1928148SAli.Saidi@ARM.com	    0x7: lui({{ }});
19310346Smitch.hayenga@arm.com	};
1948148SAli.Saidi@ARM.com    };
19510346Smitch.hayenga@arm.com
1968148SAli.Saidi@ARM.com    0x2: decode OPCODE_LO default FailUnimpl::reserved(){
19710346Smitch.hayenga@arm.com
1988148SAli.Saidi@ARM.com      //Table A-11 MIPS32 COP0 Encoding of rs Field
19910346Smitch.hayenga@arm.com      0x0: decode RS_MSB {
20010346Smitch.hayenga@arm.com	0x0: decode RS {
20110346Smitch.hayenga@arm.com	  0x0: mfc0({{ }});
20210346Smitch.hayenga@arm.com	  0xC: mtc0({{ }});
20310346Smitch.hayenga@arm.com	  0xA: rdpgpr({{ }});
20410346Smitch.hayenga@arm.com
20510346Smitch.hayenga@arm.com  	  0xB: decode SC {
20610346Smitch.hayenga@arm.com	    format BasicOp {
20710346Smitch.hayenga@arm.com		0x0: di({{ }});
20810346Smitch.hayenga@arm.com		0x1: ei({{ }}); 	      
2099368Snathanael.premillieu@irisa.fr	    }
2109368Snathanael.premillieu@irisa.fr	  }
2119368Snathanael.premillieu@irisa.fr
2129368Snathanael.premillieu@irisa.fr  	  0xE: wrpgpr({{ }});
2138148SAli.Saidi@ARM.com	}
21410346Smitch.hayenga@arm.com
21510346Smitch.hayenga@arm.com	//Table A-12 MIPS32 COP0 Encoding of Function Field When rs=CO
21610346Smitch.hayenga@arm.com	0x1: decode FUNCTION {
21710346Smitch.hayenga@arm.com	  format Trap {
2188148SAli.Saidi@ARM.com	        0x01: tlbr({{ }});
2197170Sgblack@eecs.umich.edu	        0x02: tlbwi({{ }});
2207190Sgblack@eecs.umich.edu	        0x06: tlbwr({{ }});
22110346Smitch.hayenga@arm.com	        0x08: tlbp({{ }});
2227190Sgblack@eecs.umich.edu	  }
2237343Sgblack@eecs.umich.edu
22410199SAndrew.Bardsley@arm.com	  format BasicOp {
22510199SAndrew.Bardsley@arm.com	        0x18: eret({{ }});
22610199SAndrew.Bardsley@arm.com	        0x1F: deret({{ }});
22710199SAndrew.Bardsley@arm.com	        0x20: wait({{ }});
22810199SAndrew.Bardsley@arm.com          }
22910346Smitch.hayenga@arm.com	}
23010346Smitch.hayenga@arm.com      }
23110199SAndrew.Bardsley@arm.com
23210199SAndrew.Bardsley@arm.com      //Table A-13 MIPS32 COP1 Encoding of rs Field
23310199SAndrew.Bardsley@arm.com      0x1: decode RS_MSB {
23410199SAndrew.Bardsley@arm.com
23510199SAndrew.Bardsley@arm.com	0x0: decode RS_HI {
23610346Smitch.hayenga@arm.com	  0x0: decode RS_LO {
23710346Smitch.hayenga@arm.com	    0x0: mfc1({{ }});
2387343Sgblack@eecs.umich.edu	    0x2: cfc1({{ }});
2397170Sgblack@eecs.umich.edu	    0x3: mfhc1({{ }});
2407170Sgblack@eecs.umich.edu	    0x4: mtc1({{ }});
24110037SARM gem5 Developers	    0x6: ctc1({{ }});
24210037SARM gem5 Developers	    0x7: mftc1({{ }});
24310037SARM gem5 Developers	  }
24410037SARM gem5 Developers
24510037SARM gem5 Developers	  0x1: decode ND {
24610037SARM gem5 Developers	    0x0: decode TF {
24710037SARM gem5 Developers	      format Branch {
24810346Smitch.hayenga@arm.com	      	0x0: bc1f({{ }});
24910037SARM gem5 Developers	      	0x1: bc1t({{ }});
25010346Smitch.hayenga@arm.com	      }
25110346Smitch.hayenga@arm.com	    }
25210346Smitch.hayenga@arm.com
25310346Smitch.hayenga@arm.com	    0x1: decode TF {
25410346Smitch.hayenga@arm.com	      format Branch {
25510346Smitch.hayenga@arm.com		0x0: bc1fl({{ }});
25610346Smitch.hayenga@arm.com	      	0x1: bc1tl({{ }});
25710037SARM gem5 Developers	      }
25810037SARM gem5 Developers	    }
25910037SARM gem5 Developers	  }
26010037SARM gem5 Developers	}
26110037SARM gem5 Developers
26210037SARM gem5 Developers	0x1: decode RS_HI {
26310346Smitch.hayenga@arm.com	  0x2: decode RS_LO {
26410346Smitch.hayenga@arm.com
26510346Smitch.hayenga@arm.com	    //Table A-14 MIPS32 COP1 Encoding of Function Field When rs=S
26610346Smitch.hayenga@arm.com	    //(( single-word ))
26710037SARM gem5 Developers	    0x0: decode RS_HI {
26810037SARM gem5 Developers	      0x0: decode RS_LO {
26910037SARM gem5 Developers		0x0: add_fmt({{ }});
27010037SARM gem5 Developers		0x1: sub_fmt({{ }});
27110346Smitch.hayenga@arm.com		0x2: mul_fmt({{ }});
27210346Smitch.hayenga@arm.com		0x3: div_fmt({{ }});
27310346Smitch.hayenga@arm.com		0x4: sqrt_fmt({{ }});
27410346Smitch.hayenga@arm.com		0x5: abs_fmt({{ }});
27510037SARM gem5 Developers		0x6: mov_fmt({{ }});
27610346Smitch.hayenga@arm.com		0x7: neg_fmt({{ }});
27710346Smitch.hayenga@arm.com	      }
27810346Smitch.hayenga@arm.com
27910346Smitch.hayenga@arm.com	      0x1: decode RS_LO {
28010346Smitch.hayenga@arm.com		//only legal for 64 bit
28110346Smitch.hayenga@arm.com		format mode64 {
28210346Smitch.hayenga@arm.com		  0x0: round_l({{ }});
28310346Smitch.hayenga@arm.com		  0x1: trunc_l({{ }});
28410037SARM gem5 Developers		  0x2: ceil_l({{ }});
28510037SARM gem5 Developers		  0x3: floor_l({{ }});
28610037SARM gem5 Developers		}
28710346Smitch.hayenga@arm.com
28810346Smitch.hayenga@arm.com		0x4: round_w({{ }});
28910037SARM gem5 Developers		0x5: trunc_w({{ }});
29010346Smitch.hayenga@arm.com		0x6: ceil_w({{ }});
29110346Smitch.hayenga@arm.com		0x7: floor_w({{ }});
29210346Smitch.hayenga@arm.com	      }
29310346Smitch.hayenga@arm.com
29410037SARM gem5 Developers	      0x2: decode RS_LO {
29510037SARM gem5 Developers		0x1: decode MOVCF {
29610037SARM gem5 Developers		  0x0: movf_fmt({{ }});
29710346Smitch.hayenga@arm.com		  0x1: movt_fmt({{ }});
29810346Smitch.hayenga@arm.com		}
29910037SARM gem5 Developers
30010346Smitch.hayenga@arm.com		format Move {
30110346Smitch.hayenga@arm.com		  0x2: movz({{ if (Rt == 0) Rd = Rs; }});
30210037SARM gem5 Developers         	  0x3: movn({{ if (Rt != 0) Rd = Rs; }});
30310037SARM gem5 Developers	      	}
30410037SARM gem5 Developers
30510037SARM gem5 Developers		format mode64 {
30610037SARM gem5 Developers		  0x2: recip({{ }});
30710346Smitch.hayenga@arm.com		  0x3: rsqrt{{ }});
30810346Smitch.hayenga@arm.com		}
30910346Smitch.hayenga@arm.com	      }
31010346Smitch.hayenga@arm.com
31110037SARM gem5 Developers	      0x4: decode RS_LO {
31210346Smitch.hayenga@arm.com		0x1: cvt_d({{ }});
31310037SARM gem5 Developers		0x4: cvt_w({{ }});
31410037SARM gem5 Developers
31510037SARM gem5 Developers		//only legal for 64 bit
31610037SARM gem5 Developers		format mode64 {
31710037SARM gem5 Developers		  0x5: cvt_l({{ }});
31810346Smitch.hayenga@arm.com		  0x6: cvt_ps({{ }});
31910346Smitch.hayenga@arm.com		}
32010037SARM gem5 Developers	      }
32110346Smitch.hayenga@arm.com	    }
32210346Smitch.hayenga@arm.com
32310037SARM gem5 Developers	    //Table A-15 MIPS32 COP1 Encoding of Function Field When rs=D
32410037SARM gem5 Developers	    0x1: decode RS_HI {
32510346Smitch.hayenga@arm.com	      0x0: decode RS_LO {
32610346Smitch.hayenga@arm.com		0x0: add_fmt({{ }});
32710037SARM gem5 Developers		0x1: sub_fmt({{ }});
32810037SARM gem5 Developers		0x2: mul_fmt({{ }});
32910037SARM gem5 Developers		0x3: div_fmt({{ }});
33010037SARM gem5 Developers		0x4: sqrt_fmt({{ }});
33110037SARM gem5 Developers		0x5: abs_fmt({{ }});
33210346Smitch.hayenga@arm.com		0x6: mov_fmt({{ }});
33310037SARM gem5 Developers		0x7: neg_fmt({{ }});
33410037SARM gem5 Developers	      }
33510037SARM gem5 Developers
33610346Smitch.hayenga@arm.com	      0x1: decode RS_LO {
33710346Smitch.hayenga@arm.com		//only legal for 64 bit
33810037SARM gem5 Developers		format mode64 {
33910037SARM gem5 Developers		  0x0: round_l({{ }});
34010037SARM gem5 Developers		  0x1: trunc_l({{ }});
34110037SARM gem5 Developers		  0x2: ceil_l({{ }});
34210037SARM gem5 Developers		  0x3: floor_l({{ }});
34310037SARM gem5 Developers		}
34410037SARM gem5 Developers
34510037SARM gem5 Developers		0x4: round_w({{ }});
34610037SARM gem5 Developers		0x5: trunc_w({{ }});
34710037SARM gem5 Developers		0x6: ceil_w({{ }});
34810037SARM gem5 Developers		0x7: floor_w({{ }});
34910037SARM gem5 Developers	      }
35010346Smitch.hayenga@arm.com
35110037SARM gem5 Developers	      0x2: decode RS_LO {
35210037SARM gem5 Developers		0x1: decode MOVCF {
35310346Smitch.hayenga@arm.com		  0x0: movf_fmt({{ }});
35410346Smitch.hayenga@arm.com		  0x1: movt_fmt({{ }});
35510037SARM gem5 Developers		}
35610346Smitch.hayenga@arm.com
35710037SARM gem5 Developers		format Move {
35810346Smitch.hayenga@arm.com		  0x2: movz({{ if (Rt == 0) Rd = Rs; }});
35910346Smitch.hayenga@arm.com         	  0x3: movn({{ if (Rt != 0) Rd = Rs; }});
36010346Smitch.hayenga@arm.com	      	}
36110037SARM gem5 Developers
36210346Smitch.hayenga@arm.com		format mode64 {
36310037SARM gem5 Developers		  0x5: recip({{ }});
36410037SARM gem5 Developers		  0x6: rsqrt{{ }});
36510037SARM gem5 Developers		}
36610037SARM gem5 Developers	      }
36710037SARM gem5 Developers
36810037SARM gem5 Developers	      0x4: decode RS_LO {
36910037SARM gem5 Developers		0x0: cvt_s({{ }});
37010346Smitch.hayenga@arm.com		0x4: cvt_w({{ }});
37110037SARM gem5 Developers
37210037SARM gem5 Developers		//only legal for 64 bit
37310346Smitch.hayenga@arm.com		format mode64 {
37410346Smitch.hayenga@arm.com		  0x5: cvt_l({{ }});
37510037SARM gem5 Developers		}
37610346Smitch.hayenga@arm.com	      }
37710037SARM gem5 Developers	    }
37810346Smitch.hayenga@arm.com
37910346Smitch.hayenga@arm.com	    //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=W
38010037SARM gem5 Developers	    0x4: decode FUNCTION {
38110346Smitch.hayenga@arm.com	      0x10: cvt_s({{ }});
38210346Smitch.hayenga@arm.com	      0x10: cvt_d({{ }});
38310037SARM gem5 Developers	    }
38410346Smitch.hayenga@arm.com
38510346Smitch.hayenga@arm.com	    //Table A-16 MIPS32 COP1 Encoding of Function Field When rs=L1
38610346Smitch.hayenga@arm.com	    //Note: "1. Format type L is legal only if 64-bit floating point operations 
38710346Smitch.hayenga@arm.com	    //are enabled."
38810037SARM gem5 Developers	    0x5: decode FUNCTION_HI {
38910037SARM gem5 Developers	      0x10: cvt_s({{ }});
39010037SARM gem5 Developers	      0x11: cvt_d({{ }});
39110037SARM gem5 Developers	    }
39210037SARM gem5 Developers
39310037SARM gem5 Developers	    //Table A-17 MIPS64 COP1 Encoding of Function Field When rs=PS1
39410037SARM gem5 Developers	    //Note: "1. Format type PS is legal only if 64-bit floating point operations 
39510346Smitch.hayenga@arm.com	    //are enabled. "
39610037SARM gem5 Developers	    0x6: decode RS_HI {
39710037SARM gem5 Developers	      0x0: decode RS_LO {
39810346Smitch.hayenga@arm.com		0x0: add_fmt({{ }});
39910346Smitch.hayenga@arm.com		0x1: sub_fmt({{ }});
40010037SARM gem5 Developers		0x2: mul_fmt({{ }});
40110346Smitch.hayenga@arm.com		0x5: abs_fmt({{ }});
40210037SARM gem5 Developers		0x6: mov_fmt({{ }});
40310346Smitch.hayenga@arm.com		0x7: neg_fmt({{ }});
40410346Smitch.hayenga@arm.com	      }
40510037SARM gem5 Developers
40610346Smitch.hayenga@arm.com	      0x2: decode RS_LO {
40710346Smitch.hayenga@arm.com		0x1: decode MOVCF {
40810037SARM gem5 Developers		  0x0: movf_fmt({{ }});
40910346Smitch.hayenga@arm.com		  0x1: movt_fmt({{ }});
41010346Smitch.hayenga@arm.com		}
41110346Smitch.hayenga@arm.com
41210346Smitch.hayenga@arm.com	      }
41310037SARM gem5 Developers
41410037SARM gem5 Developers	      0x4: decode RS_LO {
41510037SARM gem5 Developers		0x0: cvt_s_pu({{ }});
41610037SARM gem5 Developers	      }
41710037SARM gem5 Developers
41810037SARM gem5 Developers	      0x5: decode RS_LO {
41910037SARM gem5 Developers		0x0: cvt_s_pl({{ }});
42010037SARM gem5 Developers		0x4: pll_s_pl({{ }});
42110346Smitch.hayenga@arm.com		0x5: plu_s_pl({{ }});
42210037SARM gem5 Developers		0x6: pul_s_pl({{ }});
42310037SARM gem5 Developers		0x7: puu_s_pl({{ }});
42410346Smitch.hayenga@arm.com	      }
42510346Smitch.hayenga@arm.com	    }
42610037SARM gem5 Developers      }
42710346Smitch.hayenga@arm.com
42810346Smitch.hayenga@arm.com      //Table A-19 MIPS32 COP2 Encoding of rs Field 
42910037SARM gem5 Developers      0x2: decode RS_MSB {
43010346Smitch.hayenga@arm.com	0x0: decode RS_HI {
43110346Smitch.hayenga@arm.com	  0x0: decode RS_LO {
43210346Smitch.hayenga@arm.com	    0x0: mfc2({{ }});
43310346Smitch.hayenga@arm.com	    0x2: cfc2({{ }});
43410346Smitch.hayenga@arm.com	    0x3: mfhc2({{ }});
43510037SARM gem5 Developers	    0x4: mtc2({{ }});
43610037SARM gem5 Developers	    0x6: ctc2({{ }});
43710346Smitch.hayenga@arm.com	    0x7: mftc2({{ }});
43810037SARM gem5 Developers	  }
43910037SARM gem5 Developers
44010037SARM gem5 Developers	  0x1: decode ND {
44110037SARM gem5 Developers	    0x0: decode TF {
44210037SARM gem5 Developers	      format Branch { 
44310037SARM gem5 Developers	        0x0: bc2f({{ }});
44410037SARM gem5 Developers	        0x1: bc2t({{ }});
44510346Smitch.hayenga@arm.com	      }
44610037SARM gem5 Developers	    }
44710037SARM gem5 Developers
44810346Smitch.hayenga@arm.com	    0x1: decode TF {
44910346Smitch.hayenga@arm.com	      format Branch {
45010037SARM gem5 Developers	      	0x0: bc2fl({{ }});
45110037SARM gem5 Developers	      	0x1: bc2tl({{ }});
4527639Sgblack@eecs.umich.edu	      }
4537639Sgblack@eecs.umich.edu	    }
4547639Sgblack@eecs.umich.edu	  }
4557639Sgblack@eecs.umich.edu	}
4567639Sgblack@eecs.umich.edu      }
4577639Sgblack@eecs.umich.edu
4587639Sgblack@eecs.umich.edu      //Table A-20 MIPS64 COP1X Encoding of Function Field 1
4597639Sgblack@eecs.umich.edu      //Note: "COP1X instructions are legal only if 64-bit floating point 
4607639Sgblack@eecs.umich.edu      //operations are enabled."
4617639Sgblack@eecs.umich.edu      0x3: decode FUNCTION_HI {
4627639Sgblack@eecs.umich.edu	0x0: decode FUNCTION_LO {
4637639Sgblack@eecs.umich.edu	  0x0: lwxc1({{ }});
4647639Sgblack@eecs.umich.edu	  0x1: ldxc1({{ }});
4657639Sgblack@eecs.umich.edu	  0x5: luxc1({{ }});
4667639Sgblack@eecs.umich.edu	}
4677639Sgblack@eecs.umich.edu
46810037SARM gem5 Developers	0x1: decode FUNCTION_LO {
4697639Sgblack@eecs.umich.edu	  0x0: swxc1({{ }});
4707639Sgblack@eecs.umich.edu	  0x1: sdxc1({{ }});
4717639Sgblack@eecs.umich.edu	  0x5: suxc1({{ }});
4727639Sgblack@eecs.umich.edu	  0x7: prefx({{ }});
4737639Sgblack@eecs.umich.edu	}
4747639Sgblack@eecs.umich.edu
4757639Sgblack@eecs.umich.edu	0x3: alnv_ps({{ }});
4767639Sgblack@eecs.umich.edu
4777639Sgblack@eecs.umich.edu	0x4: decode FUNCTION_LO {
4787639Sgblack@eecs.umich.edu	  0x0: madd_s({{ }});
4797639Sgblack@eecs.umich.edu	  0x1: madd_d({{ }});
4807639Sgblack@eecs.umich.edu	  0x6: madd_ps({{ }});
4817639Sgblack@eecs.umich.edu	}
4827639Sgblack@eecs.umich.edu
4837639Sgblack@eecs.umich.edu	0x5: decode FUNCTION_LO {
4847639Sgblack@eecs.umich.edu	  0x0: msub_s({{ }});
4857639Sgblack@eecs.umich.edu	  0x1: msub_d({{ }});
4867639Sgblack@eecs.umich.edu	  0x6: msub_ps({{ }});	
4877639Sgblack@eecs.umich.edu	}
4887639Sgblack@eecs.umich.edu
4897639Sgblack@eecs.umich.edu	0x6: decode FUNCTION_LO {
4907639Sgblack@eecs.umich.edu	  0x0: nmadd_s({{ }});
4917639Sgblack@eecs.umich.edu	  0x1: nmadd_d({{ }});
4927639Sgblack@eecs.umich.edu	  0x6: nmadd_ps({{ }});	
4937639Sgblack@eecs.umich.edu	}
4947639Sgblack@eecs.umich.edu
4957853SMatt.Horsnell@ARM.com	0x7: decode FUNCTION_LO {
4967853SMatt.Horsnell@ARM.com	  0x0: nmsub_s({{ }});
4977639Sgblack@eecs.umich.edu	  0x1: nmsub_d({{ }});
4987639Sgblack@eecs.umich.edu	  0x6: nmsub_ps({{ }});
4997639Sgblack@eecs.umich.edu	}
5007639Sgblack@eecs.umich.edu      } 
5017646Sgene.wu@arm.com
5027639Sgblack@eecs.umich.edu      //MIPS obsolete instructions 
5037639Sgblack@eecs.umich.edu      0x4: beql({{ }});
5047639Sgblack@eecs.umich.edu      0x5: bnel({{ }});
5057639Sgblack@eecs.umich.edu      0x6: blezl({{ }});
5067639Sgblack@eecs.umich.edu      0x7: bgtzl({{ }});
5077639Sgblack@eecs.umich.edu    };
5087639Sgblack@eecs.umich.edu
5097639Sgblack@eecs.umich.edu    0x3: decode OPCODE_LO default FailUnimpl::reserved() {
5107639Sgblack@eecs.umich.edu
5117639Sgblack@eecs.umich.edu	//Table A-5 MIPS32 SPECIAL2 Encoding of Function Field
5127639Sgblack@eecs.umich.edu	0x4: decode FUNCTION_HI {
5137639Sgblack@eecs.umich.edu
5147639Sgblack@eecs.umich.edu	    0x0: decode FUNCTION_LO {
5157639Sgblack@eecs.umich.edu	      0x0: madd({{ }});
5167639Sgblack@eecs.umich.edu	      0x1: maddu({{ }});
5177639Sgblack@eecs.umich.edu	      0x2: mult({{ }});
5187639Sgblack@eecs.umich.edu	      0x4: msub({{ }});
5197639Sgblack@eecs.umich.edu	      0x5: msubu({{ }});
5207639Sgblack@eecs.umich.edu	    }
5217639Sgblack@eecs.umich.edu
5227639Sgblack@eecs.umich.edu	    0x4: decode FUNCTION_LO {
5237639Sgblack@eecs.umich.edu	      0x0: clz({{ }});
5247639Sgblack@eecs.umich.edu	      0x1: clo({{ }});
5257639Sgblack@eecs.umich.edu	    }
5267639Sgblack@eecs.umich.edu
5277639Sgblack@eecs.umich.edu	    0x7: decode FUNCTION_LO {
5287639Sgblack@eecs.umich.edu	      0x7: sdbbp({{ }});
5297639Sgblack@eecs.umich.edu	    }	      
5307639Sgblack@eecs.umich.edu	}
5317639Sgblack@eecs.umich.edu
5327853SMatt.Horsnell@ARM.com	//Table A-6 MIPS32 SPECIAL3 Encoding of Function Field for Release 2 of the Architecture
5337853SMatt.Horsnell@ARM.com	0x7: decode FUNCTION_HI {
5347639Sgblack@eecs.umich.edu	  
5357639Sgblack@eecs.umich.edu	  0x0: decode FUNCTION_LO {
5367639Sgblack@eecs.umich.edu	    0x1: ext({{ }});
5377639Sgblack@eecs.umich.edu	    0x4: ins({{ }});
5387639Sgblack@eecs.umich.edu	  }
5397639Sgblack@eecs.umich.edu
5407639Sgblack@eecs.umich.edu	  //Table A-10 MIPS32 BSHFL Encoding of sa Field
5417639Sgblack@eecs.umich.edu	  0x4: decode SA {
5427639Sgblack@eecs.umich.edu	    0x02: wsbh({{ }});
5437639Sgblack@eecs.umich.edu	    0x10: seb({{ }});
5447639Sgblack@eecs.umich.edu	    0x18: seh({{ }});
5457639Sgblack@eecs.umich.edu	  }
5467639Sgblack@eecs.umich.edu
5477639Sgblack@eecs.umich.edu	  0x6: decode FUNCTION_LO {
5487639Sgblack@eecs.umich.edu	    0x7: rdhwr({{ }});
5497639Sgblack@eecs.umich.edu	  }
5507639Sgblack@eecs.umich.edu	}
5517639Sgblack@eecs.umich.edu    };
5527639Sgblack@eecs.umich.edu
5537639Sgblack@eecs.umich.edu    0x4: decode OPCODE_LO default FailUnimpl::reserved() {
5547639Sgblack@eecs.umich.edu	format Memory {
5557639Sgblack@eecs.umich.edu	    0x0: lb({{ }});
5567639Sgblack@eecs.umich.edu	    0x1: lh({{ }});
5577639Sgblack@eecs.umich.edu	    0x2: lwl({{ }});
5587639Sgblack@eecs.umich.edu	    0x3: lw({{ }});
5597639Sgblack@eecs.umich.edu	    0x4: lbu({{ }});
5607639Sgblack@eecs.umich.edu	    0x5: lhu({{ }});
5617639Sgblack@eecs.umich.edu	    0x6: lhu({{ }});
5627639Sgblack@eecs.umich.edu	};
5637639Sgblack@eecs.umich.edu
5647639Sgblack@eecs.umich.edu	0x7: FailUnimpl::reserved({{ }});
5657639Sgblack@eecs.umich.edu    };
5667639Sgblack@eecs.umich.edu
5677639Sgblack@eecs.umich.edu    0x5: decode OPCODE_LO default FailUnimpl::reserved() {
5687639Sgblack@eecs.umich.edu	format Memory {
5697639Sgblack@eecs.umich.edu	    0x0: sb({{ }});
57010037SARM gem5 Developers	    0x1: sh({{ }});
5717639Sgblack@eecs.umich.edu	    0x2: swl({{ }});
5727639Sgblack@eecs.umich.edu	    0x3: sw({{ }});
5737639Sgblack@eecs.umich.edu	    0x6: swr({{ }});
5747639Sgblack@eecs.umich.edu	};
5757639Sgblack@eecs.umich.edu
5767639Sgblack@eecs.umich.edu	format FailUnimpl {
5777639Sgblack@eecs.umich.edu	    0x4: reserved({{ }});
5787639Sgblack@eecs.umich.edu	    0x5: reserved({{ }});
5797639Sgblack@eecs.umich.edu	    0x7: cache({{ }});
5807639Sgblack@eecs.umich.edu	};
5817639Sgblack@eecs.umich.edu
5827639Sgblack@eecs.umich.edu    };
5837639Sgblack@eecs.umich.edu
5847639Sgblack@eecs.umich.edu    0x6: decode OPCODE_LO default FailUnimpl::reserved() {
5857639Sgblack@eecs.umich.edu	format Memory {
5867639Sgblack@eecs.umich.edu	    0x0: ll({{ }});
5877639Sgblack@eecs.umich.edu	    0x1: lwc1({{ }});
5887639Sgblack@eecs.umich.edu	    0x5: ldc1({{ }});
5897639Sgblack@eecs.umich.edu	};
5907639Sgblack@eecs.umich.edu    };
5917639Sgblack@eecs.umich.edu
5927639Sgblack@eecs.umich.edu    0x7: decode OPCODE_LO default FailUnimpl::reserved() {
5937639Sgblack@eecs.umich.edu	format Memory {
5947639Sgblack@eecs.umich.edu	    0x0: sc({{ }});
5957639Sgblack@eecs.umich.edu	    0x1: swc1({{ }});
5967639Sgblack@eecs.umich.edu	    0x5: sdc1({{ }});
5977639Sgblack@eecs.umich.edu	};
5987639Sgblack@eecs.umich.edu
5997639Sgblack@eecs.umich.edu    }
6007639Sgblack@eecs.umich.edu}
6017639Sgblack@eecs.umich.edu
6027639Sgblack@eecs.umich.edu
6037639Sgblack@eecs.umich.edu