1// Copyright (c) 2006-2007 The Regents of The University of Michigan 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer; 8// redistributions in binary form must reproduce the above copyright 9// notice, this list of conditions and the following disclaimer in the 10// documentation and/or other materials provided with the distribution; 11// neither the name of the copyright holders nor the names of its 12// contributors may be used to endorse or promote products derived from 13// this software without specific prior written permission. 14// 15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26// 27// Authors: Ali Saidi 28// Gabe Black 29// Steve Reinhardt 30 31// Basic instruction class declaration template. 32def template BasicDeclare {{ 33/** 34 * Static instruction class for "%(mnemonic)s". 35 */ 36class %(class_name)s : public %(base_class)s 37{ 38 public: 39 // Constructor. 40 %(class_name)s(ExtMachInst machInst); 41 Fault execute(ExecContext *, Trace::InstRecord *) const override; 42}; 43}}; 44 45// Basic instruction class declaration template. 46def template FpBasicDeclare {{ 47/** 48 * Static instruction class for "%(mnemonic)s". 49 */ 50class %(class_name)s : public %(base_class)s 51{ 52 public: 53 // Constructor. 54 %(class_name)s(ExtMachInst machInst); 55 Fault execute(ExecContext *, Trace::InstRecord *) const override; 56 Fault doFpOp(ExecContext *, Trace::InstRecord *) const M5_NO_INLINE; 57}; 58}}; 59 60// Basic instruction class declaration template. 61def template BasicDeclareWithMnemonic {{ 62/** 63 * Static instruction class for "%(mnemonic)s". 64 */ 65class %(class_name)s : public %(base_class)s 66{ 67 public: 68 // Constructor. 69 %(class_name)s(const char *mnemonic, ExtMachInst machInst); 70 Fault execute(ExecContext *, Trace::InstRecord *) const override; 71}; 72}}; 73 74// Basic instruction class constructor template. 75def template BasicConstructor {{ 76%(class_name)s::%(class_name)s(ExtMachInst machInst) : 77 %(base_class)s("%(mnemonic)s", machInst, %(op_class)s) 78{ 79 %(constructor)s; 80} 81}}; 82 83// Basic instruction class constructor template. 84def template BasicConstructorWithMnemonic {{ 85%(class_name)s::%(class_name)s(const char *mnemonic, ExtMachInst machInst) : 86 %(base_class)s(mnemonic, machInst, %(op_class)s) 87{ 88 %(constructor)s; 89} 90}}; 91 92// Basic instruction class execute method template. 93def template BasicExecute {{ 94Fault 95%(class_name)s::execute(ExecContext *xc, 96 Trace::InstRecord *traceData) const 97{ 98 Fault fault = NoFault; 99 100 %(fp_enable_check)s; 101 %(op_decl)s; 102 %(op_rd)s; 103 %(code)s; 104 105 if (fault == NoFault) { 106 %(op_wb)s; 107 } 108 return fault; 109} 110}}; 111 112def template DoFpOpExecute {{ 113Fault 114%(class_name)s::doFpOp(ExecContext *xc, Trace::InstRecord *traceData) const 115{ 116 Fault fault = NoFault; 117 %(op_decl)s; 118 %(op_rd)s; 119 %(fp_code)s; 120 if (fault == NoFault) { 121 %(op_wb)s; 122 } 123 return fault; 124} 125}}; 126 127// Basic decode template. 128def template BasicDecode {{ 129return new %(class_name)s(machInst); 130}}; 131 132// Basic decode template, passing mnemonic in as string arg to constructor. 133def template BasicDecodeWithMnemonic {{ 134return new %(class_name)s("%(mnemonic)s", machInst); 135}}; 136 137// The most basic instruction format... used only for a few misc. insts 138def format BasicOperate(code, *flags) {{ 139 code = filterDoubles(code) 140 iop = InstObjParams(name, Name, 'SparcStaticInst', code, flags) 141 header_output = BasicDeclare.subst(iop) 142 decoder_output = BasicConstructor.subst(iop) 143 decode_block = BasicDecode.subst(iop) 144 exec_output = BasicExecute.subst(iop) 145 146}}; 147 148def format FpBasic(code, *flags) {{ 149 exec_code = """ 150 Fsr |= bits(Fsr, 4, 0) << 5; 151 Fsr = insertBits(Fsr, 4, 0, 0); 152 int newrnd = M5_FE_TONEAREST; 153 switch (Fsr<31:30>) { 154 case 0: newrnd = M5_FE_TONEAREST; break; 155 case 1: newrnd = M5_FE_TOWARDZERO; break; 156 case 2: newrnd = M5_FE_UPWARD; break; 157 case 3: newrnd = M5_FE_DOWNWARD; break; 158 } 159 int oldrnd = m5_fegetround(); 160 m5_fesetround(newrnd); 161 __asm__ __volatile__("" ::: "memory"); 162 fault = doFpOp(xc, traceData); 163 __asm__ __volatile__("" ::: "memory"); 164 m5_fesetround(oldrnd); 165 return fault; 166""" 167 fp_code = filterDoubles(code) 168 iop = InstObjParams(name, Name, 'SparcStaticInst', 169 { "code" : exec_code, "fp_code" : fp_code }, flags) 170 header_output = FpBasicDeclare.subst(iop) 171 decoder_output = BasicConstructor.subst(iop) 172 decode_block = BasicDecode.subst(iop) 173 exec_output = BasicExecute.subst(iop) 174 exec_output += DoFpOpExecute.subst(iop) 175}}; 176