CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
PrsLib.txt325 linesDownload Raw Back to Compiler
1 2U0 PrsPush(CPrsStk *ps,I64 val)3{4  ps->stk[++ps->ptr]=val;5}6 7I64 PrsPop(CPrsStk *ps)8{9  return ps->stk[ps->ptr--];10}11 12U0 PrsPush2(CPrsStk *ps,I64 val)13{14  ps->stk2[++ps->ptr2]=val;15}16 17I64 PrsPop2(CPrsStk *ps)18{19  return ps->stk2[ps->ptr2--];20}21 22U0 PrsPopDeref(CPrsStk *ps)23{24  I64 i=PrsPop(ps);25  CHashClass *tmpc=PrsPop(ps);26  if (i.u16[0]!=IC_DEREF) {27    PrsPush(ps,tmpc);28    PrsPush(ps,i);29  }30}31 32I64 PrsKeyWord(CCmpCtrl *cc)33{//Cvt cur token to KEYWORD or -1.34  CHashGeneric *tmph;35  if (cc->token==TK_IDENT &&(tmph=cc->hash_entry) && tmph->type&HTT_KEYWORD)36    return tmph->user_data0;37  else38    return -1;39}40 41CHashClass *PrsClassNew()42{/*Ptrs to classes are handled by43allocating 5 structures for each44new class and representing a pointer45to a class by advancing 1 struct fwd46for one * and two fwd for two **.47*/48  I64 i;49  CHashClass *res=CAlloc(sizeof(CHashClass)*(PTR_STARS_NUM+1),Fs->code_heap),50        *tmpc=res;51  for (i=0;i<=PTR_STARS_NUM;i++) {52    tmpc->type=HTT_CLASS;53    tmpc->raw_type=RT_PTR;54    tmpc->size=sizeof(U8 *);55    tmpc->ptr_stars_cnt=i;56    tmpc++;57  }58  res->last_in_member_lst=&res->member_lst_and_root;59  res->size=0;60  return res;61}62 63CHashFun *PrsFunNew()64{65  I64 i;66  CHashFun *res=CAlloc(sizeof(CHashFun)*(PTR_STARS_NUM+1),Fs->code_heap),67        *tmpf=res;68  for (i=0;i<=PTR_STARS_NUM;i++) {69    tmpf->type=HTT_FUN;70    tmpf->raw_type=RT_PTR;71    tmpf->size=sizeof(U8 *);72    tmpf->ptr_stars_cnt=i;73    tmpf++;74  }75  res->last_in_member_lst=&res->member_lst_and_root;76  res->size=0;77  return res;78}79 80CIntermediateCode *ICAdd(CCmpCtrl *cc,81   I64 opcode_and_precedence,I64 arg, CHashClass *c,I64 flags=0)82{83  CIntermediateCode *tmpi=MAlloc(sizeof(CIntermediateCode));84  tmpi->ic_code=opcode_and_precedence.u16[0];85  tmpi->ic_precedence=opcode_and_precedence.u16[1];86  tmpi->ic_data=arg;87  tmpi->ic_class=c;88  if (cc->pass_trace) {89    Bts(&cc->flags,CCf_PASS_TRACE_PRESENT);90    flags|=ICF_PASS_TRACE;91  }92  if (cc->lock_cnt)93    flags|=ICF_LOCK;94  tmpi->ic_flags=flags;95  tmpi->ic_line=cc->last_line_num;96  QueIns(tmpi,cc->coc.coc_head.last);97  return tmpi;98}99 100U0 COCInit(CCmpCtrl *cc)101{102  CCodeCtrl *tmpcbh=&cc->coc;103  QueInit(&tmpcbh->coc_head.next);104  QueInit(&tmpcbh->coc_next_misc);105  tmpcbh->coc_head.ic_code=IC_END;106}107 108U0 COCPush(CCmpCtrl *cc)109{110  CCodeCtrl *tmpcbh=MAlloc(sizeof(CCodeCtrl));111  MemCpy(tmpcbh,&cc->coc,sizeof(CCodeCtrl));112  cc->coc.coc_next=tmpcbh;113}114 115CCmpCtrl *COCPopNoFree(CCmpCtrl *cc)116{117  CCodeCtrl *tmpcbh=cc->coc.coc_next;118  MemCpy(&cc->coc,tmpcbh,sizeof(CCodeCtrl));119  return tmpcbh;120}121 122U0 COCPop(CCmpCtrl *cc)123{124  Free(COCPopNoFree(cc));125}126 127U0 COCAppend(CCmpCtrl *cc, CCodeCtrl *tmpcbh)128{129  if (tmpcbh->coc_head.next!=&cc->coc.coc_head.next) {130    cc->coc.coc_head.last->next=tmpcbh->coc_head.next;131    tmpcbh->coc_head.next->last=cc->coc.coc_head.last;132    cc->coc.coc_head.last=tmpcbh->coc_head.last;133    tmpcbh->coc_head.last->next=&cc->coc.coc_head.next;134  }135  if (tmpcbh->coc_next_misc!=&cc->coc.coc_next_misc) {136    cc->coc.coc_last_misc->next=tmpcbh->coc_next_misc;137    tmpcbh->coc_next_misc->last=cc->coc.coc_last_misc;138    cc->coc.coc_last_misc=tmpcbh->coc_last_misc;139    tmpcbh->coc_last_misc->next=&cc->coc.coc_next_misc;140  }141  Free(tmpcbh);142}143 144CCodeMisc *COCMiscNew(CCmpCtrl *cc,I64 ty)145{146  CCodeMisc *res=CAlloc(sizeof(CCodeMisc));147  res->addr=INVALID_PTR;148  res->type=ty;149  QueIns(res,cc->coc.coc_last_misc);150  return res;151}152 153CCodeMisc *COCGoToLabelFind(CCmpCtrl *cc,U8 *name)154{155  CCodeMisc *cm=cc->coc.coc_next_misc;156  while (cm!=&cc->coc.coc_next_misc) {157    if ((cm->type==CMT_GOTO_LABEL||cm->type==CMT_ASM_LABEL) &&158          !StrCmp(cm->str,name))159      return cm;160    cm=cm->next;161  }162  return NULL;163}164 165I64 COCFloatConstFind(CCmpCtrl *cc,F64 d)166{167  I64 i;168  CCodeMisc *cm=cc->coc.coc_next_misc;169  while (cm!=&cc->coc.coc_next_misc) {170    if (cm->type==CMT_FLOAT_CONSTS) {171      for (i=0;i<cm->num_consts;i++)172        if (cm->float_consts[i]==d)173          return cm->addr+i*sizeof(F64);174      if (cm->num_consts<CM_CONSTS_NUM)  {175        cm->float_consts[cm->num_consts++]=d;176        return cm->addr+i*sizeof(F64);177      }178    }179    cm=cm->next;180  }181  cm=COCMiscNew(cc,CMT_FLOAT_CONSTS);182  cm->float_consts=MAlloc(CM_CONSTS_NUM*sizeof(F64));183  cm->float_consts[cm->num_consts++]=d;184  return cm->addr;185}186 187U0 COCDel(CCmpCtrl *cc,CCodeCtrl *coc)188{189  CCodeMisc *cm,*cm1;190  U8 *undef=NULL;191  QueDel(&coc->coc_head.next);192  cm=coc->coc_next_misc;193  while (cm!=&coc->coc_next_misc) {194    cm1=cm->next;195    switch (cm->type) {196      case CMT_GOTO_LABEL:197      case CMT_ASM_LABEL:198        if (!(cm->flags&CMF_DEFINED)) {199          undef=cm->str;200          cm->str=NULL;201        } else if (!cm->use_cnt) {202          PrintWarn("Unused label %s\n",cm->str);203          LexWarn(cc,"Unused label at ");204        }205        break;206      case CMT_JMP_TABLE:207        Free(cm->jmp_table);208        break;209      case CMT_FLOAT_CONSTS:210        Free(cm->float_consts);211        break;212      case CMT_ARRAY_DIM:213        LinkedLstDel(cm->dim);214        break;215      case CMT_HASH_ENTRY:216        HashDel(cm->h);217        break;218    }219    Free(cm->str);220    Free(cm);221    cm=cm1;222  }223  if (undef) {224    PrintErr("Undefined goto label %s\n",undef);225    Free(undef);226    LexExcept(cc,"Undefined goto label at ");227  }228}229 230U0 COCHeaderPut(CCmpCtrl *cc,I64 pass,Bool put)231{232  CIntermediateCode *tmpi;233  if (Bt(&cc->flags,CCf_PASS_TRACE_PRESENT)) {234    if (put) {235      if (Bt(&cc->saved_pass_trace,pass-1)) {236        "$IV,1$Pass %d:$IV,0$\n",pass-1;237        tmpi=cc->coc.coc_head.next;238        while (tmpi->ic_code) {239          if (tmpi->ic_flags&ICF_PASS_TRACE)240            ICPut(cc,tmpi);241          tmpi=tmpi->next;242        }243      }244    } else if (Bt(&cc->saved_pass_trace,pass))245      "$IV,1$Pass %d:$IV,0$\n",pass;246  }247  cc->pass=pass;248}249 250U8 *COCCompile(CCmpCtrl *cc,I64 *_code_size,CDbgInfo **_dbg,I64 *_type)251{252  U8 *res;253  CCodeMisc *lb;254  I64 i,code_size,last_code_size;255 256  COptReg reg_offsets[REG_REGS_NUM];257  if (_dbg) *_dbg=NULL;258  cc->pass=0;259  COCHeaderPut(cc,1,TRUE);260  OptPass012(cc);261  COCHeaderPut(cc,2,TRUE);262  OptPass012(cc);263  COCHeaderPut(cc,3,TRUE);264  OptPass3(cc,reg_offsets);265  COCHeaderPut(cc,4,TRUE);266  OptPass4(cc,reg_offsets,_type);267  COCHeaderPut(cc,5,TRUE);268  OptPass5(cc);269  COCHeaderPut(cc,6,TRUE);270  OptPass6(cc);271  COCHeaderPut(cc,7,TRUE);272 273  lb=cc->coc.coc_next_misc;274  while (lb!=&cc->coc.coc_next_misc) {275    if (lb->type==CMT_JMP_TABLE) {276      for (i=0;i<lb->range;i++)277        lb->jmp_table[i]=OptLabelFwd(lb->jmp_table[i]);278      lb->dft=OptLabelFwd(lb->dft);279    }280    lb=lb->next;281  }282 283  COCHeaderPut(cc,7,FALSE);284  OptPass789A(cc,reg_offsets,NULL,NULL);285  COCHeaderPut(cc,8,FALSE);286  OptPass789A(cc,reg_offsets,NULL,NULL);287  COCHeaderPut(cc,9,FALSE);288  code_size=OptPass789A(cc,reg_offsets,NULL,NULL);289  do {290    last_code_size=code_size;291    COCHeaderPut(cc,9,FALSE);292    code_size=OptPass789A(cc,reg_offsets,NULL,NULL);293    if (code_size>last_code_size) {294      "Pass:9 Code Size\n";295      LexExcept(cc,"Compiler Optimization Error at ");296    }297  } while (code_size<last_code_size);298 299  if (cc->flags&CCF_AOT_COMPILE)300    res=MAlloc(code_size);301  else {302    res=MAlloc(code_size,Fs->code_heap);303    if (cc->htc.fun)304      Fs->last_fun=cc->htc.fun;305  }306  COCHeaderPut(cc,10,FALSE);307  code_size=OptPass789A(cc,reg_offsets,res,_dbg);308 309  COCDel(cc,&cc->coc);310  if (Bt(&cc->opts,OPTf_TRACE)) {311    if (cc->flags&CCF_AOT_COMPILE) {312      if (cc->aotc->seg_size==16)313        Un(res,code_size,16);314      else if (cc->aotc->seg_size==64)315        Un(res,code_size,64);316      else317        Un(res,code_size,32);318    } else319      Un(res,code_size,64);320  }321  if (_code_size) *_code_size=code_size;322  cc->saved_pass_trace=cc->pass_trace;323  return res;324}325