hschumann2/TempleOS-Source-Code
0838
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 