1 /*
2  * Copyright (c) 1993-2019, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 /** \file
19  * \brief Data definitions for FTN front-end data structures
20  */
21 
22 #include "gbldefs.h"
23 #include "global.h"
24 #include "symtab.h"
25 #include "semant.h"
26 #include "soc.h"
27 #include "ilm.h"
28 #include "ilmtp.h"
29 #include "flgdf.h"
30 #include "feddesc.h"
31 
32 GBL gbl;
33 
34 SEM sem;
35 
36 SOC soc;
37 
38 SWEL *switch_base;
39 
40 AUX aux;
41 #include "ilmtpdf.h"
42 
43 /*
44  * ilm tables:
45  */
46 
47 /*
48 Basic types are (starting at 1) :
49 
50 TY_WORD   TY_DWORD  TY_HOLL   TY_BINT   TY_SINT   TY_INT    TY_INT8   TY_HALF  TY_REAL
51 TY_DBLE   TY_QUAD   TY_HCMPLX  TY_CMPLX  TY_DCMPLX TY_BLOG   TY_SLOG   TY_LOG    TY_LOG8
52 TY_128    TY_CHAR   TY_NCHAR
53 
54 opc opcodes are (starting at 0) :
55 OP_NEG    OP_ADD    OP_SUB    OP_MUL    OP_DIV    OP_XTOI   OP_XTOX
56 OP_CMP    OP_AIF    OP_LD     OP_ST     OP_FUNC   OP_CON
57 */
58 
59 /** ILM opcodes for basic types: */
60 short ilm_opcode[NOPC][2][NTYPE + 1] = {
61     {/* NEG */ {0, IM_INEG, 0, 0, IM_INEG, IM_INEG, IM_INEG, IM_KNEG, IM_RNEG, IM_RNEG,
62                 IM_DNEG, 0, IM_CNEG, IM_CNEG, IM_CDNEG, IM_INEG, IM_INEG, IM_INEG,
63                 IM_KNEG, 0, 0},
64      /* VNEG */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
65     {/* ADD */ {0, IM_IADD, 0, 0, IM_IADD, IM_IADD, IM_IADD, IM_KADD, IM_RADD, IM_RADD,
66                 IM_DADD, 0, IM_CADD, IM_CADD, IM_CDADD, IM_IADD, IM_IADD, IM_IADD,
67                 IM_KADD, 0, 0},
68      /* VADD */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
69     {/* SUB */ {0, IM_ISUB, 0, 0, IM_ISUB, IM_ISUB, IM_ISUB, IM_KSUB, IM_RSUB, IM_RSUB,
70                 IM_DSUB, 0, IM_CSUB, IM_CSUB, IM_CDSUB, IM_ISUB, IM_ISUB, IM_ISUB,
71                 IM_KSUB, 0, 0},
72      /* VSUB */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
73     {/* MUL */ {0, IM_IMUL, 0, 0, IM_IMUL, IM_IMUL, IM_IMUL, IM_KMUL, IM_RMUL, IM_RMUL,
74                 IM_DMUL, 0, IM_CMUL, IM_CMUL, IM_CDMUL, IM_IMUL, IM_IMUL, IM_IMUL,
75                 IM_KMUL, 0, 0},
76      /* VMUL */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
77     {/* DIV */ {0, IM_IDIV, 0, 0, IM_IDIV, IM_IDIV, IM_IDIV, IM_KDIV, IM_RDIV, IM_RDIV,
78                 IM_DDIV, 0, IM_CDIV, IM_CDIV, IM_CDDIV, IM_IDIV, IM_IDIV, IM_IDIV,
79                 IM_KDIV, 0, 0},
80      /* VDIV */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
81     {/* xTOI */ {0, IM_ITOI, 0, 0, IM_ITOI, IM_ITOI, IM_ITOI, IM_KTOI, IM_RTOI, IM_RTOI,
82                  IM_DTOI, 0, IM_CTOI, IM_CTOI, IM_CDTOI, IM_ITOI, IM_ITOI, IM_ITOI,
83                  IM_KTOI, 0, 0},
84      /* VxTOI */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
85     {/* xTOK */ {0, IM_KTOK, 0, 0, IM_KTOK, IM_KTOK, IM_KTOK, IM_KTOK, IM_RTOK, IM_RTOK,
86                  IM_DTOK, 0, IM_CTOK, IM_CTOK, IM_CDTOK, IM_KTOK, IM_KTOK, IM_KTOK,
87                  IM_KTOK, 0, 0},
88      /* VxTOI */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
89     {/* xTOx */ {0, IM_ITOI, 0, 0, IM_ITOI, IM_ITOI, IM_ITOI, IM_KTOK, IM_RTOR, IM_RTOR,
90                  IM_DTOD, 0, IM_CTOC, IM_CTOC, IM_CDTOCD, IM_ITOI, IM_ITOI, IM_ITOI,
91                  IM_KTOK, 0, 0},
92      /* VxTOx */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
93     {/* CMP */ {0, IM_UICMP, IM_UDICMP, 0, IM_ICMP, IM_ICMP, IM_ICMP, IM_KCMP, IM_RCMP,
94                 IM_RCMP, IM_DCMP, 0, IM_CCMP, IM_CCMP, IM_CDCMP, IM_ICMP, IM_ICMP,
95                 IM_ICMP, IM_KCMP, 0, IM_SCMP, IM_NSCMP},
96      /* VCMP */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
97     {/* AIF  */ {0, IM_IAIF, 0, 0, IM_IAIF, IM_IAIF, IM_IAIF, IM_KAIF, IM_RAIF, IM_RAIF,
98                  IM_DAIF, 0, 0, 0, IM_IAIF, IM_IAIF, IM_IAIF, IM_KAIF, 0, 0},
99      /* VAIF non-existent */ {0}},
100     {/* LD */ {0, 0, 0, 0, IM_CHLD, IM_SILD, IM_ILD, IM_KLD, IM_RLD, IM_RLD, IM_DLD, 0,
101                IM_CLD, IM_CLD, IM_CDLD, IM_CHLD, IM_SLLD, IM_LLD, IM_KLLD, 0, 0},
102      /* VLD */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
103     {/* ST */ {0, IM_IST, IM_IST, 0, IM_CHST, IM_SIST, IM_IST, IM_KST, IM_RST, IM_RST,
104                IM_DST, 0, IM_CST, IM_CST, IM_CDST, IM_CHST, IM_SLST, IM_LST, IM_KLST, 0,
105                IM_SST, IM_NSST},
106      /* VST */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
107     {/* FUNC */ {0, IM_IFUNC, 0, 0, IM_IFUNC, IM_IFUNC, IM_IFUNC, IM_KFUNC,
108                  IM_RFUNC, IM_RFUNC, IM_DFUNC, 0, IM_CFUNC, IM_CFUNC, IM_CDFUNC, IM_LFUNC, IM_LFUNC,
109                  IM_LFUNC, IM_KFUNC, 0, 0},
110      /* VFUNC non-existent */ {0}},
111     {/* CON */ {0, IM_UCON, IM_UDCON, 0, IM_ICON, IM_ICON, IM_ICON, IM_KCON,
112                 IM_RCON, IM_RCON, IM_DCON, 0, IM_CCON, IM_CCON, IM_CDCON, IM_LCON, IM_LCON,
113                 IM_LCON, IM_KCON, 0, IM_BASE},
114      /* VCON non-existent */ {0}}};
115 
116 /** We only allow casting to and from TY_WORD and TY_DWORD.  Therefore, you
117  * index into the following table as follows
118  *       cast_types[dtype][{DT_WORD or DT_DWORD} - 1][0 for from or 1 for to]
119  */
120 INT cast_types[NTYPE][2][2] = {
121     /* DT_NONE */ {{0, 0}, {0, 0}},
122     /* DT_WORD */ {{0, 0}, {IM_UITOUDI, IM_UDITOUI}},
123     /* DT_DWORD */ {{IM_UDITOUI, IM_UITOUDI}, {0, 0}},
124     /* DT_HOLL */ {{IM_ITOUI, -1}, {IM_ITOUDI, -1}},
125     /* DT_BINT */ {{IM_SCTOUI, IM_UITOSC}, {IM_SCTOUDI, IM_UDITOSC}},
126     /* DT_SINT */ {{IM_STOUI, IM_UITOS}, {IM_STOUDI, IM_UDITOS}},
127     /* DT_INT */ {{IM_ITOUI, IM_UITOI}, {IM_ITOUDI, IM_UDITOI}},
128     /* DT_INT8 */ {{IM_K2I, IM_UI2K}, {IM_K2D, IM_D2K}},
129     /* DT_HALF */ {{IM_RTOUI, IM_UITOR}, {IM_RTOUDI, IM_UDITOR}},
130     /* DT_REAL */ {{IM_RTOUI, IM_UITOR}, {IM_RTOUDI, IM_UDITOR}},
131     /* DT_DBLE */ {{IM_DTOUI, IM_UITOD}, {IM_DTOUDI, IM_UDITOD}},
132     /* DT_QUAD */ {{-1, -1}, {-1, -1}},
133     /* DT_HCMPLX */ {{-1, -1}, {IM_CTOUDI, -1}},
134     /* DT_CMPLX */ {{-1, -1}, {IM_CTOUDI, -1}},
135     /* DT_DCMPLX */ {{-1, -1}, {IM_CDTOUDI, -1}},
136     /* DT_BLOG */ {{IM_SCTOUI, IM_UITOSC}, {IM_SCTOUDI, IM_UDITOSC}},
137     /* DT_SLOG */ {{IM_STOUI, IM_UITOS}, {IM_STOUDI, IM_UDITOS}},
138     /* DT_LOG */ {{IM_ITOUI, IM_UITOI}, {IM_ITOUDI, IM_UDITOI}},
139     /* DT_LOG8 */ {{IM_K2I, IM_UI2K}, {IM_K2D, IM_D2K}},
140     /* DT_128 */ {{-1, -1}, {-1, -1}}};
141 
142 int ty_to_lib[] = {
143     -1,      /* TY_NONE */
144     __WORD,  /* TY_WORD */
145     __DWORD, /* TY_DWORD */
146     __HOLL,  /* TY_HOLL */
147     __BINT,  /* TY_BINT */
148     __SINT,  /* TY_SINT */
149     __INT,   /* TY_INT */
150     __INT8,  /* TY_INT8 */
151     __REAL,  /* TY_HALF */
152     __REAL,  /* TY_REAL */
153     __DBLE,  /* TY_DBLE */
154     __QUAD,  /* TY_QUAD */
155     __CPLX,  /* TY_HCMPLX */
156     __CPLX,  /* TY_CMPLX */
157     __DCPLX, /* TY_DCMPLX */
158     __BLOG,  /* TY_BLOG */
159     __SLOG,  /* TY_SLOG */
160     __LOG,   /* TY_LOG */
161     __LOG8,  /* TY_LOG8 */
162     -1,      /* TY_128 */
163     __CHAR,  /* TY_CHAR */
164     __NCHAR, /* TY_NCHAR */
165 };
166