hschumann2/TempleOS-Source-Code
0838
1 2asm {3//************************************4SYS_HASH_STR::5// IN: RSI=Addr of string6// OUT: RAX7 XOR RAX,RAX8 TEST RSI,RSI9 JZ @@1510 11 PUSH RSI12 PUSH RBX13 XOR RBX,RBX14 JMP @@1015 16@@05: SHL1 RBX17 ADC RBX,RAX18@@10: LODSB19 TEST AL,AL20 JNZ @@0521 22 MOV RAX,RBX23 SHR RBX,1624 ADC RAX,RBX25 POP RBX26 POP RSI27 28@@15: RET29//************************************30SYS_HASH_SINGLE_TABLE_FIND1::31// IN: RAX=HASHED STRING VAL32// RSI=STR33// RBX=TYPE MASK34// RDI=TABLE35// RCX=INSTANCE, NOT ZERO36// OUT: RAX=ENTRY OR ZERO NOT FOUND37// RDX=POINTER TO POINTER TO ENTRY38// RCX IF NOT FOUND ENOUGH, DECREMENTED BY NUM MATCHES39// ZERO FLAG SET NOT FOUND40 MOV RCX,141SYS_HASH_SINGLE_TABLE_FIND::42 TEST RCX,RCX43 JNZ @@0544 XOR RAX,RAX45 RET46@@05: AND RAX,U64 CHashTable.mask[RDI]47 MOV RDX,U64 CHashTable.body[RDI]48 LEA RDX,U64 [RDX+RAX*8]49@@10: MOV RAX,U64 [RDX]50 TEST RAX,RAX51 JNZ @@1552 RET53 54@@15: TEST U32 CHash.type[RAX],EBX55 JZ @@3056 PUSH RAX57 PUSH RDI58 PUSH RSI59 MOV RDI,U64 CHash.str[RAX]60@@20: LODSB61 CMP U8 [RDI],AL62 JNE @@2563 INC RDI64 TEST AL,AL65 JNZ @@2066 POP RSI67 POP RDI68 POP RAX69 LOOP @@3070 INC U32 CHash.use_cnt[RAX]71 TEST RAX,RAX72 RET73 74@@25: POP RSI75 POP RDI76 POP RAX77 78@@30: LEA RDX,U64 CHash.next[RAX]79 JMP @@1080//************************************81SYS_HASH_FIND1::82// IN: RSI=STR83// RBX=TYPE MASK84// RDI=TABLE85// RCX=INSTANCE NUM86// OUT: RAX=ENTRY OR ZERO NOT FOUND87// ZERO FLAG SET NOT FOUND88 MOV RCX,189SYS_HASH_FIND::90 PUSH RDI91 CALL SYS_HASH_STR92 93@@05: PUSH RAX94 CALL SYS_HASH_SINGLE_TABLE_FIND95 JNZ @@1596 POP RAX97@@10: MOV RDI,U64 CHashTable.next[RDI]98 TEST RDI,RDI99 JNZ @@05100 POP RDI101 XOR RAX,RAX102 RET103 104@@15: ADD RSP,8105 POP RDI106 TEST RAX,RAX107 RET108//************************************109SYS_HASH_BUCKET_FIND::110// IN: RSI=STR111// RDI=TABLE112// OUT: RAX=BUCKET113 PUSH RDX114 CALL SYS_HASH_STR115 AND RAX,U64 CHashTable.mask[RDI]116 MOV RDX,U64 CHashTable.body[RDI]117 LEA RAX,U64 [RDX+RAX*8]118 POP RDX119 RET120_HASH_STR::121 PUSH RBP122 MOV RBP,RSP123 PUSH RSI124 MOV RSI,U64 SF_ARG1[RBP]125 CALL SYS_HASH_STR126 POP RSI127 POP RBP128 RET1 8129_HASH_FIND::130 PUSH RBP131 MOV RBP,RSP132 PUSH RSI133 PUSH RDI134 MOV RSI,U64 SF_ARG1[RBP]135 MOV RDI,U64 SF_ARG2[RBP]136 MOV RBX,U64 SF_ARG3[RBP]137 MOV RCX,U64 SF_ARG4[RBP]138 CALL SYS_HASH_FIND139 POP RDI140 POP RSI141 POP RBP142 RET1 32143_HASH_SINGLE_TABLE_FIND::144 PUSH RBP145 MOV RBP,RSP146 PUSH RSI147 PUSH RDI148 MOV RSI,U64 SF_ARG1[RBP]149 MOV RDI,U64 SF_ARG2[RBP]150 MOV RBX,U64 SF_ARG3[RBP]151 MOV RCX,U64 SF_ARG4[RBP]152 CALL SYS_HASH_STR153 CALL SYS_HASH_SINGLE_TABLE_FIND154 POP RDI155 POP RSI156 POP RBP157 RET1 32158_HASH_BUCKET_FIND::159 PUSH RBP160 MOV RBP,RSP161 PUSH RSI162 PUSH RDI163 MOV RSI,U64 SF_ARG1[RBP]164 MOV RDI,U64 SF_ARG2[RBP]165 CALL SYS_HASH_BUCKET_FIND166 POP RDI167 POP RSI168 POP RBP169 RET1 16170_HASH_ADD::171 PUSH RBP172 MOV RBP,RSP173 PUSH RSI174 PUSH RDI175 MOV RCX,U64 SF_ARG1[RBP]176 MOV RSI,U64 CHash.str[RCX]177 MOV RDI,U64 SF_ARG2[RBP]178 CALL SYS_HASH_BUCKET_FIND179 MOV RCX,U64 SF_ARG1[RBP]180 PUSHFD181 CLI182 MOV RBX,U64 [RAX]183 MOV U64 CHash.next[RCX],RBX184 MOV U64 [RAX],RCX185 186 POPFD187 POP RDI188 POP RSI189 POP RBP190 RET1 16191_HASH_ADD_AFTER::192 PUSH RBP193 MOV RBP,RSP194 PUSH RDI195 MOV RCX,U64 SF_ARG1[RBP]196 MOV RDI,U64 SF_ARG3[RBP]197 PUSHFD198 CLI199 MOV RAX,SF_ARG2[RBP]200 MOV RBX,U64 [RAX]201 MOV U64 CHash.next[RCX],RBX202 MOV U64 [RAX],RCX203 204 POPFD205 POP RDI206 POP RBP207 RET1 24208_HASH_REM_DEL::209 PUSH RBP210 MOV RBP,RSP211 PUSH RSI212 PUSH RDI213 MOV RCX,U64 SF_ARG1[RBP]214 TEST RCX,RCX215 JZ @@10216 MOV RSI,U64 CHash.str[RCX]217 XOR RBX,RBX218 MOV EBX,U32 CHash.type[RCX]219 AND EBX,~HTG_FLAGS_MASK&0xFFFFFFFF220 MOV RDI,U64 SF_ARG2[RBP]221 MOV RCX,U64 SF_ARG3[RBP]222 CALL SYS_HASH_STR223 224 PUSHFD225 CLI226 CALL SYS_HASH_SINGLE_TABLE_FIND227 JZ @@05228 CMP RAX,U64 SF_ARG1[RBP]229 JNE @@05230 231 MOV RBX,U64 CHash.next[RAX]232 MOV U64 [RDX],RBX233 234 POPFD235 236 PUSH_C_REGS237 PUSH RAX238 CALL &HashDel239 POP_C_REGS240 241 POP RDI242 POP RSI243 MOV RAX,1244 POP RBP245 RET1 24246 247@@05: POPFD248@@10: POP RDI249 POP RSI250 XOR RAX,RAX251 POP RBP252 RET1 24253}254 255_extern _HASH_STR I64 HashStr(U8 *st); //Hash a string.256_extern _HASH_FIND CHash *HashFind(U8 *needle_str,CHashTable *haystack_table,257 I64 mask,I64 instance=1);//Find string in hash table.258_extern _HASH_SINGLE_TABLE_FIND CHash *HashSingleTableFind(U8 *needle_str,259 CHashTable *haystack_table,260 I64 mask,I64 instance=1);//Find string in single hash table.261_extern _HASH_BUCKET_FIND CHash **HashBucketFind(U8 *needle_str,262 CHashTable *haystack_table); //Find hash bucket.263_extern _HASH_ADD U0 HashAdd(CHash *tmph,264 CHashTable *table); //Add entry to hash table.265_extern _HASH_REM_DEL Bool HashRemDel(CHash *tmph,CHashTable *table,266 I64 instance=1);//Remove hash entry and del. Instance must match.267 