pred.isa revision 6423:727622fa50e5
17119Sgblack@eecs.umich.edu// -*- mode:c++ -*- 27119Sgblack@eecs.umich.edu 37119Sgblack@eecs.umich.edu// Copyright (c) 2007-2008 The Florida State University 47119Sgblack@eecs.umich.edu// All rights reserved. 57119Sgblack@eecs.umich.edu// 67119Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 77119Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 87119Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 97119Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 107119Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 117119Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 127119Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 137119Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 147119Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 157119Sgblack@eecs.umich.edu// this software without specific prior written permission. 167119Sgblack@eecs.umich.edu// 177119Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 187119Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 197119Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 207119Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 217119Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 227119Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 237119Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 247119Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 257119Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 267119Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 277119Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 287119Sgblack@eecs.umich.edu// 297119Sgblack@eecs.umich.edu// Authors: Stephen Hines 307119Sgblack@eecs.umich.edu 317119Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 327119Sgblack@eecs.umich.edu// 337119Sgblack@eecs.umich.edu// Predicated Instruction Execution 347119Sgblack@eecs.umich.edu// 357119Sgblack@eecs.umich.edu 367119Sgblack@eecs.umich.edulet {{ 377119Sgblack@eecs.umich.edu predicateTest = 'testPredicate(Cpsr, condCode)' 387119Sgblack@eecs.umich.edu}}; 397119Sgblack@eecs.umich.edu 407119Sgblack@eecs.umich.edudef template PredOpExecute {{ 417119Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 427119Sgblack@eecs.umich.edu { 437119Sgblack@eecs.umich.edu Fault fault = NoFault; 447119Sgblack@eecs.umich.edu uint64_t resTemp = 0; 457119Sgblack@eecs.umich.edu resTemp = resTemp; 467119Sgblack@eecs.umich.edu %(op_decl)s; 477119Sgblack@eecs.umich.edu %(op_rd)s; 487119Sgblack@eecs.umich.edu 497119Sgblack@eecs.umich.edu if (%(predicate_test)s) 507119Sgblack@eecs.umich.edu { 517119Sgblack@eecs.umich.edu %(code)s; 527119Sgblack@eecs.umich.edu if (fault == NoFault) 537119Sgblack@eecs.umich.edu { 547119Sgblack@eecs.umich.edu %(op_wb)s; 557119Sgblack@eecs.umich.edu } 567119Sgblack@eecs.umich.edu } 577119Sgblack@eecs.umich.edu 587119Sgblack@eecs.umich.edu return fault; 597119Sgblack@eecs.umich.edu } 607119Sgblack@eecs.umich.edu}}; 617119Sgblack@eecs.umich.edu 627119Sgblack@eecs.umich.edudef template DataDecode {{ 637119Sgblack@eecs.umich.edu if (machInst.opcode4 == 0) { 647119Sgblack@eecs.umich.edu if (machInst.sField == 0) 657119Sgblack@eecs.umich.edu return new %(class_name)sImm(machInst); 667119Sgblack@eecs.umich.edu else 677119Sgblack@eecs.umich.edu return new %(class_name)sImmCc(machInst); 687119Sgblack@eecs.umich.edu } else { 697119Sgblack@eecs.umich.edu if (machInst.sField == 0) 707119Sgblack@eecs.umich.edu return new %(class_name)s(machInst); 717119Sgblack@eecs.umich.edu else 727119Sgblack@eecs.umich.edu return new %(class_name)sCc(machInst); 737119Sgblack@eecs.umich.edu } 747119Sgblack@eecs.umich.edu}}; 757119Sgblack@eecs.umich.edu 767119Sgblack@eecs.umich.edudef template DataImmDecode {{ 777119Sgblack@eecs.umich.edu if (machInst.sField == 0) 787119Sgblack@eecs.umich.edu return new %(class_name)s(machInst); 797119Sgblack@eecs.umich.edu else 807119Sgblack@eecs.umich.edu return new %(class_name)sCc(machInst); 817119Sgblack@eecs.umich.edu}}; 827119Sgblack@eecs.umich.edu 837119Sgblack@eecs.umich.edulet {{ 847119Sgblack@eecs.umich.edu 857119Sgblack@eecs.umich.edu calcCcCode = ''' 867119Sgblack@eecs.umich.edu uint16_t _ic, _iv, _iz, _in; 877119Sgblack@eecs.umich.edu 887119Sgblack@eecs.umich.edu _in = (resTemp >> 31) & 1; 897119Sgblack@eecs.umich.edu _iz = (resTemp == 0); 907119Sgblack@eecs.umich.edu _iv = %(ivValue)s & 1; 917119Sgblack@eecs.umich.edu _ic = %(icValue)s & 1; 927119Sgblack@eecs.umich.edu 937119Sgblack@eecs.umich.edu Cpsr = _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 | 947119Sgblack@eecs.umich.edu (Cpsr & 0x0FFFFFFF); 957119Sgblack@eecs.umich.edu 967119Sgblack@eecs.umich.edu DPRINTF(Arm, "in = %%d\\n", _in); 977119Sgblack@eecs.umich.edu DPRINTF(Arm, "iz = %%d\\n", _iz); 987119Sgblack@eecs.umich.edu DPRINTF(Arm, "ic = %%d\\n", _ic); 997119Sgblack@eecs.umich.edu DPRINTF(Arm, "iv = %%d\\n", _iv); 1007119Sgblack@eecs.umich.edu ''' 1017119Sgblack@eecs.umich.edu 1027119Sgblack@eecs.umich.edu}}; 1037119Sgblack@eecs.umich.edu 1047119Sgblack@eecs.umich.edulet {{ 1057119Sgblack@eecs.umich.edu def getCcCode(flagtype): 1067119Sgblack@eecs.umich.edu icReg = icImm = iv = '' 1077119Sgblack@eecs.umich.edu if flagtype == "none": 1087119Sgblack@eecs.umich.edu icReg = icImm = 'Cpsr<29:>' 1097119Sgblack@eecs.umich.edu iv = 'Cpsr<28:>' 1107119Sgblack@eecs.umich.edu elif flagtype == "add": 1117119Sgblack@eecs.umich.edu icReg = icImm = 'findCarry(32, resTemp, Rn, op2)' 1127119Sgblack@eecs.umich.edu iv = 'findOverflow(32, resTemp, Rn, op2)' 1137119Sgblack@eecs.umich.edu elif flagtype == "sub": 1147119Sgblack@eecs.umich.edu icReg = icImm ='findCarry(32, resTemp, Rn, ~op2)' 1157119Sgblack@eecs.umich.edu iv = 'findOverflow(32, resTemp, Rn, ~op2)' 1167119Sgblack@eecs.umich.edu elif flagtype == "rsb": 1177119Sgblack@eecs.umich.edu icReg = icImm = 'findCarry(32, resTemp, op2, ~Rn)' 1187119Sgblack@eecs.umich.edu iv = 'findOverflow(32, resTemp, op2, ~Rn)' 1197119Sgblack@eecs.umich.edu else: 1207119Sgblack@eecs.umich.edu icReg = 'shift_carry_rs(Rm, Rs, shift, Cpsr<29:>)' 1217119Sgblack@eecs.umich.edu icImm = 'shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)' 1227119Sgblack@eecs.umich.edu iv = 'Cpsr<28:>' 1237119Sgblack@eecs.umich.edu return (calcCcCode % {"icValue" : icReg, "ivValue" : iv}, 1247119Sgblack@eecs.umich.edu calcCcCode % {"icValue" : icImm, "ivValue" : iv}) 1257119Sgblack@eecs.umich.edu 1267119Sgblack@eecs.umich.edu def getImmCcCode(flagtype): 1277119Sgblack@eecs.umich.edu ivValue = icValue = '' 1287119Sgblack@eecs.umich.edu if flagtype == "none": 1297119Sgblack@eecs.umich.edu icValue = 'Cpsr<29:>' 1307119Sgblack@eecs.umich.edu ivValue = 'Cpsr<28:>' 1317119Sgblack@eecs.umich.edu elif flagtype == "add": 1327119Sgblack@eecs.umich.edu icValue = 'findCarry(32, resTemp, Rn, rotated_imm)' 1337119Sgblack@eecs.umich.edu ivValue = 'findOverflow(32, resTemp, Rn, rotated_imm)' 1347119Sgblack@eecs.umich.edu elif flagtype == "sub": 1357119Sgblack@eecs.umich.edu icValue = 'findCarry(32, resTemp, Rn, ~rotated_imm)' 1367119Sgblack@eecs.umich.edu ivValue = 'findOverflow(32, resTemp, Rn, ~rotated_imm)' 1377119Sgblack@eecs.umich.edu elif flagtype == "rsb": 1387119Sgblack@eecs.umich.edu icValue = 'findCarry(32, resTemp, rotated_imm, ~Rn)' 1397119Sgblack@eecs.umich.edu ivValue = 'findOverflow(32, resTemp, rotated_imm, ~Rn)' 1407119Sgblack@eecs.umich.edu else: 1417119Sgblack@eecs.umich.edu icValue = '(rotate ? rotated_carry:Cpsr<29:>)' 1427119Sgblack@eecs.umich.edu ivValue = 'Cpsr<28:>' 1437119Sgblack@eecs.umich.edu return calcCcCode % vars() 1447119Sgblack@eecs.umich.edu}}; 1457119Sgblack@eecs.umich.edu 1467119Sgblack@eecs.umich.edudef format DataOp(code, flagtype = logic) {{ 1477119Sgblack@eecs.umich.edu (regCcCode, immCcCode) = getCcCode(flagtype) 1487119Sgblack@eecs.umich.edu regCode = '''uint32_t op2 = shift_rm_rs(Rm, Rs, 1497119Sgblack@eecs.umich.edu shift, Cpsr<29:0>); 1507119Sgblack@eecs.umich.edu op2 = op2;''' + code 1517119Sgblack@eecs.umich.edu immCode = '''uint32_t op2 = shift_rm_imm(Rm, shift_size, 1527119Sgblack@eecs.umich.edu shift, Cpsr<29:0>); 1537119Sgblack@eecs.umich.edu op2 = op2;''' + code 1547119Sgblack@eecs.umich.edu regIop = InstObjParams(name, Name, 'PredIntOp', 1557119Sgblack@eecs.umich.edu {"code": regCode, 1567119Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 1577119Sgblack@eecs.umich.edu immIop = InstObjParams(name, Name + "Imm", 'PredIntOp', 1587119Sgblack@eecs.umich.edu {"code": immCode, 1597119Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 1607119Sgblack@eecs.umich.edu regCcIop = InstObjParams(name, Name + "Cc", 'PredIntOp', 1617119Sgblack@eecs.umich.edu {"code": regCode + regCcCode, 1627119Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 1637119Sgblack@eecs.umich.edu immCcIop = InstObjParams(name, Name + "ImmCc", 'PredIntOp', 1647119Sgblack@eecs.umich.edu {"code": immCode + immCcCode, 1657119Sgblack@eecs.umich.edu "predicate_test": predicateTest}) 1667119Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(regIop) + \ 1677119Sgblack@eecs.umich.edu BasicDeclare.subst(immIop) + \ 1687119Sgblack@eecs.umich.edu BasicDeclare.subst(regCcIop) + \ 1697119Sgblack@eecs.umich.edu BasicDeclare.subst(immCcIop) 1707119Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(regIop) + \ 1717119Sgblack@eecs.umich.edu BasicConstructor.subst(immIop) + \ 1727119Sgblack@eecs.umich.edu BasicConstructor.subst(regCcIop) + \ 1737119Sgblack@eecs.umich.edu BasicConstructor.subst(immCcIop) 1747119Sgblack@eecs.umich.edu exec_output = PredOpExecute.subst(regIop) + \ 1757119Sgblack@eecs.umich.edu PredOpExecute.subst(immIop) + \ 1767119Sgblack@eecs.umich.edu PredOpExecute.subst(regCcIop) + \ 1777119Sgblack@eecs.umich.edu PredOpExecute.subst(immCcIop) 1787119Sgblack@eecs.umich.edu decode_block = DataDecode.subst(regIop) 1797119Sgblack@eecs.umich.edu}}; 1807119Sgblack@eecs.umich.edu 181def format DataImmOp(code, flagtype = logic) {{ 182 code += "resTemp = resTemp;" 183 iop = InstObjParams(name, Name, 'PredImmOp', 184 {"code": code, 185 "predicate_test": predicateTest}) 186 ccIop = InstObjParams(name, Name + "Cc", 'PredImmOp', 187 {"code": code + getImmCcCode(flagtype), 188 "predicate_test": predicateTest}) 189 header_output = BasicDeclare.subst(iop) + \ 190 BasicDeclare.subst(ccIop) 191 decoder_output = BasicConstructor.subst(iop) + \ 192 BasicConstructor.subst(ccIop) 193 exec_output = PredOpExecute.subst(iop) + \ 194 PredOpExecute.subst(ccIop) 195 decode_block = DataImmDecode.subst(iop) 196}}; 197 198def format PredOp(code, *opt_flags) {{ 199 iop = InstObjParams(name, Name, 'PredOp', 200 {"code": code, 201 "predicate_test": predicateTest}, 202 opt_flags) 203 header_output = BasicDeclare.subst(iop) 204 decoder_output = BasicConstructor.subst(iop) 205 decode_block = BasicDecode.subst(iop) 206 exec_output = PredOpExecute.subst(iop) 207}}; 208 209def format PredImmOp(code, *opt_flags) {{ 210 iop = InstObjParams(name, Name, 'PredImmOp', 211 {"code": code, 212 "predicate_test": predicateTest}, 213 opt_flags) 214 header_output = BasicDeclare.subst(iop) 215 decoder_output = BasicConstructor.subst(iop) 216 decode_block = BasicDecode.subst(iop) 217 exec_output = PredOpExecute.subst(iop) 218}}; 219 220def format PredImmOpCc(code, icValue, ivValue, *opt_flags) {{ 221 ccCode = calcCcCode % vars() 222 code += ccCode; 223 iop = InstObjParams(name, Name, 'PredImmOp', 224 {"code": code, 225 "cc_code": ccCode, 226 "predicate_test": predicateTest}, 227 opt_flags) 228 header_output = BasicDeclare.subst(iop) 229 decoder_output = BasicConstructor.subst(iop) 230 decode_block = BasicDecode.subst(iop) 231 exec_output = PredOpExecute.subst(iop) 232}}; 233 234def format PredIntOp(code, *opt_flags) {{ 235 new_code = ArmGenericCodeSubs(code) 236 iop = InstObjParams(name, Name, 'PredIntOp', 237 {"code": new_code, 238 "predicate_test": predicateTest}, 239 opt_flags) 240 header_output = BasicDeclare.subst(iop) 241 decoder_output = BasicConstructor.subst(iop) 242 decode_block = BasicDecode.subst(iop) 243 exec_output = PredOpExecute.subst(iop) 244}}; 245 246def format PredIntOpCc(code, icValue, ivValue, *opt_flags) {{ 247 ccCode = calcCcCode % vars() 248 code += ccCode; 249 new_code = ArmGenericCodeSubs(code) 250 iop = InstObjParams(name, Name, 'PredIntOp', 251 {"code": new_code, 252 "cc_code": ccCode, 253 "predicate_test": predicateTest}, 254 opt_flags) 255 header_output = BasicDeclare.subst(iop) 256 decoder_output = BasicConstructor.subst(iop) 257 decode_block = BasicDecode.subst(iop) 258 exec_output = PredOpExecute.subst(iop) 259}}; 260 261