fp.isa revision 2084
15647Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 25647Sgblack@eecs.umich.edu// 35647Sgblack@eecs.umich.edu// Floating Point operate instructions 45647Sgblack@eecs.umich.edu// 55647Sgblack@eecs.umich.edu 65647Sgblack@eecs.umich.eduoutput header {{ 75647Sgblack@eecs.umich.edu /** 85647Sgblack@eecs.umich.edu * Base class for integer operations. 95647Sgblack@eecs.umich.edu */ 105647Sgblack@eecs.umich.edu class FPOp : public MipsStaticInst 115647Sgblack@eecs.umich.edu { 125647Sgblack@eecs.umich.edu protected: 135647Sgblack@eecs.umich.edu 145647Sgblack@eecs.umich.edu /// Constructor 155647Sgblack@eecs.umich.edu FPOp(const char *mnem, MachInst _machInst, OpClass __opClass) : MipsStaticInst(mnem, _machInst, __opClass) 165647Sgblack@eecs.umich.edu { 175647Sgblack@eecs.umich.edu } 185647Sgblack@eecs.umich.edu 195647Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 205647Sgblack@eecs.umich.edu }; 215647Sgblack@eecs.umich.edu}}; 225647Sgblack@eecs.umich.edu 235647Sgblack@eecs.umich.eduoutput decoder {{ 245647Sgblack@eecs.umich.edu std::string FPOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 255647Sgblack@eecs.umich.edu { 265647Sgblack@eecs.umich.edu return "Disassembly of integer instruction\n"; 275647Sgblack@eecs.umich.edu } 285647Sgblack@eecs.umich.edu}}; 295647Sgblack@eecs.umich.edu 305647Sgblack@eecs.umich.edudef template FloatingPointExecute {{ 315647Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 325647Sgblack@eecs.umich.edu { 335647Sgblack@eecs.umich.edu //These are set to constants when the execute method 345647Sgblack@eecs.umich.edu //is generated 355647Sgblack@eecs.umich.edu bool useCc = ; 365647Sgblack@eecs.umich.edu bool checkPriv = ; 375647Sgblack@eecs.umich.edu 385647Sgblack@eecs.umich.edu //Attempt to execute the instruction 395647Sgblack@eecs.umich.edu try 405647Sgblack@eecs.umich.edu { 415647Sgblack@eecs.umich.edu checkPriv; 425647Sgblack@eecs.umich.edu 435647Sgblack@eecs.umich.edu %(op_decl)s; 445647Sgblack@eecs.umich.edu %(op_rd)s; 455647Sgblack@eecs.umich.edu %(code)s; 465647Sgblack@eecs.umich.edu } 475647Sgblack@eecs.umich.edu //If we have an exception for some reason, 485647Sgblack@eecs.umich.edu //deal with it 495647Sgblack@eecs.umich.edu catch(MipsException except) 505647Sgblack@eecs.umich.edu { 515647Sgblack@eecs.umich.edu //Deal with exception 525647Sgblack@eecs.umich.edu return No_Fault; 535647Sgblack@eecs.umich.edu } 545647Sgblack@eecs.umich.edu 555647Sgblack@eecs.umich.edu //Write the resulting state to the execution context 565647Sgblack@eecs.umich.edu %(op_wb)s; 575647Sgblack@eecs.umich.edu if(useCc) 585648Sgblack@eecs.umich.edu { 595647Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.iccFields.n = Rd & (1 << 63); 605654Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.iccFields.z = (Rd == 0); 615647Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.iccFields.v = ivValue; 625654Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.iccFields.c = icValue; 635647Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.xccFields.n = Rd & (1 << 31); 645648Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.xccFields.z = ((Rd & 0xFFFFFFFF) == 0); 655648Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.xccFields.v = xvValue; 665647Sgblack@eecs.umich.edu xc->regs.miscRegFile.ccrFields.xccFields.c = xcValue; 675647Sgblack@eecs.umich.edu } 685647Sgblack@eecs.umich.edu return No_Fault; 695647Sgblack@eecs.umich.edu } 705647Sgblack@eecs.umich.edu}}; 715647Sgblack@eecs.umich.edu 725647Sgblack@eecs.umich.edu// Primary format for integer operate instructions: 735647Sgblack@eecs.umich.edudef format FloatOp(code, *opt_flags) {{ 745647Sgblack@eecs.umich.edu orig_code = code 755648Sgblack@eecs.umich.edu cblk = CodeBlock(code) 765647Sgblack@eecs.umich.edu checkPriv = (code.find('checkPriv') != -1) 775648Sgblack@eecs.umich.edu code.replace('checkPriv', '') 785648Sgblack@eecs.umich.edu if checkPriv: 795648Sgblack@eecs.umich.edu code.replace('checkPriv;', 'if(!xc->regs.miscRegFile.pstateFields.priv) throw privileged_opcode;') 805648Sgblack@eecs.umich.edu else: 815648Sgblack@eecs.umich.edu code.replace('checkPriv;', '') 825648Sgblack@eecs.umich.edu for (marker, value) in (('ivValue', '0'), ('icValue', '0'), 835648Sgblack@eecs.umich.edu ('xvValue', '0'), ('xcValue', '0')): 845648Sgblack@eecs.umich.edu code.replace(marker, value) 855648Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'MipsStaticInst', cblk, opt_flags) 865648Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 875648Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 885648Sgblack@eecs.umich.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 895648Sgblack@eecs.umich.edu exec_output = FloatingPointExecute.subst(iop) 905648Sgblack@eecs.umich.edu}}; 915648Sgblack@eecs.umich.edu 925648Sgblack@eecs.umich.edu// Primary format for integer operate instructions: 935648Sgblack@eecs.umich.edudef format Float64Op(code, *opt_flags) {{ 945648Sgblack@eecs.umich.edu orig_code = code 955648Sgblack@eecs.umich.edu cblk = CodeBlock(code) 965648Sgblack@eecs.umich.edu checkPriv = (code.find('checkPriv') != -1) 975648Sgblack@eecs.umich.edu code.replace('checkPriv', '') 985648Sgblack@eecs.umich.edu if checkPriv: 995648Sgblack@eecs.umich.edu code.replace('checkPriv;', 'if(!xc->regs.miscRegFile.pstateFields.priv) throw privileged_opcode;') 1005648Sgblack@eecs.umich.edu else: 1015648Sgblack@eecs.umich.edu code.replace('checkPriv;', '') 1025648Sgblack@eecs.umich.edu for (marker, value) in (('ivValue', '0'), ('icValue', '0'), 1035648Sgblack@eecs.umich.edu ('xvValue', '0'), ('xcValue', '0')): 1045648Sgblack@eecs.umich.edu code.replace(marker, value) 1055648Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'MipsStaticInst', cblk, opt_flags) 1065648Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 1075648Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 1085648Sgblack@eecs.umich.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 1095648Sgblack@eecs.umich.edu exec_output = FloatingPointExecute.subst(iop) 1105648Sgblack@eecs.umich.edu}}; 1115648Sgblack@eecs.umich.edu 1125648Sgblack@eecs.umich.edu// Primary format for integer operate instructions: 1135648Sgblack@eecs.umich.edudef format FPOpCc(code, icValue, ivValue, xcValue, xvValue, *opt_flags) {{ 1145648Sgblack@eecs.umich.edu orig_code = code 1155648Sgblack@eecs.umich.edu 1165648Sgblack@eecs.umich.edu cblk = CodeBlock(code) 1175648Sgblack@eecs.umich.edu checkPriv = (code.find('checkPriv') != -1) 1185648Sgblack@eecs.umich.edu code.replace('checkPriv', '') 1195648Sgblack@eecs.umich.edu if checkPriv: 1205648Sgblack@eecs.umich.edu code.replace('checkPriv;', 'if(!xc->regs.miscRegFile.pstateFields.priv) throw privileged_opcode;') 1215648Sgblack@eecs.umich.edu else: 1225648Sgblack@eecs.umich.edu code.replace('checkPriv;', '') 1235648Sgblack@eecs.umich.edu for (marker, value) in (('ivValue', ivValue), ('icValue', icValue), 1245648Sgblack@eecs.umich.edu ('xvValue', xvValue), ('xcValue', xcValue)): 1255648Sgblack@eecs.umich.edu code.replace(marker, value) 1265648Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'MipsStaticInst', cblk, opt_flags) 1275648Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 1285648Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 1295648Sgblack@eecs.umich.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 1305648Sgblack@eecs.umich.edu exec_output = IntegerExecute.subst(iop) 1315648Sgblack@eecs.umich.edu}}; 1325648Sgblack@eecs.umich.edu