basicmem.isa revision 2591
11156SN/A////////////////////////////////////////////////////////////////////
21762SN/A//
31156SN/A// Mem instructions
41156SN/A//
51156SN/A
61156SN/Aoutput header {{
71156SN/A        /**
81156SN/A         * Base class for memory operations.
91156SN/A         */
101156SN/A        class Mem : public SparcStaticInst
111156SN/A        {
121156SN/A          protected:
131156SN/A
141156SN/A            // Constructor
151156SN/A            Mem(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
161156SN/A                SparcStaticInst(mnem, _machInst, __opClass)
171156SN/A            {
181156SN/A            }
191156SN/A
201156SN/A            std::string generateDisassembly(Addr pc,
211156SN/A                    const SymbolTable *symtab) const;
221156SN/A        };
231156SN/A
241156SN/A        /**
251156SN/A         * Class for memory operations which use an immediate offset.
261156SN/A         */
272665SN/A        class MemImm : public Mem
282665SN/A        {
291156SN/A          protected:
301156SN/A
3111263Sandreas.sandberg@arm.com            // Constructor
3211263Sandreas.sandberg@arm.com            MemImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
331156SN/A                Mem(mnem, _machInst, __opClass)
342566SN/A            {
351156SN/A                imm = sign_ext(SIMM13, 13);
361156SN/A            }
379850SN/A
384762SN/A            std::string generateDisassembly(Addr pc,
3911263Sandreas.sandberg@arm.com                    const SymbolTable *symtab) const;
409850SN/A
418641SN/A            int32_t imm;
425882SN/A        };
431156SN/A}};
446216SN/A
456658SN/Aoutput decoder {{
468232SN/A        std::string Mem::generateDisassembly(Addr pc,
4711263Sandreas.sandberg@arm.com                const SymbolTable *symtab) const
482566SN/A        {
493348SN/A            std::stringstream response;
501156SN/A            bool load = flags[IsLoad];
511157SN/A            bool save = flags[IsStore];
521156SN/A
535603SN/A            printMnemonic(response, mnemonic);
541156SN/A            if(save)
552107SN/A            {
561156SN/A                printReg(response, _srcRegIdx[0]);
571156SN/A                ccprintf(response, ", ");
581156SN/A            }
591156SN/A            ccprintf(response, "[ ");
601156SN/A            printReg(response, _srcRegIdx[!save ? 0 : 1]);
611156SN/A            ccprintf(response, " + ");
621156SN/A            printReg(response, _srcRegIdx[!save ? 1 : 2]);
631156SN/A            ccprintf(response, " ]");
641156SN/A            if(load)
651156SN/A            {
661156SN/A                ccprintf(response, ", ");
671156SN/A                printReg(response, _destRegIdx[0]);
681156SN/A            }
691156SN/A
701156SN/A            return response.str();
711156SN/A        }
721156SN/A
731156SN/A        std::string MemImm::generateDisassembly(Addr pc,
741156SN/A                const SymbolTable *symtab) const
751156SN/A        {
761156SN/A            std::stringstream response;
771156SN/A            bool load = flags[IsLoad];
781156SN/A            bool save = flags[IsStore];
791156SN/A
801156SN/A            printMnemonic(response, mnemonic);
811156SN/A            if(save)
824981SN/A            {
839339SN/A                printReg(response, _srcRegIdx[0]);
841634SN/A                ccprintf(response, ", ");
851634SN/A            }
861156SN/A            ccprintf(response, "[ ");
871156SN/A            printReg(response, _srcRegIdx[!save ? 0 : 1]);
881156SN/A            if(imm >= 0)
894981SN/A                ccprintf(response, " + 0x%x ]", imm);
902627SN/A            else
912282SN/A                ccprintf(response, " + -0x%x ]", -imm);
922627SN/A            if(load)
931156SN/A            {
941156SN/A                ccprintf(response, ", ");
951156SN/A                printReg(response, _destRegIdx[0]);
961156SN/A            }
971156SN/A
984981SN/A            return response.str();
991156SN/A        }
1001156SN/A}};
1011156SN/A
1021156SN/Adef template MemExecute {{
1031156SN/A        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
1041156SN/A                Trace::InstRecord *traceData) const
1051156SN/A        {
1061156SN/A            Fault fault = NoFault;
1071156SN/A            Addr EA;
1081156SN/A            %(op_decl)s;
1099339SN/A            %(op_rd)s;
1105603SN/A            %(ea_code)s;
1115603SN/A            DPRINTF(Sparc, "The address is 0x%x\n", EA);
1125603SN/A            %(load)s;
1135603SN/A            %(code)s;
1145603SN/A            %(store)s;
1155603SN/A
1165603SN/A            if(fault == NoFault)
1175603SN/A            {
1185603SN/A                //Write the resulting state to the execution context
1195603SN/A                %(op_wb)s;
1205603SN/A            }
1215603SN/A
1225603SN/A            return fault;
1235603SN/A        }
1245603SN/A}};
1255603SN/A
1265603SN/Alet {{
1275603SN/A    # Leave memAccessFlags at 0 for now
1285603SN/A    loadString = "xc->read(EA, (uint%(width)s_t&)Mem, 0);"
1295603SN/A    storeString = "uint64_t write_result = 0; \
1305603SN/A    xc->write((uint%(width)s_t)Mem, EA, 0, &write_result);"
1315603SN/A
1325603SN/A    def doMemFormat(code, load, store, name, Name, opt_flags):
1335603SN/A        addrCalcReg = 'EA = Rs1 + Rs2;'
1345603SN/A        addrCalcImm = 'EA = Rs1 + imm;'
1355603SN/A        iop = InstObjParams(name, Name, 'Mem', code,
1365603SN/A                opt_flags, ("ea_code", addrCalcReg),
1375603SN/A                ("load", load), ("store", store))
1389339SN/A        iop_imm = InstObjParams(name, Name + 'Imm', 'MemImm', code,
1399339SN/A                opt_flags, ("ea_code", addrCalcImm),
1405603SN/A                ("load", load), ("store", store))
1411156SN/A        header_output = BasicDeclare.subst(iop) + BasicDeclare.subst(iop_imm)
1421156SN/A        decoder_output = BasicConstructor.subst(iop) + BasicConstructor.subst(iop_imm)
1434981SN/A        decode_block = ROrImmDecode.subst(iop)
1444981SN/A        exec_output = MemExecute.subst(iop) + MemExecute.subst(iop_imm)
1454981SN/A        return (header_output, decoder_output, exec_output, decode_block)
1464981SN/A}};
1474981SN/A
1484981SN/Adef format Load(code, width, *opt_flags) {{
1494981SN/A        (header_output,
1504981SN/A         decoder_output,
1514981SN/A         exec_output,
1524981SN/A         decode_block) = doMemFormat(code,
1534981SN/A             loadString % {"width":width}, '', name, Name, opt_flags)
1544981SN/A}};
1554981SN/A
1561939SN/Adef format Store(code, width, *opt_flags) {{
15711005SN/A        (header_output,
1582008SN/A         decoder_output,
1592008SN/A         exec_output,
1602282SN/A         decode_block) = doMemFormat(code, '',
1612282SN/A             storeString % {"width":width}, name, Name, opt_flags)
1622282SN/A}};
1632008SN/A
1642008SN/Adef format LoadStore(code, width, *opt_flags) {{
1655603SN/A        (header_output,
1665603SN/A         decoder_output,
1675603SN/A         exec_output,
1685603SN/A         decode_block) = doMemFormat(code,
1692008SN/A             loadString % {"width":width}, storeString % {"width":width},
17011005SN/A             name, Name, opt_flags)
1712008SN/A}};
1722008SN/A