// Copyright (c) 2017-2019 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall // not be construed as granting a license to any other intellectual // property including but not limited to intellectual property relating // to a hardware implementation of the functionality of the software // licensed hereunder. You may use the software subject to the license // terms below provided that you ensure that this notice is replicated // unmodified and in its entirety in all distributions of the software, // modified or unmodified, in source code or in binary form. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer; // redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution; // neither the name of the copyright holders nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Giacomo Gabrielli /// @file /// SVE top-level decoder. output header {{ namespace Aarch64 { StaticInstPtr decodeSveIntArithBinPred(ExtMachInst machInst); StaticInstPtr decodeSveIntReduc(ExtMachInst machInst); StaticInstPtr decodeSveShiftByImmPred(ExtMachInst machInst); StaticInstPtr decodeSveIntArithUnaryPred(ExtMachInst machInst); StaticInstPtr decodeSveIntMulAdd(ExtMachInst machInst); StaticInstPtr decodeSveIntArithUnpred(ExtMachInst machInst); StaticInstPtr decodeSveIntLogUnpred(ExtMachInst machInst); StaticInstPtr decodeSveIndexGen(ExtMachInst machInst); StaticInstPtr decodeSveStackAlloc(ExtMachInst machInst); StaticInstPtr decodeSveShiftByImmUnpred(ExtMachInst machInst); StaticInstPtr decodeSveCompVecAddr(ExtMachInst machInst); StaticInstPtr decodeSveIntMiscUnpred(ExtMachInst machInst); StaticInstPtr decodeSveElemCount(ExtMachInst machInst); StaticInstPtr decodeSveLogMaskImm(ExtMachInst machInst); StaticInstPtr decodeSveIntWideImmPred(ExtMachInst machInst); StaticInstPtr decodeSvePermExtract(ExtMachInst machInst); StaticInstPtr decodeSvePermUnpred(ExtMachInst machInst); StaticInstPtr decodeSvePermPredicates(ExtMachInst machInst); StaticInstPtr decodeSvePermIntlv(ExtMachInst machInst); StaticInstPtr decodeSvePermPred(ExtMachInst machInst); StaticInstPtr decodeSveSelVec(ExtMachInst machInst); StaticInstPtr decodeSveIntCmpVec(ExtMachInst machInst); StaticInstPtr decodeSveIntCmpUImm(ExtMachInst machInst); StaticInstPtr decodeSveIntCmpSImm(ExtMachInst machInst); StaticInstPtr decodeSvePredGen(ExtMachInst machInst); StaticInstPtr decodeSvePredCount(ExtMachInst machInst); StaticInstPtr decodeSveIntCmpSca(ExtMachInst machInst); StaticInstPtr decodeSveIntWideImmUnpred(ExtMachInst machInst); StaticInstPtr decodeSveMultiplyAddUnpred(ExtMachInst machInst); StaticInstPtr decodeSveMultiplyIndexed(ExtMachInst machInst); StaticInstPtr decodeSveFpFastReduc(ExtMachInst machInst); StaticInstPtr decodeSveFpUnaryUnpred(ExtMachInst machInst); StaticInstPtr decodeSveFpCmpZero(ExtMachInst machInst); StaticInstPtr decodeSveFpAccumReduc(ExtMachInst machInst); StaticInstPtr decodeSveFpArithUnpred(ExtMachInst machInst); StaticInstPtr decodeSveFpArithPred(ExtMachInst machInst); StaticInstPtr decodeSveFpUnaryPred(ExtMachInst machInst); StaticInstPtr decodeSveFpCmpVec(ExtMachInst machInst); StaticInstPtr decodeSveFpFusedMulAdd(ExtMachInst machInst); StaticInstPtr decodeSveFpCplxAdd(ExtMachInst machInst); StaticInstPtr decodeSveFpCplxMulAddVec(ExtMachInst machInst); StaticInstPtr decodeSveFpMulAddIndexed(ExtMachInst machInst); StaticInstPtr decodeSveFpCplxMulAddIndexed(ExtMachInst machInst); StaticInstPtr decodeSveFpMulIndexed(ExtMachInst machInst); StaticInstPtr decodeSveMemGather32(ExtMachInst machInst); StaticInstPtr decodeSveMemContigLoad(ExtMachInst machInst); StaticInstPtr decodeSveMemGather64(ExtMachInst machInst); StaticInstPtr decodeSveMemStore(ExtMachInst machInst); } }}; output decoder {{ namespace Aarch64 { StaticInstPtr decodeSveInt(ExtMachInst machInst) { uint8_t b_29_24_21 = (bits(machInst, 29) << 2) | (bits(machInst, 24) << 1) | bits(machInst, 21); switch (b_29_24_21) { case 0x0: { if (bits(machInst, 14)) { return decodeSveIntMulAdd(machInst); } else { uint8_t b_15_13 = (bits(machInst, 15) << 1) | bits(machInst, 13); switch (b_15_13) { case 0x0: if (bits(machInst, 30)) { return decodeSveMultiplyAddUnpred(machInst); } else { return decodeSveIntArithBinPred(machInst); } case 0x1: return decodeSveIntReduc(machInst); case 0x2: return decodeSveShiftByImmPred(machInst); case 0x3: return decodeSveIntArithUnaryPred(machInst); } } break; } case 0x1: { uint8_t b_15_14 = bits(machInst, 15, 14); uint8_t b_13 = bits(machInst, 13); uint8_t b_12 = bits(machInst, 12); switch (b_15_14) { case 0x0: if (b_13) { return decodeSveIntLogUnpred(machInst); } else { if (bits(machInst, 30)) { return decodeSveMultiplyIndexed(machInst); } else { return decodeSveIntArithUnpred(machInst); } } case 0x1: if (b_13) { return new Unknown64(machInst); } else if (b_12) { return decodeSveStackAlloc(machInst); } else { return decodeSveIndexGen(machInst); } case 0x2: if (b_13) { if (b_12) { return decodeSveIntMiscUnpred(machInst); } else { return decodeSveCompVecAddr(machInst); } } else { return decodeSveShiftByImmUnpred(machInst); } case 0x3: return decodeSveElemCount(machInst); } break; } case 0x2: if (bits(machInst, 20)) { return decodeSveIntWideImmPred(machInst); } else { return decodeSveLogMaskImm(machInst); } case 0x3: { uint8_t b_15_14 = bits(machInst, 15, 14); uint8_t b_13 = bits(machInst, 13); switch (b_15_14) { case 0x0: if (b_13) { return decodeSvePermUnpred(machInst); } else { return decodeSvePermExtract(machInst); } case 0x1: if (b_13) { return decodeSvePermIntlv(machInst); } else { return decodeSvePermPredicates(machInst); } case 0x2: return decodeSvePermPred(machInst); case 0x3: return decodeSveSelVec(machInst); } break; } case 0x4: return decodeSveIntCmpVec(machInst); case 0x5: return decodeSveIntCmpUImm(machInst); case 0x6: if (bits(machInst, 14)) { return decodeSvePredGen(machInst); } else { return decodeSveIntCmpSImm(machInst); } case 0x7: { uint8_t b_15_14 = bits(machInst, 15, 14); switch (b_15_14) { case 0x0: return decodeSveIntCmpSca(machInst); case 0x1: return new Unknown64(machInst); case 0x2: return decodeSvePredCount(machInst); case 0x3: return decodeSveIntWideImmUnpred(machInst); } } } return new Unknown64(machInst); } StaticInstPtr decodeSveFp(ExtMachInst machInst) { uint8_t b_24_21 = (bits(machInst, 24) << 1) | bits(machInst, 21); switch (b_24_21) { case 0x0: if (!bits(machInst, 15)) { return decodeSveFpCplxMulAddVec(machInst); } else if((bits(machInst, 20, 17) | bits(machInst, 14, 13)) == 0) { return decodeSveFpCplxAdd(machInst); } return new Unknown64(machInst); case 0x1: if (bits(machInst, 15, 12) == 1) { return decodeSveFpCplxMulAddIndexed(machInst); } switch (bits(machInst, 13, 11)) { case 0: return decodeSveFpMulAddIndexed(machInst); case 4: if (!bits(machInst, 10)) return decodeSveFpMulIndexed(machInst); M5_FALLTHROUGH; default: return new Unknown64(machInst); } case 0x2: { if (bits(machInst, 14)) { return decodeSveFpCmpVec(machInst); } else { uint8_t b_15_13 = (bits(machInst, 15) << 1) | bits(machInst, 13); switch (b_15_13) { case 0x0: return decodeSveFpArithUnpred(machInst); case 0x1: { uint8_t b_20_19 = (bits(machInst, 20) << 1) | bits(machInst, 19); switch (b_20_19) { case 0x0: return decodeSveFpFastReduc(machInst); case 0x1: if (bits(machInst, 12)) { return decodeSveFpUnaryUnpred(machInst); } else { return new Unknown64(machInst); } case 0x2: return decodeSveFpCmpZero(machInst); case 0x3: return decodeSveFpAccumReduc(machInst); } break; } case 0x2: return decodeSveFpArithPred(machInst); case 0x3: return decodeSveFpUnaryPred(machInst); } } break; } case 0x3: return decodeSveFpFusedMulAdd(machInst); } return new Unknown64(machInst); } StaticInstPtr decodeSveMem(ExtMachInst machInst) { uint8_t b_30_29 = bits(machInst, 30, 29); switch (b_30_29) { case 0x0: return decodeSveMemGather32(machInst); case 0x1: return decodeSveMemContigLoad(machInst); case 0x2: return decodeSveMemGather64(machInst); case 0x3: return decodeSveMemStore(machInst); } return new Unknown64(machInst); } } // namespace Aarch64 }};