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