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