1 /** 2 * Compiler implementation of the 3 * $(LINK2 http://www.dlang.org, D programming language). 4 * 5 * Copyright: Copyright (C) 1985-1998 by Symantec 6 * Copyright (C) 2000-2019 by The D Language Foundation, All Rights Reserved 7 * Authors: $(LINK2 http://www.digitalmars.com, Walter Bright) 8 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) 9 * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/backend/optabgen.d, backend/optabgen.d) 10 */ 11 12 module optabgen; 13 14 /* Generate op-code tables 15 * Creates optab.d,tytab.d,debtab.d,cdxxx.d,elxxx.d 16 */ 17 18 import core.stdc.stdio; 19 import core.stdc.stdlib; 20 21 import dmd.backend.cc; 22 import dmd.backend.cdef; 23 import dmd.backend.oper; 24 import dmd.backend.ty; 25 26 ubyte[OPMAX] xptab1,xptab2,xptab3; 27 28 int[] _binary = [ 29 OPadd,OPmul,OPand,OPmin,OPcond,OPcomma,OPdiv,OPmod,OPxor, 30 OPor,OPoror,OPandand,OPshl,OPshr,OPashr,OPstreq,OPstrcpy,OPstrcat,OPstrcmp, 31 OPpostinc,OPpostdec,OPeq,OPaddass,OPminass,OPmulass,OPdivass, 32 OPmodass,OPshrass,OPashrass,OPshlass,OPandass,OPxorass,OPorass, 33 OPle,OPgt,OPlt,OPge,OPeqeq,OPne,OPparam,OPcall,OPcallns,OPcolon,OPcolon2, 34 OPbit,OPbrack,OParrowstar,OPmemcpy,OPmemcmp,OPmemset, 35 OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge, 36 OPnlt,OPnle,OPord,OPnlg,OPnleg,OPnule,OPnul,OPnuge,OPnug,OPnue, 37 OPinfo,OPpair,OPrpair, 38 OPbt,OPbtc,OPbtr,OPbts,OPror,OProl,OPbtst, 39 OPremquo,OPcmpxchg, 40 OPoutp,OPscale,OPyl2x,OPyl2xp1, 41 OPvecsto,OPprefetch 42 ]; 43 int[] _unary = 44 [OPnot,OPcom,OPind,OPaddr,OPneg,OPuadd, 45 OPabs,OPrndtol,OPrint, 46 OPpreinc,OPpredec, 47 OPbool,OPstrlen, 48 OPb_8,OPs16_32,OPu16_32,OPd_s32,OPd_u32, 49 OPs32_d,OPu32_d,OPd_s16,OPs16_d,OP32_16, 50 OPd_f,OPf_d,OPu8_16,OPs8_16,OP16_8, 51 OPd_ld, OPld_d,OPc_r,OPc_i, 52 OPu32_64,OPs32_64,OP64_32,OPmsw, 53 OPd_s64,OPs64_d,OPd_u64,OPu64_d,OPld_u64, 54 OP128_64,OPs64_128,OPu64_128, 55 OPucall,OPucallns,OPstrpar,OPstrctor,OPu16_d,OPd_u16, 56 OParrow,OPnegass, 57 OPctor,OPdtor,OPsetjmp,OPvoid, 58 OPbsf,OPbsr,OPbswap,OPpopcnt, 59 OPddtor, 60 OPvector,OPvecfill, 61 OPva_start, 62 OPsqrt,OPsin,OPcos,OPinp, 63 OPvp_fp,OPcvp_fp,OPnp_fp,OPnp_f16p,OPf16p_np,OPoffset, 64 ]; 65 int[] _commut = [OPadd,OPand,OPor,OPxor,OPmul,OPeqeq,OPne,OPle,OPlt,OPge,OPgt, 66 OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge, 67 OPnlt,OPnle,OPord,OPnlg,OPnleg,OPnule,OPnul,OPnuge,OPnug,OPnue, 68 ]; 69 int[] _assoc = [OPadd,OPand,OPor,OPxor,OPmul]; 70 int[] _assign = 71 [OPstreq,OPeq,OPaddass,OPminass,OPmulass,OPdivass,OPmodass, 72 OPshrass,OPashrass,OPshlass,OPandass,OPxorass,OPorass,OPpostinc,OPpostdec, 73 OPnegass,OPvecsto,OPcmpxchg, 74 ]; 75 int[] _wid = 76 [OPadd,OPmin,OPand,OPor,OPxor,OPcom,OPneg,OPmul,OPaddass,OPnegass, 77 OPminass,OPandass,OPorass,OPxorass,OPmulass,OPshlass,OPshl,OPshrass, 78 OPashrass, 79 ]; 80 int[] _eop0e = 81 [OPadd,OPmin,OPxor,OPor,OPshl,OPshr,OPashr,OPpostinc,OPpostdec,OPaddass, 82 OPminass,OPshrass,OPashrass,OPshlass,OPxorass,OPorass, 83 OPror,OProl, 84 ]; 85 int[] _eop00 = [OPmul,OPand,OPmulass,OPandass]; 86 int[] _eop1e = [OPmul,OPdiv,OPmulass,OPdivass]; 87 int[] _call = [OPcall,OPucall,OPcallns,OPucallns]; 88 int[] _rel = [OPeqeq,OPne,OPle,OPlt,OPgt,OPge, 89 OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge, 90 OPnlt,OPnle,OPord,OPnlg,OPnleg,OPnule,OPnul,OPnuge,OPnug,OPnue, 91 ]; 92 int[] _logical = [OPeqeq,OPne,OPle,OPlt,OPgt,OPge,OPandand,OPoror,OPnot,OPbool, 93 OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge, 94 OPnlt,OPnle,OPord,OPnlg,OPnleg,OPnule,OPnul,OPnuge,OPnug,OPnue, 95 OPbt,OPbtst, 96 ]; 97 int[] _def = [OPstreq,OPeq,OPaddass,OPminass,OPmulass,OPdivass,OPmodass, 98 OPshrass,OPashrass,OPshlass,OPandass,OPxorass,OPorass, 99 OPpostinc,OPpostdec, 100 OPcall,OPucall,OPasm,OPstrcpy,OPmemcpy,OPmemset,OPstrcat, 101 OPnegass, 102 OPbtc,OPbtr,OPbts, 103 OPvecsto,OPcmpxchg, 104 ]; 105 int[] _sideff = [OPasm,OPucall,OPstrcpy,OPmemcpy,OPmemset,OPstrcat, 106 OPcall,OPeq,OPstreq,OPpostinc,OPpostdec, 107 OPaddass,OPminass,OPmulass,OPdivass,OPmodass,OPandass, 108 OPorass,OPxorass,OPshlass,OPshrass,OPashrass, 109 OPnegass,OPctor,OPdtor,OPmark,OPvoid, 110 OPbtc,OPbtr,OPbts, 111 OPhalt,OPdctor,OPddtor, 112 OPcmpxchg, 113 OPva_start, 114 OPinp,OPoutp,OPvecsto,OPprefetch, 115 ]; 116 int[] _rtol = [OPeq,OPstreq,OPstrcpy,OPmemcpy,OPpostinc,OPpostdec,OPaddass, 117 OPminass,OPmulass,OPdivass,OPmodass,OPandass, 118 OPorass,OPxorass,OPshlass,OPshrass,OPashrass, 119 OPcall,OPcallns,OPinfo,OPmemset, 120 OPvecsto,OPcmpxchg, 121 ]; 122 int[] _ae = [OPvar,OPconst,OPrelconst,OPneg, 123 OPabs,OPrndtol,OPrint, 124 OPstrlen,OPstrcmp,OPind,OPaddr, 125 OPnot,OPbool,OPcom,OPadd,OPmin,OPmul,OPand,OPor,OPmemcmp, 126 OPxor,OPdiv,OPmod,OPshl,OPshr,OPashr,OPeqeq,OPne,OPle,OPlt,OPge,OPgt, 127 OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge, 128 OPnlt,OPnle,OPord,OPnlg,OPnleg,OPnule,OPnul,OPnuge,OPnug,OPnue, 129 OPs16_32,OPu16_32,OPd_s32,OPd_u32,OPu16_d,OPd_u16, 130 OPs32_d,OPu32_d,OPd_s16,OPs16_d,OP32_16, 131 OPd_f,OPf_d,OPu8_16,OPs8_16,OP16_8, 132 OPd_ld,OPld_d,OPc_r,OPc_i, 133 OPu32_64,OPs32_64,OP64_32,OPmsw, 134 OPd_s64,OPs64_d,OPd_u64,OPu64_d,OPld_u64, 135 OP128_64,OPs64_128,OPu64_128, 136 OPsizeof, 137 OPcallns,OPucallns,OPpair,OPrpair, 138 OPbsf,OPbsr,OPbt,OPbswap,OPb_8,OPbtst,OPpopcnt, 139 OPgot,OPremquo, 140 OPnullptr, 141 OProl,OPror, 142 OPsqrt,OPsin,OPcos,OPscale, 143 OPvp_fp,OPcvp_fp,OPnp_fp,OPnp_f16p,OPf16p_np,OPoffset,OPvecfill, 144 ]; 145 int[] _boolnop = [OPuadd,OPbool,OPs16_32,OPu16_32, 146 OPs16_d, 147 OPf_d,OPu8_16,OPs8_16, 148 OPd_ld, OPld_d, 149 OPu32_64,OPs32_64,/*OP64_32,OPmsw,*/ 150 OPs64_128,OPu64_128, 151 OPu16_d,OPb_8, 152 OPnullptr, 153 OPnp_fp,OPvp_fp,OPcvp_fp, 154 OPvecfill, 155 ]; 156 int[] _lvalue = [OPvar,OPind,OPcomma,OPbit]; 157 158 FILE *fdeb; 159 160 int main() 161 { 162 printf("OPTABGEN... generating files\n"); 163 fdeb = fopen("debtab.d","w"); 164 dooptab(); 165 dotab(); 166 fltables(); 167 dotytab(); 168 fclose(fdeb); 169 return 0; 170 } 171 172 int cost(uint op) 173 { uint c; 174 175 c = 0; /* default cost */ 176 if (xptab1[op] & _OTunary) 177 c += 2; 178 else if (xptab1[op] & _OTbinary) 179 c += 7; 180 if (xptab2[op] & _OTlogical) 181 c += 3; 182 switch (op) 183 { case OPvar: c += 1; break; 184 case OPmul: c += 3; break; 185 case OPdiv: 186 case OPmod: c += 4; break; 187 case OProl: 188 case OPror: 189 case OPshl: 190 case OPashr: 191 case OPshr: c += 2; break; 192 case OPcall: 193 case OPucall: 194 case OPcallns: 195 case OPucallns: 196 c += 10; break; // very high cost for function calls 197 198 default: 199 break; 200 } 201 return c; 202 } 203 204 void dooptab() 205 { int i; 206 FILE *f; 207 208 /* Load optab[] */ 209 static void X1(int[] arr, uint mask) { for(int i=0; i<arr.length; i++) xptab1[arr[i]] |= mask; } 210 static void X2(int[] arr, uint mask) { for(int i=0; i<arr.length; i++) xptab2[arr[i]] |= mask; } 211 static void X3(int[] arr, uint mask) { for(int i=0; i<arr.length; i++) xptab3[arr[i]] |= mask; } 212 213 X1(_binary,_OTbinary); 214 X1(_unary,_OTunary); 215 X1(_commut,_OTcommut); 216 X1(_assoc,_OTassoc); 217 X1(_sideff,_OTsideff); 218 X1(_eop0e,_OTeop0e); 219 X1(_eop00,_OTeop00); 220 X1(_eop1e,_OTeop1e); 221 222 X2(_logical,_OTlogical); 223 X2(_wid,_OTwid); 224 X2(_call,_OTcall); 225 X2(_rtol,_OTrtol); 226 X2(_assign,_OTassign); 227 X2(_def,_OTdef); 228 X2(_ae,_OTae); 229 230 X3(_boolnop,_OTboolnop); 231 232 f = fopen("optab.d","w"); 233 fprintf(f,"extern (C) __gshared ubyte[OPMAX] optab1 =\n\t["); 234 for (i = 0; i < OPMAX; i++) 235 { if ((i & 7) == 0) 236 fprintf(f,"\n\t"); 237 fprintf(f,"0x%x",xptab1[i]); 238 if (i != OPMAX - 1) 239 fprintf(f,","); 240 } 241 fprintf(f,"\t];\n"); 242 fprintf(f,"extern (C) __gshared ubyte[OPMAX] optab2 =\n\t["); 243 for (i = 0; i < OPMAX; i++) 244 { if ((i & 7) == 0) 245 fprintf(f,"\n\t"); 246 fprintf(f,"0x%x",xptab2[i]); 247 if (i != OPMAX - 1) 248 fprintf(f,","); 249 } 250 fprintf(f,"\t];\n"); 251 fprintf(f,"extern (C) __gshared ubyte[OPMAX] optab3 =\n\t["); 252 for (i = 0; i < OPMAX; i++) 253 { if ((i & 7) == 0) 254 fprintf(f,"\n\t"); 255 fprintf(f,"0x%x",xptab3[i]); 256 if (i != OPMAX - 1) 257 fprintf(f,","); 258 } 259 fprintf(f,"\t];\n"); 260 261 fprintf(f,"extern (C) __gshared ubyte[OPMAX] opcost =\n\t["); 262 for (i = 0; i < OPMAX; i++) 263 { if ((i & 7) == 0) 264 fprintf(f,"\n\t"); 265 fprintf(f,"0x%x",cost(i)); 266 if (i != OPMAX - 1) 267 fprintf(f,","); 268 } 269 fprintf(f,"\t];\n"); 270 271 doreltables(f); 272 fclose(f); 273 } 274 275 /******************************************************** 276 */ 277 278 void doreltables(FILE *f) 279 { 280 struct RelTables 281 { OPER op; /* operator */ 282 OPER inot; /* for logical negation */ 283 OPER swap; /* if operands are swapped */ 284 OPER integral; /* if operands are integral types */ 285 int exception; /* if invalid exception is generated */ 286 int unord; /* result of unordered operand(s) */ 287 } 288 static RelTables[26] reltables = 289 [ /* op not swap int exc unord */ 290 { OPeqeq, OPne, OPeqeq, OPeqeq, 0, 0 }, 291 { OPne, OPeqeq, OPne, OPne, 0, 1 }, 292 { OPgt, OPngt, OPlt, OPgt, 1, 0 }, 293 { OPge, OPnge, OPle, OPge, 1, 0 }, 294 { OPlt, OPnlt, OPgt, OPlt, 1, 0 }, 295 { OPle, OPnle, OPge, OPle, 1, 0 }, 296 297 { OPunord, OPord, OPunord, cast(OPER)0,0,1 }, 298 { OPlg, OPnlg, OPlg, OPne, 1, 0 }, 299 { OPleg, OPnleg, OPleg, cast(OPER)1,1, 0 }, 300 { OPule, OPnule, OPuge, OPle, 0, 1 }, 301 { OPul, OPnul, OPug, OPlt, 0, 1 }, 302 { OPuge, OPnuge, OPule, OPge, 0, 1 }, 303 { OPug, OPnug, OPul, OPgt, 0, 1 }, 304 { OPue, OPnue, OPue, OPeqeq, 0, 1 }, 305 306 { OPngt, OPgt, OPnlt, OPle, 1, 1 }, 307 { OPnge, OPge, OPnle, OPlt, 1, 1 }, 308 { OPnlt, OPlt, OPngt, OPge, 1, 1 }, 309 { OPnle, OPle, OPnge, OPgt, 1, 1 }, 310 { OPord, OPunord, OPord, cast(OPER)1,0, 0 }, 311 { OPnlg, OPlg, OPnlg, OPeqeq, 1, 1 }, 312 { OPnleg, OPleg, OPnleg, cast(OPER)0,1, 1 }, 313 { OPnule, OPule, OPnuge, OPgt, 0, 0 }, 314 { OPnul, OPul, OPnug, OPge, 0, 0 }, 315 { OPnuge, OPuge, OPnule, OPlt, 0, 0 }, 316 { OPnug, OPug, OPnul, OPle, 0, 0 }, 317 { OPnue, OPue, OPnue, OPne, 0, 0 }, 318 ]; 319 enum RELMAX = reltables.length; 320 OPER[RELMAX] rel_not; 321 OPER[RELMAX] rel_swap; 322 OPER[RELMAX] rel_integral; 323 int[RELMAX] rel_exception; 324 int[RELMAX] rel_unord; 325 int i; 326 327 for (i = 0; i < RELMAX; i++) 328 { int j = cast(int)(reltables[i].op) - RELOPMIN; 329 330 assert(j >= 0 && j < RELMAX); 331 rel_not [j] = reltables[i].inot; 332 rel_swap [j] = reltables[i].swap; 333 rel_integral [j] = reltables[i].integral; 334 rel_exception[j] = reltables[i].exception; 335 rel_unord [j] = reltables[i].unord; 336 } 337 338 fprintf(f,"__gshared ubyte[%d] _rel_not =\n[ ", RELMAX); 339 for (i = 0; i < rel_not.length; i++) 340 { fprintf(f,"0x%02x,",rel_not[i]); 341 if ((i & 7) == 7 && i < rel_not.length - 1) 342 fprintf(f,"\n "); 343 } 344 fprintf(f,"\n];\n"); 345 346 fprintf(f,"__gshared ubyte[%d] _rel_swap =\n[ ", RELMAX); 347 for (i = 0; i < rel_swap.length; i++) 348 { fprintf(f,"0x%02x,",rel_swap[i]); 349 if ((i & 7) == 7 && i < rel_swap.length - 1) 350 fprintf(f,"\n "); 351 } 352 fprintf(f,"\n];\n"); 353 354 fprintf(f,"__gshared ubyte[%d] _rel_integral =\n[ ", RELMAX); 355 for (i = 0; i < rel_integral.length; i++) 356 { fprintf(f,"0x%02x,",rel_integral[i]); 357 if ((i & 7) == 7 && i < rel_integral.length - 1) 358 fprintf(f,"\n "); 359 } 360 fprintf(f,"\n];\n"); 361 362 fprintf(f,"__gshared ubyte[%d] _rel_exception =\n[ ", RELMAX); 363 for (i = 0; i < rel_exception.length; i++) 364 { fprintf(f,"0x%02x,",rel_exception[i]); 365 if ((i & 7) == 7 && i < rel_exception.length - 1) 366 fprintf(f,"\n "); 367 } 368 fprintf(f,"\n];\n"); 369 370 fprintf(f,"__gshared ubyte[%d] _rel_unord =\n[ ", RELMAX); 371 for (i = 0; i < rel_unord.length; i++) 372 { fprintf(f,"0x%02x,",rel_unord[i]); 373 if ((i & 7) == 7 && i < rel_unord.length - 1) 374 fprintf(f,"\n "); 375 } 376 fprintf(f,"\n];\n"); 377 } 378 379 380 /******************************************************** 381 */ 382 383 string[OPMAX] debtab, cdxxx, elxxx; 384 385 void dotab() 386 { int i; 387 FILE *f; 388 389 void X(string d, string e, string c) { debtab[i]=d; cdxxx[i]=c; elxxx[i]=e; } 390 391 for (i = 0; i < OPMAX; i++) 392 { 393 switch (i) 394 { 395 case OPunde: X("unde", "elerr", "cderr"); break; 396 case OPadd: X("+", "eladd", "cdorth"); break; 397 case OPmul: X("*", "elmul", "cdmul"); break; 398 case OPand: X("&", "elbitwise", "cdorth"); break; 399 case OPmin: X("-", "elmin", "cdorth"); break; 400 case OPnot: X("!", "elnot", "cdnot"); break; 401 case OPcom: X("~", "elcom", "cdcom"); break; 402 case OPcond: X("?", "elcond", "cdcond"); break; 403 case OPcomma: X(",", "elcomma", "cdcomma"); break; 404 case OPremquo: X("/%", "elremquo", "cdmul"); break; 405 case OPdiv: X("/", "eldiv", "cdmul"); break; 406 case OPmod: X("%", "elmod", "cdmul"); break; 407 case OPxor: X("^", "elxor", "cdorth"); break; 408 case OPstring: X("string", "elstring", "cderr"); break; 409 case OPrelconst: X("relconst", "elzot", "cdrelconst"); break; 410 case OPinp: X("inp", "elzot", "cdport"); break; 411 case OPoutp: X("outp", "elzot", "cdport"); break; 412 case OPasm: X("asm", "elzot", "cdasm"); break; 413 case OPinfo: X("info", "elinfo", "cdinfo"); break; 414 case OPdctor: X("dctor", "elzot", "cddctor"); break; 415 case OPddtor: X("ddtor", "elddtor", "cdddtor"); break; 416 case OPctor: X("ctor", "elinfo", "cdctor"); break; 417 case OPdtor: X("dtor", "elinfo", "cddtor"); break; 418 case OPmark: X("mark", "elinfo", "cdmark"); break; 419 case OPvoid: X("void", "elzot", "cdvoid"); break; 420 case OPhalt: X("halt", "elzot", "cdhalt"); break; 421 case OPnullptr: X("nullptr", "elerr", "cderr"); break; 422 case OPpair: X("pair", "elpair", "cdpair"); break; 423 case OPrpair: X("rpair", "elpair", "cdpair"); break; 424 425 case OPor: X("|", "elor", "cdorth"); break; 426 case OPoror: X("||", "eloror", "cdloglog"); break; 427 case OPandand: X("&&", "elandand", "cdloglog"); break; 428 case OProl: X("<<|", "elshl", "cdshift"); break; 429 case OPror: X(">>|", "elshl", "cdshift"); break; 430 case OPshl: X("<<", "elshl", "cdshift"); break; 431 case OPshr: X(">>>", "elshr", "cdshift"); break; 432 case OPashr: X(">>", "elshr", "cdshift"); break; 433 case OPbit: X("bit", "elbit", "cderr"); break; 434 case OPind: X("*", "elind", "cdind"); break; 435 case OPaddr: X("&", "eladdr", "cderr"); break; 436 case OPneg: X("-", "elneg", "cdneg"); break; 437 case OPuadd: X("+", "elzot", "cderr"); break; 438 case OPabs: X("abs", "evalu8", "cdabs"); break; 439 case OPsqrt: X("sqrt", "evalu8", "cdneg"); break; 440 case OPsin: X("sin", "evalu8", "cdneg"); break; 441 case OPcos: X("cos", "evalu8", "cdneg"); break; 442 case OPscale: X("scale", "elzot", "cdscale"); break; 443 case OPyl2x: X("yl2x", "elzot", "cdscale"); break; 444 case OPyl2xp1: X("yl2xp1", "elzot", "cdscale"); break; 445 case OPcmpxchg: X("cas", "elzot", "cdcmpxchg"); break; 446 case OPrint: X("rint", "evalu8", "cdneg"); break; 447 case OPrndtol: X("rndtol", "evalu8", "cdrndtol"); break; 448 case OPstrlen: X("strlen", "elzot", "cdstrlen"); break; 449 case OPstrcpy: X("strcpy", "elstrcpy", "cdstrcpy"); break; 450 case OPmemcpy: X("memcpy", "elmemcpy", "cdmemcpy"); break; 451 case OPmemset: X("memset", "elmemset", "cdmemset"); break; 452 case OPstrcat: X("strcat", "elzot", "cderr"); break; 453 case OPstrcmp: X("strcmp", "elstrcmp", "cdstrcmp"); break; 454 case OPmemcmp: X("memcmp", "elmemcmp", "cdmemcmp"); break; 455 case OPsetjmp: X("setjmp", "elzot", "cdsetjmp"); break; 456 case OPnegass: X("negass", "elnegass", "cdaddass"); break; 457 case OPpreinc: X("U++", "elzot", "cderr"); break; 458 case OPpredec: X("U--", "elzot", "cderr"); break; 459 case OPstreq: X("streq", "elstruct", "cdstreq"); break; 460 case OPpostinc: X("++", "elpost", "cdpost"); break; 461 case OPpostdec: X("--", "elpost", "cdpost"); break; 462 case OPeq: X("=", "eleq", "cdeq"); break; 463 case OPaddass: X("+=", "elopass", "cdaddass"); break; 464 case OPminass: X("-=", "elopass", "cdaddass"); break; 465 case OPmulass: X("*=", "elopass", "cdmulass"); break; 466 case OPdivass: X("/=", "elopass", "cdmulass"); break; 467 case OPmodass: X("%=", "elopass", "cdmulass"); break; 468 case OPshrass: X(">>>=", "elopass", "cdshass"); break; 469 case OPashrass: X(">>=", "elopass", "cdshass"); break; 470 case OPshlass: X("<<=", "elopass", "cdshass"); break; 471 case OPandass: X("&=", "elopass", "cdaddass"); break; 472 case OPxorass: X("^=", "elopass", "cdaddass"); break; 473 case OPorass: X("|=", "elopass", "cdaddass"); break; 474 475 case OPle: X("<=", "elcmp", "cdcmp"); break; 476 case OPgt: X(">", "elcmp", "cdcmp"); break; 477 case OPlt: X("<", "elcmp", "cdcmp"); break; 478 case OPge: X(">=", "elcmp", "cdcmp"); break; 479 case OPeqeq: X("==", "elcmp", "cdcmp"); break; 480 case OPne: X("!=", "elcmp", "cdcmp"); break; 481 482 case OPunord: X("!<>=", "elcmp", "cdcmp"); break; 483 case OPlg: X("<>", "elcmp", "cdcmp"); break; 484 case OPleg: X("<>=", "elcmp", "cdcmp"); break; 485 case OPule: X("!>", "elcmp", "cdcmp"); break; 486 case OPul: X("!>=", "elcmp", "cdcmp"); break; 487 case OPuge: X("!<", "elcmp", "cdcmp"); break; 488 case OPug: X("!<=", "elcmp", "cdcmp"); break; 489 case OPue: X("!<>", "elcmp", "cdcmp"); break; 490 case OPngt: X("~>", "elcmp", "cdcmp"); break; 491 case OPnge: X("~>=", "elcmp", "cdcmp"); break; 492 case OPnlt: X("~<", "elcmp", "cdcmp"); break; 493 case OPnle: X("~<=", "elcmp", "cdcmp"); break; 494 case OPord: X("~!<>=", "elcmp", "cdcmp"); break; 495 case OPnlg: X("~<>", "elcmp", "cdcmp"); break; 496 case OPnleg: X("~<>=", "elcmp", "cdcmp"); break; 497 case OPnule: X("~!>", "elcmp", "cdcmp"); break; 498 case OPnul: X("~!>=", "elcmp", "cdcmp"); break; 499 case OPnuge: X("~!<", "elcmp", "cdcmp"); break; 500 case OPnug: X("~!<=", "elcmp", "cdcmp"); break; 501 case OPnue: X("~!<>", "elcmp", "cdcmp"); break; 502 503 case OPvp_fp: X("vptrfptr", "elvptrfptr", "cdcnvt"); break; 504 case OPcvp_fp: X("cvptrfptr", "elvptrfptr", "cdcnvt"); break; 505 case OPoffset: X("offset", "ellngsht", "cdlngsht"); break; 506 case OPnp_fp: X("ptrlptr", "elptrlptr", "cdshtlng"); break; 507 case OPnp_f16p: X("tofar16", "elzot", "cdfar16"); break; 508 case OPf16p_np: X("fromfar16", "elzot", "cdfar16"); break; 509 510 case OPs16_32: X("s16_32", "evalu8", "cdshtlng"); break; 511 case OPu16_32: X("u16_32", "evalu8", "cdshtlng"); break; 512 case OPd_s32: X("d_s32", "evalu8", "cdcnvt"); break; 513 case OPb_8: X("b_8", "evalu8", "cdcnvt"); break; 514 case OPs32_d: X("s32_d", "evalu8", "cdcnvt"); break; 515 case OPd_s16: X("d_s16", "evalu8", "cdcnvt"); break; 516 case OPs16_d: X("s16_d", "evalu8", "cdcnvt"); break; 517 case OPd_u16: X("d_u16", "evalu8", "cdcnvt"); break; 518 case OPu16_d: X("u16_d", "evalu8", "cdcnvt"); break; 519 case OPd_u32: X("d_u32", "evalu8", "cdcnvt"); break; 520 case OPu32_d: X("u32_d", "evalu8", "cdcnvt"); break; 521 case OP32_16: X("32_16", "ellngsht", "cdlngsht"); break; 522 case OPd_f: X("d_f", "evalu8", "cdcnvt"); break; 523 case OPf_d: X("f_d", "evalu8", "cdcnvt"); break; 524 case OPd_ld: X("d_ld", "evalu8", "cdcnvt"); break; 525 case OPld_d: X("ld_d", "evalu8", "cdcnvt"); break; 526 case OPc_r: X("c_r", "elc_r", "cdconvt87"); break; 527 case OPc_i: X("c_i", "elc_i", "cdconvt87"); break; 528 case OPu8_16: X("u8_16", "elbyteint", "cdbyteint"); break; 529 case OPs8_16: X("s8_16", "elbyteint", "cdbyteint"); break; 530 case OP16_8: X("16_8", "ellngsht", "cdlngsht"); break; 531 case OPu32_64: X("u32_64", "el32_64", "cdshtlng"); break; 532 case OPs32_64: X("s32_64", "el32_64", "cdshtlng"); break; 533 case OP64_32: X("64_32", "el64_32", "cdlngsht"); break; 534 case OPu64_128: X("u64_128", "evalu8", "cdshtlng"); break; 535 case OPs64_128: X("s64_128", "evalu8", "cdshtlng"); break; 536 case OP128_64: X("128_64", "el64_32", "cdlngsht"); break; 537 case OPmsw: X("msw", "elmsw", "cdmsw"); break; 538 539 case OPd_s64: X("d_s64", "evalu8", "cdcnvt"); break; 540 case OPs64_d: X("s64_d", "evalu8", "cdcnvt"); break; 541 case OPd_u64: X("d_u64", "evalu8", "cdcnvt"); break; 542 case OPu64_d: X("u64_d", "elu64_d", "cdcnvt"); break; 543 case OPld_u64: X("ld_u64", "evalu8", "cdcnvt"); break; 544 case OPparam: X("param", "elparam", "cderr"); break; 545 case OPsizeof: X("sizeof", "elzot", "cderr"); break; 546 case OParrow: X("->", "elzot", "cderr"); break; 547 case OParrowstar: X("->*", "elzot", "cderr"); break; 548 case OPcolon: X("colon", "elzot", "cderr"); break; 549 case OPcolon2: X("colon2", "elzot", "cderr"); break; 550 case OPbool: X("bool", "elbool", "cdnot"); break; 551 case OPcall: X("call", "elcall", "cdfunc"); break; 552 case OPucall: X("ucall", "elcall", "cdfunc"); break; 553 case OPcallns: X("callns", "elcall", "cdfunc"); break; 554 case OPucallns: X("ucallns", "elcall", "cdfunc"); break; 555 case OPstrpar: X("strpar", "elstruct", "cderr"); break; 556 case OPstrctor: X("strctor", "elzot", "cderr"); break; 557 case OPstrthis: X("strthis", "elzot", "cdstrthis"); break; 558 case OPconst: X("const", "elerr", "cderr"); break; 559 case OPvar: X("var", "elerr", "loaddata"); break; 560 case OPreg: X("reg", "elerr", "cderr"); break; 561 case OPnew: X("new", "elerr", "cderr"); break; 562 case OPanew: X("new[]", "elerr", "cderr"); break; 563 case OPdelete: X("delete", "elerr", "cderr"); break; 564 case OPadelete: X("delete[]", "elerr", "cderr"); break; 565 case OPbrack: X("brack", "elerr", "cderr"); break; 566 case OPframeptr: X("frameptr", "elzot", "cdframeptr"); break; 567 case OPgot: X("got", "elzot", "cdgot"); break; 568 569 case OPbsf: X("bsf", "elzot", "cdbscan"); break; 570 case OPbsr: X("bsr", "elzot", "cdbscan"); break; 571 case OPbtst: X("btst", "elzot", "cdbtst"); break; 572 case OPbt: X("bt", "elzot", "cdbt"); break; 573 case OPbtc: X("btc", "elzot", "cdbt"); break; 574 case OPbtr: X("btr", "elzot", "cdbt"); break; 575 case OPbts: X("bts", "elzot", "cdbt"); break; 576 577 case OPbswap: X("bswap", "evalu8", "cdbswap"); break; 578 case OPpopcnt: X("popcnt", "evalu8", "cdpopcnt"); break; 579 case OPvector: X("vector", "elzot", "cdvector"); break; 580 case OPvecsto: X("vecsto", "elzot", "cdvecsto"); break; 581 case OPvecfill: X("vecfill", "elzot", "cdvecfill"); break; 582 case OPva_start: X("va_start", "elvalist", "cderr"); break; 583 case OPprefetch: X("prefetch", "elzot", "cdprefetch"); break; 584 585 default: 586 printf("opcode hole x%x\n",i); 587 exit(EXIT_FAILURE); 588 } 589 } 590 591 fprintf(fdeb,"extern (C++) __gshared const(char)*[OPMAX] debtab = \n\t[\n"); 592 for (i = 0; i < OPMAX - 1; i++) 593 fprintf(fdeb,"\t\"%.*s\",\n",cast(int)debtab[i].length, debtab[i].ptr); 594 fprintf(fdeb,"\t\"%.*s\"\n\t];\n",cast(int)debtab[i].length, debtab[i].ptr); 595 596 f = fopen("cdxxx.d","w"); 597 fprintf(f,"__gshared void function (ref CodeBuilder,elem *,regm_t *)[OPMAX] cdxxx = \n\t[\n"); 598 for (i = 0; i < OPMAX - 1; i++) 599 fprintf(f,"\t&%.*s,\n",cast(int)cdxxx[i].length, cdxxx[i].ptr); 600 fprintf(f,"\t&%.*s\n\t];\n", cast(int)cdxxx[i].length, cdxxx[i].ptr); 601 fclose(f); 602 603 static if (1) 604 { 605 { 606 f = fopen("elxxx.d","w"); 607 fprintf(f,"extern (C++) __gshared elem *function(elem *, goal_t)[OPMAX] elxxx = \n\t[\n"); 608 for (i = 0; i < OPMAX - 1; i++) 609 fprintf(f,"\t&%s,\n",elxxx[i].ptr); 610 fprintf(f,"\t&%s\n\t];\n",elxxx[i].ptr); 611 fclose(f); 612 } 613 } 614 else 615 { 616 { 617 f = fopen("elxxx.c","w"); 618 fprintf(f,"static elem *(*elxxx[OPMAX]) (elem *, goal_t) = \n\t{\n"); 619 for (i = 0; i < OPMAX - 1; i++) 620 fprintf(f,"\t%s,\n",elxxx[i].ptr); 621 fprintf(f,"\t%s\n\t};\n",elxxx[i].ptr); 622 fclose(f); 623 } 624 } 625 } 626 627 void fltables() 628 { FILE *f; 629 int i; 630 char[FLMAX] segfl, datafl, stackfl, flinsymtab; 631 632 static char[] indatafl = /* is FLxxxx a data type? */ 633 [ FLdata,FLudata,FLreg,FLpseudo,FLauto,FLfast,FLpara,FLextern, 634 FLcs,FLfltreg,FLallocatmp,FLdatseg,FLtlsdata,FLbprel, 635 FLstack,FLregsave,FLfuncarg, 636 FLndp, 637 ]; 638 static char[] indatafl_s = [ FLfardata, ]; 639 640 static char[] instackfl = /* is FLxxxx a stack data type? */ 641 [ FLauto,FLfast,FLpara,FLcs,FLfltreg,FLallocatmp,FLbprel,FLstack,FLregsave, 642 FLfuncarg, 643 FLndp, 644 ]; 645 646 static char[] inflinsymtab = /* is FLxxxx in the symbol table? */ 647 [ FLdata,FLudata,FLreg,FLpseudo,FLauto,FLfast,FLpara,FLextern,FLfunc, 648 FLtlsdata,FLbprel,FLstack ]; 649 static char[] inflinsymtab_s = [ FLfardata,FLcsdata, ]; 650 651 for (i = 0; i < FLMAX; i++) 652 datafl[i] = stackfl[i] = flinsymtab[i] = 0; 653 654 for (i = 0; i < indatafl.length; i++) 655 datafl[indatafl[i]] = 1; 656 657 for (i = 0; i < instackfl.length; i++) 658 stackfl[instackfl[i]] = 1; 659 660 for (i = 0; i < inflinsymtab.length; i++) 661 flinsymtab[inflinsymtab[i]] = 1; 662 663 for (i = 0; i < indatafl_s.length; i++) 664 datafl[indatafl_s[i]] = 1; 665 666 for (i = 0; i < inflinsymtab_s.length; i++) 667 flinsymtab[inflinsymtab_s[i]] = 1; 668 669 /* Segment registers */ 670 enum ES = 0; 671 enum CS = 1; 672 enum SS = 2; 673 enum DS = 3; 674 675 for (i = 0; i < FLMAX; i++) 676 { switch (i) 677 { 678 case 0: segfl[i] = cast(byte)-1; break; 679 case FLconst: segfl[i] = cast(byte)-1; break; 680 case FLoper: segfl[i] = cast(byte)-1; break; 681 case FLfunc: segfl[i] = CS; break; 682 case FLdata: segfl[i] = DS; break; 683 case FLudata: segfl[i] = DS; break; 684 case FLreg: segfl[i] = cast(byte)-1; break; 685 case FLpseudo: segfl[i] = cast(byte)-1; break; 686 case FLauto: segfl[i] = SS; break; 687 case FLfast: segfl[i] = SS; break; 688 case FLstack: segfl[i] = SS; break; 689 case FLbprel: segfl[i] = SS; break; 690 case FLpara: segfl[i] = SS; break; 691 case FLextern: segfl[i] = DS; break; 692 case FLcode: segfl[i] = CS; break; 693 case FLblock: segfl[i] = CS; break; 694 case FLblockoff: segfl[i] = CS; break; 695 case FLcs: segfl[i] = SS; break; 696 case FLregsave: segfl[i] = SS; break; 697 case FLndp: segfl[i] = SS; break; 698 case FLswitch: segfl[i] = cast(byte)-1; break; 699 case FLfltreg: segfl[i] = SS; break; 700 case FLoffset: segfl[i] = cast(byte)-1; break; 701 case FLfardata: segfl[i] = cast(byte)-1; break; 702 case FLcsdata: segfl[i] = CS; break; 703 case FLdatseg: segfl[i] = DS; break; 704 case FLctor: segfl[i] = cast(byte)-1; break; 705 case FLdtor: segfl[i] = cast(byte)-1; break; 706 case FLdsymbol: segfl[i] = cast(byte)-1; break; 707 case FLgot: segfl[i] = cast(byte)-1; break; 708 case FLgotoff: segfl[i] = cast(byte)-1; break; 709 case FLlocalsize: segfl[i] = cast(byte)-1; break; 710 case FLtlsdata: segfl[i] = cast(byte)-1; break; 711 case FLframehandler: segfl[i] = cast(byte)-1; break; 712 case FLasm: segfl[i] = cast(byte)-1; break; 713 case FLallocatmp: segfl[i] = SS; break; 714 case FLfuncarg: segfl[i] = SS; break; 715 default: 716 printf("error in segfl[%d]\n", i); 717 exit(1); 718 } 719 } 720 721 f = fopen("fltables.d","w"); 722 fprintf(f, "extern (C++) __gshared {\n"); 723 724 fprintf(f,"ubyte[FLMAX] datafl = \n\t[ "); 725 for (i = 0; i < FLMAX - 1; i++) 726 fprintf(f,"cast(ubyte)%d,",datafl[i]); 727 fprintf(f,"cast(ubyte)%d ];\n",datafl[i]); 728 729 fprintf(f,"ubyte[FLMAX] stackfl = \n\t[ "); 730 for (i = 0; i < FLMAX - 1; i++) 731 fprintf(f,"cast(ubyte)%d,",stackfl[i]); 732 fprintf(f,"cast(ubyte)%d ];\n",stackfl[i]); 733 734 fprintf(f,"ubyte[FLMAX] segfl = \n\t[ "); 735 for (i = 0; i < FLMAX - 1; i++) 736 fprintf(f,"cast(ubyte)%d,",segfl[i]); 737 fprintf(f,"cast(ubyte)%d ];\n",segfl[i]); 738 739 fprintf(f,"ubyte[FLMAX] flinsymtab = \n\t[ "); 740 for (i = 0; i < FLMAX - 1; i++) 741 fprintf(f,"cast(ubyte)%d,",flinsymtab[i]); 742 fprintf(f,"cast(ubyte)%d ];\n",flinsymtab[i]); 743 744 fprintf(f, "}\n"); 745 fclose(f); 746 } 747 748 void dotytab() 749 { 750 static tym_t[] _ptr = [ TYnptr ]; 751 static tym_t[] _ptr_nflat= [ TYsptr,TYcptr,TYf16ptr,TYfptr,TYhptr,TYvptr ]; 752 static tym_t[] _real = [ TYfloat,TYdouble,TYdouble_alias,TYldouble, 753 TYfloat4,TYdouble2, 754 TYfloat8,TYdouble4, 755 TYfloat16,TYdouble8, 756 ]; 757 static tym_t[] _imaginary = [ 758 TYifloat,TYidouble,TYildouble, 759 ]; 760 static tym_t[] _complex = [ 761 TYcfloat,TYcdouble,TYcldouble, 762 ]; 763 static tym_t[] _integral = [ TYbool,TYchar,TYschar,TYuchar,TYshort, 764 TYwchar_t,TYushort,TYenum,TYint,TYuint, 765 TYlong,TYulong,TYllong,TYullong,TYdchar, 766 TYschar16,TYuchar16,TYshort8,TYushort8, 767 TYlong4,TYulong4,TYllong2,TYullong2, 768 TYschar32,TYuchar32,TYshort16,TYushort16, 769 TYlong8,TYulong8,TYllong4,TYullong4, 770 TYschar64,TYuchar64,TYshort32,TYushort32, 771 TYlong16,TYulong16,TYllong8,TYullong8, 772 TYchar16,TYcent,TYucent, 773 ]; 774 static tym_t[] _ref = [ TYnref,TYref ]; 775 static tym_t[] _func = [ TYnfunc,TYnpfunc,TYnsfunc,TYifunc,TYmfunc,TYjfunc,TYhfunc ]; 776 static tym_t[] _ref_nflat = [ TYfref ]; 777 static tym_t[] _func_nflat= [ TYffunc,TYfpfunc,TYf16func,TYfsfunc,TYnsysfunc,TYfsysfunc, ]; 778 static tym_t[] _uns = [ TYuchar,TYushort,TYuint,TYulong, 779 TYwchar_t, 780 TYuchar16,TYushort8,TYulong4,TYullong2, 781 TYdchar,TYullong,TYucent,TYchar16 ]; 782 static tym_t[] _mptr = [ TYmemptr ]; 783 static tym_t[] _nullptr = [ TYnullptr ]; 784 static tym_t[] _fv = [ TYfptr, TYvptr ]; 785 static tym_t[] _farfunc = [ TYffunc,TYfpfunc,TYfsfunc,TYfsysfunc ]; 786 static tym_t[] _pasfunc = [ TYnpfunc,TYnsfunc,TYmfunc,TYjfunc ]; 787 static tym_t[] _pasfunc_nf = [ TYfpfunc,TYf16func,TYfsfunc, ]; 788 static tym_t[] _revfunc = [ TYnpfunc,TYjfunc ]; 789 static tym_t[] _revfunc_nf = [ TYfpfunc,TYf16func, ]; 790 static tym_t[] _short = [ TYbool,TYchar,TYschar,TYuchar,TYshort, 791 TYwchar_t,TYushort,TYchar16 ]; 792 static tym_t[] _aggregate = [ TYstruct,TYarray ]; 793 static tym_t[] _xmmreg = [ 794 TYfloat,TYdouble,TYifloat,TYidouble, 795 TYfloat4,TYdouble2, 796 TYschar16,TYuchar16,TYshort8,TYushort8, 797 TYlong4,TYulong4,TYllong2,TYullong2, 798 TYfloat8,TYdouble4, 799 TYschar32,TYuchar32,TYshort16,TYushort16, 800 TYlong8,TYulong8,TYllong4,TYullong4, 801 TYschar64,TYuchar64,TYshort32,TYushort32, 802 TYlong16,TYulong16,TYllong8,TYullong8, 803 TYfloat16,TYdouble8, 804 ]; 805 static tym_t[] _simd = [ 806 TYfloat4,TYdouble2, 807 TYschar16,TYuchar16,TYshort8,TYushort8, 808 TYlong4,TYulong4,TYllong2,TYullong2, 809 TYfloat8,TYdouble4, 810 TYschar32,TYuchar32,TYshort16,TYushort16, 811 TYlong8,TYulong8,TYllong4,TYullong4, 812 TYschar64,TYuchar64,TYshort32,TYushort32, 813 TYlong16,TYulong16,TYllong8,TYullong8, 814 TYfloat16,TYdouble8, 815 ]; 816 817 struct TypeTab 818 { 819 string str; /* name of type */ 820 tym_t ty; /* TYxxxx */ 821 tym_t unsty; /* conversion to unsigned type */ 822 tym_t relty; /* type for relaxed type checking */ 823 int size; 824 int debtyp; /* Codeview 1 type in debugger record */ 825 int debtyp4; /* Codeview 4 type in debugger record */ 826 } 827 static TypeTab[] typetab = 828 [ 829 /* Note that chars are signed, here */ 830 {"bool", TYbool, TYbool, TYchar, 1, 0x80, 0x30}, 831 {"char", TYchar, TYuchar, TYchar, 1, 0x80, 0x70}, 832 {"signed char", TYschar, TYuchar, TYchar, 1, 0x80, 0x10}, 833 {"unsigned char",TYuchar, TYuchar, TYchar, 1, 0x84, 0x20}, 834 {"char16_t", TYchar16, TYchar16, TYint, 2, 0x85, 0x21}, 835 {"short", TYshort, TYushort, TYint, SHORTSIZE, 0x81,0x11}, 836 {"wchar_t", TYwchar_t, TYwchar_t, TYint, SHORTSIZE, 0x85,0x71}, 837 {"unsigned short",TYushort, TYushort, TYint, SHORTSIZE, 0x85,0x21}, 838 839 // These values are adjusted for 32 bit ints in cv_init() and util_set32() 840 {"enum", TYenum, TYuint, TYint, -1, 0x81,0x72}, 841 {"int", TYint, TYuint, TYint, 2, 0x81,0x72}, 842 {"unsigned", TYuint, TYuint, TYint, 2, 0x85,0x73}, 843 844 {"long", TYlong, TYulong, TYlong, LONGSIZE, 0x82,0x12}, 845 {"unsigned long",TYulong, TYulong, TYlong, LONGSIZE, 0x86,0x22}, 846 {"dchar", TYdchar, TYdchar, TYlong, 4, 0x86,0x22}, 847 {"long long", TYllong, TYullong, TYllong, LLONGSIZE, 0x82,0x13}, 848 {"uns long long",TYullong, TYullong, TYllong, LLONGSIZE, 0x86,0x23}, 849 {"cent", TYcent, TYucent, TYcent, 16, 0x82,0x603}, 850 {"ucent", TYucent, TYucent, TYcent, 16, 0x86,0x603}, 851 {"float", TYfloat, TYfloat, TYfloat, FLOATSIZE, 0x88,0x40}, 852 {"double", TYdouble, TYdouble, TYdouble, DOUBLESIZE,0x89,0x41}, 853 {"double alias", TYdouble_alias, TYdouble_alias, TYdouble_alias,8, 0x89,0x41}, 854 {"long double", TYldouble, TYldouble, TYldouble, -1, 0x89,0x42}, 855 856 {"imaginary float", TYifloat, TYifloat, TYifloat, FLOATSIZE, 0x88,0x40}, 857 {"imaginary double", TYidouble, TYidouble, TYidouble, DOUBLESIZE,0x89,0x41}, 858 {"imaginary long double",TYildouble, TYildouble, TYildouble, -1,0x89,0x42}, 859 860 {"complex float", TYcfloat, TYcfloat, TYcfloat, 2*FLOATSIZE, 0x88,0x50}, 861 {"complex double", TYcdouble, TYcdouble, TYcdouble, 2*DOUBLESIZE,0x89,0x51}, 862 {"complex long double", TYcldouble, TYcldouble, TYcldouble, -1,0x89,0x52}, 863 864 {"float[4]", TYfloat4, TYfloat4, TYfloat4, 16, 0, 0}, 865 {"double[2]", TYdouble2, TYdouble2, TYdouble2, 16, 0, 0}, 866 {"signed char[16]", TYschar16, TYuchar16, TYschar16, 16, 0, 0}, 867 {"unsigned char[16]", TYuchar16, TYuchar16, TYuchar16, 16, 0, 0}, 868 {"short[8]", TYshort8, TYushort8, TYshort8, 16, 0, 0}, 869 {"unsigned short[8]", TYushort8, TYushort8, TYushort8, 16, 0, 0}, 870 {"long[4]", TYlong4, TYulong4, TYlong4, 16, 0, 0}, 871 {"unsigned long[4]", TYulong4, TYulong4, TYulong4, 16, 0, 0}, 872 {"long long[2]", TYllong2, TYullong2, TYllong2, 16, 0, 0}, 873 {"unsigned long long[2]", TYullong2, TYullong2, TYullong2, 16, 0, 0}, 874 875 {"float[8]", TYfloat8, TYfloat8, TYfloat8, 32, 0, 0}, 876 {"double[4]", TYdouble4, TYdouble4, TYdouble4, 32, 0, 0}, 877 {"signed char[32]", TYschar32, TYuchar32, TYschar32, 32, 0, 0}, 878 {"unsigned char[32]", TYuchar32, TYuchar32, TYuchar32, 32, 0, 0}, 879 {"short[16]", TYshort16, TYushort16, TYshort16, 32, 0, 0}, 880 {"unsigned short[16]", TYushort16, TYushort16, TYushort16, 32, 0, 0}, 881 {"long[8]", TYlong8, TYulong8, TYlong8, 32, 0, 0}, 882 {"unsigned long[8]", TYulong8, TYulong8, TYulong8, 32, 0, 0}, 883 {"long long[4]", TYllong4, TYullong4, TYllong4, 32, 0, 0}, 884 {"unsigned long long[4]", TYullong4, TYullong4, TYullong4, 32, 0, 0}, 885 886 {"float[16]", TYfloat16, TYfloat16, TYfloat16, 64, 0, 0}, 887 {"double[8]", TYdouble8, TYdouble8, TYdouble8, 64, 0, 0}, 888 {"signed char[64]", TYschar64, TYuchar64, TYschar64, 64, 0, 0}, 889 {"unsigned char[64]", TYuchar64, TYuchar64, TYuchar64, 64, 0, 0}, 890 {"short[32]", TYshort32, TYushort32, TYshort32, 64, 0, 0}, 891 {"unsigned short[32]", TYushort32, TYushort32, TYushort32, 64, 0, 0}, 892 {"long[16]", TYlong16, TYulong16, TYlong16, 64, 0, 0}, 893 {"unsigned long[16]", TYulong16, TYulong16, TYulong16, 64, 0, 0}, 894 {"long long[8]", TYllong8, TYullong8, TYllong8, 64, 0, 0}, 895 {"unsigned long long[8]", TYullong8, TYullong8, TYullong8, 64, 0, 0}, 896 897 {"nullptr_t", TYnullptr, TYnullptr, TYptr, 2, 0x20, 0x100}, 898 {"*", TYnptr, TYnptr, TYnptr, 2, 0x20, 0x100}, 899 {"&", TYref, TYref, TYref, -1, 0, 0}, 900 {"void", TYvoid, TYvoid, TYvoid, -1, 0x85, 3}, 901 {"struct", TYstruct, TYstruct, TYstruct, -1, 0, 0}, 902 {"array", TYarray, TYarray, TYarray, -1, 0x78, 0}, 903 {"C func", TYnfunc, TYnfunc, TYnfunc, -1, 0x63, 0}, 904 {"Pascal func", TYnpfunc, TYnpfunc, TYnpfunc, -1, 0x74, 0}, 905 {"std func", TYnsfunc, TYnsfunc, TYnsfunc, -1, 0x63, 0}, 906 {"*", TYptr, TYptr, TYptr, 2, 0x20, 0x100}, 907 {"member func", TYmfunc, TYmfunc, TYmfunc, -1, 0x64, 0}, 908 {"D func", TYjfunc, TYjfunc, TYjfunc, -1, 0x74, 0}, 909 {"C func", TYhfunc, TYhfunc, TYhfunc, -1, 0, 0}, 910 {"__near &", TYnref, TYnref, TYnref, 2, 0, 0}, 911 912 {"__ss *", TYsptr, TYsptr, TYsptr, 2, 0x20, 0x100}, 913 {"__cs *", TYcptr, TYcptr, TYcptr, 2, 0x20, 0x100}, 914 {"__far16 *", TYf16ptr, TYf16ptr, TYf16ptr, 4, 0x40, 0x200}, 915 {"__far *", TYfptr, TYfptr, TYfptr, 4, 0x40, 0x200}, 916 {"__huge *", TYhptr, TYhptr, TYhptr, 4, 0x40, 0x300}, 917 {"__handle *", TYvptr, TYvptr, TYvptr, 4, 0x40, 0x200}, 918 {"far C func", TYffunc, TYffunc, TYffunc, -1, 0x64, 0}, 919 {"far Pascal func", TYfpfunc, TYfpfunc, TYfpfunc, -1, 0x73, 0}, 920 {"far std func", TYfsfunc, TYfsfunc, TYfsfunc, -1, 0x64, 0}, 921 {"_far16 Pascal func", TYf16func, TYf16func, TYf16func, -1, 0x63, 0}, 922 {"sys func", TYnsysfunc, TYnsysfunc,TYnsysfunc, -1, 0x63, 0}, 923 {"far sys func", TYfsysfunc, TYfsysfunc,TYfsysfunc, -1, 0x64, 0}, 924 {"__far &", TYfref, TYfref, TYfref, 4, 0, 0}, 925 926 {"interrupt func", TYifunc, TYifunc, TYifunc, -1, 0x64, 0}, 927 {"memptr", TYmemptr, TYmemptr, TYmemptr, -1, 0, 0}, 928 {"ident", TYident, TYident, TYident, -1, 0, 0}, 929 {"template", TYtemplate, TYtemplate, TYtemplate, -1, 0, 0}, 930 {"vtshape", TYvtshape, TYvtshape, TYvtshape, -1, 0, 0}, 931 ]; 932 933 FILE *f; 934 static uint[64 * 4] tytab; 935 static tym_t[64 * 4] tytouns; 936 static tym_t[TYMAX] _tyrelax; 937 static tym_t[TYMAX] _tyequiv; 938 static byte[64 * 4] _tysize; 939 static string[TYMAX] tystring; 940 static ubyte[TYMAX] dttab; 941 static ushort[TYMAX] dttab4; 942 int i; 943 944 static void T1(tym_t[] arr, uint mask) { for (int i=0; i< arr.length; i++) 945 { tytab[arr[i]] |= mask; } 946 } 947 static void T2(tym_t[] arr, uint mask) { for (int i=0; i< arr.length; i++) 948 { tytab[arr[i]] |= mask; } 949 } 950 951 T1(_ptr, TYFLptr); 952 T1(_ptr_nflat,TYFLptr); 953 T1(_real, TYFLreal); 954 T1(_integral, TYFLintegral); 955 T1(_imaginary,TYFLimaginary); 956 T1(_complex, TYFLcomplex); 957 T1(_uns, TYFLuns); 958 T1(_mptr, TYFLmptr); 959 960 T1(_fv, TYFLfv); 961 T2(_farfunc, TYFLfarfunc); 962 T2(_pasfunc, TYFLpascal); 963 T2(_revfunc, TYFLrevparam); 964 T2(_short, TYFLshort); 965 T2(_aggregate,TYFLaggregate); 966 T2(_ref, TYFLref); 967 T2(_func, TYFLfunc); 968 T2(_nullptr, TYFLnullptr); 969 T2(_pasfunc_nf, TYFLpascal); 970 T2(_revfunc_nf, TYFLrevparam); 971 T2(_ref_nflat, TYFLref); 972 T2(_func_nflat, TYFLfunc); 973 T1(_xmmreg, TYFLxmmreg); 974 T1(_simd, TYFLsimd); 975 976 f = fopen("tytab.d","w"); 977 978 fprintf(f,"__gshared uint[256] tytab =\n[ "); 979 for (i = 0; i < tytab.length; i++) 980 { fprintf(f,"0x%02x,",tytab[i]); 981 if ((i & 7) == 7 && i < tytab.length - 1) 982 fprintf(f,"\n "); 983 } 984 fprintf(f,"\n];\n"); 985 986 static if (0) 987 { 988 fprintf(f,"__gshared ubyte[TYMAX] tytab2 =\n[ "); 989 for (i = 0; i < tytab2.length; i++) 990 { fprintf(f,"0x%02x,",tytab2[i]); 991 if ((i & 7) == 7 && i < tytab2.length - 1) 992 fprintf(f,"\n "); 993 } 994 fprintf(f,"\n];\n"); 995 } 996 997 for (i = 0; i < typetab.length; i++) 998 { tytouns[typetab[i].ty] = typetab[i].unsty; 999 } 1000 fprintf(f,"__gshared tym_t[256] tytouns =\n[ "); 1001 for (i = 0; i < tytouns.length; i++) 1002 { fprintf(f,"0x%02x,",tytouns[i]); 1003 if ((i & 7) == 7 && i < tytouns.length - 1) 1004 fprintf(f,"\n "); 1005 } 1006 fprintf(f,"\n];\n"); 1007 1008 for (i = 0; i < typetab.length; i++) 1009 { _tysize[typetab[i].ty | 0x00] = cast(byte)typetab[i].size; 1010 /*printf("_tysize[%d] = %d\n",typetab[i].ty,typetab[i].size);*/ 1011 } 1012 fprintf(f,"__gshared byte[256] _tysize =\n[ "); 1013 for (i = 0; i < _tysize.length; i++) 1014 { fprintf(f,"%d,",_tysize[i]); 1015 if ((i & 7) == 7 && i < _tysize.length - 1) 1016 fprintf(f,"\n "); 1017 } 1018 fprintf(f,"\n];\n"); 1019 1020 for (i = 0; i < _tysize.length; i++) 1021 _tysize[i] = 0; 1022 for (i = 0; i < typetab.length; i++) 1023 { byte sz = cast(byte)typetab[i].size; 1024 switch (typetab[i].ty) 1025 { 1026 case TYldouble: 1027 case TYildouble: 1028 case TYcldouble: 1029 static if (TARGET_OSX) 1030 { 1031 sz = 16; 1032 } 1033 else static if (TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_DRAGONFLYBSD || TARGET_SOLARIS) 1034 { 1035 sz = 4; 1036 } 1037 else static if (TARGET_WINDOS) 1038 { 1039 sz = 2; 1040 } 1041 else 1042 { 1043 static assert(0, "fix this"); 1044 } 1045 break; 1046 1047 case TYcent: 1048 case TYucent: 1049 sz = 8; 1050 break; 1051 1052 default: 1053 break; 1054 } 1055 _tysize[typetab[i].ty | 0x00] = sz; 1056 /*printf("_tyalignsize[%d] = %d\n",typetab[i].ty,typetab[i].size);*/ 1057 } 1058 1059 fprintf(f,"__gshared byte[256] _tyalignsize =\n[ "); 1060 for (i = 0; i < _tysize.length; i++) 1061 { fprintf(f,"%d,",_tysize[i]); 1062 if ((i & 7) == 7 && i < _tysize.length - 1) 1063 fprintf(f,"\n "); 1064 } 1065 fprintf(f,"\n];\n"); 1066 1067 for (i = 0; i < typetab.length; i++) 1068 { _tyrelax[typetab[i].ty] = typetab[i].relty; 1069 /*printf("_tyrelax[%d] = %d\n",typetab[i].ty,typetab[i].relty);*/ 1070 } 1071 fprintf(f,"__gshared ubyte[TYMAX] _tyrelax =\n[ "); 1072 for (i = 0; i < _tyrelax.length; i++) 1073 { fprintf(f,"0x%02x,",_tyrelax[i]); 1074 if ((i & 7) == 7 && i < _tyrelax.length - 1) 1075 fprintf(f,"\n "); 1076 } 1077 fprintf(f,"\n];\n"); 1078 1079 /********** tyequiv ************/ 1080 for (i = 0; i < _tyequiv.length; i++) 1081 _tyequiv[i] = i; 1082 _tyequiv[TYchar] = TYschar; /* chars are signed by default */ 1083 1084 // These values are adjusted in util_set32() for 32 bit ints 1085 _tyequiv[TYint] = TYshort; 1086 _tyequiv[TYuint] = TYushort; 1087 1088 fprintf(f,"__gshared ubyte[TYMAX] tyequiv =\n[ "); 1089 for (i = 0; i < _tyequiv.length; i++) 1090 { fprintf(f,"0x%02x,",_tyequiv[i]); 1091 if ((i & 7) == 7 && i < _tyequiv.length - 1) 1092 fprintf(f,"\n "); 1093 } 1094 fprintf(f,"\n];\n"); 1095 1096 for (i = 0; i < typetab.length; i++) 1097 tystring[typetab[i].ty] = typetab[i].str; 1098 fprintf(f,"extern (C) __gshared const(char)*[TYMAX] tystring =\n[ "); 1099 for (i = 0; i < tystring.length; i++) 1100 { fprintf(f,"\"%s\",",tystring[i].ptr); 1101 if ((i & 7) == 7 && i < tystring.length - 1) 1102 fprintf(f,"\n "); 1103 } 1104 fprintf(f,"\n];\n"); 1105 1106 for (i = 0; i < typetab.length; i++) 1107 dttab[typetab[i].ty] = cast(ubyte)typetab[i].debtyp; 1108 fprintf(f,"__gshared ubyte[TYMAX] dttab =\n[ "); 1109 for (i = 0; i < dttab.length; i++) 1110 { fprintf(f,"0x%02x,",dttab[i]); 1111 if ((i & 7) == 7 && i < dttab.length - 1) 1112 fprintf(f,"\n "); 1113 } 1114 fprintf(f,"\n];\n"); 1115 1116 for (i = 0; i < typetab.length; i++) 1117 dttab4[typetab[i].ty] = cast(ushort)typetab[i].debtyp4; 1118 fprintf(f,"__gshared ushort[TYMAX] dttab4 =\n[ "); 1119 for (i = 0; i < dttab4.length; i++) 1120 { fprintf(f,"0x%02x,",dttab4[i]); 1121 if ((i & 7) == 7 && i < dttab4.length - 1) 1122 fprintf(f,"\n "); 1123 } 1124 fprintf(f,"\n];\n"); 1125 1126 fclose(f); 1127 }