phase9: absorption — 0x80065930 pair-table lookup (311 regions / 302 distinct bodies)

Coordinator matched the 30-entry key/value pair-table lookup on the first
attempt (array spelling reproduced the two walked pointers). Gate MATCH
whole-binary SHA-1 e173426c157384ebf1b6caf8c6fea18a85a14af9.
This commit is contained in:
Christopher Williams
2026-09-24 01:17:17 -04:00
parent afa690aea4
commit 692b8cb800
2 changed files with 52 additions and 0 deletions
+1
View File
@@ -125,6 +125,7 @@
0x80058288 0x800582AC src/func_80058288.c
0x8005E3D0 0x8005E3F4 src/func_8005E3D0.c
0x8005ED6C 0x8005EDBC src/func_8005ED6C.c
0x80065930 0x80065980 src/func_80065930.c
0x80065B6C 0x80065B8C src/func_80065B6C.c
0x800668A8 0x800668F0 src/func_800668A8.c
0x800681A4 0x800681E0 src/func_800681A4.c
1 # Code-region registry: one C region per matched function.
125 0x80058288
126 0x8005E3D0
127 0x8005ED6C
128 0x80065930
129 0x80065B6C
130 0x800668A8
131 0x800681A4
+51
View File
@@ -0,0 +1,51 @@
/* func_80065930 — 0x80065930..0x80065980 (80 bytes).
*
* Searches a 30-entry key table (0x80132AF8) for the argument; returns the
* value at the matching index in the value table (0x80132A80), else 0.
*
* Original words:
* 0x3C068013 lui a2,0x8013
* 0x24C62A80 addiu a2,a2,10880 ; a2 = &value[0] (0x80132A80)
* 0x3C038013 lui v1,0x8013
* 0x24632AF8 addiu v1,v1,11000 ; v1 = &key[0] (0x80132AF8)
* loop:
* 0x8C620000 lw v0,0(v1)
* 0x00000000 nop
* 0x14440004 bne v0,a0,next ; if (key[i] != arg) next
* 0x00000000 nop
* 0x8CC20000 lw v0,0(a2)
* 0x0801965E j done
* 0x00000000 nop
* next:
* 0x24C60004 addiu a2,a2,4
* 0x24A50001 addiu a1,a1,1 ; i++
* 0x28A2001E slti v0,a1,30
* 0x1440FFF5 bnez v0,loop
* 0x24630004 addiu v1,v1,4 ; (delay) next key
* 0x00001021 move v0,zero
* done:
* 0x03E00008 jr ra
* 0x00000000 nop
*
* Unlike 0x80042CE0 (which used one walked register for both arrays), here
* two separate walked pointers a2/v1 advance in the branch delay slots. The
* not-found path returns 0 via a separate move.
*
* LIMITS: table sizes (30), 4-byte stride, and the key/value split are
* hypotheses read from the loop geometry. Only the compiled bytes are
* evidence.
*/
extern int D_80132A80[];
extern int D_80132AF8[];
int func_80065930(int key)
{
int i;
for (i = 0; i < 30; i++) {
if (D_80132AF8[i] == key)
return D_80132A80[i];
}
return 0;
}