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