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