mesa/src/freedreno/rnn/rnn.h

244 lines
5.2 KiB
C

/*
* Copyright (C) 2010 Marcin Kościelnicki <koriakin@0x04.net>
* Copyright (C) 2010 Luca Barbieri <luca@luca-barbieri.com>
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef RNN_H
#define RNN_H
#include <stdint.h>
#include <stdlib.h>
struct rnnauthor {
char* name;
char* email;
char* contributions;
char* license;
char** nicknames;
int nicknamesnum;
int nicknamesmax;
};
struct rnncopyright {
unsigned firstyear;
char* license;
struct rnnauthor **authors;
int authorsnum;
int authorsmax;
};
struct rnndb {
struct rnncopyright copyright;
struct rnnenum **enums;
int enumsnum;
int enumsmax;
struct rnnbitset **bitsets;
int bitsetsnum;
int bitsetsmax;
struct rnndomain **domains;
int domainsnum;
int domainsmax;
struct rnngroup **groups;
int groupsnum;
int groupsmax;
struct rnnspectype **spectypes;
int spectypesnum;
int spectypesmax;
char **files;
int filesnum;
int filesmax;
int estatus;
};
struct rnnvarset {
struct rnnenum *venum;
int *variants;
};
struct rnnvarinfo {
char *prefixstr;
char *varsetstr;
char *variantsstr;
int dead;
struct rnnenum *prefenum;
char *prefix;
struct rnnvarset **varsets;
int varsetsnum;
int varsetsmax;
};
struct rnnenum {
char *name;
int bare;
int isinline;
struct rnnvarinfo varinfo;
struct rnnvalue **vals;
int valsnum;
int valsmax;
char *fullname;
int prepared;
char *file;
};
struct rnnvalue {
char *name;
int valvalid;
uint64_t value;
struct rnnvarinfo varinfo;
char *fullname;
char *file;
};
struct rnntypeinfo {
char *name;
enum rnnttype {
RNN_TTYPE_INVALID,
RNN_TTYPE_INLINE_ENUM,
RNN_TTYPE_INLINE_BITSET,
RNN_TTYPE_ENUM,
RNN_TTYPE_BITSET,
RNN_TTYPE_SPECTYPE,
RNN_TTYPE_HEX,
RNN_TTYPE_INT,
RNN_TTYPE_UINT,
RNN_TTYPE_FLOAT,
RNN_TTYPE_BOOLEAN,
RNN_TTYPE_FIXED,
RNN_TTYPE_UFIXED,
RNN_TTYPE_A3XX_REGID,
} type;
struct rnnenum *eenum;
struct rnnbitset *ebitset;
struct rnnspectype *spectype;
struct rnnbitfield **bitfields;
int bitfieldsnum;
int bitfieldsmax;
struct rnnvalue **vals;
int valsnum;
int valsmax;
int shr, low, high;
uint64_t min, max, align, radix;
int addvariant;
int minvalid, maxvalid, alignvalid, radixvalid;
};
static inline uint64_t typeinfo_mask(struct rnntypeinfo *ti)
{
if (ti->high == 63)
return -(1ULL << ti->low);
else
return (1ULL << (ti->high + 1)) - (1ULL << ti->low);
}
struct rnnbitset {
char *name;
int bare;
int isinline;
struct rnnvarinfo varinfo;
struct rnnbitfield **bitfields;
int bitfieldsnum;
int bitfieldsmax;
char *fullname;
char *file;
};
struct rnnbitfield {
char *name;
struct rnnvarinfo varinfo;
struct rnntypeinfo typeinfo;
char *fullname;
char *file;
};
struct rnndomain {
char *name;
int bare;
int width;
uint64_t size;
int sizevalid;
struct rnnvarinfo varinfo;
struct rnndelem **subelems;
int subelemsnum;
int subelemsmax;
char *fullname;
char *file;
};
struct rnngroup {
char *name;
struct rnndelem **subelems;
int subelemsnum;
int subelemsmax;
};
struct rnndelem {
enum rnnetype {
RNN_ETYPE_REG,
RNN_ETYPE_ARRAY,
RNN_ETYPE_STRIPE,
RNN_ETYPE_USE_GROUP,
} type;
char *name;
int width;
enum rnnaccess {
RNN_ACCESS_R,
RNN_ACCESS_W,
RNN_ACCESS_RW,
} access;
uint64_t offset;
uint64_t *offsets; /* for "array" with irregular offsets */
int offsetsnum;
int offsetsmax;
char *doffset;
char **doffsets;
int doffsetsnum;
int doffsetsmax;
uint64_t length;
uint64_t stride;
struct rnndelem **subelems;
int subelemsnum;
int subelemsmax;
struct rnnvarinfo varinfo;
struct rnntypeinfo typeinfo;
struct rnnenum *index; /* for arrays, for symbolic idx values */
char *fullname;
char *file;
};
struct rnnspectype {
char *name;
struct rnntypeinfo typeinfo;
char *file;
};
void rnn_init(void);
struct rnndb *rnn_newdb(void);
void rnn_parsefile (struct rnndb *db, char *file);
void rnn_prepdb (struct rnndb *db);
struct rnnenum *rnn_findenum (struct rnndb *db, const char *name);
struct rnnbitset *rnn_findbitset (struct rnndb *db, const char *name);
struct rnndomain *rnn_finddomain (struct rnndb *db, const char *name);
struct rnnspectype *rnn_findspectype (struct rnndb *db, const char *name);
#endif