basicmem.isa revision 3810:c2caa5f3f09f
111986Sandreas.sandberg@arm.com// Copyright (c) 2006 The Regents of The University of Michigan
211986Sandreas.sandberg@arm.com// All rights reserved.
311986Sandreas.sandberg@arm.com//
411986Sandreas.sandberg@arm.com// Redistribution and use in source and binary forms, with or without
511986Sandreas.sandberg@arm.com// modification, are permitted provided that the following conditions are
611986Sandreas.sandberg@arm.com// met: redistributions of source code must retain the above copyright
711986Sandreas.sandberg@arm.com// notice, this list of conditions and the following disclaimer;
811986Sandreas.sandberg@arm.com// redistributions in binary form must reproduce the above copyright
911986Sandreas.sandberg@arm.com// notice, this list of conditions and the following disclaimer in the
1011986Sandreas.sandberg@arm.com// documentation and/or other materials provided with the distribution;
1111986Sandreas.sandberg@arm.com// neither the name of the copyright holders nor the names of its
1211986Sandreas.sandberg@arm.com// contributors may be used to endorse or promote products derived from
1311986Sandreas.sandberg@arm.com// this software without specific prior written permission.
1411986Sandreas.sandberg@arm.com//
1511986Sandreas.sandberg@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1611986Sandreas.sandberg@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1711986Sandreas.sandberg@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1811986Sandreas.sandberg@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1911986Sandreas.sandberg@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2011986Sandreas.sandberg@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2111986Sandreas.sandberg@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2211986Sandreas.sandberg@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2311986Sandreas.sandberg@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2411986Sandreas.sandberg@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2511986Sandreas.sandberg@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2611986Sandreas.sandberg@arm.com//
2711986Sandreas.sandberg@arm.com// Authors: Ali Saidi
2811986Sandreas.sandberg@arm.com//          Gabe Black
2911986Sandreas.sandberg@arm.com
3011986Sandreas.sandberg@arm.com////////////////////////////////////////////////////////////////////
3111986Sandreas.sandberg@arm.com//
3211986Sandreas.sandberg@arm.com// Mem instructions
3311986Sandreas.sandberg@arm.com//
3411986Sandreas.sandberg@arm.com
3511986Sandreas.sandberg@arm.comdef template MemDeclare {{
3611986Sandreas.sandberg@arm.com        /**
3711986Sandreas.sandberg@arm.com         * Static instruction class for "%(mnemonic)s".
3811986Sandreas.sandberg@arm.com         */
3911986Sandreas.sandberg@arm.com        class %(class_name)s : public %(base_class)s
4011986Sandreas.sandberg@arm.com        {
4111986Sandreas.sandberg@arm.com          public:
4211986Sandreas.sandberg@arm.com
4311986Sandreas.sandberg@arm.com            /// Constructor.
4411986Sandreas.sandberg@arm.com            %(class_name)s(ExtMachInst machInst);
4511986Sandreas.sandberg@arm.com
4611986Sandreas.sandberg@arm.com            %(BasicExecDeclare)s
4711986Sandreas.sandberg@arm.com
4811986Sandreas.sandberg@arm.com            %(InitiateAccDeclare)s
4911986Sandreas.sandberg@arm.com
5011986Sandreas.sandberg@arm.com            %(CompleteAccDeclare)s
5111986Sandreas.sandberg@arm.com        };
5211986Sandreas.sandberg@arm.com}};
5311986Sandreas.sandberg@arm.com
5411986Sandreas.sandberg@arm.comlet {{
5511986Sandreas.sandberg@arm.com    def doMemFormat(code, execute, faultCode, name, Name, asi, opt_flags):
5611986Sandreas.sandberg@arm.com        addrCalcReg = 'EA = Rs1 + Rs2;'
5711986Sandreas.sandberg@arm.com        addrCalcImm = 'EA = Rs1 + imm;'
5811986Sandreas.sandberg@arm.com        iop = InstObjParams(name, Name, 'Mem', code,
5911986Sandreas.sandberg@arm.com                opt_flags, {"fault_check": faultCode, "ea_code": addrCalcReg})
6011986Sandreas.sandberg@arm.com        iop_imm = InstObjParams(name, Name + "Imm", 'MemImm', code,
6111986Sandreas.sandberg@arm.com                opt_flags, {"fault_check": faultCode, "ea_code": addrCalcImm})
6211986Sandreas.sandberg@arm.com        header_output = MemDeclare.subst(iop) + MemDeclare.subst(iop_imm)
6311986Sandreas.sandberg@arm.com        decoder_output = BasicConstructor.subst(iop) + BasicConstructor.subst(iop_imm)
6411986Sandreas.sandberg@arm.com        decode_block = ROrImmDecode.subst(iop)
6511986Sandreas.sandberg@arm.com        exec_output = doDualSplitExecute(code, addrCalcReg, addrCalcImm,
6611986Sandreas.sandberg@arm.com                execute, faultCode, name, name + "Imm", Name, Name + "Imm",
6711986Sandreas.sandberg@arm.com                asi, opt_flags)
6811986Sandreas.sandberg@arm.com        return (header_output, decoder_output, exec_output, decode_block)
6911986Sandreas.sandberg@arm.com}};
7011986Sandreas.sandberg@arm.com
7111986Sandreas.sandberg@arm.comdef format LoadAlt(code, asi, *opt_flags) {{
7211986Sandreas.sandberg@arm.com        (header_output,
7311986Sandreas.sandberg@arm.com         decoder_output,
7411986Sandreas.sandberg@arm.com         exec_output,
7511986Sandreas.sandberg@arm.com         decode_block) = doMemFormat(code, LoadExecute,
7611986Sandreas.sandberg@arm.com            AlternateASIPrivFaultCheck, name, Name, asi, opt_flags)
7711986Sandreas.sandberg@arm.com}};
7811986Sandreas.sandberg@arm.com
7911986Sandreas.sandberg@arm.comdef format StoreAlt(code, asi, *opt_flags) {{
8011986Sandreas.sandberg@arm.com        (header_output,
8111986Sandreas.sandberg@arm.com         decoder_output,
8211986Sandreas.sandberg@arm.com         exec_output,
8311986Sandreas.sandberg@arm.com         decode_block) = doMemFormat(code, StoreExecute,
8411986Sandreas.sandberg@arm.com            AlternateASIPrivFaultCheck, name, Name, asi, opt_flags)
8511986Sandreas.sandberg@arm.com}};
8611986Sandreas.sandberg@arm.com
8711986Sandreas.sandberg@arm.comdef format Load(code, *opt_flags) {{
8811986Sandreas.sandberg@arm.com        (header_output,
8911986Sandreas.sandberg@arm.com         decoder_output,
9011986Sandreas.sandberg@arm.com         exec_output,
9111986Sandreas.sandberg@arm.com         decode_block) = doMemFormat(code,
9211986Sandreas.sandberg@arm.com             LoadExecute, '', name, Name, 0, opt_flags)
9311986Sandreas.sandberg@arm.com}};
9411986Sandreas.sandberg@arm.com
9511986Sandreas.sandberg@arm.comdef format Store(code, *opt_flags) {{
9611986Sandreas.sandberg@arm.com        (header_output,
9711986Sandreas.sandberg@arm.com         decoder_output,
9811986Sandreas.sandberg@arm.com         exec_output,
9911986Sandreas.sandberg@arm.com         decode_block) = doMemFormat(code,
10011986Sandreas.sandberg@arm.com             StoreExecute, '', name, Name, 0, opt_flags)
10111986Sandreas.sandberg@arm.com}};
10211986Sandreas.sandberg@arm.com