mirror of https://github.com/zeldaret/botw.git
ksys/act: Fix matching issue in AiClassDef
This commit is contained in:
parent
3d279039e9
commit
dbe6afa97a
2
lib/sead
2
lib/sead
|
@ -1 +1 @@
|
||||||
Subproject commit 7978b9ee0debb7d48cdc0a09a31cf278f7f91ef3
|
Subproject commit faf27ce52f15de1a445d8ad3c20d2724941853c0
|
|
@ -88,47 +88,14 @@ s32 AIClassDef::getRawDefIdx(const sead::SafeString& def_name, AIDefType type) c
|
||||||
if (!mData)
|
if (!mData)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
auto& buffer = mData->defs[s32(type)];
|
return getRawDefs(type).binarySearch(
|
||||||
if (buffer.size() == 0)
|
hash, +[](const Data::Def& def, const u32& hash) {
|
||||||
|
if (def.name_hash < hash)
|
||||||
return -1;
|
return -1;
|
||||||
|
if (def.name_hash > hash)
|
||||||
s32 a = 0;
|
return 1;
|
||||||
s32 b = buffer.size() - 1;
|
return 0;
|
||||||
while (a < b) {
|
});
|
||||||
const s32 m = (a + b) / 2;
|
|
||||||
auto* def = &buffer(m);
|
|
||||||
|
|
||||||
#ifdef MATCHING_HACK_NX_CLANG
|
|
||||||
{
|
|
||||||
// The original code has a bunch of useless comparisons that look like this:
|
|
||||||
// if (def->name_hash < hash == def->name_hash > hash)
|
|
||||||
// Unfortunately it doesn't match when written that way or with a more obvious
|
|
||||||
// equality check. Inline assembly to the rescue.
|
|
||||||
int lt, gt;
|
|
||||||
asm("cmp %w[def_hash], %w[hash]\n"
|
|
||||||
"cset %w[lt], cc\n"
|
|
||||||
"cset %w[gt], hi\n"
|
|
||||||
: [lt] "=r"(lt), [gt] "=r"(gt)
|
|
||||||
: [def_hash] "r"(def->name_hash), [hash] "r"(hash)
|
|
||||||
: "cc");
|
|
||||||
if (gt == lt)
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (def->name_hash == hash)
|
|
||||||
return m;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (def->name_hash >= hash)
|
|
||||||
b = m;
|
|
||||||
else
|
|
||||||
a = m + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer(a).name_hash != hash)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return a;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIClassDef::getDef(const sead::SafeString& class_name, AIDefSet* set,
|
void AIClassDef::getDef(const sead::SafeString& class_name, AIDefSet* set,
|
||||||
|
|
Loading…
Reference in New Issue