basic.isa revision 5268
17404SAli.Saidi@ARM.com// -*- mode:c++ -*-
210717Sandreas.hansson@arm.com
37404SAli.Saidi@ARM.com// -*- mode:c++ -*-
47404SAli.Saidi@ARM.com
57404SAli.Saidi@ARM.com// Copyright (c) 2003-2005 The Regents of The University of Michigan
67404SAli.Saidi@ARM.com// All rights reserved.
77404SAli.Saidi@ARM.com//
87404SAli.Saidi@ARM.com// Redistribution and use in source and binary forms, with or without
97404SAli.Saidi@ARM.com// modification, are permitted provided that the following conditions are
107404SAli.Saidi@ARM.com// met: redistributions of source code must retain the above copyright
117404SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer;
127404SAli.Saidi@ARM.com// redistributions in binary form must reproduce the above copyright
137404SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer in the
147404SAli.Saidi@ARM.com// documentation and/or other materials provided with the distribution;
157404SAli.Saidi@ARM.com// neither the name of the copyright holders nor the names of its
167404SAli.Saidi@ARM.com// contributors may be used to endorse or promote products derived from
177404SAli.Saidi@ARM.com// this software without specific prior written permission.
187404SAli.Saidi@ARM.com//
197404SAli.Saidi@ARM.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
207404SAli.Saidi@ARM.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
217404SAli.Saidi@ARM.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
227404SAli.Saidi@ARM.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
237404SAli.Saidi@ARM.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
247404SAli.Saidi@ARM.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
257404SAli.Saidi@ARM.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
267404SAli.Saidi@ARM.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
277404SAli.Saidi@ARM.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
287404SAli.Saidi@ARM.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
297404SAli.Saidi@ARM.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
307404SAli.Saidi@ARM.com//
317404SAli.Saidi@ARM.com// Authors: Steve Reinhardt
327404SAli.Saidi@ARM.com//          Korey Sewell
337404SAli.Saidi@ARM.com
347404SAli.Saidi@ARM.com// Declarations for execute() methods.
357404SAli.Saidi@ARM.comdef template BasicExecDeclare {{
367404SAli.Saidi@ARM.com        Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const;
377404SAli.Saidi@ARM.com}};
3810037SARM gem5 Developers
397404SAli.Saidi@ARM.com// Basic instruction class declaration template.
4010873Sandreas.sandberg@arm.comdef template BasicDeclare {{
417404SAli.Saidi@ARM.com        /**
4210474Sandreas.hansson@arm.com         * Static instruction class for "%(mnemonic)s".
4310474Sandreas.hansson@arm.com         */
447404SAli.Saidi@ARM.com        class %(class_name)s : public %(base_class)s
4510037SARM gem5 Developers        {
4610037SARM gem5 Developers          public:
477404SAli.Saidi@ARM.com                /// Constructor.
487728SAli.Saidi@ARM.com                %(class_name)s(MachInst machInst);
497404SAli.Saidi@ARM.com                %(BasicExecDeclare)s
508245Snate@binkert.org        };
519152Satgutier@umich.edu}};
528245Snate@binkert.org
538245Snate@binkert.org// Basic instruction class constructor template.
5410873Sandreas.sandberg@arm.comdef template BasicConstructor {{
557748SAli.Saidi@ARM.com        inline %(class_name)s::%(class_name)s(MachInst machInst)  : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
567404SAli.Saidi@ARM.com        {
577404SAli.Saidi@ARM.com                %(constructor)s;
587404SAli.Saidi@ARM.com        }
597404SAli.Saidi@ARM.com}};
6010913Sandreas.sandberg@arm.com
6110717Sandreas.hansson@arm.com
6210717Sandreas.hansson@arm.com// Basic instruction class execute method template.
6310717Sandreas.hansson@arm.comdef template BasicExecute {{
649258SAli.Saidi@ARM.com        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
6510621SCurtis.Dunham@arm.com        {
6610621SCurtis.Dunham@arm.com                Fault fault = NoFault;
6710037SARM gem5 Developers
6810037SARM gem5 Developers                %(fp_enable_check)s;
6910037SARM gem5 Developers                %(op_decl)s;
7010037SARM gem5 Developers                %(op_rd)s;
717439Sdam.sunwoo@arm.com                if(fault == NoFault)
727576SAli.Saidi@ARM.com                {
7310037SARM gem5 Developers                  %(code)s;
7410037SARM gem5 Developers                  if(fault == NoFault){
7510037SARM gem5 Developers                    %(op_wb)s;
7610717Sandreas.hansson@arm.com                  }
7710037SARM gem5 Developers                }
7810037SARM gem5 Developers                return fault;
7910037SARM gem5 Developers        }
8010037SARM gem5 Developers}};
8110037SARM gem5 Developers
8210037SARM gem5 Developers// Basic decode template.
8310037SARM gem5 Developersdef template BasicDecode {{
8410037SARM gem5 Developers        return new %(class_name)s(machInst);
8510037SARM gem5 Developers}};
8610037SARM gem5 Developers
8710037SARM gem5 Developers// Basic decode template, passing mnemonic in as string arg to constructor.
8810037SARM gem5 Developersdef template BasicDecodeWithMnemonic {{
897439Sdam.sunwoo@arm.com        return new %(class_name)s("%(mnemonic)s", machInst);
907404SAli.Saidi@ARM.com}};
917404SAli.Saidi@ARM.com
927404SAli.Saidi@ARM.com// The most basic instruction format...
937404SAli.Saidi@ARM.comdef format BasicOp(code, *flags) {{
947404SAli.Saidi@ARM.com        iop = InstObjParams(name, Name, 'MipsStaticInst', code, flags)
957404SAli.Saidi@ARM.com        header_output = BasicDeclare.subst(iop)
9610717Sandreas.hansson@arm.com        decoder_output = BasicConstructor.subst(iop)
9710717Sandreas.hansson@arm.com        decode_block = BasicDecode.subst(iop)
9810717Sandreas.hansson@arm.com        exec_output = BasicExecute.subst(iop)
9910717Sandreas.hansson@arm.com}};
10010717Sandreas.hansson@arm.com