113170Sgiacomo.travaglini@arm.com// -*- mode:c++ -*-
213170Sgiacomo.travaglini@arm.com
313170Sgiacomo.travaglini@arm.com// Copyright (c) 2018 ARM Limited
413170Sgiacomo.travaglini@arm.com// All rights reserved
513170Sgiacomo.travaglini@arm.com//
613170Sgiacomo.travaglini@arm.com// The license below extends only to copyright in the software and shall
713170Sgiacomo.travaglini@arm.com// not be construed as granting a license to any other intellectual
813170Sgiacomo.travaglini@arm.com// property including but not limited to intellectual property relating
913170Sgiacomo.travaglini@arm.com// to a hardware implementation of the functionality of the software
1013170Sgiacomo.travaglini@arm.com// licensed hereunder.  You may use the software subject to the license
1113170Sgiacomo.travaglini@arm.com// terms below provided that you ensure that this notice is replicated
1213170Sgiacomo.travaglini@arm.com// unmodified and in its entirety in all distributions of the software,
1313170Sgiacomo.travaglini@arm.com// modified or unmodified, in source code or in binary form.
1413170Sgiacomo.travaglini@arm.com//
1513170Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
1613170Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1713170Sgiacomo.travaglini@arm.com// met: redistributions of source code must retain the above copyright
1813170Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer;
1913170Sgiacomo.travaglini@arm.com// redistributions in binary form must reproduce the above copyright
2013170Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer in the
2113170Sgiacomo.travaglini@arm.com// documentation and/or other materials provided with the distribution;
2213170Sgiacomo.travaglini@arm.com// neither the name of the copyright holders nor the names of its
2313170Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2413170Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2513170Sgiacomo.travaglini@arm.com//
2613170Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2713170Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2813170Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2913170Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3013170Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3113170Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3213170Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3313170Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3413170Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3513170Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3613170Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3713170Sgiacomo.travaglini@arm.com//
3813170Sgiacomo.travaglini@arm.com// Authors: Giacomo Travaglini
3913170Sgiacomo.travaglini@arm.com
4013170Sgiacomo.travaglini@arm.comlet {{
4113170Sgiacomo.travaglini@arm.com    header_output = '''
4213170Sgiacomo.travaglini@arm.com    StaticInstPtr
4313171Sgiacomo.travaglini@arm.com    decodeCryptoAES(ExtMachInst machInst);
4413171Sgiacomo.travaglini@arm.com
4513171Sgiacomo.travaglini@arm.com    StaticInstPtr
4613170Sgiacomo.travaglini@arm.com    decodeCryptoThreeRegSHA(ExtMachInst machInst);
4713170Sgiacomo.travaglini@arm.com
4813170Sgiacomo.travaglini@arm.com    StaticInstPtr
4913170Sgiacomo.travaglini@arm.com    decodeCryptoTwoRegSHA(ExtMachInst machInst);
5013170Sgiacomo.travaglini@arm.com    '''
5113170Sgiacomo.travaglini@arm.com
5213170Sgiacomo.travaglini@arm.com    decoder_output = '''
5313170Sgiacomo.travaglini@arm.com
5413170Sgiacomo.travaglini@arm.com    StaticInstPtr
5513171Sgiacomo.travaglini@arm.com    decodeCryptoAES(ExtMachInst machInst)
5613171Sgiacomo.travaglini@arm.com    {
5713171Sgiacomo.travaglini@arm.com        const auto opcode = bits(machInst, 16, 12);
5813171Sgiacomo.travaglini@arm.com        const auto size = bits(machInst, 23, 22);
5913171Sgiacomo.travaglini@arm.com
6013171Sgiacomo.travaglini@arm.com        IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
6113171Sgiacomo.travaglini@arm.com        IntRegIndex rn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
6213171Sgiacomo.travaglini@arm.com
6313171Sgiacomo.travaglini@arm.com        if (size) {
6413171Sgiacomo.travaglini@arm.com            // UNALLOCATED
6513171Sgiacomo.travaglini@arm.com            return new Unknown64(machInst);
6613171Sgiacomo.travaglini@arm.com        } else {
6713171Sgiacomo.travaglini@arm.com            switch (opcode) {
6813171Sgiacomo.travaglini@arm.com              case 0x4: return new AESE64(machInst, rd, rd, rn);
6913171Sgiacomo.travaglini@arm.com              case 0x5: return new AESD64(machInst, rd, rd, rn);
7013171Sgiacomo.travaglini@arm.com              case 0x6: return new AESMC64(machInst, rd, rn);
7113171Sgiacomo.travaglini@arm.com              case 0x7: return new AESIMC64(machInst, rd, rn);
7213171Sgiacomo.travaglini@arm.com              default: return new Unknown64(machInst);
7313171Sgiacomo.travaglini@arm.com            }
7413171Sgiacomo.travaglini@arm.com        }
7513171Sgiacomo.travaglini@arm.com    }
7613171Sgiacomo.travaglini@arm.com
7713171Sgiacomo.travaglini@arm.com    StaticInstPtr
7813170Sgiacomo.travaglini@arm.com    decodeCryptoTwoRegSHA(ExtMachInst machInst)
7913170Sgiacomo.travaglini@arm.com    {
8013170Sgiacomo.travaglini@arm.com        const auto opcode = bits(machInst, 16, 12);
8113170Sgiacomo.travaglini@arm.com        const auto size = bits(machInst, 23, 22);
8213170Sgiacomo.travaglini@arm.com
8313170Sgiacomo.travaglini@arm.com        IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
8413170Sgiacomo.travaglini@arm.com        IntRegIndex rn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
8513170Sgiacomo.travaglini@arm.com
8613170Sgiacomo.travaglini@arm.com        if (size) {
8713170Sgiacomo.travaglini@arm.com            // UNALLOCATED
8813170Sgiacomo.travaglini@arm.com            return new Unknown64(machInst);
8913170Sgiacomo.travaglini@arm.com        } else {
9013170Sgiacomo.travaglini@arm.com            switch (opcode) {
9113170Sgiacomo.travaglini@arm.com              case 0x0: return new SHA1H64(machInst, rd, rn);
9213170Sgiacomo.travaglini@arm.com              case 0x1: return new SHA1SU164(machInst, rd, rn);
9313170Sgiacomo.travaglini@arm.com              case 0x2: return new SHA256SU064(machInst, rd, rn);
9413170Sgiacomo.travaglini@arm.com              default: return new Unknown64(machInst);
9513170Sgiacomo.travaglini@arm.com            }
9613170Sgiacomo.travaglini@arm.com        }
9713170Sgiacomo.travaglini@arm.com    }
9813170Sgiacomo.travaglini@arm.com
9913170Sgiacomo.travaglini@arm.com    StaticInstPtr
10013170Sgiacomo.travaglini@arm.com    decodeCryptoThreeRegSHA(ExtMachInst machInst)
10113170Sgiacomo.travaglini@arm.com    {
10213170Sgiacomo.travaglini@arm.com        const auto opcode = bits(machInst, 14, 12);
10313170Sgiacomo.travaglini@arm.com        const auto size = bits(machInst, 23, 22);
10413170Sgiacomo.travaglini@arm.com
10513170Sgiacomo.travaglini@arm.com        IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
10613170Sgiacomo.travaglini@arm.com        IntRegIndex rn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
10713170Sgiacomo.travaglini@arm.com        IntRegIndex rm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
10813170Sgiacomo.travaglini@arm.com
10913170Sgiacomo.travaglini@arm.com        if (size) {
11013170Sgiacomo.travaglini@arm.com            // UNALLOCATED
11113170Sgiacomo.travaglini@arm.com            return new Unknown64(machInst);
11213170Sgiacomo.travaglini@arm.com        } else {
11313170Sgiacomo.travaglini@arm.com            switch (opcode) {
11413170Sgiacomo.travaglini@arm.com              case 0x0: return new SHA1C64(machInst, rd, rn, rm);
11513170Sgiacomo.travaglini@arm.com              case 0x1: return new SHA1P64(machInst, rd, rn, rm);
11613170Sgiacomo.travaglini@arm.com              case 0x2: return new SHA1M64(machInst, rd, rn, rm);
11713170Sgiacomo.travaglini@arm.com              case 0x3: return new SHA1SU064(machInst, rd, rn, rm);
11813170Sgiacomo.travaglini@arm.com              case 0x4: return new SHA256H64(machInst, rd, rn, rm);
11913170Sgiacomo.travaglini@arm.com              case 0x5: return new SHA256H264(machInst, rd, rn, rm);
12013170Sgiacomo.travaglini@arm.com              case 0x6: return new SHA256SU164(machInst, rd, rn, rm);
12113170Sgiacomo.travaglini@arm.com              default: return new Unknown64(machInst);
12213170Sgiacomo.travaglini@arm.com            }
12313170Sgiacomo.travaglini@arm.com        }
12413170Sgiacomo.travaglini@arm.com    }
12513170Sgiacomo.travaglini@arm.com   '''
12613170Sgiacomo.travaglini@arm.com}};
127