sve_mem.isa revision 14091
114028Sgiacomo.gabrielli@arm.com// Copyright (c) 2017-2018 ARM Limited
213955Sgiacomo.gabrielli@arm.com// All rights reserved
313955Sgiacomo.gabrielli@arm.com//
413955Sgiacomo.gabrielli@arm.com// The license below extends only to copyright in the software and shall
513955Sgiacomo.gabrielli@arm.com// not be construed as granting a license to any other intellectual
613955Sgiacomo.gabrielli@arm.com// property including but not limited to intellectual property relating
713955Sgiacomo.gabrielli@arm.com// to a hardware implementation of the functionality of the software
813955Sgiacomo.gabrielli@arm.com// licensed hereunder.  You may use the software subject to the license
913955Sgiacomo.gabrielli@arm.com// terms below provided that you ensure that this notice is replicated
1013955Sgiacomo.gabrielli@arm.com// unmodified and in its entirety in all distributions of the software,
1113955Sgiacomo.gabrielli@arm.com// modified or unmodified, in source code or in binary form.
1213955Sgiacomo.gabrielli@arm.com//
1313955Sgiacomo.gabrielli@arm.com// Redistribution and use in source and binary forms, with or without
1413955Sgiacomo.gabrielli@arm.com// modification, are permitted provided that the following conditions are
1513955Sgiacomo.gabrielli@arm.com// met: redistributions of source code must retain the above copyright
1613955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer;
1713955Sgiacomo.gabrielli@arm.com// redistributions in binary form must reproduce the above copyright
1813955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer in the
1913955Sgiacomo.gabrielli@arm.com// documentation and/or other materials provided with the distribution;
2013955Sgiacomo.gabrielli@arm.com// neither the name of the copyright holders nor the names of its
2113955Sgiacomo.gabrielli@arm.com// contributors may be used to endorse or promote products derived from
2213955Sgiacomo.gabrielli@arm.com// this software without specific prior written permission.
2313955Sgiacomo.gabrielli@arm.com//
2413955Sgiacomo.gabrielli@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2513955Sgiacomo.gabrielli@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2613955Sgiacomo.gabrielli@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2713955Sgiacomo.gabrielli@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2813955Sgiacomo.gabrielli@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2913955Sgiacomo.gabrielli@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3013955Sgiacomo.gabrielli@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3113955Sgiacomo.gabrielli@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3213955Sgiacomo.gabrielli@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3313955Sgiacomo.gabrielli@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3413955Sgiacomo.gabrielli@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3513955Sgiacomo.gabrielli@arm.com//
3613955Sgiacomo.gabrielli@arm.com// Authors: Giacomo Gabrielli
3713955Sgiacomo.gabrielli@arm.com
3813955Sgiacomo.gabrielli@arm.com// @file Definition of SVE memory access instructions.
3913955Sgiacomo.gabrielli@arm.com
4013955Sgiacomo.gabrielli@arm.comoutput header {{
4113955Sgiacomo.gabrielli@arm.com
4213955Sgiacomo.gabrielli@arm.com    // Decodes SVE contiguous load instructions, scalar plus scalar form.
4313955Sgiacomo.gabrielli@arm.com    template <template <typename T1, typename T2> class Base>
4413955Sgiacomo.gabrielli@arm.com    StaticInstPtr
4513955Sgiacomo.gabrielli@arm.com    decodeSveContigLoadSSInsts(uint8_t dtype, ExtMachInst machInst,
4613955Sgiacomo.gabrielli@arm.com                               IntRegIndex zt, IntRegIndex pg, IntRegIndex rn,
4713955Sgiacomo.gabrielli@arm.com                               IntRegIndex rm, bool firstFaulting)
4813955Sgiacomo.gabrielli@arm.com    {
4913955Sgiacomo.gabrielli@arm.com        const char* mn = firstFaulting ? "ldff1" : "ld1";
5013955Sgiacomo.gabrielli@arm.com        switch (dtype) {
5113955Sgiacomo.gabrielli@arm.com          case 0x0:
5213955Sgiacomo.gabrielli@arm.com            return new Base<uint8_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
5313955Sgiacomo.gabrielli@arm.com          case 0x1:
5413955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
5513955Sgiacomo.gabrielli@arm.com          case 0x2:
5613955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
5713955Sgiacomo.gabrielli@arm.com          case 0x3:
5813955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
5913955Sgiacomo.gabrielli@arm.com          case 0x4:
6013955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int32_t>(mn, machInst, zt, pg, rn, rm);
6113955Sgiacomo.gabrielli@arm.com          case 0x5:
6213955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
6313955Sgiacomo.gabrielli@arm.com          case 0x6:
6413955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
6513955Sgiacomo.gabrielli@arm.com          case 0x7:
6613955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
6713955Sgiacomo.gabrielli@arm.com          case 0x8:
6813955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int16_t>(mn, machInst, zt, pg, rn, rm);
6913955Sgiacomo.gabrielli@arm.com          case 0x9:
7013955Sgiacomo.gabrielli@arm.com            return new Base<int32_t, int16_t>(mn, machInst, zt, pg, rn, rm);
7113955Sgiacomo.gabrielli@arm.com          case 0xa:
7213955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint32_t>(mn, machInst, zt, pg, rn, rm);
7313955Sgiacomo.gabrielli@arm.com          case 0xb:
7413955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint32_t>(mn, machInst, zt, pg, rn, rm);
7513955Sgiacomo.gabrielli@arm.com          case 0xc:
7613955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int8_t>(mn, machInst, zt, pg, rn, rm);
7713955Sgiacomo.gabrielli@arm.com          case 0xd:
7813955Sgiacomo.gabrielli@arm.com            return new Base<int32_t, int8_t>(mn, machInst, zt, pg, rn, rm);
7913955Sgiacomo.gabrielli@arm.com          case 0xe:
8013955Sgiacomo.gabrielli@arm.com            return new Base<int16_t, int8_t>(mn, machInst, zt, pg, rn, rm);
8113955Sgiacomo.gabrielli@arm.com          case 0xf:
8213955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint64_t>(mn, machInst, zt, pg, rn, rm);
8313955Sgiacomo.gabrielli@arm.com        }
8413955Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
8513955Sgiacomo.gabrielli@arm.com    }
8613955Sgiacomo.gabrielli@arm.com
8713955Sgiacomo.gabrielli@arm.com    // Decodes SVE contiguous load instructions, scalar plus immediate form.
8813955Sgiacomo.gabrielli@arm.com    template <template <typename T1, typename T2> class Base>
8913955Sgiacomo.gabrielli@arm.com    StaticInstPtr
9013955Sgiacomo.gabrielli@arm.com    decodeSveContigLoadSIInsts(uint8_t dtype, ExtMachInst machInst,
9113955Sgiacomo.gabrielli@arm.com                               IntRegIndex zt, IntRegIndex pg, IntRegIndex rn,
9214091Sgabor.dozsa@arm.com                               uint64_t imm, bool nonFaulting,
9313955Sgiacomo.gabrielli@arm.com                               bool replicate = false)
9413955Sgiacomo.gabrielli@arm.com    {
9514091Sgabor.dozsa@arm.com        assert(!(nonFaulting && replicate));
9614091Sgabor.dozsa@arm.com        const char* mn = replicate ? "ld1r" : (nonFaulting ? "ldnf1" : "ld1");
9713955Sgiacomo.gabrielli@arm.com        switch (dtype) {
9813955Sgiacomo.gabrielli@arm.com          case 0x0:
9913955Sgiacomo.gabrielli@arm.com            return new Base<uint8_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
10013955Sgiacomo.gabrielli@arm.com          case 0x1:
10113955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
10213955Sgiacomo.gabrielli@arm.com          case 0x2:
10313955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
10413955Sgiacomo.gabrielli@arm.com          case 0x3:
10513955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
10613955Sgiacomo.gabrielli@arm.com          case 0x4:
10713955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int32_t>(mn, machInst, zt, pg, rn, imm);
10813955Sgiacomo.gabrielli@arm.com          case 0x5:
10913955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
11013955Sgiacomo.gabrielli@arm.com          case 0x6:
11113955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
11213955Sgiacomo.gabrielli@arm.com          case 0x7:
11313955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
11413955Sgiacomo.gabrielli@arm.com          case 0x8:
11513955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int16_t>(mn, machInst, zt, pg, rn, imm);
11613955Sgiacomo.gabrielli@arm.com          case 0x9:
11713955Sgiacomo.gabrielli@arm.com            return new Base<int32_t, int16_t>(mn, machInst, zt, pg, rn, imm);
11813955Sgiacomo.gabrielli@arm.com          case 0xa:
11913955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint32_t>(mn, machInst, zt, pg, rn, imm);
12013955Sgiacomo.gabrielli@arm.com          case 0xb:
12113955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint32_t>(mn, machInst, zt, pg, rn, imm);
12213955Sgiacomo.gabrielli@arm.com          case 0xc:
12313955Sgiacomo.gabrielli@arm.com            return new Base<int64_t, int8_t>(mn, machInst, zt, pg, rn, imm);
12413955Sgiacomo.gabrielli@arm.com          case 0xd:
12513955Sgiacomo.gabrielli@arm.com            return new Base<int32_t, int8_t>(mn, machInst, zt, pg, rn, imm);
12613955Sgiacomo.gabrielli@arm.com          case 0xe:
12713955Sgiacomo.gabrielli@arm.com            return new Base<int16_t, int8_t>(mn, machInst, zt, pg, rn, imm);
12813955Sgiacomo.gabrielli@arm.com          case 0xf:
12913955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint64_t>(mn, machInst, zt, pg, rn, imm);
13013955Sgiacomo.gabrielli@arm.com        }
13113955Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
13213955Sgiacomo.gabrielli@arm.com    }
13313955Sgiacomo.gabrielli@arm.com
13413955Sgiacomo.gabrielli@arm.com    // Decodes SVE contiguous store instructions, scalar plus scalar form.
13513955Sgiacomo.gabrielli@arm.com    template <template <typename T1, typename T2> class Base>
13613955Sgiacomo.gabrielli@arm.com    StaticInstPtr
13713955Sgiacomo.gabrielli@arm.com    decodeSveContigStoreSSInsts(uint8_t dtype, ExtMachInst machInst,
13813955Sgiacomo.gabrielli@arm.com                                IntRegIndex zt, IntRegIndex pg, IntRegIndex rn,
13913955Sgiacomo.gabrielli@arm.com                                IntRegIndex rm)
14013955Sgiacomo.gabrielli@arm.com    {
14113955Sgiacomo.gabrielli@arm.com        const char* mn = "st1";
14213955Sgiacomo.gabrielli@arm.com        switch (dtype) {
14313955Sgiacomo.gabrielli@arm.com          case 0x0:
14413955Sgiacomo.gabrielli@arm.com            return new Base<uint8_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
14513955Sgiacomo.gabrielli@arm.com          case 0x1:
14613955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
14713955Sgiacomo.gabrielli@arm.com          case 0x2:
14813955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
14913955Sgiacomo.gabrielli@arm.com          case 0x3:
15013955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint8_t>(mn, machInst, zt, pg, rn, rm);
15113955Sgiacomo.gabrielli@arm.com          case 0x5:
15213955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
15313955Sgiacomo.gabrielli@arm.com          case 0x6:
15413955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
15513955Sgiacomo.gabrielli@arm.com          case 0x7:
15613955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint16_t>(mn, machInst, zt, pg, rn, rm);
15713955Sgiacomo.gabrielli@arm.com          case 0xa:
15813955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint32_t>(mn, machInst, zt, pg, rn, rm);
15913955Sgiacomo.gabrielli@arm.com          case 0xb:
16013955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint32_t>(mn, machInst, zt, pg, rn, rm);
16113955Sgiacomo.gabrielli@arm.com          case 0xf:
16213955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint64_t>(mn, machInst, zt, pg, rn, rm);
16313955Sgiacomo.gabrielli@arm.com        }
16413955Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
16513955Sgiacomo.gabrielli@arm.com    }
16613955Sgiacomo.gabrielli@arm.com
16713955Sgiacomo.gabrielli@arm.com    // Decodes SVE contiguous store instructions, scalar plus immediate form.
16813955Sgiacomo.gabrielli@arm.com    template <template <typename T1, typename T2> class Base>
16913955Sgiacomo.gabrielli@arm.com    StaticInstPtr
17013955Sgiacomo.gabrielli@arm.com    decodeSveContigStoreSIInsts(uint8_t dtype, ExtMachInst machInst,
17113955Sgiacomo.gabrielli@arm.com                                IntRegIndex zt, IntRegIndex pg, IntRegIndex rn,
17213955Sgiacomo.gabrielli@arm.com                                int8_t imm)
17313955Sgiacomo.gabrielli@arm.com    {
17413955Sgiacomo.gabrielli@arm.com        const char* mn = "st1";
17513955Sgiacomo.gabrielli@arm.com        switch (dtype) {
17613955Sgiacomo.gabrielli@arm.com          case 0x0:
17713955Sgiacomo.gabrielli@arm.com            return new Base<uint8_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
17813955Sgiacomo.gabrielli@arm.com          case 0x1:
17913955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
18013955Sgiacomo.gabrielli@arm.com          case 0x2:
18113955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
18213955Sgiacomo.gabrielli@arm.com          case 0x3:
18313955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint8_t>(mn, machInst, zt, pg, rn, imm);
18413955Sgiacomo.gabrielli@arm.com          case 0x5:
18513955Sgiacomo.gabrielli@arm.com            return new Base<uint16_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
18613955Sgiacomo.gabrielli@arm.com          case 0x6:
18713955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
18813955Sgiacomo.gabrielli@arm.com          case 0x7:
18913955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint16_t>(mn, machInst, zt, pg, rn, imm);
19013955Sgiacomo.gabrielli@arm.com          case 0xa:
19113955Sgiacomo.gabrielli@arm.com            return new Base<uint32_t, uint32_t>(mn, machInst, zt, pg, rn, imm);
19213955Sgiacomo.gabrielli@arm.com          case 0xb:
19313955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint32_t>(mn, machInst, zt, pg, rn, imm);
19413955Sgiacomo.gabrielli@arm.com          case 0xf:
19513955Sgiacomo.gabrielli@arm.com            return new Base<uint64_t, uint64_t>(mn, machInst, zt, pg, rn, imm);
19613955Sgiacomo.gabrielli@arm.com        }
19713955Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
19813955Sgiacomo.gabrielli@arm.com    }
19913955Sgiacomo.gabrielli@arm.com
20013955Sgiacomo.gabrielli@arm.com    // NOTE: SVE load-and-replicate instructions are decoded with
20113955Sgiacomo.gabrielli@arm.com    // decodeSveContigLoadSIInsts(...).
20213955Sgiacomo.gabrielli@arm.com
20313955Sgiacomo.gabrielli@arm.com}};
20413955Sgiacomo.gabrielli@arm.com
20514028Sgiacomo.gabrielli@arm.comoutput decoder {{
20614028Sgiacomo.gabrielli@arm.com
20714028Sgiacomo.gabrielli@arm.com    StaticInstPtr
20814028Sgiacomo.gabrielli@arm.com    decodeSveGatherLoadVIInsts(uint8_t dtype, ExtMachInst machInst,
20914028Sgiacomo.gabrielli@arm.com                               IntRegIndex zt, IntRegIndex pg, IntRegIndex zn,
21014028Sgiacomo.gabrielli@arm.com                               uint64_t imm, bool esizeIs32,
21114091Sgabor.dozsa@arm.com                               bool firstFault)
21214028Sgiacomo.gabrielli@arm.com    {
21314091Sgabor.dozsa@arm.com        const char* mn = firstFault ? "ldff1" : "ld1";
21414028Sgiacomo.gabrielli@arm.com        switch (dtype) {
21514028Sgiacomo.gabrielli@arm.com          case 0x0:
21614028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
21714028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<int32_t, int8_t,
21814091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
21914091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
22014091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
22114028Sgiacomo.gabrielli@arm.com            } else {
22214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<int64_t, int8_t,
22314091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
22414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
22514091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
22614028Sgiacomo.gabrielli@arm.com            }
22714028Sgiacomo.gabrielli@arm.com          case 0x1:
22814028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
22914028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint8_t,
23014091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
23114091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
23214091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
23314028Sgiacomo.gabrielli@arm.com            } else {
23414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint8_t,
23514091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
23614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
23714091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
23814028Sgiacomo.gabrielli@arm.com            }
23914028Sgiacomo.gabrielli@arm.com          case 0x2:
24014028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
24114028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<int32_t, int16_t,
24214091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
24314091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
24414091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
24514028Sgiacomo.gabrielli@arm.com            } else {
24614028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<int64_t, int16_t,
24714091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
24814091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
24914091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
25014028Sgiacomo.gabrielli@arm.com            }
25114028Sgiacomo.gabrielli@arm.com          case 0x3:
25214028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
25314028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint16_t,
25414091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
25514091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
25614091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
25714028Sgiacomo.gabrielli@arm.com            } else {
25814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint16_t,
25914091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
26014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
26114091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
26214028Sgiacomo.gabrielli@arm.com            }
26314028Sgiacomo.gabrielli@arm.com          case 0x4:
26414028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
26514028Sgiacomo.gabrielli@arm.com                break;
26614028Sgiacomo.gabrielli@arm.com            } else {
26714028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<int64_t, int32_t,
26814091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
26914091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
27014091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
27114028Sgiacomo.gabrielli@arm.com            }
27214028Sgiacomo.gabrielli@arm.com          case 0x5:
27314028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
27414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint32_t,
27514091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
27614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
27714091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
27814028Sgiacomo.gabrielli@arm.com            } else {
27914028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint32_t,
28014091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
28114091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
28214091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
28314028Sgiacomo.gabrielli@arm.com            }
28414028Sgiacomo.gabrielli@arm.com          case 0x7:
28514028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
28614028Sgiacomo.gabrielli@arm.com                break;
28714028Sgiacomo.gabrielli@arm.com            } else {
28814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint64_t,
28914091Sgabor.dozsa@arm.com                                           SveGatherLoadVIMicroop,
29014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
29114091Sgabor.dozsa@arm.com                    mn, machInst, MemReadOp, zt, pg, zn, imm, firstFault);
29214028Sgiacomo.gabrielli@arm.com            }
29314028Sgiacomo.gabrielli@arm.com        }
29414028Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
29514028Sgiacomo.gabrielli@arm.com    }
29614028Sgiacomo.gabrielli@arm.com
29714028Sgiacomo.gabrielli@arm.com    StaticInstPtr
29814028Sgiacomo.gabrielli@arm.com    decodeSveGatherLoadSVInsts(uint8_t dtype, ExtMachInst machInst,
29914028Sgiacomo.gabrielli@arm.com                               IntRegIndex zt, IntRegIndex pg, IntRegIndex rn,
30014028Sgiacomo.gabrielli@arm.com                               IntRegIndex zm, bool esizeIs32, bool offsetIs32,
30114028Sgiacomo.gabrielli@arm.com                               bool offsetIsSigned, bool offsetIsScaled,
30214091Sgabor.dozsa@arm.com                               bool firstFault)
30314028Sgiacomo.gabrielli@arm.com    {
30414091Sgabor.dozsa@arm.com        const char* mn = firstFault ? "ldff1" : "ld1";
30514028Sgiacomo.gabrielli@arm.com        switch (dtype) {
30614028Sgiacomo.gabrielli@arm.com          case 0x0:
30714028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
30814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<int32_t, int8_t,
30914091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
31014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
31114028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
31214091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
31314028Sgiacomo.gabrielli@arm.com            } else {
31414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<int64_t, int8_t,
31514091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
31614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
31714028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
31814091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
31914028Sgiacomo.gabrielli@arm.com            }
32014028Sgiacomo.gabrielli@arm.com          case 0x1:
32114028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
32214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint8_t,
32314091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
32414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
32514028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
32614091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
32714028Sgiacomo.gabrielli@arm.com            } else {
32814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint8_t,
32914091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
33014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
33114028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
33214091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
33314028Sgiacomo.gabrielli@arm.com            }
33414028Sgiacomo.gabrielli@arm.com          case 0x2:
33514028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
33614028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<int32_t, int16_t,
33714091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
33814091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
33914028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
34014091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
34114028Sgiacomo.gabrielli@arm.com            } else {
34214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<int64_t, int16_t,
34314091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
34414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
34514028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
34614091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
34714028Sgiacomo.gabrielli@arm.com            }
34814028Sgiacomo.gabrielli@arm.com          case 0x3:
34914028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
35014028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint16_t,
35114091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
35214091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
35314028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
35414091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
35514028Sgiacomo.gabrielli@arm.com            } else {
35614028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint16_t,
35714091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
35814091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
35914028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
36014091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
36114028Sgiacomo.gabrielli@arm.com            }
36214028Sgiacomo.gabrielli@arm.com          case 0x4:
36314028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
36414028Sgiacomo.gabrielli@arm.com                break;
36514028Sgiacomo.gabrielli@arm.com            } else {
36614028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<int64_t, int32_t,
36714091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
36814091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
36914028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
37014091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
37114028Sgiacomo.gabrielli@arm.com            }
37214028Sgiacomo.gabrielli@arm.com          case 0x5:
37314028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
37414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint32_t,
37514091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
37614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
37714028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
37814091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
37914028Sgiacomo.gabrielli@arm.com            } else {
38014028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint32_t,
38114091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
38214091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
38314028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
38414091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
38514028Sgiacomo.gabrielli@arm.com            }
38614028Sgiacomo.gabrielli@arm.com          case 0x7:
38714028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
38814028Sgiacomo.gabrielli@arm.com                break;
38914028Sgiacomo.gabrielli@arm.com            } else {
39014028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint64_t,
39114091Sgabor.dozsa@arm.com                                           SveGatherLoadSVMicroop,
39214091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
39314028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemReadOp, zt, pg, rn, zm,
39414091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, firstFault);
39514028Sgiacomo.gabrielli@arm.com            }
39614028Sgiacomo.gabrielli@arm.com        }
39714028Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
39814028Sgiacomo.gabrielli@arm.com    }
39914028Sgiacomo.gabrielli@arm.com
40014028Sgiacomo.gabrielli@arm.com    StaticInstPtr
40114028Sgiacomo.gabrielli@arm.com    decodeSveScatterStoreVIInsts(uint8_t msz, ExtMachInst machInst,
40214028Sgiacomo.gabrielli@arm.com                                 IntRegIndex zt, IntRegIndex pg,
40314028Sgiacomo.gabrielli@arm.com                                 IntRegIndex zn, uint64_t imm,
40414028Sgiacomo.gabrielli@arm.com                                 bool esizeIs32)
40514028Sgiacomo.gabrielli@arm.com    {
40614028Sgiacomo.gabrielli@arm.com        const char* mn = "st1";
40714028Sgiacomo.gabrielli@arm.com        switch (msz) {
40814028Sgiacomo.gabrielli@arm.com          case 0x0:
40914028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
41014028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint8_t,
41114091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
41214091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
41314091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
41414028Sgiacomo.gabrielli@arm.com            } else {
41514028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint8_t,
41614091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
41714091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
41814091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
41914028Sgiacomo.gabrielli@arm.com            }
42014028Sgiacomo.gabrielli@arm.com          case 0x1:
42114028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
42214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint16_t,
42314091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
42414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
42514091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
42614028Sgiacomo.gabrielli@arm.com            } else {
42714028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint16_t,
42814091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
42914091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
43014091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
43114028Sgiacomo.gabrielli@arm.com            }
43214028Sgiacomo.gabrielli@arm.com          case 0x2:
43314028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
43414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint32_t, uint32_t,
43514091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
43614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
43714091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
43814028Sgiacomo.gabrielli@arm.com            } else {
43914028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint32_t,
44014091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
44114091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
44214091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
44314028Sgiacomo.gabrielli@arm.com            }
44414028Sgiacomo.gabrielli@arm.com          case 0x3:
44514028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
44614028Sgiacomo.gabrielli@arm.com                break;
44714028Sgiacomo.gabrielli@arm.com            } else {
44814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemVI<uint64_t, uint64_t,
44914091Sgabor.dozsa@arm.com                                           SveScatterStoreVIMicroop,
45014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
45114091Sgabor.dozsa@arm.com                    mn, machInst, MemWriteOp, zt, pg, zn, imm, false);
45214028Sgiacomo.gabrielli@arm.com            }
45314028Sgiacomo.gabrielli@arm.com        }
45414028Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
45514028Sgiacomo.gabrielli@arm.com    }
45614028Sgiacomo.gabrielli@arm.com
45714028Sgiacomo.gabrielli@arm.com    StaticInstPtr
45814028Sgiacomo.gabrielli@arm.com    decodeSveScatterStoreSVInsts(uint8_t msz, ExtMachInst machInst,
45914028Sgiacomo.gabrielli@arm.com                                 IntRegIndex zt, IntRegIndex pg,
46014028Sgiacomo.gabrielli@arm.com                                 IntRegIndex rn, IntRegIndex zm,
46114028Sgiacomo.gabrielli@arm.com                                 bool esizeIs32, bool offsetIs32,
46214028Sgiacomo.gabrielli@arm.com                                 bool offsetIsSigned, bool offsetIsScaled)
46314028Sgiacomo.gabrielli@arm.com    {
46414028Sgiacomo.gabrielli@arm.com        const char* mn = "st1";
46514028Sgiacomo.gabrielli@arm.com        switch (msz) {
46614028Sgiacomo.gabrielli@arm.com          case 0x0:
46714028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
46814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint8_t,
46914091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
47014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
47114028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
47214091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
47314028Sgiacomo.gabrielli@arm.com            } else {
47414028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint8_t,
47514091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
47614091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
47714028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
47814091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
47914028Sgiacomo.gabrielli@arm.com            }
48014028Sgiacomo.gabrielli@arm.com          case 0x1:
48114028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
48214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint16_t,
48314091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
48414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
48514028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
48614091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
48714028Sgiacomo.gabrielli@arm.com            } else {
48814028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint16_t,
48914091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
49014091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
49114028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
49214091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
49314028Sgiacomo.gabrielli@arm.com            }
49414028Sgiacomo.gabrielli@arm.com          case 0x2:
49514028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
49614028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint32_t, uint32_t,
49714091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
49814091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
49914028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
50014091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
50114028Sgiacomo.gabrielli@arm.com            } else {
50214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint32_t,
50314091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
50414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
50514028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
50614091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
50714028Sgiacomo.gabrielli@arm.com            }
50814028Sgiacomo.gabrielli@arm.com          case 0x3:
50914028Sgiacomo.gabrielli@arm.com            if (esizeIs32) {
51014028Sgiacomo.gabrielli@arm.com                break;
51114028Sgiacomo.gabrielli@arm.com            } else {
51214028Sgiacomo.gabrielli@arm.com                return new SveIndexedMemSV<uint64_t, uint64_t,
51314091Sgabor.dozsa@arm.com                                           SveScatterStoreSVMicroop,
51414091Sgabor.dozsa@arm.com                                           SveFirstFaultWritebackMicroop>(
51514028Sgiacomo.gabrielli@arm.com                    mn, machInst, MemWriteOp, zt, pg, rn, zm,
51614091Sgabor.dozsa@arm.com                    offsetIs32, offsetIsSigned, offsetIsScaled, false);
51714028Sgiacomo.gabrielli@arm.com            }
51814028Sgiacomo.gabrielli@arm.com        }
51914028Sgiacomo.gabrielli@arm.com        return new Unknown64(machInst);
52014028Sgiacomo.gabrielli@arm.com    }
52114028Sgiacomo.gabrielli@arm.com
52214028Sgiacomo.gabrielli@arm.com}};
52314028Sgiacomo.gabrielli@arm.com
52414028Sgiacomo.gabrielli@arm.com
52513955Sgiacomo.gabrielli@arm.comlet {{
52613955Sgiacomo.gabrielli@arm.com
52713955Sgiacomo.gabrielli@arm.com    header_output = ''
52813955Sgiacomo.gabrielli@arm.com    exec_output = ''
52913955Sgiacomo.gabrielli@arm.com    decoders = { 'Generic': {} }
53013955Sgiacomo.gabrielli@arm.com
53113955Sgiacomo.gabrielli@arm.com    SPAlignmentCheckCode = '''
53213955Sgiacomo.gabrielli@arm.com        if (this->baseIsSP && bits(XBase, 3, 0) &&
53313955Sgiacomo.gabrielli@arm.com            SPAlignmentCheckEnabled(xc->tcBase())) {
53413955Sgiacomo.gabrielli@arm.com            return std::make_shared<SPAlignmentFault>();
53513955Sgiacomo.gabrielli@arm.com        }
53613955Sgiacomo.gabrielli@arm.com    '''
53713955Sgiacomo.gabrielli@arm.com
53813955Sgiacomo.gabrielli@arm.com    def emitSveMemFillSpill(isPred):
53913955Sgiacomo.gabrielli@arm.com        global header_output, exec_output, decoders
54013955Sgiacomo.gabrielli@arm.com        eaCode = SPAlignmentCheckCode + '''
54113955Sgiacomo.gabrielli@arm.com        int memAccessSize = %(memacc_size)s;
54213955Sgiacomo.gabrielli@arm.com        EA = XBase + ((int64_t) imm * %(memacc_size)s)''' % {
54313955Sgiacomo.gabrielli@arm.com            'memacc_size': 'eCount / 8' if isPred else 'eCount'}
54414091Sgabor.dozsa@arm.com        loadRdEnableCode = '''
54514091Sgabor.dozsa@arm.com        auto rdEn = std::vector<bool>();
54614091Sgabor.dozsa@arm.com        '''
54713955Sgiacomo.gabrielli@arm.com        if isPred:
54813955Sgiacomo.gabrielli@arm.com            loadMemAccCode = '''
54913955Sgiacomo.gabrielli@arm.com            int index = 0;
55013955Sgiacomo.gabrielli@arm.com            uint8_t byte;
55113955Sgiacomo.gabrielli@arm.com            for (int i = 0; i < eCount / 8; i++) {
55213955Sgiacomo.gabrielli@arm.com                byte = memDataView[i];
55313955Sgiacomo.gabrielli@arm.com                for (int j = 0; j < 8; j++, index++) {
55413955Sgiacomo.gabrielli@arm.com                    PDest_x[index] = (byte >> j) & 1;
55513955Sgiacomo.gabrielli@arm.com                }
55613955Sgiacomo.gabrielli@arm.com            }
55713955Sgiacomo.gabrielli@arm.com            '''
55813955Sgiacomo.gabrielli@arm.com            storeMemAccCode = '''
55913955Sgiacomo.gabrielli@arm.com            int index = 0;
56013955Sgiacomo.gabrielli@arm.com            uint8_t byte;
56113955Sgiacomo.gabrielli@arm.com            for (int i = 0; i < eCount / 8; i++) {
56213955Sgiacomo.gabrielli@arm.com                byte = 0;
56313955Sgiacomo.gabrielli@arm.com                for (int j = 0; j < 8; j++, index++) {
56413955Sgiacomo.gabrielli@arm.com                    byte |= PDest_x[index] << j;
56513955Sgiacomo.gabrielli@arm.com                }
56613955Sgiacomo.gabrielli@arm.com                memDataView[i] = byte;
56713955Sgiacomo.gabrielli@arm.com            }
56813955Sgiacomo.gabrielli@arm.com            '''
56913955Sgiacomo.gabrielli@arm.com            storeWrEnableCode = '''
57013955Sgiacomo.gabrielli@arm.com            auto wrEn = std::vector<bool>(eCount / 8, true);
57113955Sgiacomo.gabrielli@arm.com            '''
57213955Sgiacomo.gabrielli@arm.com        else:
57313955Sgiacomo.gabrielli@arm.com            loadMemAccCode = '''
57413955Sgiacomo.gabrielli@arm.com            for (int i = 0; i < eCount; i++) {
57513955Sgiacomo.gabrielli@arm.com                AA64FpDest_x[i] = memDataView[i];
57613955Sgiacomo.gabrielli@arm.com            }
57713955Sgiacomo.gabrielli@arm.com            '''
57813955Sgiacomo.gabrielli@arm.com            storeMemAccCode = '''
57913955Sgiacomo.gabrielli@arm.com            for (int i = 0; i < eCount; i++) {
58013955Sgiacomo.gabrielli@arm.com                memDataView[i] = AA64FpDest_x[i];
58113955Sgiacomo.gabrielli@arm.com            }
58213955Sgiacomo.gabrielli@arm.com            '''
58313955Sgiacomo.gabrielli@arm.com            storeWrEnableCode = '''
58413955Sgiacomo.gabrielli@arm.com            auto wrEn = std::vector<bool>(sizeof(MemElemType) * eCount, true);
58513955Sgiacomo.gabrielli@arm.com            '''
58613955Sgiacomo.gabrielli@arm.com        loadIop = InstObjParams('ldr',
58713955Sgiacomo.gabrielli@arm.com            'SveLdrPred' if isPred else 'SveLdrVec',
58813955Sgiacomo.gabrielli@arm.com            'SveMemPredFillSpill' if isPred else 'SveMemVecFillSpill',
58913955Sgiacomo.gabrielli@arm.com            {'tpl_header': '',
59013955Sgiacomo.gabrielli@arm.com             'tpl_args': '',
59113955Sgiacomo.gabrielli@arm.com             'memacc_code': loadMemAccCode,
59213955Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
59314091Sgabor.dozsa@arm.com             'rden_code' : loadRdEnableCode,
59414091Sgabor.dozsa@arm.com             'fault_code' : '',
59513955Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
59613955Sgiacomo.gabrielli@arm.com            ['IsMemRef', 'IsLoad'])
59713955Sgiacomo.gabrielli@arm.com        storeIop = InstObjParams('str',
59813955Sgiacomo.gabrielli@arm.com            'SveStrPred' if isPred else 'SveStrVec',
59913955Sgiacomo.gabrielli@arm.com            'SveMemPredFillSpill' if isPred else 'SveMemVecFillSpill',
60013955Sgiacomo.gabrielli@arm.com            {'tpl_header': '',
60113955Sgiacomo.gabrielli@arm.com             'tpl_args': '',
60213955Sgiacomo.gabrielli@arm.com             'wren_code': storeWrEnableCode,
60313955Sgiacomo.gabrielli@arm.com             'memacc_code': storeMemAccCode,
60413955Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
60513955Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
60613955Sgiacomo.gabrielli@arm.com            ['IsMemRef', 'IsStore'])
60713955Sgiacomo.gabrielli@arm.com        header_output += SveMemFillSpillOpDeclare.subst(loadIop)
60813955Sgiacomo.gabrielli@arm.com        header_output += SveMemFillSpillOpDeclare.subst(storeIop)
60913955Sgiacomo.gabrielli@arm.com        exec_output += (
61013955Sgiacomo.gabrielli@arm.com            SveContigLoadExecute.subst(loadIop) +
61113955Sgiacomo.gabrielli@arm.com            SveContigLoadInitiateAcc.subst(loadIop) +
61213955Sgiacomo.gabrielli@arm.com            SveContigLoadCompleteAcc.subst(loadIop) +
61313955Sgiacomo.gabrielli@arm.com            SveContigStoreExecute.subst(storeIop) +
61413955Sgiacomo.gabrielli@arm.com            SveContigStoreInitiateAcc.subst(storeIop) +
61513955Sgiacomo.gabrielli@arm.com            SveContigStoreCompleteAcc.subst(storeIop))
61613955Sgiacomo.gabrielli@arm.com
61713955Sgiacomo.gabrielli@arm.com    loadTplArgs = (
61813955Sgiacomo.gabrielli@arm.com        ('uint8_t', 'uint8_t'),
61913955Sgiacomo.gabrielli@arm.com        ('uint16_t', 'uint8_t'),
62013955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint8_t'),
62113955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint8_t'),
62213955Sgiacomo.gabrielli@arm.com        ('int64_t', 'int32_t'),
62313955Sgiacomo.gabrielli@arm.com        ('uint16_t', 'uint16_t'),
62413955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint16_t'),
62513955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint16_t'),
62613955Sgiacomo.gabrielli@arm.com        ('int64_t', 'int16_t'),
62713955Sgiacomo.gabrielli@arm.com        ('int32_t', 'int16_t'),
62813955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint32_t'),
62913955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint32_t'),
63013955Sgiacomo.gabrielli@arm.com        ('int64_t', 'int8_t'),
63113955Sgiacomo.gabrielli@arm.com        ('int32_t', 'int8_t'),
63213955Sgiacomo.gabrielli@arm.com        ('int16_t', 'int8_t'),
63313955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint64_t'),
63413955Sgiacomo.gabrielli@arm.com    )
63513955Sgiacomo.gabrielli@arm.com
63613955Sgiacomo.gabrielli@arm.com    storeTplArgs = (
63713955Sgiacomo.gabrielli@arm.com        ('uint8_t', 'uint8_t'),
63813955Sgiacomo.gabrielli@arm.com        ('uint16_t', 'uint8_t'),
63913955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint8_t'),
64013955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint8_t'),
64113955Sgiacomo.gabrielli@arm.com        ('uint16_t', 'uint16_t'),
64213955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint16_t'),
64313955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint16_t'),
64413955Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint32_t'),
64513955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint32_t'),
64613955Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint64_t'),
64713955Sgiacomo.gabrielli@arm.com    )
64813955Sgiacomo.gabrielli@arm.com
64914028Sgiacomo.gabrielli@arm.com    gatherLoadTplArgs = (
65014028Sgiacomo.gabrielli@arm.com        ('int32_t', 'int8_t'),
65114028Sgiacomo.gabrielli@arm.com        ('int64_t', 'int8_t'),
65214028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint8_t'),
65314028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint8_t'),
65414028Sgiacomo.gabrielli@arm.com        ('int32_t', 'int16_t'),
65514028Sgiacomo.gabrielli@arm.com        ('int64_t', 'int16_t'),
65614028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint16_t'),
65714028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint16_t'),
65814028Sgiacomo.gabrielli@arm.com        ('int64_t', 'int32_t'),
65914028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint32_t'),
66014028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint32_t'),
66114028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint64_t'),
66214028Sgiacomo.gabrielli@arm.com    )
66314028Sgiacomo.gabrielli@arm.com
66414028Sgiacomo.gabrielli@arm.com    scatterStoreTplArgs = (
66514028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint8_t'),
66614028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint8_t'),
66714028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint16_t'),
66814028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint16_t'),
66914028Sgiacomo.gabrielli@arm.com        ('uint32_t', 'uint32_t'),
67014028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint32_t'),
67114028Sgiacomo.gabrielli@arm.com        ('uint64_t', 'uint64_t'),
67214028Sgiacomo.gabrielli@arm.com    )
67314028Sgiacomo.gabrielli@arm.com
67413955Sgiacomo.gabrielli@arm.com    # Generates definitions for SVE contiguous loads
67513955Sgiacomo.gabrielli@arm.com    def emitSveContigMemInsts(offsetIsImm):
67613955Sgiacomo.gabrielli@arm.com        global header_output, exec_output, decoders
67714091Sgabor.dozsa@arm.com        # First-faulting instructions only have a scalar plus scalar form,
67814091Sgabor.dozsa@arm.com        # while non-faulting instructions only a scalar plus immediate form, so
67914091Sgabor.dozsa@arm.com        # `offsetIsImm` is used to determine which class of instructions is
68014091Sgabor.dozsa@arm.com        # generated
68114091Sgabor.dozsa@arm.com        firstFaulting = not offsetIsImm
68213955Sgiacomo.gabrielli@arm.com        tplHeader = 'template <class RegElemType, class MemElemType>'
68313955Sgiacomo.gabrielli@arm.com        tplArgs = '<RegElemType, MemElemType>'
68413955Sgiacomo.gabrielli@arm.com        eaCode = SPAlignmentCheckCode + '''
68513955Sgiacomo.gabrielli@arm.com        int memAccessSize = eCount * sizeof(MemElemType);
68613955Sgiacomo.gabrielli@arm.com        EA = XBase + '''
68713955Sgiacomo.gabrielli@arm.com        if offsetIsImm:
68813955Sgiacomo.gabrielli@arm.com            eaCode += '((int64_t) this->imm * eCount * sizeof(MemElemType))'
68913955Sgiacomo.gabrielli@arm.com        else:
69013955Sgiacomo.gabrielli@arm.com            eaCode += '(XOffset * sizeof(MemElemType));'
69114091Sgabor.dozsa@arm.com        loadRdEnableCode = '''
69214091Sgabor.dozsa@arm.com        auto rdEn = std::vector<bool>(sizeof(MemElemType) * eCount, true);
69314091Sgabor.dozsa@arm.com        for (int i = 0; i < eCount; i++) {
69414091Sgabor.dozsa@arm.com            if (!GpOp_x[i]) {
69514091Sgabor.dozsa@arm.com                for (int j = 0; j < sizeof(MemElemType); j++) {
69614091Sgabor.dozsa@arm.com                    rdEn[sizeof(MemElemType) * i + j] = false;
69714091Sgabor.dozsa@arm.com                }
69814091Sgabor.dozsa@arm.com            }
69914091Sgabor.dozsa@arm.com        }
70014091Sgabor.dozsa@arm.com        '''
70113955Sgiacomo.gabrielli@arm.com        loadMemAccCode = '''
70213955Sgiacomo.gabrielli@arm.com        for (int i = 0; i < eCount; i++) {
70313955Sgiacomo.gabrielli@arm.com            if (GpOp_x[i]) {
70413955Sgiacomo.gabrielli@arm.com                AA64FpDest_x[i] = memDataView[i];
70513955Sgiacomo.gabrielli@arm.com            } else {
70613955Sgiacomo.gabrielli@arm.com                AA64FpDest_x[i] = 0;
70713955Sgiacomo.gabrielli@arm.com            }
70813955Sgiacomo.gabrielli@arm.com        }
70913955Sgiacomo.gabrielli@arm.com        '''
71013955Sgiacomo.gabrielli@arm.com        storeMemAccCode = '''
71113955Sgiacomo.gabrielli@arm.com        for (int i = 0; i < eCount; i++) {
71213955Sgiacomo.gabrielli@arm.com            if (GpOp_x[i]) {
71313955Sgiacomo.gabrielli@arm.com                memDataView[i] = AA64FpDest_x[i];
71413955Sgiacomo.gabrielli@arm.com            } else {
71513955Sgiacomo.gabrielli@arm.com                memDataView[i] = 0;
71613955Sgiacomo.gabrielli@arm.com                for (int j = 0; j < sizeof(MemElemType); j++) {
71713955Sgiacomo.gabrielli@arm.com                    wrEn[sizeof(MemElemType) * i + j] = false;
71813955Sgiacomo.gabrielli@arm.com                }
71913955Sgiacomo.gabrielli@arm.com            }
72013955Sgiacomo.gabrielli@arm.com        }
72113955Sgiacomo.gabrielli@arm.com        '''
72213955Sgiacomo.gabrielli@arm.com        storeWrEnableCode = '''
72313955Sgiacomo.gabrielli@arm.com        auto wrEn = std::vector<bool>(sizeof(MemElemType) * eCount, true);
72413955Sgiacomo.gabrielli@arm.com        '''
72514091Sgabor.dozsa@arm.com        ffrReadBackCode = '''
72614091Sgabor.dozsa@arm.com        auto& firstFaultReg = Ffr;'''
72714091Sgabor.dozsa@arm.com        fautlingLoadmemAccCode = '''
72814091Sgabor.dozsa@arm.com        for (int i = 0; i < eCount; i++) {
72914091Sgabor.dozsa@arm.com            if (GpOp_x[i] && firstFaultReg[i * sizeof(RegElemType)]) {
73014091Sgabor.dozsa@arm.com                AA64FpDest_x[i] = memDataView[i];
73114091Sgabor.dozsa@arm.com            } else {
73214091Sgabor.dozsa@arm.com                AA64FpDest_x[i] = 0;
73314091Sgabor.dozsa@arm.com            }
73414091Sgabor.dozsa@arm.com        }
73514091Sgabor.dozsa@arm.com        '''
73614091Sgabor.dozsa@arm.com        nonFaultingCode = 'true ||'
73714091Sgabor.dozsa@arm.com        faultCode = '''
73814091Sgabor.dozsa@arm.com        Addr fault_addr;
73914091Sgabor.dozsa@arm.com        if (fault == NoFault || getFaultVAddr(fault, fault_addr)) {
74014091Sgabor.dozsa@arm.com            unsigned fault_elem_index;
74114091Sgabor.dozsa@arm.com            if (fault != NoFault) {
74214091Sgabor.dozsa@arm.com                assert(fault_addr >= EA);
74314091Sgabor.dozsa@arm.com                fault_elem_index = (fault_addr - EA) / sizeof(MemElemType);
74414091Sgabor.dozsa@arm.com            } else {
74514091Sgabor.dozsa@arm.com                fault_elem_index = eCount + 1;
74614091Sgabor.dozsa@arm.com            }
74714091Sgabor.dozsa@arm.com            int first_active_index;
74814091Sgabor.dozsa@arm.com            for (first_active_index = 0;
74914091Sgabor.dozsa@arm.com                 first_active_index < eCount && !(GpOp_x[first_active_index]);
75014091Sgabor.dozsa@arm.com                 first_active_index++);
75114091Sgabor.dozsa@arm.com            if (%s first_active_index < fault_elem_index) {
75214091Sgabor.dozsa@arm.com                for (int i = 0; i < eCount; i++) {
75314091Sgabor.dozsa@arm.com                    for (int j = 0; j < sizeof(RegElemType); j++) {
75414091Sgabor.dozsa@arm.com                        if (i < fault_elem_index) {
75514091Sgabor.dozsa@arm.com                            Ffr_ub[i * sizeof(RegElemType) + j] = FfrAux_x[i];
75614091Sgabor.dozsa@arm.com                        } else {
75714091Sgabor.dozsa@arm.com                            Ffr_ub[i * sizeof(RegElemType) + j] = 0;
75814091Sgabor.dozsa@arm.com                        }
75914091Sgabor.dozsa@arm.com                    }
76014091Sgabor.dozsa@arm.com                }
76114091Sgabor.dozsa@arm.com                fault = NoFault;
76214091Sgabor.dozsa@arm.com                if (first_active_index >= fault_elem_index) {
76314091Sgabor.dozsa@arm.com                    // non-faulting load needs this
76414091Sgabor.dozsa@arm.com                    xc->setMemAccPredicate(false);
76514091Sgabor.dozsa@arm.com                }
76614091Sgabor.dozsa@arm.com            }
76714091Sgabor.dozsa@arm.com        }
76814091Sgabor.dozsa@arm.com        ''' % ('' if firstFaulting else nonFaultingCode)
76914091Sgabor.dozsa@arm.com
77013955Sgiacomo.gabrielli@arm.com        loadIop = InstObjParams('ld1',
77113955Sgiacomo.gabrielli@arm.com            'SveContigLoadSI' if offsetIsImm else 'SveContigLoadSS',
77213955Sgiacomo.gabrielli@arm.com            'SveContigMemSI' if offsetIsImm else 'SveContigMemSS',
77313955Sgiacomo.gabrielli@arm.com            {'tpl_header': tplHeader,
77413955Sgiacomo.gabrielli@arm.com             'tpl_args': tplArgs,
77514091Sgabor.dozsa@arm.com             'rden_code' : loadRdEnableCode,
77613955Sgiacomo.gabrielli@arm.com             'memacc_code': loadMemAccCode,
77713955Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
77814091Sgabor.dozsa@arm.com             'fault_code' : '',
77913955Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
78013955Sgiacomo.gabrielli@arm.com            ['IsMemRef', 'IsLoad'])
78113955Sgiacomo.gabrielli@arm.com        storeIop = InstObjParams('st1',
78213955Sgiacomo.gabrielli@arm.com            'SveContigStoreSI' if offsetIsImm else 'SveContigStoreSS',
78313955Sgiacomo.gabrielli@arm.com            'SveContigMemSI' if offsetIsImm else 'SveContigMemSS',
78413955Sgiacomo.gabrielli@arm.com            {'tpl_header': tplHeader,
78513955Sgiacomo.gabrielli@arm.com             'tpl_args': tplArgs,
78613955Sgiacomo.gabrielli@arm.com             'wren_code': storeWrEnableCode,
78713955Sgiacomo.gabrielli@arm.com             'memacc_code': storeMemAccCode,
78813955Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
78913955Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
79013955Sgiacomo.gabrielli@arm.com            ['IsMemRef', 'IsStore'])
79114091Sgabor.dozsa@arm.com        faultIop = InstObjParams('ldff1' if firstFaulting else 'ldnf1',
79214091Sgabor.dozsa@arm.com            'SveContigFFLoadSS' if firstFaulting else 'SveContigNFLoadSI',
79314091Sgabor.dozsa@arm.com            'SveContigMemSS' if firstFaulting else 'SveContigMemSI',
79414091Sgabor.dozsa@arm.com            {'tpl_header': tplHeader,
79514091Sgabor.dozsa@arm.com             'tpl_args': tplArgs,
79614091Sgabor.dozsa@arm.com             'rden_code' : loadRdEnableCode,
79714091Sgabor.dozsa@arm.com             'memacc_code': fautlingLoadmemAccCode,
79814091Sgabor.dozsa@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
79914091Sgabor.dozsa@arm.com             'fault_code' : faultCode,
80014091Sgabor.dozsa@arm.com             'fa_code' : ''},
80114091Sgabor.dozsa@arm.com            ['IsMemRef', 'IsLoad'])
80214091Sgabor.dozsa@arm.com        faultIop.snippets['memacc_code'] = (ffrReadBackCode +
80314091Sgabor.dozsa@arm.com                                           faultIop.snippets['memacc_code'])
80413955Sgiacomo.gabrielli@arm.com        if offsetIsImm:
80513955Sgiacomo.gabrielli@arm.com            header_output += SveContigMemSIOpDeclare.subst(loadIop)
80613955Sgiacomo.gabrielli@arm.com            header_output += SveContigMemSIOpDeclare.subst(storeIop)
80714091Sgabor.dozsa@arm.com            header_output += SveContigMemSIOpDeclare.subst(faultIop)
80813955Sgiacomo.gabrielli@arm.com        else:
80913955Sgiacomo.gabrielli@arm.com            header_output += SveContigMemSSOpDeclare.subst(loadIop)
81013955Sgiacomo.gabrielli@arm.com            header_output += SveContigMemSSOpDeclare.subst(storeIop)
81114091Sgabor.dozsa@arm.com            header_output += SveContigMemSSOpDeclare.subst(faultIop)
81213955Sgiacomo.gabrielli@arm.com        exec_output += (
81313955Sgiacomo.gabrielli@arm.com            SveContigLoadExecute.subst(loadIop) +
81413955Sgiacomo.gabrielli@arm.com            SveContigLoadInitiateAcc.subst(loadIop) +
81513955Sgiacomo.gabrielli@arm.com            SveContigLoadCompleteAcc.subst(loadIop) +
81613955Sgiacomo.gabrielli@arm.com            SveContigStoreExecute.subst(storeIop) +
81713955Sgiacomo.gabrielli@arm.com            SveContigStoreInitiateAcc.subst(storeIop) +
81814091Sgabor.dozsa@arm.com            SveContigStoreCompleteAcc.subst(storeIop) +
81914091Sgabor.dozsa@arm.com            SveContigLoadExecute.subst(faultIop) +
82014091Sgabor.dozsa@arm.com            SveContigLoadInitiateAcc.subst(faultIop) +
82114091Sgabor.dozsa@arm.com            SveContigLoadCompleteAcc.subst(faultIop))
82214091Sgabor.dozsa@arm.com
82313955Sgiacomo.gabrielli@arm.com        for args in loadTplArgs:
82413955Sgiacomo.gabrielli@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
82513955Sgiacomo.gabrielli@arm.com                         'class_name': 'SveContigLoadSI' if offsetIsImm
82613955Sgiacomo.gabrielli@arm.com                                       else 'SveContigLoadSS'}
82713955Sgiacomo.gabrielli@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
82813955Sgiacomo.gabrielli@arm.com        for args in storeTplArgs:
82913955Sgiacomo.gabrielli@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
83013955Sgiacomo.gabrielli@arm.com                         'class_name': 'SveContigStoreSI' if offsetIsImm
83113955Sgiacomo.gabrielli@arm.com                                       else 'SveContigStoreSS'}
83213955Sgiacomo.gabrielli@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
83314091Sgabor.dozsa@arm.com        for args in loadTplArgs:
83414091Sgabor.dozsa@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
83514091Sgabor.dozsa@arm.com                         'class_name': 'SveContigFFLoadSS' if firstFaulting
83614091Sgabor.dozsa@arm.com                                       else 'SveContigNFLoadSI'}
83714091Sgabor.dozsa@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
83814091Sgabor.dozsa@arm.com
83913955Sgiacomo.gabrielli@arm.com
84013955Sgiacomo.gabrielli@arm.com    # Generates definitions for SVE load-and-replicate instructions
84113955Sgiacomo.gabrielli@arm.com    def emitSveLoadAndRepl():
84213955Sgiacomo.gabrielli@arm.com        global header_output, exec_output, decoders
84313955Sgiacomo.gabrielli@arm.com        tplHeader = 'template <class RegElemType, class MemElemType>'
84413955Sgiacomo.gabrielli@arm.com        tplArgs = '<RegElemType, MemElemType>'
84513955Sgiacomo.gabrielli@arm.com        eaCode = SPAlignmentCheckCode + '''
84613955Sgiacomo.gabrielli@arm.com        EA = XBase + imm * sizeof(MemElemType);'''
84713955Sgiacomo.gabrielli@arm.com        memAccCode = '''
84813955Sgiacomo.gabrielli@arm.com        for (int i = 0; i < eCount; i++) {
84913955Sgiacomo.gabrielli@arm.com            if (GpOp_x[i]) {
85013955Sgiacomo.gabrielli@arm.com                AA64FpDest_x[i] = memData;
85113955Sgiacomo.gabrielli@arm.com            } else {
85213955Sgiacomo.gabrielli@arm.com                AA64FpDest_x[i] = 0;
85313955Sgiacomo.gabrielli@arm.com            }
85413955Sgiacomo.gabrielli@arm.com        }
85513955Sgiacomo.gabrielli@arm.com        '''
85613955Sgiacomo.gabrielli@arm.com        iop = InstObjParams('ld1r',
85713955Sgiacomo.gabrielli@arm.com            'SveLoadAndRepl',
85813955Sgiacomo.gabrielli@arm.com            'SveContigMemSI',
85913955Sgiacomo.gabrielli@arm.com            {'tpl_header': tplHeader,
86013955Sgiacomo.gabrielli@arm.com             'tpl_args': tplArgs,
86113955Sgiacomo.gabrielli@arm.com             'memacc_code': memAccCode,
86213955Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
86313955Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
86413955Sgiacomo.gabrielli@arm.com            ['IsMemRef', 'IsLoad'])
86513955Sgiacomo.gabrielli@arm.com        header_output += SveContigMemSIOpDeclare.subst(iop)
86613955Sgiacomo.gabrielli@arm.com        exec_output += (
86713955Sgiacomo.gabrielli@arm.com            SveLoadAndReplExecute.subst(iop) +
86813955Sgiacomo.gabrielli@arm.com            SveLoadAndReplInitiateAcc.subst(iop) +
86913955Sgiacomo.gabrielli@arm.com            SveLoadAndReplCompleteAcc.subst(iop))
87013955Sgiacomo.gabrielli@arm.com        for args in loadTplArgs:
87113955Sgiacomo.gabrielli@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
87213955Sgiacomo.gabrielli@arm.com                         'class_name': 'SveLoadAndRepl'}
87313955Sgiacomo.gabrielli@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
87413955Sgiacomo.gabrielli@arm.com
87514028Sgiacomo.gabrielli@arm.com    class IndexedAddrForm:
87614028Sgiacomo.gabrielli@arm.com        VEC_PLUS_IMM = 0
87714028Sgiacomo.gabrielli@arm.com        SCA_PLUS_VEC = 1
87814028Sgiacomo.gabrielli@arm.com
87914028Sgiacomo.gabrielli@arm.com    # Generates definitions for the transfer microops of SVE indexed memory
88014028Sgiacomo.gabrielli@arm.com    # operations (gather loads, scatter stores)
88114028Sgiacomo.gabrielli@arm.com    def emitSveIndexedMemMicroops(indexed_addr_form):
88214028Sgiacomo.gabrielli@arm.com        assert indexed_addr_form in (IndexedAddrForm.VEC_PLUS_IMM,
88314028Sgiacomo.gabrielli@arm.com                                     IndexedAddrForm.SCA_PLUS_VEC)
88414028Sgiacomo.gabrielli@arm.com        global header_output, exec_output, decoders
88514028Sgiacomo.gabrielli@arm.com        tplHeader = 'template <class RegElemType, class MemElemType>'
88614028Sgiacomo.gabrielli@arm.com        tplArgs = '<RegElemType, MemElemType>'
88714028Sgiacomo.gabrielli@arm.com        if indexed_addr_form == IndexedAddrForm.VEC_PLUS_IMM:
88814028Sgiacomo.gabrielli@arm.com            eaCode = '''
88914028Sgiacomo.gabrielli@arm.com        EA = AA64FpBase_x[elemIndex] + imm * sizeof(MemElemType)'''
89014028Sgiacomo.gabrielli@arm.com        else:
89114028Sgiacomo.gabrielli@arm.com            eaCode = '''
89214028Sgiacomo.gabrielli@arm.com        uint64_t offset = AA64FpOffset_x[elemIndex];
89314028Sgiacomo.gabrielli@arm.com        if (offsetIs32) {
89414028Sgiacomo.gabrielli@arm.com            offset &= (1ULL << 32) - 1;
89514028Sgiacomo.gabrielli@arm.com        }
89614028Sgiacomo.gabrielli@arm.com        if (offsetIsSigned) {
89714028Sgiacomo.gabrielli@arm.com            offset = sext<32>(offset);
89814028Sgiacomo.gabrielli@arm.com        }
89914028Sgiacomo.gabrielli@arm.com        if (offsetIsScaled) {
90014028Sgiacomo.gabrielli@arm.com            offset *= sizeof(MemElemType);
90114028Sgiacomo.gabrielli@arm.com        }
90214028Sgiacomo.gabrielli@arm.com        EA = XBase + offset'''
90314028Sgiacomo.gabrielli@arm.com        loadMemAccCode = '''
90414091Sgabor.dozsa@arm.com            AA64FpDest_x[elemIndex] = memData;
90514028Sgiacomo.gabrielli@arm.com        '''
90614028Sgiacomo.gabrielli@arm.com        storeMemAccCode = '''
90714028Sgiacomo.gabrielli@arm.com            memData = AA64FpDest_x[elemIndex];
90814028Sgiacomo.gabrielli@arm.com        '''
90914091Sgabor.dozsa@arm.com        predCheckCode = 'GpOp_x[index]'
91014091Sgabor.dozsa@arm.com        faultStatusSetCode = 'PUreg0_x[elemIndex] = 1;'
91114091Sgabor.dozsa@arm.com        faultStatusResetCode = 'PUreg0_x[elemIndex] = 0;'
91214028Sgiacomo.gabrielli@arm.com        loadIop = InstObjParams('ld1',
91314028Sgiacomo.gabrielli@arm.com            ('SveGatherLoadVIMicroop'
91414028Sgiacomo.gabrielli@arm.com             if indexed_addr_form == IndexedAddrForm.VEC_PLUS_IMM
91514028Sgiacomo.gabrielli@arm.com             else 'SveGatherLoadSVMicroop'),
91614028Sgiacomo.gabrielli@arm.com            'MicroOp',
91714028Sgiacomo.gabrielli@arm.com            {'tpl_header': tplHeader,
91814028Sgiacomo.gabrielli@arm.com             'tpl_args': tplArgs,
91914028Sgiacomo.gabrielli@arm.com             'memacc_code': loadMemAccCode,
92014028Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
92114091Sgabor.dozsa@arm.com             'fault_status_set_code' : faultStatusSetCode,
92214091Sgabor.dozsa@arm.com             'fault_status_reset_code' : faultStatusResetCode,
92314028Sgiacomo.gabrielli@arm.com             'pred_check_code' : predCheckCode,
92414028Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
92514028Sgiacomo.gabrielli@arm.com            ['IsMicroop', 'IsMemRef', 'IsLoad'])
92614028Sgiacomo.gabrielli@arm.com        storeIop = InstObjParams('st1',
92714028Sgiacomo.gabrielli@arm.com            ('SveScatterStoreVIMicroop'
92814028Sgiacomo.gabrielli@arm.com             if indexed_addr_form == IndexedAddrForm.VEC_PLUS_IMM
92914028Sgiacomo.gabrielli@arm.com             else 'SveScatterStoreSVMicroop'),
93014028Sgiacomo.gabrielli@arm.com            'MicroOp',
93114028Sgiacomo.gabrielli@arm.com            {'tpl_header': tplHeader,
93214028Sgiacomo.gabrielli@arm.com             'tpl_args': tplArgs,
93314028Sgiacomo.gabrielli@arm.com             'memacc_code': storeMemAccCode,
93414028Sgiacomo.gabrielli@arm.com             'ea_code' : sveEnabledCheckCode + eaCode,
93514028Sgiacomo.gabrielli@arm.com             'pred_check_code' : predCheckCode,
93614028Sgiacomo.gabrielli@arm.com             'fa_code' : ''},
93714028Sgiacomo.gabrielli@arm.com            ['IsMicroop', 'IsMemRef', 'IsStore'])
93814028Sgiacomo.gabrielli@arm.com        if indexed_addr_form == IndexedAddrForm.VEC_PLUS_IMM:
93914028Sgiacomo.gabrielli@arm.com            header_output += SveIndexedMemVIMicroopDeclare.subst(loadIop)
94014028Sgiacomo.gabrielli@arm.com            header_output += SveIndexedMemVIMicroopDeclare.subst(storeIop)
94114028Sgiacomo.gabrielli@arm.com        else:
94214028Sgiacomo.gabrielli@arm.com            header_output += SveIndexedMemSVMicroopDeclare.subst(loadIop)
94314028Sgiacomo.gabrielli@arm.com            header_output += SveIndexedMemSVMicroopDeclare.subst(storeIop)
94414028Sgiacomo.gabrielli@arm.com        exec_output += (
94514028Sgiacomo.gabrielli@arm.com            SveGatherLoadMicroopExecute.subst(loadIop) +
94614028Sgiacomo.gabrielli@arm.com            SveGatherLoadMicroopInitiateAcc.subst(loadIop) +
94714028Sgiacomo.gabrielli@arm.com            SveGatherLoadMicroopCompleteAcc.subst(loadIop) +
94814028Sgiacomo.gabrielli@arm.com            SveScatterStoreMicroopExecute.subst(storeIop) +
94914028Sgiacomo.gabrielli@arm.com            SveScatterStoreMicroopInitiateAcc.subst(storeIop) +
95014028Sgiacomo.gabrielli@arm.com            SveScatterStoreMicroopCompleteAcc.subst(storeIop))
95114028Sgiacomo.gabrielli@arm.com        for args in gatherLoadTplArgs:
95214028Sgiacomo.gabrielli@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
95314028Sgiacomo.gabrielli@arm.com                         'class_name': (
95414028Sgiacomo.gabrielli@arm.com                             'SveGatherLoadVIMicroop'
95514028Sgiacomo.gabrielli@arm.com                             if indexed_addr_form == \
95614028Sgiacomo.gabrielli@arm.com                                 IndexedAddrForm.VEC_PLUS_IMM
95714028Sgiacomo.gabrielli@arm.com                             else 'SveGatherLoadSVMicroop')}
95814028Sgiacomo.gabrielli@arm.com            # TODO: this should become SveMemExecDeclare
95914028Sgiacomo.gabrielli@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
96014028Sgiacomo.gabrielli@arm.com        for args in scatterStoreTplArgs:
96114028Sgiacomo.gabrielli@arm.com            substDict = {'tpl_args': '<%s>' % ', '.join(args),
96214028Sgiacomo.gabrielli@arm.com                         'class_name': (
96314028Sgiacomo.gabrielli@arm.com                             'SveScatterStoreVIMicroop'
96414028Sgiacomo.gabrielli@arm.com                             if indexed_addr_form == \
96514028Sgiacomo.gabrielli@arm.com                                 IndexedAddrForm.VEC_PLUS_IMM
96614028Sgiacomo.gabrielli@arm.com                             else 'SveScatterStoreSVMicroop')}
96714028Sgiacomo.gabrielli@arm.com            # TODO: this should become SveMemExecDeclare
96814028Sgiacomo.gabrielli@arm.com            exec_output += SveContigMemExecDeclare.subst(substDict)
96914028Sgiacomo.gabrielli@arm.com
97014091Sgabor.dozsa@arm.com    firstFaultTplArgs = ('int32_t', 'int64_t', 'uint32_t', 'uint64_t')
97114091Sgabor.dozsa@arm.com
97214091Sgabor.dozsa@arm.com    def emitSveFirstFaultWritebackMicroop():
97314091Sgabor.dozsa@arm.com        global header_output, exec_output, decoders
97414091Sgabor.dozsa@arm.com        tplHeader = 'template <class RegElemType>'
97514091Sgabor.dozsa@arm.com        tplArgs = '<RegElemType>'
97614091Sgabor.dozsa@arm.com        faultStatusCheckCode = 'PUreg0_x[index]'
97714091Sgabor.dozsa@arm.com        firstFaultResetCode = '''
97814091Sgabor.dozsa@arm.com        for(int j = 0; j < sizeof(RegElemType); j++) {
97914091Sgabor.dozsa@arm.com            Ffr_ub[index * sizeof(RegElemType) + j] = 0;
98014091Sgabor.dozsa@arm.com        }
98114091Sgabor.dozsa@arm.com        '''
98214091Sgabor.dozsa@arm.com        firstFaultForwardCode = '''
98314091Sgabor.dozsa@arm.com        for(int j = 0; j < sizeof(RegElemType); j++) {
98414091Sgabor.dozsa@arm.com            Ffr_ub[index * sizeof(RegElemType) + j] = FfrAux_x[index];
98514091Sgabor.dozsa@arm.com        }
98614091Sgabor.dozsa@arm.com        '''
98714091Sgabor.dozsa@arm.com        iop = InstObjParams('ldff1',
98814091Sgabor.dozsa@arm.com            'SveFirstFaultWritebackMicroop',
98914091Sgabor.dozsa@arm.com            'MicroOp',
99014091Sgabor.dozsa@arm.com            {'tpl_header': tplHeader,
99114091Sgabor.dozsa@arm.com             'tpl_args': tplArgs,
99214091Sgabor.dozsa@arm.com             'fault_status_check_code' : faultStatusCheckCode,
99314091Sgabor.dozsa@arm.com             'first_fault_reset_code' : firstFaultResetCode,
99414091Sgabor.dozsa@arm.com             'first_fault_forward_code' : firstFaultForwardCode},
99514091Sgabor.dozsa@arm.com             ['IsMicroop'])
99614091Sgabor.dozsa@arm.com        header_output += SveFirstFaultWritebackMicroopDeclare.subst(iop)
99714091Sgabor.dozsa@arm.com        exec_output += SveFirstFaultWritebackMicroopExecute.subst(iop)
99814091Sgabor.dozsa@arm.com        for args in firstFaultTplArgs:
99914091Sgabor.dozsa@arm.com            substDict = {'targs': args,
100014091Sgabor.dozsa@arm.com                         'class_name' : 'SveFirstFaultWritebackMicroop' }
100114091Sgabor.dozsa@arm.com            exec_output += SveOpExecDeclare.subst(substDict)
100214091Sgabor.dozsa@arm.com
100314028Sgiacomo.gabrielli@arm.com    # Generates definitions for the first microop of SVE gather loads, required
100414028Sgiacomo.gabrielli@arm.com    # to propagate the source vector register to the transfer microops
100514028Sgiacomo.gabrielli@arm.com    def emitSveGatherLoadCpySrcVecMicroop():
100614028Sgiacomo.gabrielli@arm.com        global header_output, exec_output, decoders
100714028Sgiacomo.gabrielli@arm.com        code = sveEnabledCheckCode + '''
100814028Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
100914028Sgiacomo.gabrielli@arm.com                xc->tcBase());
101014028Sgiacomo.gabrielli@arm.com        for (unsigned i = 0; i < eCount; i++) {
101114028Sgiacomo.gabrielli@arm.com            AA64FpUreg0_ub[i] = AA64FpOp1_ub[i];
101214028Sgiacomo.gabrielli@arm.com        }'''
101314028Sgiacomo.gabrielli@arm.com        iop = InstObjParams('ld1',
101414028Sgiacomo.gabrielli@arm.com            'SveGatherLoadCpySrcVecMicroop',
101514028Sgiacomo.gabrielli@arm.com            'MicroOp',
101614028Sgiacomo.gabrielli@arm.com            {'code': code},
101714028Sgiacomo.gabrielli@arm.com            ['IsMicroop'])
101814028Sgiacomo.gabrielli@arm.com        header_output += SveGatherLoadCpySrcVecMicroopDeclare.subst(iop)
101914028Sgiacomo.gabrielli@arm.com        exec_output += SveGatherLoadCpySrcVecMicroopExecute.subst(iop)
102014028Sgiacomo.gabrielli@arm.com
102113955Sgiacomo.gabrielli@arm.com    # LD1[S]{B,H,W,D} (scalar plus immediate)
102214028Sgiacomo.gabrielli@arm.com    # ST1[S]{B,H,W,D} (scalar plus immediate)
102314091Sgabor.dozsa@arm.com    # LDNF1[S]{B,H,W,D} (scalar plus immediate)
102413955Sgiacomo.gabrielli@arm.com    emitSveContigMemInsts(True)
102513955Sgiacomo.gabrielli@arm.com    # LD1[S]{B,H,W,D} (scalar plus scalar)
102614028Sgiacomo.gabrielli@arm.com    # ST1[S]{B,H,W,D} (scalar plus scalar)
102714091Sgabor.dozsa@arm.com    # LDFF1[S]{B,H,W,D} (scalar plus vector)
102813955Sgiacomo.gabrielli@arm.com    emitSveContigMemInsts(False)
102913955Sgiacomo.gabrielli@arm.com
103013955Sgiacomo.gabrielli@arm.com    # LD1R[S]{B,H,W,D}
103113955Sgiacomo.gabrielli@arm.com    emitSveLoadAndRepl()
103213955Sgiacomo.gabrielli@arm.com
103313955Sgiacomo.gabrielli@arm.com    # LDR (predicate), STR (predicate)
103413955Sgiacomo.gabrielli@arm.com    emitSveMemFillSpill(True)
103513955Sgiacomo.gabrielli@arm.com    # LDR (vector), STR (vector)
103613955Sgiacomo.gabrielli@arm.com    emitSveMemFillSpill(False)
103713955Sgiacomo.gabrielli@arm.com
103814028Sgiacomo.gabrielli@arm.com    # LD1[S]{B,H,W,D} (vector plus immediate)
103914028Sgiacomo.gabrielli@arm.com    # ST1[S]{B,H,W,D} (vector plus immediate)
104014091Sgabor.dozsa@arm.com    # LDFF1[S]{B,H,W,D} (scalar plus immediate)
104114028Sgiacomo.gabrielli@arm.com    emitSveIndexedMemMicroops(IndexedAddrForm.VEC_PLUS_IMM)
104214028Sgiacomo.gabrielli@arm.com    # LD1[S]{B,H,W,D} (scalar plus vector)
104314028Sgiacomo.gabrielli@arm.com    # ST1[S]{B,H,W,D} (scalar plus vector)
104414091Sgabor.dozsa@arm.com    # LDFF1[S]{B,H,W,D} (scalar plus vector)
104514028Sgiacomo.gabrielli@arm.com    emitSveIndexedMemMicroops(IndexedAddrForm.SCA_PLUS_VEC)
104614028Sgiacomo.gabrielli@arm.com
104714091Sgabor.dozsa@arm.com    # FFR writeback microop for gather loads
104814091Sgabor.dozsa@arm.com    emitSveFirstFaultWritebackMicroop()
104914091Sgabor.dozsa@arm.com
105014028Sgiacomo.gabrielli@arm.com    # Source vector copy microop for gather loads
105114028Sgiacomo.gabrielli@arm.com    emitSveGatherLoadCpySrcVecMicroop()
105213955Sgiacomo.gabrielli@arm.com}};
1053