1*a1559537STaylor Simpson /* 2*a1559537STaylor Simpson * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved. 3*a1559537STaylor Simpson * 4*a1559537STaylor Simpson * This program is free software; you can redistribute it and/or modify 5*a1559537STaylor Simpson * it under the terms of the GNU General Public License as published by 6*a1559537STaylor Simpson * the Free Software Foundation; either version 2 of the License, or 7*a1559537STaylor Simpson * (at your option) any later version. 8*a1559537STaylor Simpson * 9*a1559537STaylor Simpson * This program is distributed in the hope that it will be useful, 10*a1559537STaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*a1559537STaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*a1559537STaylor Simpson * GNU General Public License for more details. 13*a1559537STaylor Simpson * 14*a1559537STaylor Simpson * You should have received a copy of the GNU General Public License 15*a1559537STaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>. 16*a1559537STaylor Simpson */ 17*a1559537STaylor Simpson 18*a1559537STaylor Simpson #ifndef HEXAGON_MMVEC_H 19*a1559537STaylor Simpson #define HEXAGON_MMVEC_H 20*a1559537STaylor Simpson 21*a1559537STaylor Simpson #define MAX_VEC_SIZE_LOGBYTES 7 22*a1559537STaylor Simpson #define MAX_VEC_SIZE_BYTES (1 << MAX_VEC_SIZE_LOGBYTES) 23*a1559537STaylor Simpson 24*a1559537STaylor Simpson #define NUM_VREGS 32 25*a1559537STaylor Simpson #define NUM_QREGS 4 26*a1559537STaylor Simpson 27*a1559537STaylor Simpson typedef uint32_t VRegMask; /* at least NUM_VREGS bits */ 28*a1559537STaylor Simpson typedef uint32_t QRegMask; /* at least NUM_QREGS bits */ 29*a1559537STaylor Simpson 30*a1559537STaylor Simpson #define VECTOR_SIZE_BYTE (fVECSIZE()) 31*a1559537STaylor Simpson 32*a1559537STaylor Simpson typedef union { 33*a1559537STaylor Simpson uint64_t ud[MAX_VEC_SIZE_BYTES / 8]; 34*a1559537STaylor Simpson int64_t d[MAX_VEC_SIZE_BYTES / 8]; 35*a1559537STaylor Simpson uint32_t uw[MAX_VEC_SIZE_BYTES / 4]; 36*a1559537STaylor Simpson int32_t w[MAX_VEC_SIZE_BYTES / 4]; 37*a1559537STaylor Simpson uint16_t uh[MAX_VEC_SIZE_BYTES / 2]; 38*a1559537STaylor Simpson int16_t h[MAX_VEC_SIZE_BYTES / 2]; 39*a1559537STaylor Simpson uint8_t ub[MAX_VEC_SIZE_BYTES / 1]; 40*a1559537STaylor Simpson int8_t b[MAX_VEC_SIZE_BYTES / 1]; 41*a1559537STaylor Simpson } MMVector; 42*a1559537STaylor Simpson 43*a1559537STaylor Simpson typedef union { 44*a1559537STaylor Simpson uint64_t ud[2 * MAX_VEC_SIZE_BYTES / 8]; 45*a1559537STaylor Simpson int64_t d[2 * MAX_VEC_SIZE_BYTES / 8]; 46*a1559537STaylor Simpson uint32_t uw[2 * MAX_VEC_SIZE_BYTES / 4]; 47*a1559537STaylor Simpson int32_t w[2 * MAX_VEC_SIZE_BYTES / 4]; 48*a1559537STaylor Simpson uint16_t uh[2 * MAX_VEC_SIZE_BYTES / 2]; 49*a1559537STaylor Simpson int16_t h[2 * MAX_VEC_SIZE_BYTES / 2]; 50*a1559537STaylor Simpson uint8_t ub[2 * MAX_VEC_SIZE_BYTES / 1]; 51*a1559537STaylor Simpson int8_t b[2 * MAX_VEC_SIZE_BYTES / 1]; 52*a1559537STaylor Simpson MMVector v[2]; 53*a1559537STaylor Simpson } MMVectorPair; 54*a1559537STaylor Simpson 55*a1559537STaylor Simpson typedef union { 56*a1559537STaylor Simpson uint64_t ud[MAX_VEC_SIZE_BYTES / 8 / 8]; 57*a1559537STaylor Simpson int64_t d[MAX_VEC_SIZE_BYTES / 8 / 8]; 58*a1559537STaylor Simpson uint32_t uw[MAX_VEC_SIZE_BYTES / 4 / 8]; 59*a1559537STaylor Simpson int32_t w[MAX_VEC_SIZE_BYTES / 4 / 8]; 60*a1559537STaylor Simpson uint16_t uh[MAX_VEC_SIZE_BYTES / 2 / 8]; 61*a1559537STaylor Simpson int16_t h[MAX_VEC_SIZE_BYTES / 2 / 8]; 62*a1559537STaylor Simpson uint8_t ub[MAX_VEC_SIZE_BYTES / 1 / 8]; 63*a1559537STaylor Simpson int8_t b[MAX_VEC_SIZE_BYTES / 1 / 8]; 64*a1559537STaylor Simpson } MMQReg; 65*a1559537STaylor Simpson 66*a1559537STaylor Simpson typedef struct { 67*a1559537STaylor Simpson MMVector data; 68*a1559537STaylor Simpson DECLARE_BITMAP(mask, MAX_VEC_SIZE_BYTES); 69*a1559537STaylor Simpson target_ulong va[MAX_VEC_SIZE_BYTES]; 70*a1559537STaylor Simpson bool op; 71*a1559537STaylor Simpson int op_size; 72*a1559537STaylor Simpson } VTCMStoreLog; 73*a1559537STaylor Simpson 74*a1559537STaylor Simpson 75*a1559537STaylor Simpson /* Types of vector register assignment */ 76*a1559537STaylor Simpson typedef enum { 77*a1559537STaylor Simpson EXT_DFL, /* Default */ 78*a1559537STaylor Simpson EXT_NEW, /* New - value used in the same packet */ 79*a1559537STaylor Simpson EXT_TMP /* Temp - value used but not stored to register */ 80*a1559537STaylor Simpson } VRegWriteType; 81*a1559537STaylor Simpson 82*a1559537STaylor Simpson #endif 83