fp.isa revision 6243
16019Shines@cs.fsu.edu// -*- mode:c++ -*- 26019Shines@cs.fsu.edu 36019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University 46019Shines@cs.fsu.edu// All rights reserved. 56019Shines@cs.fsu.edu// 66019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without 76019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are 86019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright 96019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer; 106019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright 116019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the 126019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution; 136019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its 146019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from 156019Shines@cs.fsu.edu// this software without specific prior written permission. 166019Shines@cs.fsu.edu// 176019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286019Shines@cs.fsu.edu// 296019Shines@cs.fsu.edu// Authors: Stephen Hines 306019Shines@cs.fsu.edu 316019Shines@cs.fsu.edu//////////////////////////////////////////////////////////////////// 326019Shines@cs.fsu.edu// 336019Shines@cs.fsu.edu// Floating Point operate instructions 346019Shines@cs.fsu.edu// 356019Shines@cs.fsu.edu 366019Shines@cs.fsu.eduoutput header {{ 376019Shines@cs.fsu.edu 386019Shines@cs.fsu.edu /** 396019Shines@cs.fsu.edu * Base class for FP operations. 406019Shines@cs.fsu.edu */ 416019Shines@cs.fsu.edu class FPAOp : public PredOp 426019Shines@cs.fsu.edu { 436019Shines@cs.fsu.edu protected: 446019Shines@cs.fsu.edu 456019Shines@cs.fsu.edu /// Constructor 466019Shines@cs.fsu.edu FPAOp(const char *mnem, MachInst _machInst, OpClass __opClass) : PredOp(mnem, _machInst, __opClass) 476019Shines@cs.fsu.edu { 486019Shines@cs.fsu.edu } 496019Shines@cs.fsu.edu 506019Shines@cs.fsu.edu //std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 516019Shines@cs.fsu.edu }; 526019Shines@cs.fsu.edu 536019Shines@cs.fsu.edu}}; 546019Shines@cs.fsu.edu 556019Shines@cs.fsu.eduoutput exec {{ 566019Shines@cs.fsu.edu}}; 576019Shines@cs.fsu.edu 586019Shines@cs.fsu.edudef template FPAExecute {{ 596019Shines@cs.fsu.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 606019Shines@cs.fsu.edu { 616019Shines@cs.fsu.edu Fault fault = NoFault; 626019Shines@cs.fsu.edu 636019Shines@cs.fsu.edu %(fp_enable_check)s; 646019Shines@cs.fsu.edu 656019Shines@cs.fsu.edu %(op_decl)s; 666019Shines@cs.fsu.edu %(op_rd)s; 676019Shines@cs.fsu.edu 686243Sgblack@eecs.umich.edu if (%(predicate_test)s) { 696243Sgblack@eecs.umich.edu %(code)s; 706243Sgblack@eecs.umich.edu if (fault == NoFault) { 716243Sgblack@eecs.umich.edu %(op_wb)s; 726243Sgblack@eecs.umich.edu } 736019Shines@cs.fsu.edu } 746019Shines@cs.fsu.edu 756019Shines@cs.fsu.edu return fault; 766019Shines@cs.fsu.edu } 776019Shines@cs.fsu.edu}}; 786019Shines@cs.fsu.edu 796019Shines@cs.fsu.edudef template FloatDoubleDecode {{ 806019Shines@cs.fsu.edu { 816019Shines@cs.fsu.edu ArmStaticInst *i = NULL; 826019Shines@cs.fsu.edu switch (OPCODE_19 << 1 | OPCODE_7) 836019Shines@cs.fsu.edu { 846019Shines@cs.fsu.edu case 0: 856019Shines@cs.fsu.edu i = (ArmStaticInst *)new %(class_name)sS(machInst); 866019Shines@cs.fsu.edu break; 876019Shines@cs.fsu.edu case 1: 886019Shines@cs.fsu.edu i = (ArmStaticInst *)new %(class_name)sD(machInst); 896019Shines@cs.fsu.edu break; 906019Shines@cs.fsu.edu case 2: 916019Shines@cs.fsu.edu case 3: 926019Shines@cs.fsu.edu default: 936019Shines@cs.fsu.edu panic("Cannot decode float/double nature of the instruction"); 946019Shines@cs.fsu.edu } 956019Shines@cs.fsu.edu return i; 966019Shines@cs.fsu.edu } 976019Shines@cs.fsu.edu}}; 986019Shines@cs.fsu.edu 996019Shines@cs.fsu.edu// Primary format for float point operate instructions: 1006019Shines@cs.fsu.edudef format FloatOp(code, *flags) {{ 1016019Shines@cs.fsu.edu orig_code = code 1026019Shines@cs.fsu.edu 1036019Shines@cs.fsu.edu cblk = code 1046243Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'FPAOp', 1056243Sgblack@eecs.umich.edu {"code": cblk, 1066243Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1076243Sgblack@eecs.umich.edu flags) 1086019Shines@cs.fsu.edu header_output = BasicDeclare.subst(iop) 1096019Shines@cs.fsu.edu decoder_output = BasicConstructor.subst(iop) 1106019Shines@cs.fsu.edu exec_output = FPAExecute.subst(iop) 1116019Shines@cs.fsu.edu 1126019Shines@cs.fsu.edu sng_cblk = code 1136243Sgblack@eecs.umich.edu sng_iop = InstObjParams(name, Name+'S', 'FPAOp', 1146243Sgblack@eecs.umich.edu {"code": sng_cblk, 1156243Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1166243Sgblack@eecs.umich.edu flags) 1176019Shines@cs.fsu.edu header_output += BasicDeclare.subst(sng_iop) 1186019Shines@cs.fsu.edu decoder_output += BasicConstructor.subst(sng_iop) 1196019Shines@cs.fsu.edu exec_output += FPAExecute.subst(sng_iop) 1206019Shines@cs.fsu.edu 1216019Shines@cs.fsu.edu dbl_code = re.sub(r'\.sf', '.df', orig_code) 1226019Shines@cs.fsu.edu 1236019Shines@cs.fsu.edu dbl_cblk = dbl_code 1246243Sgblack@eecs.umich.edu dbl_iop = InstObjParams(name, Name+'D', 'FPAOp', 1256243Sgblack@eecs.umich.edu {"code": dbl_cblk, 1266243Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1276243Sgblack@eecs.umich.edu flags) 1286019Shines@cs.fsu.edu header_output += BasicDeclare.subst(dbl_iop) 1296019Shines@cs.fsu.edu decoder_output += BasicConstructor.subst(dbl_iop) 1306019Shines@cs.fsu.edu exec_output += FPAExecute.subst(dbl_iop) 1316019Shines@cs.fsu.edu 1326019Shines@cs.fsu.edu decode_block = FloatDoubleDecode.subst(iop) 1336019Shines@cs.fsu.edu}}; 1346019Shines@cs.fsu.edu 1356019Shines@cs.fsu.edulet {{ 1366019Shines@cs.fsu.edu calcFPCcCode = ''' 1376019Shines@cs.fsu.edu uint16_t _in, _iz, _ic, _iv; 1386019Shines@cs.fsu.edu 1396019Shines@cs.fsu.edu _in = %(fReg1)s < %(fReg2)s; 1406019Shines@cs.fsu.edu _iz = %(fReg1)s == %(fReg2)s; 1416019Shines@cs.fsu.edu _ic = %(fReg1)s >= %(fReg2)s; 1426019Shines@cs.fsu.edu _iv = (isnan(%(fReg1)s) || isnan(%(fReg2)s)) & 1; 1436019Shines@cs.fsu.edu 1446019Shines@cs.fsu.edu Cpsr = _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 | 1456019Shines@cs.fsu.edu (Cpsr & 0x0FFFFFFF); 1466019Shines@cs.fsu.edu ''' 1476019Shines@cs.fsu.edu}}; 1486019Shines@cs.fsu.edu 1496019Shines@cs.fsu.edudef format FloatCmp(fReg1, fReg2, *flags) {{ 1506019Shines@cs.fsu.edu code = calcFPCcCode % vars() 1516243Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'FPAOp', 1526243Sgblack@eecs.umich.edu {"code": code, 1536243Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1546243Sgblack@eecs.umich.edu flags) 1556019Shines@cs.fsu.edu header_output = BasicDeclare.subst(iop) 1566019Shines@cs.fsu.edu decoder_output = BasicConstructor.subst(iop) 1576019Shines@cs.fsu.edu decode_block = BasicDecode.subst(iop) 1586019Shines@cs.fsu.edu exec_output = FPAExecute.subst(iop) 1596019Shines@cs.fsu.edu}}; 1606019Shines@cs.fsu.edu 1616019Shines@cs.fsu.edu 162