pred.isa revision 6265:154338c2c6f6
110259SAndrew.Bardsley@arm.com// -*- mode:c++ -*-
210259SAndrew.Bardsley@arm.com
310259SAndrew.Bardsley@arm.com// Copyright (c) 2007-2008 The Florida State University
410259SAndrew.Bardsley@arm.com// All rights reserved.
510259SAndrew.Bardsley@arm.com//
610259SAndrew.Bardsley@arm.com// Redistribution and use in source and binary forms, with or without
710259SAndrew.Bardsley@arm.com// modification, are permitted provided that the following conditions are
810259SAndrew.Bardsley@arm.com// met: redistributions of source code must retain the above copyright
910259SAndrew.Bardsley@arm.com// notice, this list of conditions and the following disclaimer;
1010259SAndrew.Bardsley@arm.com// redistributions in binary form must reproduce the above copyright
1110259SAndrew.Bardsley@arm.com// notice, this list of conditions and the following disclaimer in the
1210259SAndrew.Bardsley@arm.com// documentation and/or other materials provided with the distribution;
1310259SAndrew.Bardsley@arm.com// neither the name of the copyright holders nor the names of its
1410259SAndrew.Bardsley@arm.com// contributors may be used to endorse or promote products derived from
1510259SAndrew.Bardsley@arm.com// this software without specific prior written permission.
1610259SAndrew.Bardsley@arm.com//
1710259SAndrew.Bardsley@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1810259SAndrew.Bardsley@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1910259SAndrew.Bardsley@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2010259SAndrew.Bardsley@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2110259SAndrew.Bardsley@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2210259SAndrew.Bardsley@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2310259SAndrew.Bardsley@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2410259SAndrew.Bardsley@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2510259SAndrew.Bardsley@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2610259SAndrew.Bardsley@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2710259SAndrew.Bardsley@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2810259SAndrew.Bardsley@arm.com//
2910259SAndrew.Bardsley@arm.com// Authors: Stephen Hines
3010259SAndrew.Bardsley@arm.com
3110259SAndrew.Bardsley@arm.com////////////////////////////////////////////////////////////////////
3210259SAndrew.Bardsley@arm.com//
3310259SAndrew.Bardsley@arm.com// Predicated Instruction Execution
3410259SAndrew.Bardsley@arm.com//
3510259SAndrew.Bardsley@arm.com
3610259SAndrew.Bardsley@arm.comlet {{
3710259SAndrew.Bardsley@arm.com    predicateTest = 'testPredicate(Cpsr, condCode)'
3810259SAndrew.Bardsley@arm.com}};
3910259SAndrew.Bardsley@arm.com
4010259SAndrew.Bardsley@arm.comdef template PredOpExecute {{
4110259SAndrew.Bardsley@arm.com    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
4210259SAndrew.Bardsley@arm.com    {
4310259SAndrew.Bardsley@arm.com        Fault fault = NoFault;
4410259SAndrew.Bardsley@arm.com        %(op_decl)s;
4510259SAndrew.Bardsley@arm.com        %(op_rd)s;
4610259SAndrew.Bardsley@arm.com
4710259SAndrew.Bardsley@arm.com        if (%(predicate_test)s)
4810259SAndrew.Bardsley@arm.com        {
4910259SAndrew.Bardsley@arm.com            %(code)s;
5010259SAndrew.Bardsley@arm.com            if (fault == NoFault)
5110259SAndrew.Bardsley@arm.com            {
5210259SAndrew.Bardsley@arm.com                %(op_wb)s;
5310259SAndrew.Bardsley@arm.com            }
5410259SAndrew.Bardsley@arm.com        }
5510259SAndrew.Bardsley@arm.com
5610259SAndrew.Bardsley@arm.com        return fault;
5710259SAndrew.Bardsley@arm.com    }
5810259SAndrew.Bardsley@arm.com}};
5910259SAndrew.Bardsley@arm.com
6010259SAndrew.Bardsley@arm.comdef template DataDecode {{
6110259SAndrew.Bardsley@arm.com    if (machInst.opcode4 == 0) {
6210259SAndrew.Bardsley@arm.com        if (machInst.sField == 0)
6310259SAndrew.Bardsley@arm.com            return new %(class_name)sImm(machInst);
6410259SAndrew.Bardsley@arm.com        else
6510259SAndrew.Bardsley@arm.com            return new %(class_name)sImmCc(machInst);
6610259SAndrew.Bardsley@arm.com    } else {
6710259SAndrew.Bardsley@arm.com        if (machInst.sField == 0)
6810259SAndrew.Bardsley@arm.com            return new %(class_name)s(machInst);
6910259SAndrew.Bardsley@arm.com        else
7010259SAndrew.Bardsley@arm.com            return new %(class_name)sCc(machInst);
7110259SAndrew.Bardsley@arm.com    }
7210259SAndrew.Bardsley@arm.com}};
7310259SAndrew.Bardsley@arm.com
7410259SAndrew.Bardsley@arm.comlet {{
7510259SAndrew.Bardsley@arm.com
7610259SAndrew.Bardsley@arm.com    calcCcCode = '''
7710259SAndrew.Bardsley@arm.com        uint16_t _ic, _iv, _iz, _in;
7810259SAndrew.Bardsley@arm.com
7910259SAndrew.Bardsley@arm.com        _in = (resTemp >> 31) & 1;
8010259SAndrew.Bardsley@arm.com        _iz = (resTemp == 0);
8110259SAndrew.Bardsley@arm.com        _iv = %(ivValue)s & 1;
8210259SAndrew.Bardsley@arm.com        _ic = %(icValue)s & 1;
8310259SAndrew.Bardsley@arm.com
8410259SAndrew.Bardsley@arm.com        Cpsr =  _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 |
8510259SAndrew.Bardsley@arm.com            (Cpsr & 0x0FFFFFFF);
8610259SAndrew.Bardsley@arm.com
8710259SAndrew.Bardsley@arm.com        DPRINTF(Arm, "in = %%d\\n", _in);
8810259SAndrew.Bardsley@arm.com        DPRINTF(Arm, "iz = %%d\\n", _iz);
8910259SAndrew.Bardsley@arm.com        DPRINTF(Arm, "ic = %%d\\n", _ic);
9010259SAndrew.Bardsley@arm.com        DPRINTF(Arm, "iv = %%d\\n", _iv);
9110259SAndrew.Bardsley@arm.com        '''
9210259SAndrew.Bardsley@arm.com
9310259SAndrew.Bardsley@arm.com}};
9410259SAndrew.Bardsley@arm.com
9510259SAndrew.Bardsley@arm.comdef format DataOp(code, icValue, ivValue) {{
9610259SAndrew.Bardsley@arm.com    code += "resTemp = resTemp;"
9710259SAndrew.Bardsley@arm.com    regCode = re.sub(r'op2', 'shift_rm_rs(Rm, Rs, \
9810259SAndrew.Bardsley@arm.com                              shift, Cpsr<29:0>)', code)
9910259SAndrew.Bardsley@arm.com    immCode = re.sub(r'op2', 'shift_rm_imm(Rm, shift_size, \
10010259SAndrew.Bardsley@arm.com                              shift, Cpsr<29:0>)', code)
10110259SAndrew.Bardsley@arm.com    regIop = InstObjParams(name, Name, 'PredIntOp',
10210259SAndrew.Bardsley@arm.com                           {"code": regCode,
10310259SAndrew.Bardsley@arm.com                            "predicate_test": predicateTest})
10410259SAndrew.Bardsley@arm.com    immIop = InstObjParams(name, Name + "Imm", 'PredIntOp',
10510259SAndrew.Bardsley@arm.com                           {"code": immCode,
10610259SAndrew.Bardsley@arm.com                            "predicate_test": predicateTest})
10710259SAndrew.Bardsley@arm.com    regCcIop = InstObjParams(name, Name + "Cc", 'PredIntOp',
10810259SAndrew.Bardsley@arm.com                             {"code": regCode + calcCcCode % vars(),
10910259SAndrew.Bardsley@arm.com                              "predicate_test": predicateTest})
11010259SAndrew.Bardsley@arm.com    immCcIop = InstObjParams(name, Name + "ImmCc", 'PredIntOp',
11110259SAndrew.Bardsley@arm.com                             {"code": immCode + calcCcCode % vars(),
11210259SAndrew.Bardsley@arm.com                              "predicate_test": predicateTest})
11310259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(regIop) + \
11410259SAndrew.Bardsley@arm.com                    BasicDeclare.subst(immIop) + \
11510259SAndrew.Bardsley@arm.com                    BasicDeclare.subst(regCcIop) + \
11610259SAndrew.Bardsley@arm.com                    BasicDeclare.subst(immCcIop)
11710259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(regIop) + \
11810259SAndrew.Bardsley@arm.com                     BasicConstructor.subst(immIop) + \
11910259SAndrew.Bardsley@arm.com                     BasicConstructor.subst(regCcIop) + \
12010259SAndrew.Bardsley@arm.com                     BasicConstructor.subst(immCcIop)
12110259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(regIop) + \
12210259SAndrew.Bardsley@arm.com                  PredOpExecute.subst(immIop) + \
12310259SAndrew.Bardsley@arm.com                  PredOpExecute.subst(regCcIop) + \
12410259SAndrew.Bardsley@arm.com                  PredOpExecute.subst(immCcIop)
12510259SAndrew.Bardsley@arm.com    decode_block = DataDecode.subst(regIop)
12610259SAndrew.Bardsley@arm.com}};
12710259SAndrew.Bardsley@arm.com
12810259SAndrew.Bardsley@arm.comdef format PredOp(code, *opt_flags) {{
12910259SAndrew.Bardsley@arm.com    iop = InstObjParams(name, Name, 'PredOp',
13010259SAndrew.Bardsley@arm.com                        {"code": code,
13110259SAndrew.Bardsley@arm.com                         "predicate_test": predicateTest},
13210259SAndrew.Bardsley@arm.com                        opt_flags)
13310259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(iop)
13410259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(iop)
13510259SAndrew.Bardsley@arm.com    decode_block = BasicDecode.subst(iop)
13610259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(iop)
13710259SAndrew.Bardsley@arm.com}};
13810259SAndrew.Bardsley@arm.com
13910259SAndrew.Bardsley@arm.comdef format PredImmOp(code, *opt_flags) {{
14010259SAndrew.Bardsley@arm.com    iop = InstObjParams(name, Name, 'PredImmOp',
14110259SAndrew.Bardsley@arm.com                        {"code": code,
14210259SAndrew.Bardsley@arm.com                         "predicate_test": predicateTest},
14310259SAndrew.Bardsley@arm.com                        opt_flags)
14410259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(iop)
14510259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(iop)
14610259SAndrew.Bardsley@arm.com    decode_block = BasicDecode.subst(iop)
14710259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(iop)
14810259SAndrew.Bardsley@arm.com}};
14910259SAndrew.Bardsley@arm.com
15010259SAndrew.Bardsley@arm.comdef format PredImmOpCc(code, icValue, ivValue, *opt_flags) {{
15110259SAndrew.Bardsley@arm.com    ccCode = calcCcCode % vars()
15210259SAndrew.Bardsley@arm.com    code += ccCode;
15310259SAndrew.Bardsley@arm.com    iop = InstObjParams(name, Name, 'PredImmOp',
15410259SAndrew.Bardsley@arm.com                        {"code": code,
15510259SAndrew.Bardsley@arm.com                         "cc_code": ccCode,
15610259SAndrew.Bardsley@arm.com                         "predicate_test": predicateTest},
15710259SAndrew.Bardsley@arm.com                        opt_flags)
15810259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(iop)
15910259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(iop)
16010259SAndrew.Bardsley@arm.com    decode_block = BasicDecode.subst(iop)
16110259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(iop)
16210259SAndrew.Bardsley@arm.com}};
16310259SAndrew.Bardsley@arm.com
16410259SAndrew.Bardsley@arm.comdef format PredIntOp(code, *opt_flags) {{
16510259SAndrew.Bardsley@arm.com    new_code = ArmGenericCodeSubs(code)
16610259SAndrew.Bardsley@arm.com    iop = InstObjParams(name, Name, 'PredIntOp',
16710259SAndrew.Bardsley@arm.com                        {"code": new_code,
16810259SAndrew.Bardsley@arm.com                         "predicate_test": predicateTest},
16910259SAndrew.Bardsley@arm.com                        opt_flags)
17010259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(iop)
17110259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(iop)
17210259SAndrew.Bardsley@arm.com    decode_block = BasicDecode.subst(iop)
17310259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(iop)
17410259SAndrew.Bardsley@arm.com}};
17510259SAndrew.Bardsley@arm.com
17610259SAndrew.Bardsley@arm.comdef format PredIntOpCc(code, icValue, ivValue, *opt_flags) {{
17710259SAndrew.Bardsley@arm.com    ccCode = calcCcCode % vars()
17810259SAndrew.Bardsley@arm.com    code += ccCode;
17910259SAndrew.Bardsley@arm.com    new_code = ArmGenericCodeSubs(code)
18010259SAndrew.Bardsley@arm.com    iop = InstObjParams(name, Name, 'PredIntOp',
18110259SAndrew.Bardsley@arm.com                        {"code": new_code,
18210259SAndrew.Bardsley@arm.com                         "cc_code": ccCode,
18310259SAndrew.Bardsley@arm.com                         "predicate_test": predicateTest},
18410259SAndrew.Bardsley@arm.com                        opt_flags)
18510259SAndrew.Bardsley@arm.com    header_output = BasicDeclare.subst(iop)
18610259SAndrew.Bardsley@arm.com    decoder_output = BasicConstructor.subst(iop)
18710259SAndrew.Bardsley@arm.com    decode_block = BasicDecode.subst(iop)
18810259SAndrew.Bardsley@arm.com    exec_output = PredOpExecute.subst(iop)
18910259SAndrew.Bardsley@arm.com}};
19010259SAndrew.Bardsley@arm.com
19110259SAndrew.Bardsley@arm.com