pred.isa revision 6265
15409Sgblack@eecs.umich.edu// -*- mode:c++ -*-
24519Sgblack@eecs.umich.edu
34519Sgblack@eecs.umich.edu// Copyright (c) 2007-2008 The Florida State University
44519Sgblack@eecs.umich.edu// All rights reserved.
54519Sgblack@eecs.umich.edu//
64519Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
74519Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
84519Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
94519Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
104519Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
114519Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
124519Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
134519Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
144519Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
154519Sgblack@eecs.umich.edu// this software without specific prior written permission.
164519Sgblack@eecs.umich.edu//
174519Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
184519Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
194519Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
204519Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
214519Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
224519Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
234519Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
244519Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
254519Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
264519Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
274519Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284519Sgblack@eecs.umich.edu//
294519Sgblack@eecs.umich.edu// Authors: Stephen Hines
304519Sgblack@eecs.umich.edu
314519Sgblack@eecs.umich.edu////////////////////////////////////////////////////////////////////
324519Sgblack@eecs.umich.edu//
334519Sgblack@eecs.umich.edu// Predicated Instruction Execution
344519Sgblack@eecs.umich.edu//
354519Sgblack@eecs.umich.edu
364519Sgblack@eecs.umich.edulet {{
374519Sgblack@eecs.umich.edu    predicateTest = 'testPredicate(Cpsr, condCode)'
384519Sgblack@eecs.umich.edu}};
394519Sgblack@eecs.umich.edu
404519Sgblack@eecs.umich.edudef template PredOpExecute {{
414519Sgblack@eecs.umich.edu    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
424519Sgblack@eecs.umich.edu    {
434519Sgblack@eecs.umich.edu        Fault fault = NoFault;
444519Sgblack@eecs.umich.edu        %(op_decl)s;
454519Sgblack@eecs.umich.edu        %(op_rd)s;
464519Sgblack@eecs.umich.edu
474519Sgblack@eecs.umich.edu        if (%(predicate_test)s)
484519Sgblack@eecs.umich.edu        {
494519Sgblack@eecs.umich.edu            %(code)s;
504519Sgblack@eecs.umich.edu            if (fault == NoFault)
514519Sgblack@eecs.umich.edu            {
524519Sgblack@eecs.umich.edu                %(op_wb)s;
534519Sgblack@eecs.umich.edu            }
544519Sgblack@eecs.umich.edu        }
554519Sgblack@eecs.umich.edu
564519Sgblack@eecs.umich.edu        return fault;
574519Sgblack@eecs.umich.edu    }
584519Sgblack@eecs.umich.edu}};
594519Sgblack@eecs.umich.edu
604519Sgblack@eecs.umich.edudef template DataDecode {{
614519Sgblack@eecs.umich.edu    if (machInst.opcode4 == 0) {
624519Sgblack@eecs.umich.edu        if (machInst.sField == 0)
634519Sgblack@eecs.umich.edu            return new %(class_name)sImm(machInst);
644519Sgblack@eecs.umich.edu        else
654519Sgblack@eecs.umich.edu            return new %(class_name)sImmCc(machInst);
664519Sgblack@eecs.umich.edu    } else {
674519Sgblack@eecs.umich.edu        if (machInst.sField == 0)
684809Sgblack@eecs.umich.edu            return new %(class_name)s(machInst);
694519Sgblack@eecs.umich.edu        else
704519Sgblack@eecs.umich.edu            return new %(class_name)sCc(machInst);
714688Sgblack@eecs.umich.edu    }
724688Sgblack@eecs.umich.edu}};
734688Sgblack@eecs.umich.edu
744688Sgblack@eecs.umich.edulet {{
754688Sgblack@eecs.umich.edu
764688Sgblack@eecs.umich.edu    calcCcCode = '''
774708Sgblack@eecs.umich.edu        uint16_t _ic, _iv, _iz, _in;
784708Sgblack@eecs.umich.edu
794708Sgblack@eecs.umich.edu        _in = (resTemp >> 31) & 1;
804708Sgblack@eecs.umich.edu        _iz = (resTemp == 0);
814519Sgblack@eecs.umich.edu        _iv = %(ivValue)s & 1;
824519Sgblack@eecs.umich.edu        _ic = %(icValue)s & 1;
834519Sgblack@eecs.umich.edu
844519Sgblack@eecs.umich.edu        Cpsr =  _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 |
854519Sgblack@eecs.umich.edu            (Cpsr & 0x0FFFFFFF);
864519Sgblack@eecs.umich.edu
874519Sgblack@eecs.umich.edu        DPRINTF(Arm, "in = %%d\\n", _in);
884519Sgblack@eecs.umich.edu        DPRINTF(Arm, "iz = %%d\\n", _iz);
894519Sgblack@eecs.umich.edu        DPRINTF(Arm, "ic = %%d\\n", _ic);
904519Sgblack@eecs.umich.edu        DPRINTF(Arm, "iv = %%d\\n", _iv);
914519Sgblack@eecs.umich.edu        '''
924951Sgblack@eecs.umich.edu
934519Sgblack@eecs.umich.edu}};
944519Sgblack@eecs.umich.edu
954519Sgblack@eecs.umich.edudef format DataOp(code, icValue, ivValue) {{
964519Sgblack@eecs.umich.edu    code += "resTemp = resTemp;"
974519Sgblack@eecs.umich.edu    regCode = re.sub(r'op2', 'shift_rm_rs(Rm, Rs, \
984519Sgblack@eecs.umich.edu                              shift, Cpsr<29:0>)', code)
994688Sgblack@eecs.umich.edu    immCode = re.sub(r'op2', 'shift_rm_imm(Rm, shift_size, \
1004688Sgblack@eecs.umich.edu                              shift, Cpsr<29:0>)', code)
1014688Sgblack@eecs.umich.edu    regIop = InstObjParams(name, Name, 'PredIntOp',
1024688Sgblack@eecs.umich.edu                           {"code": regCode,
1034688Sgblack@eecs.umich.edu                            "predicate_test": predicateTest})
1044688Sgblack@eecs.umich.edu    immIop = InstObjParams(name, Name + "Imm", 'PredIntOp',
1054708Sgblack@eecs.umich.edu                           {"code": immCode,
1064708Sgblack@eecs.umich.edu                            "predicate_test": predicateTest})
1074708Sgblack@eecs.umich.edu    regCcIop = InstObjParams(name, Name + "Cc", 'PredIntOp',
1084708Sgblack@eecs.umich.edu                             {"code": regCode + calcCcCode % vars(),
1094519Sgblack@eecs.umich.edu                              "predicate_test": predicateTest})
1104519Sgblack@eecs.umich.edu    immCcIop = InstObjParams(name, Name + "ImmCc", 'PredIntOp',
1114519Sgblack@eecs.umich.edu                             {"code": immCode + calcCcCode % vars(),
1124519Sgblack@eecs.umich.edu                              "predicate_test": predicateTest})
1134519Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(regIop) + \
1144519Sgblack@eecs.umich.edu                    BasicDeclare.subst(immIop) + \
1154519Sgblack@eecs.umich.edu                    BasicDeclare.subst(regCcIop) + \
1164519Sgblack@eecs.umich.edu                    BasicDeclare.subst(immCcIop)
1174519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(regIop) + \
1184519Sgblack@eecs.umich.edu                     BasicConstructor.subst(immIop) + \
1194519Sgblack@eecs.umich.edu                     BasicConstructor.subst(regCcIop) + \
1204519Sgblack@eecs.umich.edu                     BasicConstructor.subst(immCcIop)
1214519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(regIop) + \
1224519Sgblack@eecs.umich.edu                  PredOpExecute.subst(immIop) + \
1234519Sgblack@eecs.umich.edu                  PredOpExecute.subst(regCcIop) + \
1244519Sgblack@eecs.umich.edu                  PredOpExecute.subst(immCcIop)
1254519Sgblack@eecs.umich.edu    decode_block = DataDecode.subst(regIop)
1264519Sgblack@eecs.umich.edu}};
1274519Sgblack@eecs.umich.edu
1284519Sgblack@eecs.umich.edudef format PredOp(code, *opt_flags) {{
1294519Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'PredOp',
1304712Sgblack@eecs.umich.edu                        {"code": code,
1314519Sgblack@eecs.umich.edu                         "predicate_test": predicateTest},
1324519Sgblack@eecs.umich.edu                        opt_flags)
1334519Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
1344519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
1354712Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1364519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(iop)
1374519Sgblack@eecs.umich.edu}};
1384519Sgblack@eecs.umich.edu
1394519Sgblack@eecs.umich.edudef format PredImmOp(code, *opt_flags) {{
1404519Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'PredImmOp',
1414519Sgblack@eecs.umich.edu                        {"code": code,
1424519Sgblack@eecs.umich.edu                         "predicate_test": predicateTest},
1434951Sgblack@eecs.umich.edu                        opt_flags)
1444519Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
1454519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
1464519Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1474519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(iop)
1484519Sgblack@eecs.umich.edu}};
1494951Sgblack@eecs.umich.edu
1504519Sgblack@eecs.umich.edudef format PredImmOpCc(code, icValue, ivValue, *opt_flags) {{
1514519Sgblack@eecs.umich.edu    ccCode = calcCcCode % vars()
1524951Sgblack@eecs.umich.edu    code += ccCode;
1534712Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'PredImmOp',
1544519Sgblack@eecs.umich.edu                        {"code": code,
1554951Sgblack@eecs.umich.edu                         "cc_code": ccCode,
1564519Sgblack@eecs.umich.edu                         "predicate_test": predicateTest},
1574951Sgblack@eecs.umich.edu                        opt_flags)
1584712Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
1594519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
1604519Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1614519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(iop)
1624519Sgblack@eecs.umich.edu}};
1634519Sgblack@eecs.umich.edu
1644519Sgblack@eecs.umich.edudef format PredIntOp(code, *opt_flags) {{
1654519Sgblack@eecs.umich.edu    new_code = ArmGenericCodeSubs(code)
1664519Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'PredIntOp',
1674519Sgblack@eecs.umich.edu                        {"code": new_code,
1684519Sgblack@eecs.umich.edu                         "predicate_test": predicateTest},
1694519Sgblack@eecs.umich.edu                        opt_flags)
1704519Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
1714519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
1724519Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1734519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(iop)
1744712Sgblack@eecs.umich.edu}};
1754519Sgblack@eecs.umich.edu
1764581Sgblack@eecs.umich.edudef format PredIntOpCc(code, icValue, ivValue, *opt_flags) {{
1774688Sgblack@eecs.umich.edu    ccCode = calcCcCode % vars()
1784581Sgblack@eecs.umich.edu    code += ccCode;
1794519Sgblack@eecs.umich.edu    new_code = ArmGenericCodeSubs(code)
1804519Sgblack@eecs.umich.edu    iop = InstObjParams(name, Name, 'PredIntOp',
1814519Sgblack@eecs.umich.edu                        {"code": new_code,
1824519Sgblack@eecs.umich.edu                         "cc_code": ccCode,
1834519Sgblack@eecs.umich.edu                         "predicate_test": predicateTest},
1844519Sgblack@eecs.umich.edu                        opt_flags)
1854519Sgblack@eecs.umich.edu    header_output = BasicDeclare.subst(iop)
1864519Sgblack@eecs.umich.edu    decoder_output = BasicConstructor.subst(iop)
1874712Sgblack@eecs.umich.edu    decode_block = BasicDecode.subst(iop)
1884519Sgblack@eecs.umich.edu    exec_output = PredOpExecute.subst(iop)
1894581Sgblack@eecs.umich.edu}};
1904688Sgblack@eecs.umich.edu
1914581Sgblack@eecs.umich.edu