fp.isa revision 6243
1// -*- mode:c++ -*- 2 3// Copyright (c) 2007-2008 The Florida State University 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer; 10// redistributions in binary form must reproduce the above copyright 11// notice, this list of conditions and the following disclaimer in the 12// documentation and/or other materials provided with the distribution; 13// neither the name of the copyright holders nor the names of its 14// contributors may be used to endorse or promote products derived from 15// this software without specific prior written permission. 16// 17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28// 29// Authors: Stephen Hines 30 31//////////////////////////////////////////////////////////////////// 32// 33// Floating Point operate instructions 34// 35 36output header {{ 37 38 /** 39 * Base class for FP operations. 40 */ 41 class FPAOp : public PredOp 42 { 43 protected: 44 45 /// Constructor 46 FPAOp(const char *mnem, MachInst _machInst, OpClass __opClass) : PredOp(mnem, _machInst, __opClass) 47 { 48 } 49 50 //std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 51 }; 52 53}}; 54 55output exec {{ 56}}; 57 58def template FPAExecute {{ 59 Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 60 { 61 Fault fault = NoFault; 62 63 %(fp_enable_check)s; 64 65 %(op_decl)s; 66 %(op_rd)s; 67 68 if (%(predicate_test)s) { 69 %(code)s; 70 if (fault == NoFault) { 71 %(op_wb)s; 72 } 73 } 74 75 return fault; 76 } 77}}; 78 79def template FloatDoubleDecode {{ 80 { 81 ArmStaticInst *i = NULL; 82 switch (OPCODE_19 << 1 | OPCODE_7) 83 { 84 case 0: 85 i = (ArmStaticInst *)new %(class_name)sS(machInst); 86 break; 87 case 1: 88 i = (ArmStaticInst *)new %(class_name)sD(machInst); 89 break; 90 case 2: 91 case 3: 92 default: 93 panic("Cannot decode float/double nature of the instruction"); 94 } 95 return i; 96 } 97}}; 98 99// Primary format for float point operate instructions: 100def format FloatOp(code, *flags) {{ 101 orig_code = code 102 103 cblk = code 104 iop = InstObjParams(name, Name, 'FPAOp', 105 {"code": cblk, 106 "predicate_test": predicateTest}, 107 flags) 108 header_output = BasicDeclare.subst(iop) 109 decoder_output = BasicConstructor.subst(iop) 110 exec_output = FPAExecute.subst(iop) 111 112 sng_cblk = code 113 sng_iop = InstObjParams(name, Name+'S', 'FPAOp', 114 {"code": sng_cblk, 115 "predicate_test": predicateTest}, 116 flags) 117 header_output += BasicDeclare.subst(sng_iop) 118 decoder_output += BasicConstructor.subst(sng_iop) 119 exec_output += FPAExecute.subst(sng_iop) 120 121 dbl_code = re.sub(r'\.sf', '.df', orig_code) 122 123 dbl_cblk = dbl_code 124 dbl_iop = InstObjParams(name, Name+'D', 'FPAOp', 125 {"code": dbl_cblk, 126 "predicate_test": predicateTest}, 127 flags) 128 header_output += BasicDeclare.subst(dbl_iop) 129 decoder_output += BasicConstructor.subst(dbl_iop) 130 exec_output += FPAExecute.subst(dbl_iop) 131 132 decode_block = FloatDoubleDecode.subst(iop) 133}}; 134 135let {{ 136 calcFPCcCode = ''' 137 uint16_t _in, _iz, _ic, _iv; 138 139 _in = %(fReg1)s < %(fReg2)s; 140 _iz = %(fReg1)s == %(fReg2)s; 141 _ic = %(fReg1)s >= %(fReg2)s; 142 _iv = (isnan(%(fReg1)s) || isnan(%(fReg2)s)) & 1; 143 144 Cpsr = _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 | 145 (Cpsr & 0x0FFFFFFF); 146 ''' 147}}; 148 149def format FloatCmp(fReg1, fReg2, *flags) {{ 150 code = calcFPCcCode % vars() 151 iop = InstObjParams(name, Name, 'FPAOp', 152 {"code": code, 153 "predicate_test": predicateTest}, 154 flags) 155 header_output = BasicDeclare.subst(iop) 156 decoder_output = BasicConstructor.subst(iop) 157 decode_block = BasicDecode.subst(iop) 158 exec_output = FPAExecute.subst(iop) 159}}; 160 161 162