misc64.isa revision 11576
12810SN/A// -*- mode:c++ -*-
212724Snikos.nikoleris@arm.com
38856Sandreas.hansson@arm.com// Copyright (c) 2011-2013, 2016 ARM Limited
48856Sandreas.hansson@arm.com// All rights reserved
58856Sandreas.hansson@arm.com//
68856Sandreas.hansson@arm.com// The license below extends only to copyright in the software and shall
78856Sandreas.hansson@arm.com// not be construed as granting a license to any other intellectual
88856Sandreas.hansson@arm.com// property including but not limited to intellectual property relating
98856Sandreas.hansson@arm.com// to a hardware implementation of the functionality of the software
108856Sandreas.hansson@arm.com// licensed hereunder.  You may use the software subject to the license
118856Sandreas.hansson@arm.com// terms below provided that you ensure that this notice is replicated
128856Sandreas.hansson@arm.com// unmodified and in its entirety in all distributions of the software,
138856Sandreas.hansson@arm.com// modified or unmodified, in source code or in binary form.
142810SN/A//
152810SN/A// Redistribution and use in source and binary forms, with or without
162810SN/A// modification, are permitted provided that the following conditions are
172810SN/A// met: redistributions of source code must retain the above copyright
182810SN/A// notice, this list of conditions and the following disclaimer;
192810SN/A// redistributions in binary form must reproduce the above copyright
202810SN/A// notice, this list of conditions and the following disclaimer in the
212810SN/A// documentation and/or other materials provided with the distribution;
222810SN/A// neither the name of the copyright holders nor the names of its
232810SN/A// contributors may be used to endorse or promote products derived from
242810SN/A// this software without specific prior written permission.
252810SN/A//
262810SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
272810SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
282810SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
292810SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
302810SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
312810SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
322810SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
332810SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
342810SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
352810SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
362810SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
372810SN/A//
382810SN/A// Authors: Gabe Black
392810SN/A
402810SN/Alet {{
4112724Snikos.nikoleris@arm.com    svcCode = '''
422810SN/A    fault = std::make_shared<SupervisorCall>(machInst, bits(machInst, 20, 5));
432810SN/A    '''
442810SN/A
452810SN/A    svcIop = InstObjParams("svc", "Svc64", "ArmStaticInst",
462810SN/A                           svcCode, ["IsSyscall", "IsNonSpeculative",
472810SN/A                                     "IsSerializeAfter"])
482810SN/A    header_output = BasicDeclare.subst(svcIop)
4911486Snikos.nikoleris@arm.com    decoder_output = BasicConstructor64.subst(svcIop)
5011486Snikos.nikoleris@arm.com    exec_output = BasicExecute.subst(svcIop)
5112724Snikos.nikoleris@arm.com
5212724Snikos.nikoleris@arm.com    hvcCode = '''
538232Snate@binkert.org    SCR scr = Scr64;
5412724Snikos.nikoleris@arm.com
5513222Sodanrc@yahoo.com.br    if (!ArmSystem::haveVirtualization(xc->tcBase()) ||
5612724Snikos.nikoleris@arm.com        (ArmSystem::haveSecurity(xc->tcBase()) && !scr.hce)) {
5711486Snikos.nikoleris@arm.com        fault = disabledFault();
5812724Snikos.nikoleris@arm.com    } else {
5912724Snikos.nikoleris@arm.com        fault = std::make_shared<HypervisorCall>(machInst, bits(machInst, 20, 5));
6012724Snikos.nikoleris@arm.com    }
6113352Snikos.nikoleris@arm.com    '''
6212724Snikos.nikoleris@arm.com
6312724Snikos.nikoleris@arm.com    hvcIop = InstObjParams("hvc", "Hvc64", "ArmStaticInst",
6412724Snikos.nikoleris@arm.com                           hvcCode, ["IsSyscall", "IsNonSpeculative",
6512724Snikos.nikoleris@arm.com                                     "IsSerializeAfter"])
662810SN/A    header_output += BasicDeclare.subst(hvcIop)
672810SN/A    decoder_output += BasicConstructor64.subst(hvcIop)
682810SN/A    exec_output += BasicExecute.subst(hvcIop)
698856Sandreas.hansson@arm.com
708856Sandreas.hansson@arm.com    # @todo: extend to take into account Virtualization.
718856Sandreas.hansson@arm.com    smcCode = '''
7213564Snikos.nikoleris@arm.com    SCR scr = Scr64;
7313564Snikos.nikoleris@arm.com    CPSR cpsr = Cpsr;
7412084Sspwilson2@wisc.edu
7512084Sspwilson2@wisc.edu    if (!ArmSystem::haveSecurity(xc->tcBase()) || inUserMode(cpsr) || scr.smd) {
768856Sandreas.hansson@arm.com        fault = disabledFault();
778856Sandreas.hansson@arm.com    } else {
784475SN/A        fault = std::make_shared<SecureMonitorCall>(machInst);
7911053Sandreas.hansson@arm.com    }
805034SN/A    '''
8112724Snikos.nikoleris@arm.com
8212724Snikos.nikoleris@arm.com    smcIop = InstObjParams("smc", "Smc64", "ArmStaticInst",
8311377Sandreas.hansson@arm.com                           smcCode, ["IsNonSpeculative", "IsSerializeAfter"])
8411377Sandreas.hansson@arm.com    header_output += BasicDeclare.subst(smcIop)
8512724Snikos.nikoleris@arm.com    decoder_output += BasicConstructor64.subst(smcIop)
8612724Snikos.nikoleris@arm.com    exec_output += BasicExecute.subst(smcIop)
8713352Snikos.nikoleris@arm.com
8812724Snikos.nikoleris@arm.com    def subst(templateBase, iop):
8912724Snikos.nikoleris@arm.com        global header_output, decoder_output, exec_output
9012724Snikos.nikoleris@arm.com        header_output += eval(templateBase + "Declare").subst(iop)
9112724Snikos.nikoleris@arm.com        decoder_output += eval(templateBase + "Constructor").subst(iop)
9212724Snikos.nikoleris@arm.com        exec_output += BasicExecute.subst(iop)
9311053Sandreas.hansson@arm.com
9411722Ssophiane.senni@gmail.com    bfmMaskCode = '''
9511722Ssophiane.senni@gmail.com    uint64_t bitMask;
9611722Ssophiane.senni@gmail.com    int diff = imm2 - imm1;
9711722Ssophiane.senni@gmail.com    if (imm1 <= imm2) {
989263Smrinmoy.ghosh@arm.com        bitMask = mask(diff + 1);
9913418Sodanrc@yahoo.com.br    } else {
1005034SN/A        bitMask = mask(imm2 + 1);
10111331Sandreas.hansson@arm.com        bitMask = (bitMask >> imm1) | (bitMask << (intWidth - imm1));
10212724Snikos.nikoleris@arm.com        diff += intWidth;
10310884Sandreas.hansson@arm.com    }
1044626SN/A    uint64_t topBits M5_VAR_USED = ~mask(diff+1);
10510360Sandreas.hansson@arm.com    uint64_t result = imm1 == 0 ? Op164 :
10611484Snikos.nikoleris@arm.com                      (Op164 >> imm1) | (Op164 << (intWidth - imm1));
1075034SN/A    result &= bitMask;
1088883SAli.Saidi@ARM.com    '''
1098833Sdam.sunwoo@arm.com
1104458SN/A    bfmCode = bfmMaskCode + 'Dest64 = result | (Dest64 & ~bitMask);'
11111377Sandreas.hansson@arm.com    bfmIop = InstObjParams("bfm", "Bfm64", "RegRegImmImmOp64", bfmCode);
11211377Sandreas.hansson@arm.com    subst("RegRegImmImmOp64", bfmIop)
11311377Sandreas.hansson@arm.com
11411377Sandreas.hansson@arm.com    ubfmCode = bfmMaskCode + 'Dest64 = result;'
11511377Sandreas.hansson@arm.com    ubfmIop = InstObjParams("ubfm", "Ubfm64", "RegRegImmImmOp64", ubfmCode);
11611377Sandreas.hansson@arm.com    subst("RegRegImmImmOp64", ubfmIop)
11711331Sandreas.hansson@arm.com
11811331Sandreas.hansson@arm.com    sbfmCode = bfmMaskCode + \
11912724Snikos.nikoleris@arm.com        'Dest64 = result | (bits(Op164, imm2) ? topBits : 0);'
12012843Srmk35@cl.cam.ac.uk    sbfmIop = InstObjParams("sbfm", "Sbfm64", "RegRegImmImmOp64", sbfmCode);
12112724Snikos.nikoleris@arm.com    subst("RegRegImmImmOp64", sbfmIop)
12213419Sodanrc@yahoo.com.br
12312724Snikos.nikoleris@arm.com    extrCode = '''
12412724Snikos.nikoleris@arm.com        if (imm == 0) {
12512724Snikos.nikoleris@arm.com            Dest64 = Op264;
12612724Snikos.nikoleris@arm.com        } else {
12712724Snikos.nikoleris@arm.com            Dest64 = (Op164 << (intWidth - imm)) | (Op264 >> imm);
12812724Snikos.nikoleris@arm.com        }
12912724Snikos.nikoleris@arm.com    '''
1302810SN/A    extrIop = InstObjParams("extr", "Extr64", "RegRegRegImmOp64", extrCode);
1312810SN/A    subst("RegRegRegImmOp64", extrIop);
1323013SN/A
1338856Sandreas.hansson@arm.com    unknownCode = '''
1342810SN/A            return std::make_shared<UndefinedInstruction>(machInst, true);
1353013SN/A    '''
13610714Sandreas.hansson@arm.com    unknown64Iop = InstObjParams("unknown", "Unknown64", "UnknownOp64",
1372810SN/A                                 unknownCode)
1389614Srene.dejong@arm.com    header_output += BasicDeclare.subst(unknown64Iop)
1399614Srene.dejong@arm.com    decoder_output += BasicConstructor64.subst(unknown64Iop)
1409614Srene.dejong@arm.com    exec_output += BasicExecute.subst(unknown64Iop)
14110345SCurtis.Dunham@arm.com
14210714Sandreas.hansson@arm.com    isbIop = InstObjParams("isb", "Isb64", "ArmStaticInst",
14310345SCurtis.Dunham@arm.com                           "fault = std::make_shared<FlushPipe>();",
1449614Srene.dejong@arm.com                           ['IsSerializeAfter'])
1452810SN/A    header_output += BasicDeclare.subst(isbIop)
1462810SN/A    decoder_output += BasicConstructor64.subst(isbIop)
1472810SN/A    exec_output += BasicExecute.subst(isbIop)
1488856Sandreas.hansson@arm.com
1492810SN/A    dsbIop = InstObjParams("dsb", "Dsb64", "ArmStaticInst",
1503013SN/A                           "fault = std::make_shared<FlushPipe>();",
15110714Sandreas.hansson@arm.com                           ['IsMemBarrier', 'IsSerializeAfter'])
1523013SN/A    header_output += BasicDeclare.subst(dsbIop)
1538856Sandreas.hansson@arm.com    decoder_output += BasicConstructor64.subst(dsbIop)
15410714Sandreas.hansson@arm.com    exec_output += BasicExecute.subst(dsbIop)
1558922Swilliam.wang@arm.com
1562897SN/A    dmbIop = InstObjParams("dmb", "Dmb64", "ArmStaticInst", "",
1572810SN/A                           ['IsMemBarrier'])
1582810SN/A    header_output += BasicDeclare.subst(dmbIop)
15910344Sandreas.hansson@arm.com    decoder_output += BasicConstructor64.subst(dmbIop)
16010344Sandreas.hansson@arm.com    exec_output += BasicExecute.subst(dmbIop)
16110344Sandreas.hansson@arm.com
16210714Sandreas.hansson@arm.com    clrexIop = InstObjParams("clrex", "Clrex64", "ArmStaticInst",
16310344Sandreas.hansson@arm.com                             "LLSCLock = 0;")
16410344Sandreas.hansson@arm.com    header_output += BasicDeclare.subst(clrexIop)
16510344Sandreas.hansson@arm.com    decoder_output += BasicConstructor64.subst(clrexIop)
16610713Sandreas.hansson@arm.com    exec_output += BasicExecute.subst(clrexIop)
16710344Sandreas.hansson@arm.com}};
1682844SN/A