CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
AsmInit.txt211 linesDownload Raw Back to Compiler
1 2U0 AsmPrsInsFlags(CCmpCtrl *cc,CInst *tmpins)3{4  I64 i;5  while (TRUE) {6    switch (cc->token) {7      case TK_IDENT:8        if ((i=LstMatch(cc->cur_str,"NO\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0"))>=0) {9          tmpins->opcode_modifier=i;10          break;11        } else12          return;13      case TK_I64:14        if (cc->cur_i64==16)15          tmpins->flags|=IEF_OP_SIZE16;16        else if (cc->cur_i64==32)17          tmpins->flags|=IEF_OP_SIZE32;18        else19          return;20        break;21      case '+':22        tmpins->flags|=IEF_PLUS_OPCODE;23      case '/':24        if (Lex(cc)==TK_I64 && cc->cur_i64<8)25          tmpins->slash_val=cc->cur_i64;26        else if (cc->token==TK_IDENT) {27          if (!StrCmp(cc->cur_str,"R"))28            tmpins->slash_val=SV_R_REG;29          else if (!StrCmp(cc->cur_str,"I"))30            tmpins->slash_val=SV_I_REG;31          else32            return;33        } else34          return;35        break;36      case '!': tmpins->flags|=IEF_DONT_SWITCH_MODES;   break;37      case '&': tmpins->flags|=IEF_DFT;                 break;38      case '%': tmpins->flags|=IEF_NOT_IN_64_BIT;       break;39      case '=': tmpins->flags|=IEF_48_REX;              break;40      case '`': tmpins->flags|=IEF_REX_ONLY_R8_R15;     break;41      case '^': tmpins->flags|=IEF_REX_XOR_LIKE;                break;42      case '*': tmpins->flags|=IEF_STI_LIKE;            break;43      case '$': tmpins->flags|=IEF_ENDING_ZERO;         break;44      default:45        return;46    }47    Lex(cc);48  }49}50 51U0 AsmHashLoad()52{//See ::/Compiler/OpCodes.DD.53  I64 i,j,size,size_max;54  CInternalType *tmpit;55  CCmpCtrl *cc;56  CHashGeneric *tmph;57  CHashReg *tmpr;58  CHashOpcode *tmpo,*tmpo2,*tmpo_max;59  CInst *tmpins;60  CHashClass *tmpc;61 62  cmp.size_arg_mask[0]=0x3FF0FFFFFE;63  cmp.size_arg_mask[1]=0x1110111112;64  cmp.size_arg_mask[2]=0x2220222224;65  cmp.size_arg_mask[4]=0x0440444448;66  cmp.size_arg_mask[8]=0x0880888880;67 68  cmp.asm_hash=HashTableNew(1024);69  size_max=offset(CHashOpcode.ins)+sizeof(CInst)<<5;70  tmpo_max=MAlloc(size_max);71 72  cc=CmpCtrlNew(FileRead("OpCodes.DD"),,"OpCodes.DD.Z");73  cc->htc.hash_table_lst=NULL;74  Lex(cc);75  while (cc->token) {76    if (cc->token!=TK_IDENT)77      LexExcept(cc,"Expecting identifier at ");78    i=LstMatch(cc->cur_str,"NONE\0R8\0R16\0R32\0R64\0SEG\0FSTK\0"79          "MM\0XMM\0OPCODE\0KEYWORD\0ASM_KEYWORD\0");80    if (i<=0)81      LexExcept(cc,"Unknown Stmt");82    Lex(cc); //skip keyword83    if (cc->token!=TK_IDENT)84      LexExcept(cc,"Expecting identifier at ");85    switch (i) {86      case REGT_R8...REGT_XMM:87        tmpr=CAlloc(sizeof(CHashReg));88        tmpr->str=cc->cur_str;89        cc->cur_str=NULL;90        Lex(cc); //skip keyword name91        if (cc->token!=TK_I64)92          LexExcept(cc,"Expecting int at ");93        tmpr->type=HTT_REG;94        tmpr->reg_type=i;95        tmpr->reg_num=cc->cur_i64;96        HashAdd(tmpr,cmp.asm_hash);97        Lex(cc); //Skip INT98        break;99      case: //OPCODE100        if (cc->token!=TK_IDENT)101          LexExcept(cc,"Expecting opcode at ");102        MemSet(tmpo_max,0,size_max);103        tmpo_max->type=HTT_OPCODE;104        tmpo_max->inst_entry_cnt=0;105        tmpo_max->str=cc->cur_str;106        cc->cur_str=0;107        Lex(cc);        //Skip OPCODE108        while (cc->token && cc->token!=';' && cc->token!=':') {109          tmpins=&tmpo_max->ins[tmpo_max->inst_entry_cnt];110          tmpins->ins_entry_num=tmpo_max->inst_entry_cnt++;111          tmpins->slash_val=SV_NONE; //Not zero!!112          while (cc->token==TK_I64) {113            tmpins->opcode[tmpins->opcode_cnt++]=cc->cur_i64;114            Lex(cc);115          }116          if (cc->token==',')117            Lex(cc);118          else if (cc->token!=';')119            LexExcept(cc,"Expecting ',' at ");120 121          AsmPrsInsFlags(cc,tmpins);122 123          tmpins->uasm_slash_val=tmpins->slash_val;124          if (tmpins->flags&IEF_STI_LIKE && tmpins->slash_val!=SV_I_REG)125            tmpins->uasm_slash_val=SV_STI_LIKE;126 127          tmpins->arg1=tmpins->arg2=tmpins->size1=tmpins->size2=0;128          if (cc->token==TK_IDENT) {129            j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");130            tmpins->arg1=j;131            if (Bt(&cmp.size_arg_mask[1],j))132              tmpins->size1=8;133            else if (Bt(&cmp.size_arg_mask[2],j))134              tmpins->size1=16;135            else if (Bt(&cmp.size_arg_mask[4],j))136              tmpins->size1=32;137            else if (Bt(&cmp.size_arg_mask[8],j))138              tmpins->size1=64;139 140            if (Lex(cc)==TK_IDENT) {141              j=DefineMatch(cc->cur_str,"ST_ARG_TYPES");142              Lex(cc);143              tmpins->arg2=j;144              if (Bt(&cmp.size_arg_mask[1],j))145                tmpins->size2=8;146              else if (Bt(&cmp.size_arg_mask[2],j))147                tmpins->size2=16;148              else if (Bt(&cmp.size_arg_mask[4],j))149                tmpins->size2=32;150              else if (Bt(&cmp.size_arg_mask[8],j))151                tmpins->size2=64;152            }153          }154        }155        size=offset(CHashOpcode.ins)+sizeof(CInst)*tmpo_max->inst_entry_cnt;156        tmpo=MAlloc(size);157        MemCpy(tmpo,tmpo_max,size);158        tmpo->use_cnt=0;159        if (HashFind(tmpo->str,cmp.asm_hash,HTT_OPCODE))160          LexExcept(cc,"Duplicate OPCODE entry ");161        HashAdd(tmpo,cmp.asm_hash);162        //Parse aliases.163        if (cc->token==':') {164          while (Lex(cc)==TK_IDENT) {165            tmpo2=MAllocIdent(tmpo);166            tmpo2->str=cc->cur_str;167            cc->cur_str=0;168            tmpo2->oc_flags|=OCF_ALIAS;169            if (HashFind(tmpo2->str,cmp.asm_hash,HTT_OPCODE))170              LexExcept(cc,"Duplicate OPCODE ALIAS entry ");171            HashAdd(tmpo2,cmp.asm_hash);172          }173        }174        break;175      case: //KEYWORD176      case: //ASM_KEYWORD177        tmph=CAlloc(sizeof(CHashGeneric));178        tmph->str=cc->cur_str;179        cc->cur_str=NULL;180        Lex(cc); //skip keyword name181        if (cc->token!=TK_I64)182          LexExcept(cc,"Expecting int at ");183        tmph->user_data0=cc->cur_i64;184        if (i==10)185          tmph->type=HTT_KEYWORD;186        else187          tmph->type=HTT_ASM_KEYWORD;188        HashAdd(tmph,cmp.asm_hash);189        Lex(cc); //Skip INT190        break;191    }192    if (cc->token!=';')193      LexExcept(cc,"Missing ';' at");194    Lex(cc); //Skip ';'195  }196  Free(tmpo_max);197  CmpCtrlDel(cc);198  for (i=0;i<INTERNAL_TYPES_NUM;i++) {199    tmpit=&internal_types_table[i];200    tmpc=PrsClassNew;201    tmpc->type=HTT_INTERNAL_TYPE;202    tmpc->raw_type=tmpit->type;203    Bts(&tmpc->flags,Cf_INTERNAL_TYPE);204    tmpc->size=tmpit->size;205    tmpc->str=AStrNew(tmpit->name);206    HashAdd(tmpc,cmp.asm_hash);207    cmp.internal_types[tmpc->raw_type]=tmpc;208  }209  adam_task->hash_table->next=cmp.asm_hash;210}211