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