diff --git a/docs/backlog.md b/docs/backlog.md index 0900a52b9..e42fa2bb1 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -2,7 +2,7 @@ > Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there. -**Open near-misses:** 2961 · by status {'near': 2813, 'failed': 148} · by class {'WAVE': 31, 'plumbing': 33, 'other': 21, 'schedule': 59, 'loose-typing': 7, 'struct': 66, 'regalloc-order': 67, 'remat': 3, 'PINS': 3, 'STUB': 2, 'iv-combine': 3, 'STRUCT': 9, None: 2656, 'loop-guard': 1} +**Open near-misses:** 2977 · by status {'near': 2828, 'failed': 149} · by class {'WAVE': 31, 'plumbing': 34, 'other': 21, 'schedule': 62, 'loose-typing': 7, 'struct': 68, 'regalloc-order': 77, 'remat': 3, 'PINS': 3, 'STUB': 2, 'iv-combine': 3, 'STRUCT': 9, None: 2656, 'loop-guard': 1} | # | addr | reach | class | nins | status | closeness | where it stuck | best draft | |--:|------|------:|-------|-----:|--------|----------:|----------------|------------| @@ -206,2764 +206,2780 @@ | 198 | func_80185E68 | 1 | STRUCT | 132 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E68.c` | | 199 | func_8013D9B0 | 1 | regalloc-order | 141 | near | 0 | none — MATCH (141 ins). Handwritten GTE color-interp loop cracked via: 5 callee-saved | `.run/backlog_drafts/func_8013D9B0.c` | | 200 | func_8018514C | 1 | WAVE | 168 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018514C.c` | -| 201 | func_8018103C | 1 | STRUCT | 579 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018103C.c` | -| 202 | func_80165658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80165658.c` | -| 203 | func_8017CFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFD4.c` | -| 204 | func_8017CFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFFC.c` | -| 205 | func_8017CF78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF78.c` | -| 206 | func_8017CFA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA0.c` | -| 207 | func_8017D13C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D13C.c` | -| 208 | func_8017D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D164.c` | -| 209 | func_8017D18C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D18C.c` | -| 210 | func_8017DA9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA9C.c` | -| 211 | func_8017D5D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D4.c` | -| 212 | func_8017D5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5FC.c` | -| 213 | func_8017D02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D02C.c` | -| 214 | func_8017D054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D054.c` | -| 215 | func_8017D07C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D07C.c` | -| 216 | func_8017D430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D430.c` | -| 217 | func_8017D134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D134.c` | -| 218 | func_8017D15C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D15C.c` | -| 219 | func_8017D3FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3FC.c` | -| 220 | func_8017D6D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D4.c` | -| 221 | func_8017D964 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D964.c` | -| 222 | func_8017F458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F458.c` | -| 223 | func_8018A660 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A660.c` | -| 224 | func_80161C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80161C98.c` | -| 225 | func_80171120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171120.c` | -| 226 | func_80157544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157544.c` | -| 227 | func_8015DE58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015DE58.c` | -| 228 | func_801678B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801678B4.c` | -| 229 | func_8016F6E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F6E0.c` | -| 230 | func_8016FDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FDB4.c` | -| 231 | func_8016FFDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FFDC.c` | -| 232 | func_8017D418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D418.c` | -| 233 | func_8017D440 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D440.c` | -| 234 | func_8017E034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E034.c` | -| 235 | func_8017ED30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED30.c` | -| 236 | func_8017ED58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED58.c` | -| 237 | func_80157DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157DC4.c` | -| 238 | func_80164EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164EA4.c` | -| 239 | func_8016F8E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F8E4.c` | -| 240 | func_80171064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171064.c` | -| 241 | func_801727D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801727D0.c` | -| 242 | func_801747CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801747CC.c` | -| 243 | func_8017EE24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE24.c` | -| 244 | func_8017F40C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F40C.c` | -| 245 | func_8017D34C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D34C.c` | -| 246 | func_8017D374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D374.c` | -| 247 | func_8017F080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F080.c` | -| 248 | func_801866B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801866B0.c` | -| 249 | func_8017D00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D00C.c` | -| 250 | func_8017D034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D034.c` | -| 251 | func_80131FDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FDC.c` | -| 252 | func_80152370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152370.c` | -| 253 | func_8015E8E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E8E8.c` | -| 254 | func_80168D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168D58.c` | -| 255 | func_8016AB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016AB30.c` | -| 256 | func_8016CB84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016CB84.c` | -| 257 | func_8016FC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FC90.c` | -| 258 | func_80170748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170748.c` | -| 259 | func_80174888 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174888.c` | -| 260 | func_80143B30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143B30.c` | -| 261 | func_80143E68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143E68.c` | -| 262 | func_8015E1B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E1B8.c` | -| 263 | func_80167A9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80167A9C.c` | -| 264 | func_801693CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801693CC.c` | -| 265 | func_80169F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169F00.c` | -| 266 | func_801704B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801704B0.c` | -| 267 | func_80170BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170BD8.c` | -| 268 | func_80170EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170EFC.c` | -| 269 | func_801714E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801714E4.c` | -| 270 | func_80173544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173544.c` | -| 271 | func_801742A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801742A4.c` | -| 272 | func_80174474 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174474.c` | -| 273 | func_8017D26C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D26C.c` | -| 274 | func_8017D7A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7A4.c` | -| 275 | func_80155580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80155580.c` | -| 276 | func_80159698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159698.c` | -| 277 | func_8015BFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BFF4.c` | -| 278 | func_8015F00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F00C.c` | -| 279 | func_80160EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160EA4.c` | -| 280 | func_80166618 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166618.c` | -| 281 | func_8016DEA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016DEA4.c` | -| 282 | func_8016F834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F834.c` | -| 283 | func_801705F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801705F8.c` | -| 284 | func_80170810 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170810.c` | -| 285 | func_80172DAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172DAC.c` | -| 286 | func_8017CD9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD9C.c` | -| 287 | func_80136C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80136C54.c` | -| 288 | func_80153320 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153320.c` | -| 289 | func_80159B70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159B70.c` | -| 290 | func_80166018 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166018.c` | -| 291 | func_80166654 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166654.c` | -| 292 | func_8016A700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A700.c` | -| 293 | func_8016BBA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016BBA4.c` | -| 294 | func_8016FB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FB7C.c` | -| 295 | func_8017F1C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1C8.c` | -| 296 | func_80182B9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B9C.c` | -| 297 | func_80131F64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131F64.c` | -| 298 | func_801425CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801425CC.c` | -| 299 | func_80152D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152D24.c` | -| 300 | func_801599A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801599A4.c` | -| 301 | func_8015C714 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015C714.c` | -| 302 | func_8015EE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015EE08.c` | -| 303 | func_8015F324 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F324.c` | -| 304 | func_801659DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801659DC.c` | -| 305 | func_8016D19C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016D19C.c` | -| 306 | func_801736FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801736FC.c` | -| 307 | func_801737E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801737E8.c` | -| 308 | func_8017CFE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFE4.c` | -| 309 | func_8017D1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1F8.c` | -| 310 | func_80143C38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143C38.c` | -| 311 | func_80159968 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159968.c` | -| 312 | func_8015D4E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015D4E8.c` | -| 313 | func_80160138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160138.c` | -| 314 | func_80162330 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162330.c` | -| 315 | func_801663FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801663FC.c` | -| 316 | func_80168744 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168744.c` | -| 317 | func_80170548 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170548.c` | -| 318 | func_80173078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173078.c` | -| 319 | func_8017390C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017390C.c` | -| 320 | func_8017496C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017496C.c` | -| 321 | func_8017BEC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEC4.c` | -| 322 | func_8017D310 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D310.c` | -| 323 | func_801449C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801449C8.c` | -| 324 | func_80151D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151D24.c` | -| 325 | func_80153060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153060.c` | -| 326 | func_8015824C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015824C.c` | -| 327 | func_8015AD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015AD3C.c` | -| 328 | func_8015BE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BE38.c` | -| 329 | func_8015F7D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F7D4.c` | -| 330 | func_80169830 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169830.c` | -| 331 | func_8016C14C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016C14C.c` | -| 332 | func_8016F798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F798.c` | -| 333 | func_8016FA84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FA84.c` | -| 334 | func_8016FF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FF30.c` | -| 335 | func_80170150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170150.c` | -| 336 | func_8017C150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C150.c` | -| 337 | func_80131EEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131EEC.c` | -| 338 | func_80144A2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80144A2C.c` | -| 339 | func_8015CFC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015CFC0.c` | -| 340 | func_8016A020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A020.c` | -| 341 | func_80170C74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170C74.c` | -| 342 | func_801711C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801711C0.c` | -| 343 | func_80172B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172B44.c` | -| 344 | func_80172CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172CA0.c` | -| 345 | func_80174384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174384.c` | -| 346 | func_8017CF7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF7C.c` | -| 347 | func_8017D22C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D22C.c` | -| 348 | func_8015282C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015282C.c` | -| 349 | func_80164BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164BA0.c` | -| 350 | func_801689D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801689D8.c` | -| 351 | func_80169B80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169B80.c` | -| 352 | func_8016B4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016B4BC.c` | -| 353 | func_8016F9C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F9C4.c` | -| 354 | func_80170AD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170AD8.c` | -| 355 | func_80170E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170E34.c` | -| 356 | func_8017BE60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BE60.c` | -| 357 | func_8017CE20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE20.c` | -| 358 | func_8017D424 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D424.c` | -| 359 | func_8017D6FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6FC.c` | -| 360 | func_8017E4C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4C8.c` | -| 361 | func_8017E578 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E578.c` | -| 362 | func_8017ED0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED0C.c` | -| 363 | func_8017F480 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F480.c` | -| 364 | func_8017F500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F500.c` | -| 365 | func_80180420 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180420.c` | -| 366 | func_8017DD2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD2C.c` | -| 367 | func_8017E524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E524.c` | -| 368 | func_8017E734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E734.c` | -| 369 | func_80184F8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184F8C.c` | -| 370 | func_8017CA80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CA80.c` | -| 371 | func_801814B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814B8.c` | -| 372 | func_80185B40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B40.c` | -| 373 | func_80186910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186910.c` | -| 374 | func_80186CAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186CAC.c` | -| 375 | func_80187FEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187FEC.c` | -| 376 | func_801886DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801886DC.c` | -| 377 | func_80189FD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189FD0.c` | -| 378 | func_8018A00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A00C.c` | -| 379 | func_8017C524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C524.c` | -| 380 | func_8017C7C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C7C4.c` | -| 381 | func_80182154 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182154.c` | -| 382 | func_80182234 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182234.c` | -| 383 | func_80182414 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182414.c` | -| 384 | func_801824E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824E0.c` | -| 385 | func_80183238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183238.c` | -| 386 | func_80183718 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183718.c` | -| 387 | func_801863AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801863AC.c` | -| 388 | func_80186E30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186E30.c` | -| 389 | func_80188ECC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188ECC.c` | -| 390 | func_80189304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189304.c` | -| 391 | func_801898C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801898C8.c` | -| 392 | func_80131FA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FA0.c` | -| 393 | func_80152B6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152B6C.c` | -| 394 | func_80157FC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157FC4.c` | -| 395 | func_80162834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162834.c` | -| 396 | func_80168AA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168AA8.c` | -| 397 | func_8016901C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016901C.c` | -| 398 | func_8016D428 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016D428.c` | -| 399 | func_8016DF20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016DF20.c` | -| 400 | func_80170240 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170240.c` | -| 401 | func_801703E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801703E0.c` | -| 402 | func_80170FB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170FB0.c` | -| 403 | func_801728E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801728E4.c` | -| 404 | func_80173B4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173B4C.c` | -| 405 | func_8017CE48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE48.c` | -| 406 | func_8017CF60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF60.c` | -| 407 | func_80143C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143C98.c` | -| 408 | func_80152698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152698.c` | -| 409 | func_8016E5B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016E5B8.c` | -| 410 | func_801706AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801706AC.c` | -| 411 | func_80174F28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174F28.c` | -| 412 | func_8017F878 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F878.c` | -| 413 | func_8017FE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE08.c` | -| 414 | func_8018043C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018043C.c` | -| 415 | func_801808D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801808D8.c` | -| 416 | func_80182F58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182F58.c` | -| 417 | func_80144054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80144054.c` | -| 418 | func_80152058 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152058.c` | -| 419 | func_8015A264 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015A264.c` | -| 420 | func_80163A58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80163A58.c` | -| 421 | func_801702FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801702FC.c` | -| 422 | func_80170D68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170D68.c` | -| 423 | func_80171260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171260.c` | -| 424 | func_801729F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801729F0.c` | -| 425 | func_8017319C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017319C.c` | -| 426 | func_8017CDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDB4.c` | -| 427 | func_8017CF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF34.c` | -| 428 | func_8017EFEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFEC.c` | -| 429 | func_8017C078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C078.c` | -| 430 | func_8017C268 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C268.c` | -| 431 | func_8017D51C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D51C.c` | -| 432 | func_80180BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180BA0.c` | -| 433 | func_80182000 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182000.c` | -| 434 | func_8017CDB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDB8.c` | -| 435 | func_8017D1B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1B4.c` | -| 436 | func_801803A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803A0.c` | -| 437 | func_8017E170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E170.c` | -| 438 | func_8017DD1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD1C.c` | -| 439 | func_8018AB74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AB74.c` | -| 440 | func_8017D49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D49C.c` | -| 441 | func_80185D6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D6C.c` | -| 442 | func_8017D348 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D348.c` | -| 443 | func_8017E020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E020.c` | -| 444 | func_8017CD14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD14.c` | -| 445 | func_8017D54C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D54C.c` | -| 446 | func_8017DB0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB0C.c` | -| 447 | func_801826C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826C4.c` | -| 448 | func_8017E290 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E290.c` | -| 449 | func_8018592C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018592C.c` | -| 450 | func_8017ED90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED90.c` | -| 451 | func_8017D0B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0B4.c` | -| 452 | func_8017E8CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8CC.c` | -| 453 | func_8017F8C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8C8.c` | -| 454 | func_80188718 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188718.c` | -| 455 | func_8017D670 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D670.c` | -| 456 | func_8017D804 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D804.c` | -| 457 | func_8017ED68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED68.c` | -| 458 | func_8017EDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDB4.c` | -| 459 | func_8017E304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E304.c` | -| 460 | func_8017D988 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D988.c` | -| 461 | func_8017DE44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE44.c` | -| 462 | func_8018794C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018794C.c` | -| 463 | func_80188D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188D18.c` | -| 464 | func_8017EDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDD8.c` | -| 465 | func_8017CFAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFAC.c` | -| 466 | func_8017CF70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF70.c` | -| 467 | func_801832D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801832D0.c` | -| 468 | func_8017F87C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F87C.c` | -| 469 | func_80184424 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184424.c` | -| 470 | func_8017D500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D500.c` | -| 471 | func_8017F228 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F228.c` | -| 472 | func_80188754 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188754.c` | -| 473 | func_80188C9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188C9C.c` | -| 474 | func_8017D874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D874.c` | -| 475 | func_8017DC54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC54.c` | -| 476 | func_8017D008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D008.c` | -| 477 | func_8017EDDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDDC.c` | -| 478 | func_8017EFB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFB8.c` | -| 479 | func_8017F184 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F184.c` | -| 480 | func_8017F268 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F268.c` | -| 481 | func_80183E04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183E04.c` | -| 482 | func_8017CFCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFCC.c` | -| 483 | func_8017E758 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E758.c` | -| 484 | func_8017E060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E060.c` | -| 485 | func_801870DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801870DC.c` | -| 486 | func_801876FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801876FC.c` | -| 487 | func_8017CFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFF4.c` | -| 488 | func_8017CF58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF58.c` | -| 489 | func_80181028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181028.c` | -| 490 | func_80181D3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D3C.c` | -| 491 | func_8017CF98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF98.c` | -| 492 | func_801840FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801840FC.c` | -| 493 | func_80180EF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EF4.c` | -| 494 | func_8017E6C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6C8.c` | -| 495 | func_8017D218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D218.c` | -| 496 | func_8017D664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D664.c` | -| 497 | func_8017F02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F02C.c` | -| 498 | func_8017F154 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F154.c` | -| 499 | func_8017D8B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8B0.c` | -| 500 | func_8017D580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D580.c` | -| 501 | func_8017E740 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E740.c` | -| 502 | func_8017E950 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E950.c` | -| 503 | func_8017E0A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0A4.c` | -| 504 | func_8017EEE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEE0.c` | -| 505 | func_8017D3B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3B8.c` | -| 506 | func_8017CF1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF1C.c` | -| 507 | func_8017D698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D698.c` | -| 508 | func_8017D174 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D174.c` | -| 509 | func_8017FB54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB54.c` | -| 510 | func_8017CF80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF80.c` | -| 511 | func_80181DEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181DEC.c` | -| 512 | func_8017F054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F054.c` | -| 513 | func_8017DCBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCBC.c` | -| 514 | func_80181274 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181274.c` | -| 515 | func_80180F3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F3C.c` | -| 516 | func_8017F768 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F768.c` | -| 517 | func_80180EE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EE0.c` | -| 518 | func_8017EA0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA0C.c` | -| 519 | func_80180C3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C3C.c` | -| 520 | func_8017D50C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D50C.c` | -| 521 | func_8017D68C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D68C.c` | -| 522 | func_8017D9FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9FC.c` | -| 523 | func_8017E2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2A0.c` | -| 524 | func_8017D798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D798.c` | -| 525 | func_8017EC84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC84.c` | -| 526 | func_8017D46C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D46C.c` | -| 527 | func_8017D370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D370.c` | -| 528 | func_8017DA10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA10.c` | -| 529 | func_8017D508 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D508.c` | -| 530 | func_8017D0A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0A0.c` | -| 531 | func_8017E77C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E77C.c` | -| 532 | func_8017F1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1A0.c` | -| 533 | func_8017EDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDBC.c` | -| 534 | func_8017CDDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDDC.c` | -| 535 | func_80183F98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183F98.c` | -| 536 | func_8017D0D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0D4.c` | -| 537 | func_8017D6C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6C0.c` | -| 538 | func_8017D884 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D884.c` | -| 539 | func_8017EA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA24.c` | -| 540 | func_8017EE00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE00.c` | -| 541 | func_8017D040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D040.c` | -| 542 | func_80182288 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182288.c` | -| 543 | func_801838F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801838F0.c` | -| 544 | func_8017D03C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D03C.c` | -| 545 | func_8017D890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D890.c` | -| 546 | func_8017DFCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFCC.c` | -| 547 | func_8017E008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E008.c` | -| 548 | func_8017DA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA24.c` | -| 549 | func_8017D770 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D770.c` | -| 550 | func_8017EA64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA64.c` | -| 551 | func_8017D908 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D908.c` | -| 552 | func_8017D544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D544.c` | -| 553 | func_8017D0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0C8.c` | -| 554 | func_8017ECBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECBC.c` | -| 555 | func_8017E84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E84C.c` | -| 556 | func_8017DDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDBC.c` | -| 557 | func_8017D24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D24C.c` | -| 558 | func_8017ECC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECC8.c` | -| 559 | func_8017EA4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA4C.c` | -| 560 | func_8017D478 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D478.c` | -| 561 | func_8017D074 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D074.c` | -| 562 | func_8017CE40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE40.c` | -| 563 | func_8018096C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018096C.c` | -| 564 | func_8017EB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB30.c` | -| 565 | func_8017D704 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D704.c` | -| 566 | func_8017D0CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0CC.c` | -| 567 | func_8017F988 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F988.c` | -| 568 | func_80181A40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A40.c` | -| 569 | func_8018656C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018656C.c` | -| 570 | func_8017D064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D064.c` | -| 571 | func_8017E278 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E278.c` | -| 572 | func_8017DF8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF8C.c` | -| 573 | func_8017D84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D84C.c` | -| 574 | func_8017EAB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAB0.c` | -| 575 | func_8017E030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E030.c` | -| 576 | func_8017D094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D094.c` | -| 577 | func_8017F0F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0F0.c` | -| 578 | func_8017E640 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E640.c` | -| 579 | func_8017DD44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD44.c` | -| 580 | func_8017D9B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9B8.c` | -| 581 | func_8017D0F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0F4.c` | -| 582 | func_8017D184 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D184.c` | -| 583 | func_8017DFE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFE0.c` | -| 584 | func_8017E1F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1F4.c` | -| 585 | func_8017E36C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E36C.c` | -| 586 | func_8017D290 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D290.c` | -| 587 | func_8017CDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDD8.c` | -| 588 | func_8017E01C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E01C.c` | -| 589 | func_80185934 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185934.c` | -| 590 | func_8017D04C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D04C.c` | -| 591 | func_8017DAD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAD0.c` | -| 592 | func_80183C4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C4C.c` | -| 593 | func_8017F360 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F360.c` | -| 594 | func_8017EB5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB5C.c` | -| 595 | func_8017DD64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD64.c` | -| 596 | func_80182258 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182258.c` | -| 597 | func_8017FF2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF2C.c` | -| 598 | func_80185AF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185AF8.c` | -| 599 | func_8017DBB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBB0.c` | -| 600 | func_8017DCA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCA0.c` | -| 601 | func_8017F2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2CC.c` | -| 602 | func_8017F644 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F644.c` | -| 603 | func_8017DE84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE84.c` | -| 604 | func_8017DEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEB0.c` | -| 605 | func_8017EF2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF2C.c` | -| 606 | func_80186318 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186318.c` | -| 607 | func_8017EA88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA88.c` | -| 608 | func_8017D0AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0AC.c` | -| 609 | func_8017E9C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9C8.c` | -| 610 | func_8017D7C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7C0.c` | -| 611 | func_8017F0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0C8.c` | -| 612 | func_8017F118 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F118.c` | -| 613 | func_8017EAA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAA4.c` | -| 614 | func_8017D494 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D494.c` | -| 615 | func_8017EEF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEF8.c` | -| 616 | func_8017D104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D104.c` | -| 617 | func_8017D9E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9E4.c` | -| 618 | func_8017CE60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE60.c` | -| 619 | func_8017DAAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAAC.c` | -| 620 | func_8017E1EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1EC.c` | -| 621 | func_8017E0B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0B0.c` | -| 622 | func_801827A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801827A8.c` | -| 623 | func_80182E1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E1C.c` | -| 624 | func_8017D708 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D708.c` | -| 625 | func_80181138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181138.c` | -| 626 | func_8017E778 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E778.c` | -| 627 | func_8017E044 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E044.c` | -| 628 | func_8017E240 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E240.c` | -| 629 | func_801824F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824F0.c` | -| 630 | func_8018279C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018279C.c` | -| 631 | func_8017E124 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E124.c` | -| 632 | func_80182758 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182758.c` | -| 633 | func_8017D0BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0BC.c` | -| 634 | func_8017DEA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEA8.c` | -| 635 | func_8017E6EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6EC.c` | -| 636 | func_8017E8F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8F8.c` | -| 637 | func_80186530 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186530.c` | -| 638 | func_8017DC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC74.c` | -| 639 | func_8017DE6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE6C.c` | -| 640 | func_8018ADD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ADD0.c` | -| 641 | func_8017C8B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C8B8.c` | -| 642 | func_8017F2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2A4.c` | -| 643 | func_8018151C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018151C.c` | -| 644 | func_8017DC94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC94.c` | -| 645 | func_8017DF1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF1C.c` | -| 646 | func_8017FC50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FC50.c` | -| 647 | func_8017D06C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D06C.c` | -| 648 | func_8017F49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F49C.c` | -| 649 | func_8017E110 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E110.c` | -| 650 | func_8017E138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E138.c` | -| 651 | func_8017EACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EACC.c` | -| 652 | func_8017DECC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DECC.c` | -| 653 | func_8017D934 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D934.c` | -| 654 | func_8017CDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDBC.c` | -| 655 | func_8017E1C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1C0.c` | -| 656 | func_8017E2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2C8.c` | -| 657 | func_8017E0D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0D8.c` | -| 658 | func_8017D030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D030.c` | -| 659 | func_8018019C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018019C.c` | -| 660 | func_8017EEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEB0.c` | -| 661 | func_8017D274 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D274.c` | -| 662 | func_8017F074 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F074.c` | -| 663 | func_8017D1E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1E0.c` | -| 664 | func_8017F130 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F130.c` | -| 665 | func_8017D4A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4A0.c` | -| 666 | func_8017DD88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD88.c` | -| 667 | func_8017E984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E984.c` | -| 668 | func_8017D150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D150.c` | -| 669 | func_8017D9B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9B4.c` | -| 670 | func_8017EBF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBF4.c` | -| 671 | func_8017EB88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB88.c` | -| 672 | func_8017EA28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA28.c` | -| 673 | func_8017DC2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC2C.c` | -| 674 | func_8017F384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F384.c` | -| 675 | func_8017D47C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D47C.c` | -| 676 | func_8017E11C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E11C.c` | -| 677 | func_80180C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C1C.c` | -| 678 | func_8017D33C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D33C.c` | -| 679 | func_8017EAD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAD8.c` | -| 680 | func_8017F254 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F254.c` | -| 681 | func_8017BFC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BFC8.c` | -| 682 | func_8017DF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF54.c` | -| 683 | func_8017E358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E358.c` | -| 684 | func_8017F370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F370.c` | -| 685 | func_8017DA00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA00.c` | -| 686 | func_80180CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CA0.c` | -| 687 | func_8017FAD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FAD8.c` | -| 688 | func_80180C7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C7C.c` | -| 689 | func_80182860 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182860.c` | -| 690 | func_8017D2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2A4.c` | -| 691 | func_8017D2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2CC.c` | -| 692 | func_8017D1D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1D0.c` | -| 693 | func_8017ED80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED80.c` | -| 694 | func_8017FA00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA00.c` | -| 695 | func_8017FF88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF88.c` | -| 696 | func_80182030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182030.c` | -| 697 | func_8017D384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D384.c` | -| 698 | func_8017DE74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE74.c` | -| 699 | func_8017E35C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E35C.c` | -| 700 | func_8017FB4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB4C.c` | -| 701 | func_801844D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801844D4.c` | -| 702 | func_8017DD60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD60.c` | -| 703 | func_8017DE88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE88.c` | -| 704 | func_8017EF18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF18.c` | -| 705 | func_8017D1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1A0.c` | -| 706 | func_8017FBE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBE0.c` | -| 707 | func_80182E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E34.c` | -| 708 | func_80180214 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180214.c` | -| 709 | func_8017F120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F120.c` | -| 710 | func_8017F4A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4A0.c` | -| 711 | func_8017D524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D524.c` | -| 712 | func_80180D74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D74.c` | -| 713 | func_801819E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801819E8.c` | -| 714 | func_80181984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181984.c` | -| 715 | func_8018263C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018263C.c` | -| 716 | func_8017CE0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE0C.c` | -| 717 | func_8017F060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F060.c` | -| 718 | func_8018234C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018234C.c` | -| 719 | func_8017CD10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD10.c` | -| 720 | func_8017E3F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E3F4.c` | -| 721 | func_80181300 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181300.c` | -| 722 | func_8017FB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB00.c` | -| 723 | func_8017D3BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3BC.c` | -| 724 | func_801803DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803DC.c` | -| 725 | func_8017DC9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC9C.c` | -| 726 | func_8017D7DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7DC.c` | -| 727 | func_8017F820 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F820.c` | -| 728 | func_8017CE94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE94.c` | -| 729 | func_8017E088 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E088.c` | -| 730 | func_8017DBB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBB4.c` | -| 731 | func_8017D078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D078.c` | -| 732 | func_8017D4CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4CC.c` | -| 733 | func_8017FA7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA7C.c` | -| 734 | func_801800D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801800D4.c` | -| 735 | func_8017DAA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAA4.c` | -| 736 | func_8017C0E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C0E4.c` | -| 737 | func_8017D404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D404.c` | -| 738 | func_8017FA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA24.c` | -| 739 | func_8017DCF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCF4.c` | -| 740 | func_801809FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801809FC.c` | -| 741 | func_8017D0E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0E8.c` | -| 742 | func_80183C10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C10.c` | -| 743 | func_8017F320 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F320.c` | -| 744 | func_8017EDC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDC0.c` | -| 745 | func_8017EF7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF7C.c` | -| 746 | func_8017CEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CEB0.c` | -| 747 | func_8018133C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018133C.c` | -| 748 | func_80184238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184238.c` | -| 749 | func_801821D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801821D4.c` | -| 750 | func_801809C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801809C4.c` | -| 751 | func_80182600 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182600.c` | -| 752 | func_8017D990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D990.c` | -| 753 | func_801835C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801835C0.c` | -| 754 | func_80180994 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180994.c` | -| 755 | func_80180FF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180FF8.c` | -| 756 | func_8017D5DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5DC.c` | -| 757 | func_8017E81C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E81C.c` | -| 758 | func_8017D3A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3A4.c` | -| 759 | func_80186BC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BC4.c` | -| 760 | func_80187794 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187794.c` | -| 761 | func_80180AEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AEC.c` | -| 762 | func_8017E04C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E04C.c` | -| 763 | func_80182E04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E04.c` | -| 764 | func_8018057C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018057C.c` | -| 765 | func_8017D640 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D640.c` | -| 766 | func_8018187C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018187C.c` | -| 767 | func_80180668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180668.c` | -| 768 | func_8017DA94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA94.c` | -| 769 | func_8017DB44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB44.c` | -| 770 | func_8017CFEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFEC.c` | -| 771 | func_80180EAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EAC.c` | -| 772 | func_8017D554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D554.c` | -| 773 | func_80184DE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184DE8.c` | -| 774 | func_8017CFC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFC4.c` | -| 775 | func_8017ED60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED60.c` | -| 776 | func_8017F2E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2E0.c` | -| 777 | func_8017D220 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D220.c` | -| 778 | func_80182834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182834.c` | -| 779 | func_8017D29C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D29C.c` | -| 780 | func_80185404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185404.c` | -| 781 | func_8017E0A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0A0.c` | -| 782 | func_8017CB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CB7C.c` | -| 783 | func_8017FBE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBE8.c` | -| 784 | func_8017DA7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA7C.c` | -| 785 | func_8017EF68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF68.c` | -| 786 | func_8017D5F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5F8.c` | -| 787 | func_8017E30C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E30C.c` | -| 788 | func_8017EF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF54.c` | -| 789 | func_80183194 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183194.c` | -| 790 | func_801843F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801843F4.c` | -| 791 | func_8017D010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D010.c` | -| 792 | func_8017E978 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E978.c` | -| 793 | func_8017D1D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1D4.c` | -| 794 | func_80181B78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B78.c` | -| 795 | func_801829BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829BC.c` | -| 796 | func_8017F1BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1BC.c` | -| 797 | func_8017DB78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB78.c` | -| 798 | func_8017DD30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD30.c` | -| 799 | func_80185594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185594.c` | -| 800 | func_80185A80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A80.c` | -| 801 | func_8017D740 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D740.c` | -| 802 | func_80184674 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184674.c` | -| 803 | func_80183364 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183364.c` | -| 804 | func_80184C90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C90.c` | -| 805 | func_80180B50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B50.c` | -| 806 | func_801814B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814B0.c` | -| 807 | func_80184884 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184884.c` | -| 808 | func_8017CFC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFC8.c` | -| 809 | func_80180D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D58.c` | -| 810 | func_8017EA84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA84.c` | -| 811 | func_8017D7C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7C4.c` | -| 812 | func_8017D620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D620.c` | -| 813 | func_8017D9A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9A8.c` | -| 814 | func_8017E854 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E854.c` | -| 815 | func_8017DDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDD8.c` | -| 816 | func_80180280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180280.c` | -| 817 | func_80181C44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C44.c` | -| 818 | func_80185D7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D7C.c` | -| 819 | func_8017E090 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E090.c` | -| 820 | func_8017E378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E378.c` | -| 821 | func_8017E89C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E89C.c` | -| 822 | func_8017D21C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D21C.c` | -| 823 | func_8017E388 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E388.c` | -| 824 | func_8017D688 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D688.c` | -| 825 | func_8017F06C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F06C.c` | -| 826 | func_8018F6DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F6DC.c` | -| 827 | func_80185D00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D00.c` | -| 828 | func_801801A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801A8.c` | -| 829 | func_8017F094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F094.c` | -| 830 | func_80182EE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EE8.c` | -| 831 | func_80185DE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185DE4.c` | -| 832 | func_8017F2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2A0.c` | -| 833 | func_8017DFC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFC0.c` | -| 834 | func_8017D600 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D600.c` | -| 835 | func_80181B3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B3C.c` | -| 836 | func_8017EFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFD4.c` | -| 837 | func_8017F7F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F7F8.c` | -| 838 | func_8017D6A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6A4.c` | -| 839 | func_8017DF80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF80.c` | -| 840 | func_8017CC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CC90.c` | -| 841 | func_801832B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801832B8.c` | -| 842 | func_8017F69C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F69C.c` | -| 843 | func_801811DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811DC.c` | -| 844 | func_8018266C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018266C.c` | -| 845 | func_8017EBA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBA8.c` | -| 846 | func_801840C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801840C0.c` | -| 847 | func_8017D808 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D808.c` | -| 848 | func_80182C24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C24.c` | -| 849 | func_801843B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801843B4.c` | -| 850 | func_80182C88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C88.c` | -| 851 | func_80181128 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181128.c` | -| 852 | func_8017EB0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB0C.c` | -| 853 | func_8017EB34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB34.c` | -| 854 | func_80180384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180384.c` | -| 855 | func_8017DE70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE70.c` | -| 856 | func_8017DC78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC78.c` | -| 857 | func_80180A38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A38.c` | -| 858 | func_80182378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182378.c` | -| 859 | func_80181874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181874.c` | -| 860 | func_8017EDCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDCC.c` | -| 861 | func_80187814 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187814.c` | -| 862 | func_8017E9DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9DC.c` | -| 863 | func_8017D578 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D578.c` | -| 864 | func_801825EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801825EC.c` | -| 865 | func_8017EC08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC08.c` | -| 866 | func_8017D8EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8EC.c` | -| 867 | func_8017E568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E568.c` | -| 868 | func_8017DF58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF58.c` | -| 869 | func_80181C6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C6C.c` | -| 870 | func_8017FBF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBF8.c` | -| 871 | func_8017CE68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE68.c` | -| 872 | func_80188080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188080.c` | -| 873 | func_8017F8AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8AC.c` | -| 874 | func_80183544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183544.c` | -| 875 | func_801859A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801859A0.c` | -| 876 | func_8017E668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E668.c` | -| 877 | func_8017D828 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D828.c` | -| 878 | func_8017DD5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD5C.c` | -| 879 | func_8017E014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E014.c` | -| 880 | func_8017E4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4BC.c` | -| 881 | func_8017FEF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FEF0.c` | -| 882 | func_8017E75C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E75C.c` | -| 883 | func_801858F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801858F0.c` | -| 884 | func_8017E4B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4B0.c` | -| 885 | func_8017EAE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAE0.c` | -| 886 | func_8017F0D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0D4.c` | -| 887 | func_8017DC40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC40.c` | -| 888 | func_8017F3B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3B8.c` | -| 889 | func_80184CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184CD0.c` | -| 890 | func_801863B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801863B0.c` | -| 891 | func_8017FB10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB10.c` | -| 892 | func_8017D338 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D338.c` | -| 893 | func_8017D714 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D714.c` | -| 894 | func_8017D1DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1DC.c` | -| 895 | func_8017D280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D280.c` | -| 896 | func_8017D784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D784.c` | -| 897 | func_8017EE2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE2C.c` | -| 898 | func_8018006C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018006C.c` | -| 899 | func_80183520 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183520.c` | -| 900 | func_80181010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181010.c` | -| 901 | func_80182B64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B64.c` | -| 902 | func_8018739C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018739C.c` | -| 903 | func_801828F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801828F4.c` | -| 904 | func_8017ECA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECA0.c` | -| 905 | func_8017F54C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F54C.c` | -| 906 | func_8018474C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018474C.c` | -| 907 | func_80187CD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CD8.c` | -| 908 | func_8018051C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018051C.c` | -| 909 | func_8017E0D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0D0.c` | -| 910 | func_80181054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181054.c` | -| 911 | func_80181F6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F6C.c` | -| 912 | func_8017CE88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE88.c` | -| 913 | func_8017E55C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E55C.c` | -| 914 | func_8017EDA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDA4.c` | -| 915 | func_8017E1C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1C8.c` | -| 916 | func_80181E54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E54.c` | -| 917 | func_80186EC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186EC4.c` | -| 918 | func_80182728 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182728.c` | -| 919 | func_80181020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181020.c` | -| 920 | func_80180D90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D90.c` | -| 921 | func_8017D09C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D09C.c` | -| 922 | func_8017FD8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD8C.c` | -| 923 | func_8017E58C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E58C.c` | -| 924 | func_80181E44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E44.c` | -| 925 | func_8018288C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018288C.c` | -| 926 | func_8017E7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7D0.c` | -| 927 | func_80183BF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183BF8.c` | -| 928 | func_8017F89C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F89C.c` | -| 929 | func_80180950 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180950.c` | -| 930 | func_8017E3B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E3B4.c` | -| 931 | func_8017D6D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D0.c` | -| 932 | func_8017E9CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9CC.c` | -| 933 | func_8017D928 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D928.c` | -| 934 | func_8017DFD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFD8.c` | -| 935 | func_8017F734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F734.c` | -| 936 | func_8017DDE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDE0.c` | -| 937 | func_8017E294 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E294.c` | -| 938 | func_8017BEE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEE4.c` | -| 939 | func_80189B3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189B3C.c` | -| 940 | func_8017E618 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E618.c` | -| 941 | func_8017D004 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D004.c` | -| 942 | func_8018355C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018355C.c` | -| 943 | func_8018BE0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BE0C.c` | -| 944 | func_8017EDA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDA0.c` | -| 945 | func_8017EEA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEA0.c` | -| 946 | func_80180F20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F20.c` | -| 947 | func_80185008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185008.c` | -| 948 | func_80182D10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D10.c` | -| 949 | func_8018AA14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AA14.c` | -| 950 | func_8017D3C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3C8.c` | -| 951 | func_8017F414 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F414.c` | -| 952 | func_8017D024 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D024.c` | -| 953 | func_8017F840 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F840.c` | -| 954 | func_8017FD88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD88.c` | -| 955 | func_8017E890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E890.c` | -| 956 | func_8017F0D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0D8.c` | -| 957 | func_80180030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180030.c` | -| 958 | func_801845B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845B4.c` | -| 959 | func_80180E18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E18.c` | -| 960 | func_801848A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801848A8.c` | -| 961 | func_80184C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C1C.c` | -| 962 | func_8017DB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB00.c` | -| 963 | func_8017D350 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D350.c` | -| 964 | func_80181304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181304.c` | -| 965 | func_80183C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C54.c` | -| 966 | func_8017EB4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB4C.c` | -| 967 | func_801801A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801A4.c` | -| 968 | func_80184828 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184828.c` | -| 969 | func_80180204 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180204.c` | -| 970 | func_80181500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181500.c` | -| 971 | func_80186044 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186044.c` | -| 972 | func_8017C7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C7D0.c` | -| 973 | func_8017E6FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6FC.c` | -| 974 | func_8017CDE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDE4.c` | -| 975 | func_8017F630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F630.c` | -| 976 | func_801847F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847F4.c` | -| 977 | func_80186500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186500.c` | -| 978 | func_8017E048 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E048.c` | -| 979 | func_80180890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180890.c` | -| 980 | func_80184854 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184854.c` | -| 981 | func_80180568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180568.c` | -| 982 | func_801826EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826EC.c` | -| 983 | func_80183FA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183FA0.c` | -| 984 | func_8017C114 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C114.c` | -| 985 | func_80180CA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CA4.c` | -| 986 | func_8017DA78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA78.c` | -| 987 | func_8017F024 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F024.c` | -| 988 | func_80182708 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182708.c` | -| 989 | func_8017DEA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEA4.c` | -| 990 | func_8017F0E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0E8.c` | -| 991 | func_80185720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185720.c` | -| 992 | func_8017D224 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D224.c` | -| 993 | func_8017DB34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB34.c` | -| 994 | func_8017E6C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6C0.c` | -| 995 | func_8017E7AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7AC.c` | -| 996 | func_8017D380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D380.c` | -| 997 | func_8018033C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018033C.c` | -| 998 | func_80183284 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183284.c` | -| 999 | func_80188634 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188634.c` | -| 1000 | func_8018A5B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A5B0.c` | -| 1001 | func_8017D450 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D450.c` | -| 1002 | func_8017D57C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D57C.c` | -| 1003 | func_8017DCF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCF0.c` | -| 1004 | func_8017DAB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAB8.c` | -| 1005 | func_8017DD9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD9C.c` | -| 1006 | func_8018189C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018189C.c` | -| 1007 | func_801801F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801F4.c` | -| 1008 | func_8017DE7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE7C.c` | -| 1009 | func_801815AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801815AC.c` | -| 1010 | func_801877E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801877E4.c` | -| 1011 | func_8017DDB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDB0.c` | -| 1012 | func_8017DCA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCA8.c` | -| 1013 | func_801813AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801813AC.c` | -| 1014 | func_80181818 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181818.c` | -| 1015 | func_801834B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801834B4.c` | -| 1016 | func_8017ECB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECB0.c` | -| 1017 | func_80181F20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F20.c` | -| 1018 | func_80183D84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183D84.c` | -| 1019 | func_8017D01C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D01C.c` | -| 1020 | func_8017C0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C0C8.c` | -| 1021 | func_8017D63C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D63C.c` | -| 1022 | func_8017D2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2C8.c` | -| 1023 | func_801811B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811B4.c` | -| 1024 | func_8017DE98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE98.c` | -| 1025 | func_80180D38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D38.c` | -| 1026 | func_801847A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847A4.c` | -| 1027 | func_801847FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847FC.c` | -| 1028 | func_8018B8C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B8C4.c` | -| 1029 | func_8017D138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D138.c` | -| 1030 | func_80181478 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181478.c` | -| 1031 | func_8017E0B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0B8.c` | -| 1032 | func_801821F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801821F8.c` | -| 1033 | func_80183624 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183624.c` | -| 1034 | func_80184C28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C28.c` | -| 1035 | func_8017D974 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D974.c` | -| 1036 | func_80184778 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184778.c` | -| 1037 | func_8017C1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C1F8.c` | -| 1038 | func_8018AF0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF0C.c` | -| 1039 | func_8017DBF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBF0.c` | -| 1040 | func_801813F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801813F0.c` | -| 1041 | func_8017D96C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D96C.c` | -| 1042 | func_80181C30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C30.c` | -| 1043 | func_8017DAA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAA0.c` | -| 1044 | func_80184AA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184AA8.c` | -| 1045 | func_8018533C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018533C.c` | -| 1046 | func_8017E700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E700.c` | -| 1047 | func_8017F870 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F870.c` | -| 1048 | func_8017E9F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9F4.c` | -| 1049 | func_801856E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801856E4.c` | -| 1050 | func_8018F63C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F63C.c` | -| 1051 | func_80187BAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BAC.c` | -| 1052 | func_8018C3F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C3F8.c` | -| 1053 | func_80182654 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182654.c` | -| 1054 | func_8018A030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A030.c` | -| 1055 | func_8017DBC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBC0.c` | -| 1056 | func_8017DE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE38.c` | -| 1057 | func_8017DCC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCC8.c` | -| 1058 | func_8017DE4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE4C.c` | -| 1059 | func_8017D084 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D084.c` | -| 1060 | func_8017DAF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAF4.c` | -| 1061 | func_8017F25C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F25C.c` | -| 1062 | func_8017F3A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3A8.c` | -| 1063 | func_80180850 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180850.c` | -| 1064 | func_801803B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803B8.c` | -| 1065 | func_80182A08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182A08.c` | -| 1066 | func_8018001C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018001C.c` | -| 1067 | func_80184D0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D0C.c` | -| 1068 | func_8017DBA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBA8.c` | -| 1069 | func_8017CEEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CEEC.c` | -| 1070 | func_8017DACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DACC.c` | -| 1071 | func_8017D294 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D294.c` | -| 1072 | func_8017E5E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E5E4.c` | -| 1073 | func_801846AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801846AC.c` | -| 1074 | func_8017DB5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB5C.c` | -| 1075 | func_80183FEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183FEC.c` | -| 1076 | func_80180DFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DFC.c` | -| 1077 | func_80181BD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181BD0.c` | -| 1078 | func_8017D2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2A0.c` | -| 1079 | func_80182148 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182148.c` | -| 1080 | func_80180E88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E88.c` | -| 1081 | func_80181F60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F60.c` | -| 1082 | func_80184D40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D40.c` | -| 1083 | func_801807DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801807DC.c` | -| 1084 | func_8017D690 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D690.c` | -| 1085 | func_8017F110 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F110.c` | -| 1086 | func_8017FB3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB3C.c` | -| 1087 | func_80183DC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DC8.c` | -| 1088 | func_8018B2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B2A4.c` | -| 1089 | func_801845E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845E8.c` | -| 1090 | func_801811F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811F4.c` | -| 1091 | func_80182EA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EA0.c` | -| 1092 | func_8018525C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018525C.c` | -| 1093 | func_80186BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BD8.c` | -| 1094 | func_80181A94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A94.c` | -| 1095 | func_80183B68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B68.c` | -| 1096 | func_80187874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187874.c` | -| 1097 | func_801848AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801848AC.c` | -| 1098 | func_80187CA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CA8.c` | -| 1099 | func_8017F4C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4C4.c` | -| 1100 | func_80180144 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180144.c` | -| 1101 | func_8017E968 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E968.c` | -| 1102 | func_801881C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801881C8.c` | -| 1103 | func_8017E9D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9D8.c` | -| 1104 | func_8017F620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F620.c` | -| 1105 | func_80185BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185BA0.c` | -| 1106 | func_80183B9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B9C.c` | -| 1107 | func_80182324 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182324.c` | -| 1108 | func_80182B90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B90.c` | -| 1109 | func_8017E8DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8DC.c` | -| 1110 | func_80186104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186104.c` | -| 1111 | func_80186404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186404.c` | -| 1112 | func_8017DEC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEC4.c` | -| 1113 | func_80188040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188040.c` | -| 1114 | func_801884D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884D4.c` | -| 1115 | func_8017D0DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0DC.c` | -| 1116 | func_80182028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182028.c` | -| 1117 | func_80183A18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A18.c` | -| 1118 | func_8017D170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D170.c` | -| 1119 | func_8017E32C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E32C.c` | -| 1120 | func_80183A10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A10.c` | -| 1121 | func_8017D19C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D19C.c` | -| 1122 | func_8017D594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D594.c` | -| 1123 | func_8017DF44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF44.c` | -| 1124 | func_80183300 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183300.c` | -| 1125 | func_8018C24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C24C.c` | -| 1126 | func_80180B54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B54.c` | -| 1127 | func_80181040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181040.c` | -| 1128 | func_8017EB1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB1C.c` | -| 1129 | func_8018AF08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF08.c` | -| 1130 | func_8018118C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018118C.c` | -| 1131 | func_80182A18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182A18.c` | -| 1132 | func_80187D80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187D80.c` | -| 1133 | func_80188DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DC4.c` | -| 1134 | func_80185580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185580.c` | -| 1135 | func_8018847C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018847C.c` | -| 1136 | func_8017F468 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F468.c` | -| 1137 | func_8017EEFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEFC.c` | -| 1138 | func_8017D610 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D610.c` | -| 1139 | func_8017D790 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D790.c` | -| 1140 | func_80180B2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B2C.c` | -| 1141 | func_801812FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801812FC.c` | -| 1142 | func_8017F6C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F6C4.c` | -| 1143 | func_801860BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801860BC.c` | -| 1144 | func_80182EDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EDC.c` | -| 1145 | func_8018BDE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BDE0.c` | -| 1146 | func_8018C3A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C3A4.c` | -| 1147 | func_80186C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186C1C.c` | -| 1148 | func_801803F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803F8.c` | -| 1149 | func_801814A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814A8.c` | -| 1150 | func_8018523C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018523C.c` | -| 1151 | func_80180264 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180264.c` | -| 1152 | func_8018C5CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C5CC.c` | -| 1153 | func_8017D14C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D14C.c` | -| 1154 | func_8017D6F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6F0.c` | -| 1155 | func_8017D700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D700.c` | -| 1156 | func_80188204 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188204.c` | -| 1157 | func_8017E9EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9EC.c` | -| 1158 | func_8017F1C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1C4.c` | -| 1159 | func_8018A858 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A858.c` | -| 1160 | func_80184CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184CA0.c` | -| 1161 | func_80182544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182544.c` | -| 1162 | func_80184658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184658.c` | -| 1163 | func_80181CE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181CE0.c` | -| 1164 | func_80183D48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183D48.c` | -| 1165 | func_8017D1F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1F0.c` | -| 1166 | func_801899F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801899F8.c` | -| 1167 | func_80188650 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188650.c` | -| 1168 | func_801892CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801892CC.c` | -| 1169 | func_80180990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180990.c` | -| 1170 | func_80186A84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186A84.c` | -| 1171 | func_8017CE54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE54.c` | -| 1172 | func_8017F568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F568.c` | -| 1173 | func_801804DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804DC.c` | -| 1174 | func_8017EEC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEC8.c` | -| 1175 | func_8017FB78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB78.c` | -| 1176 | func_8017EBF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBF0.c` | -| 1177 | func_80181858 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181858.c` | -| 1178 | func_8017C664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C664.c` | -| 1179 | func_80181090 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181090.c` | -| 1180 | func_8017DB6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB6C.c` | -| 1181 | func_80181438 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181438.c` | -| 1182 | func_80185880 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185880.c` | -| 1183 | func_8018912C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018912C.c` | -| 1184 | func_8017E850 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E850.c` | -| 1185 | func_80182DAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182DAC.c` | -| 1186 | func_8017F3BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3BC.c` | -| 1187 | func_80184358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184358.c` | -| 1188 | func_8017D80C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D80C.c` | -| 1189 | func_80180658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180658.c` | -| 1190 | func_8017F344 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F344.c` | -| 1191 | func_80181E1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E1C.c` | -| 1192 | func_8018545C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018545C.c` | -| 1193 | func_8017FBA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBA4.c` | -| 1194 | func_801861A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801861A0.c` | -| 1195 | func_80181344 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181344.c` | -| 1196 | func_80184A1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184A1C.c` | -| 1197 | func_8018B550 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B550.c` | -| 1198 | func_80186BF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BF8.c` | -| 1199 | func_80180224 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180224.c` | -| 1200 | func_80180260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180260.c` | -| 1201 | func_80185730 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185730.c` | -| 1202 | func_80184258 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184258.c` | -| 1203 | func_8018C77C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C77C.c` | -| 1204 | func_8017D4C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4C0.c` | -| 1205 | func_8017D5A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5A0.c` | -| 1206 | func_80180DEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DEC.c` | -| 1207 | func_80187BF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BF0.c` | -| 1208 | func_80183554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183554.c` | -| 1209 | func_801818AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801818AC.c` | -| 1210 | func_8018913C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018913C.c` | -| 1211 | func_80180A58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A58.c` | -| 1212 | func_801801CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801CC.c` | -| 1213 | func_80184DDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184DDC.c` | -| 1214 | func_8017F3E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3E4.c` | -| 1215 | func_80182C68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C68.c` | -| 1216 | func_801856F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801856F0.c` | -| 1217 | func_801830F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801830F0.c` | -| 1218 | func_8017EAC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAC8.c` | -| 1219 | func_8017E538 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E538.c` | -| 1220 | func_8017EC70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC70.c` | -| 1221 | func_80180548 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180548.c` | -| 1222 | func_8017EFB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFB0.c` | -| 1223 | func_80188DA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DA0.c` | -| 1224 | func_8018A484 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A484.c` | -| 1225 | func_8017F168 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F168.c` | -| 1226 | func_8017F724 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F724.c` | -| 1227 | func_80181838 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181838.c` | -| 1228 | func_80182FF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182FF0.c` | -| 1229 | func_8017D014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D014.c` | -| 1230 | func_8017FE54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE54.c` | -| 1231 | func_8018200C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018200C.c` | -| 1232 | func_80188220 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188220.c` | -| 1233 | func_801894B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801894B4.c` | -| 1234 | func_8018B65C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B65C.c` | -| 1235 | func_8017EC5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC5C.c` | -| 1236 | func_8018465C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018465C.c` | -| 1237 | func_8017D864 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D864.c` | -| 1238 | func_80181CBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181CBC.c` | -| 1239 | func_80185898 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185898.c` | -| 1240 | func_80182E08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E08.c` | -| 1241 | func_80189970 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189970.c` | -| 1242 | func_8017F2BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2BC.c` | -| 1243 | func_8017DE78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE78.c` | -| 1244 | func_80183678 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183678.c` | -| 1245 | func_8017ED04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED04.c` | -| 1246 | func_8018A528 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A528.c` | -| 1247 | func_8018A6DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A6DC.c` | -| 1248 | func_80181C74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C74.c` | -| 1249 | func_8017EA18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA18.c` | -| 1250 | func_80180CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CD0.c` | -| 1251 | func_80181C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C1C.c` | -| 1252 | func_8017FA54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA54.c` | -| 1253 | func_80183C58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C58.c` | -| 1254 | func_8017D1E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1E4.c` | -| 1255 | func_8018AF60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF60.c` | -| 1256 | func_8018B588 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B588.c` | -| 1257 | func_80181084 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181084.c` | -| 1258 | func_8018555C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018555C.c` | -| 1259 | func_80186D04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186D04.c` | -| 1260 | func_8017E79C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E79C.c` | -| 1261 | func_8017FAC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FAC8.c` | -| 1262 | func_80180D78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D78.c` | -| 1263 | func_80184B68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184B68.c` | -| 1264 | func_8017DF40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF40.c` | -| 1265 | func_8017D5D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D0.c` | -| 1266 | func_8017D944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D944.c` | -| 1267 | func_8018434C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018434C.c` | -| 1268 | func_80184388 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184388.c` | -| 1269 | func_80187EDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187EDC.c` | -| 1270 | func_8017EF24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF24.c` | -| 1271 | func_8018540C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018540C.c` | -| 1272 | func_80186FA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186FA8.c` | -| 1273 | func_8017F4D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4D0.c` | -| 1274 | func_80188060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188060.c` | -| 1275 | func_80189868 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189868.c` | -| 1276 | func_80189DB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189DB4.c` | -| 1277 | func_8018165C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018165C.c` | -| 1278 | func_80184430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184430.c` | -| 1279 | func_8017F5BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F5BC.c` | -| 1280 | func_80181808 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181808.c` | -| 1281 | func_801849FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801849FC.c` | -| 1282 | func_8017EBEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBEC.c` | -| 1283 | func_8017EE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE08.c` | -| 1284 | func_80180EB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EB8.c` | -| 1285 | func_801833F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801833F0.c` | -| 1286 | func_8017D4B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4B4.c` | -| 1287 | func_8019026C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8019026C.c` | -| 1288 | func_8017DF0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF0C.c` | -| 1289 | func_8017F554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F554.c` | -| 1290 | func_8017FACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FACC.c` | -| 1291 | func_8017FD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD3C.c` | -| 1292 | func_80180F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F00.c` | -| 1293 | func_801853F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801853F8.c` | -| 1294 | func_8017EA04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA04.c` | -| 1295 | func_8017FF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF30.c` | -| 1296 | func_80180840 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180840.c` | -| 1297 | func_80181068 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181068.c` | -| 1298 | func_80181254 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181254.c` | -| 1299 | func_80183BBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183BBC.c` | -| 1300 | func_8018F704 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F704.c` | -| 1301 | func_8018B748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B748.c` | -| 1302 | func_8017D308 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D308.c` | -| 1303 | func_8017F8E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8E0.c` | -| 1304 | func_80189FCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189FCC.c` | -| 1305 | func_8017E134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E134.c` | -| 1306 | func_80186094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186094.c` | -| 1307 | func_8018975C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018975C.c` | -| 1308 | func_8017D9D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9D0.c` | -| 1309 | func_80181E8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E8C.c` | -| 1310 | func_80186CB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186CB8.c` | -| 1311 | func_8017EFF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFF0.c` | -| 1312 | func_8017F750 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F750.c` | -| 1313 | func_80180010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180010.c` | -| 1314 | func_8018AF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF34.c` | -| 1315 | func_8017F2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2C8.c` | -| 1316 | func_8017FCE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FCE8.c` | -| 1317 | func_80183054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183054.c` | -| 1318 | func_801895A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801895A0.c` | -| 1319 | func_80189E74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189E74.c` | -| 1320 | func_80182138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182138.c` | -| 1321 | func_80182F10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182F10.c` | -| 1322 | func_80182514 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182514.c` | -| 1323 | func_80189630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189630.c` | -| 1324 | func_80184C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C54.c` | -| 1325 | func_80186080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186080.c` | -| 1326 | func_80186754 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186754.c` | -| 1327 | func_8018AE14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AE14.c` | -| 1328 | func_80181134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181134.c` | -| 1329 | func_80187378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187378.c` | -| 1330 | func_8018A8A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A8A0.c` | -| 1331 | func_8018ACD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ACD4.c` | -| 1332 | func_8018AFB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AFB4.c` | -| 1333 | func_80183DF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DF8.c` | -| 1334 | func_80184920 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184920.c` | -| 1335 | func_8017D894 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D894.c` | -| 1336 | func_80184D70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D70.c` | -| 1337 | func_80186834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186834.c` | -| 1338 | func_80180534 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180534.c` | -| 1339 | func_801805D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801805D0.c` | -| 1340 | func_80185020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185020.c` | -| 1341 | func_80188734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188734.c` | -| 1342 | func_8017DAB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAB4.c` | -| 1343 | func_8017F980 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F980.c` | -| 1344 | func_80183B28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B28.c` | -| 1345 | func_80180310 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180310.c` | -| 1346 | func_80185B94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B94.c` | -| 1347 | func_801884BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884BC.c` | -| 1348 | func_80189068 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189068.c` | -| 1349 | func_80187A4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187A4C.c` | -| 1350 | func_8017C180 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C180.c` | -| 1351 | func_80180040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180040.c` | -| 1352 | func_801851A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801851A0.c` | -| 1353 | func_80180FD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180FD0.c` | -| 1354 | func_80187014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187014.c` | -| 1355 | func_8018A494 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A494.c` | -| 1356 | func_8017F8A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8A8.c` | -| 1357 | func_80180DB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DB0.c` | -| 1358 | func_8017E5F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E5F0.c` | -| 1359 | func_80180A5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A5C.c` | -| 1360 | func_80184B5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184B5C.c` | -| 1361 | func_8017DB64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB64.c` | -| 1362 | func_801801C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801C4.c` | -| 1363 | func_801810C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801810C0.c` | -| 1364 | func_8018195C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018195C.c` | -| 1365 | func_80183A24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A24.c` | -| 1366 | func_8017EC58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC58.c` | -| 1367 | func_8017EC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC74.c` | -| 1368 | func_801858EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801858EC.c` | -| 1369 | func_8017E8D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8D0.c` | -| 1370 | func_8017F5E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F5E0.c` | -| 1371 | func_80181990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181990.c` | -| 1372 | func_8017E318 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E318.c` | -| 1373 | func_8017F24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F24C.c` | -| 1374 | func_8017DBF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBF8.c` | -| 1375 | func_80182BF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182BF4.c` | -| 1376 | func_80181D84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D84.c` | -| 1377 | func_80181E9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E9C.c` | -| 1378 | func_80181F4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F4C.c` | -| 1379 | func_8017D8F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8F8.c` | -| 1380 | func_8017E49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E49C.c` | -| 1381 | func_80187924 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187924.c` | -| 1382 | func_8017FCF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FCF0.c` | -| 1383 | func_80189418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189418.c` | -| 1384 | func_80189C48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189C48.c` | -| 1385 | func_801804A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804A0.c` | -| 1386 | func_80186984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186984.c` | -| 1387 | func_8017DD18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD18.c` | -| 1388 | func_8017F214 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F214.c` | -| 1389 | func_801830EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801830EC.c` | -| 1390 | func_8018ADA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ADA4.c` | -| 1391 | func_8017EC78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC78.c` | -| 1392 | func_8017EDC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDC8.c` | -| 1393 | func_8017EFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFFC.c` | -| 1394 | func_80180C2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C2C.c` | -| 1395 | func_80185334 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185334.c` | -| 1396 | func_80188DC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DC8.c` | -| 1397 | func_80189620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189620.c` | -| 1398 | func_80185A2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A2C.c` | -| 1399 | func_8017DC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC90.c` | -| 1400 | func_80183100 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183100.c` | -| 1401 | func_8018166C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018166C.c` | -| 1402 | func_80184E00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184E00.c` | -| 1403 | func_8017D9AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9AC.c` | -| 1404 | func_8017F594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F594.c` | -| 1405 | func_80181198 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181198.c` | -| 1406 | func_8018425C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018425C.c` | -| 1407 | func_80185288 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185288.c` | -| 1408 | func_801884A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884A8.c` | -| 1409 | func_8017EB74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB74.c` | -| 1410 | func_8017ECF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECF4.c` | -| 1411 | func_80185EA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185EA8.c` | -| 1412 | func_8017E2F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2F4.c` | -| 1413 | func_801859B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801859B8.c` | -| 1414 | func_80187A8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187A8C.c` | -| 1415 | func_8017ECC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECC0.c` | -| 1416 | func_8017C358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C358.c` | -| 1417 | func_8017D8C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8C8.c` | -| 1418 | func_8017D940 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D940.c` | -| 1419 | func_801842B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801842B0.c` | -| 1420 | func_8017EEB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEB8.c` | -| 1421 | func_80187C64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187C64.c` | -| 1422 | func_80188B74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188B74.c` | -| 1423 | func_8017C1BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C1BC.c` | -| 1424 | func_8017E6CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6CC.c` | -| 1425 | func_801800F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801800F4.c` | -| 1426 | func_80184630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184630.c` | -| 1427 | func_80183F4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183F4C.c` | -| 1428 | func_8017D410 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D410.c` | -| 1429 | func_8017ED74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED74.c` | -| 1430 | func_8018910C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018910C.c` | -| 1431 | func_8019041C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8019041C.c` | -| 1432 | func_8017F160 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F160.c` | -| 1433 | func_801802BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801802BC.c` | -| 1434 | func_80184160 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184160.c` | -| 1435 | func_80187CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CD0.c` | -| 1436 | func_8017D238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D238.c` | -| 1437 | func_8017FC84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FC84.c` | -| 1438 | func_80184FE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184FE8.c` | -| 1439 | func_8018BAE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BAE0.c` | -| 1440 | func_8018C0A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C0A4.c` | -| 1441 | func_8017F3C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3C0.c` | -| 1442 | func_8017F84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F84C.c` | -| 1443 | func_80181670 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181670.c` | -| 1444 | func_8017E820 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E820.c` | -| 1445 | func_8017EA2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA2C.c` | -| 1446 | func_8018038C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018038C.c` | -| 1447 | func_8018056C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018056C.c` | -| 1448 | func_8018C118 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C118.c` | -| 1449 | func_8018C4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C4BC.c` | -| 1450 | func_8017CF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF30.c` | -| 1451 | func_8017FE10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE10.c` | -| 1452 | func_8017DE68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE68.c` | -| 1453 | func_8017EB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB7C.c` | -| 1454 | func_8017F0A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0A8.c` | -| 1455 | func_8017D7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7D0.c` | -| 1456 | func_8017D8F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8F4.c` | -| 1457 | func_8017DA0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA0C.c` | -| 1458 | func_80188720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188720.c` | -| 1459 | func_8017FA90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA90.c` | -| 1460 | func_80180868 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180868.c` | -| 1461 | func_80188088 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188088.c` | -| 1462 | func_8017F1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1F8.c` | -| 1463 | func_8018774C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018774C.c` | -| 1464 | func_801829DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829DC.c` | -| 1465 | func_8017DC08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC08.c` | -| 1466 | func_8017F508 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F508.c` | -| 1467 | func_80181124 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181124.c` | -| 1468 | func_8018AD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AD3C.c` | -| 1469 | func_80185668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185668.c` | -| 1470 | func_80185B5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B5C.c` | -| 1471 | func_80180860 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180860.c` | -| 1472 | func_80180944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180944.c` | -| 1473 | func_8018F488 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F488.c` | -| 1474 | func_8018337C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018337C.c` | -| 1475 | func_80181A5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A5C.c` | -| 1476 | func_80187050 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187050.c` | -| 1477 | func_8018603C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018603C.c` | -| 1478 | func_8017E7A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7A8.c` | -| 1479 | func_80180028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180028.c` | -| 1480 | func_80180AA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AA4.c` | -| 1481 | func_801824F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824F8.c` | -| 1482 | func_8015EEE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015EEE0.c` | -| 1483 | func_80181D30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D30.c` | -| 1484 | func_8017CF00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF00.c` | -| 1485 | func_8017CFA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA4.c` | -| 1486 | func_8017D048 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D048.c` | -| 1487 | func_80180E98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E98.c` | -| 1488 | func_80180F34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F34.c` | -| 1489 | func_80181260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181260.c` | -| 1490 | func_80183C9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C9C.c` | -| 1491 | func_8018258C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018258C.c` | -| 1492 | func_80182E38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E38.c` | -| 1493 | func_80183138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183138.c` | -| 1494 | func_80183960 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183960.c` | -| 1495 | func_80185A68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A68.c` | -| 1496 | func_80185E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E34.c` | -| 1497 | func_8017DFAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFAC.c` | -| 1498 | func_80183438 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183438.c` | -| 1499 | func_80183A68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A68.c` | -| 1500 | func_8018A8D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A8D4.c` | -| 1501 | func_8018A910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A910.c` | -| 1502 | func_8018BC3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BC3C.c` | -| 1503 | func_8018C368 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C368.c` | -| 1504 | func_8018C73C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C73C.c` | -| 1505 | func_8017FB48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB48.c` | -| 1506 | func_8017BF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BF34.c` | -| 1507 | func_8017DB70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB70.c` | -| 1508 | func_8017F90C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F90C.c` | -| 1509 | func_8017FE9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE9C.c` | -| 1510 | func_80180170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180170.c` | -| 1511 | func_801829F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829F0.c` | -| 1512 | func_8018338C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018338C.c` | -| 1513 | func_80183598 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183598.c` | -| 1514 | func_801841B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801841B0.c` | -| 1515 | func_8017F050 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F050.c` | -| 1516 | func_80184878 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184878.c` | -| 1517 | func_8017E218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E218.c` | -| 1518 | func_80180AD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AD8.c` | -| 1519 | func_80185E4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E4C.c` | -| 1520 | func_8017E720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E720.c` | -| 1521 | func_8017E824 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E824.c` | -| 1522 | func_801819E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801819E0.c` | -| 1523 | func_80185C60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185C60.c` | -| 1524 | func_8018CC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CC74.c` | -| 1525 | func_80187BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BD8.c` | -| 1526 | func_8017E7E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7E4.c` | -| 1527 | func_80180784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180784.c` | -| 1528 | func_80183280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183280.c` | -| 1529 | func_80183380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183380.c` | -| 1530 | func_80180D14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D14.c` | -| 1531 | func_80180DB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DB8.c` | -| 1532 | func_80182D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D18.c` | -| 1533 | func_80186034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186034.c` | -| 1534 | func_80186484 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186484.c` | -| 1535 | func_801872C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801872C8.c` | -| 1536 | func_8018B304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B304.c` | -| 1537 | func_8018C2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C2CC.c` | -| 1538 | func_8018048C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018048C.c` | -| 1539 | func_8018B874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B874.c` | -| 1540 | func_8018B9DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B9DC.c` | -| 1541 | func_8018BD58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BD58.c` | -| 1542 | func_8018CADC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CADC.c` | -| 1543 | func_801803E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803E0.c` | -| 1544 | func_801845EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845EC.c` | -| 1545 | func_80186A1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186A1C.c` | -| 1546 | func_8017CF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF54.c` | -| 1547 | func_80180D28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D28.c` | -| 1548 | func_80181DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181DC4.c` | -| 1549 | func_80184ACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184ACC.c` | -| 1550 | func_8018788C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018788C.c` | -| 1551 | func_8018DF08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018DF08.c` | -| 1552 | func_8018EBEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018EBEC.c` | -| 1553 | func_8017F7B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F7B8.c` | -| 1554 | func_80180104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180104.c` | -| 1555 | func_801814D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814D0.c` | -| 1556 | func_801885F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801885F4.c` | -| 1557 | func_80189A20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189A20.c` | -| 1558 | func_8018A538 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A538.c` | -| 1559 | func_8018ABF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ABF0.c` | -| 1560 | func_8018EDC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018EDC4.c` | -| 1561 | func_8017E910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E910.c` | -| 1562 | func_8017E94C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E94C.c` | -| 1563 | func_8017E9C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9C4.c` | -| 1564 | func_80181B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B44.c` | -| 1565 | func_80183018 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183018.c` | -| 1566 | func_80183230 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183230.c` | -| 1567 | func_8018399C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018399C.c` | -| 1568 | func_80183DF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DF0.c` | -| 1569 | func_80184510 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184510.c` | -| 1570 | func_80185FC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185FC4.c` | -| 1571 | func_801860C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801860C4.c` | -| 1572 | func_8017BF14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BF14.c` | -| 1573 | func_8017C338 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C338.c` | -| 1574 | func_80184130 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184130.c` | -| 1575 | func_801851B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801851B4.c` | -| 1576 | func_8018A94C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A94C.c` | -| 1577 | func_8017CCD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CCD8.c` | -| 1578 | func_8017E374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E374.c` | -| 1579 | func_8017F96C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F96C.c` | -| 1580 | func_80188524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188524.c` | -| 1581 | func_80189A24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189A24.c` | -| 1582 | func_8018A3F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A3F0.c` | -| 1583 | func_8018A488 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A488.c` | -| 1584 | func_8018A748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A748.c` | -| 1585 | func_8018AA34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AA34.c` | -| 1586 | func_8018CFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CFF4.c` | -| 1587 | func_8018FCC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FCC8.c` | -| 1588 | func_801805DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801805DC.c` | -| 1589 | func_801834E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801834E4.c` | -| 1590 | func_80183788 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183788.c` | -| 1591 | func_8017FEC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FEC8.c` | -| 1592 | func_801804F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804F4.c` | -| 1593 | func_80180B7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B7C.c` | -| 1594 | func_80180C94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C94.c` | -| 1595 | func_80180D5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D5C.c` | -| 1596 | func_80183EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183EFC.c` | -| 1597 | func_8018593C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018593C.c` | -| 1598 | func_80185C70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185C70.c` | -| 1599 | func_80186688 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186688.c` | -| 1600 | func_8017E798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E798.c` | -| 1601 | func_8017E7D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7D4.c` | -| 1602 | func_80180A88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A88.c` | -| 1603 | func_8018333C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018333C.c` | -| 1604 | func_80184210 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184210.c` | -| 1605 | func_801850A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801850A0.c` | -| 1606 | func_801868E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801868E0.c` | -| 1607 | func_801875EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801875EC.c` | -| 1608 | func_80188B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188B44.c` | -| 1609 | func_8018CF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CF54.c` | -| 1610 | func_8018AC34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AC34.c` | -| 1611 | func_8018ACB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ACB4.c` | -| 1612 | func_8018BC34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BC34.c` | -| 1613 | func_8017E038 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E038.c` | -| 1614 | func_80181924 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181924.c` | -| 1615 | func_8018B570 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B570.c` | -| 1616 | func_8018B6F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B6F4.c` | -| 1617 | func_8018BE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BE38.c` | -| 1618 | func_8018C5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C5FC.c` | -| 1619 | func_8017C4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C4BC.c` | -| 1620 | func_8017E380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E380.c` | -| 1621 | func_8017E464 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E464.c` | -| 1622 | func_8017E564 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E564.c` | -| 1623 | func_8017EB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB00.c` | -| 1624 | func_8017F2F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2F0.c` | -| 1625 | func_801826D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826D8.c` | -| 1626 | func_801874A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801874A8.c` | -| 1627 | func_80187784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187784.c` | -| 1628 | func_801894E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801894E0.c` | -| 1629 | func_8018A5E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A5E4.c` | -| 1630 | func_8018FB50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FB50.c` | -| 1631 | func_8018FB8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FB8C.c` | -| 1632 | func_8017F20C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F20C.c` | -| 1633 | func_80182BC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182BC8.c` | -| 1634 | func_8018381C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018381C.c` | -| 1635 | func_801898DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801898DC.c` | -| 1636 | func_8017E458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E458.c` | -| 1637 | func_80182D74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D74.c` | -| 1638 | func_80188BB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188BB0.c` | -| 1639 | func_80188BEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188BEC.c` | -| 1640 | func_80188C64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188C64.c` | -| 1641 | func_80188CDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188CDC.c` | -| 1642 | func_80189B38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189B38.c` | -| 1643 | func_8018C4DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C4DC.c` | -| 1644 | func_80146C3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80146C3C.c` | -| 1645 | func_801495C4 | None | regalloc-order | None | near | 0 | none — MATCH expected (cloned byte-matched sibling func_8014964C recipe: $16 pin + asm barriers force param_2→$s0 and rematerialize &in/&mid/mtx) | `.run/backlog_drafts/func_801495C4.c` | -| 1646 | func_80151664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151664.c` | -| 1647 | func_80151944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151944.c` | -| 1648 | func_80151C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151C54.c` | -| 1649 | func_801522CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801522CC.c` | -| 1650 | func_80155800 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80155800.c` | -| 1651 | func_8016039C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016039C.c` | -| 1652 | func_80162CCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162CCC.c` | -| 1653 | func_801733FC | None | struct | None | near | 0 | none — modeled on sibling func_80173460 (packed 8-byte struct copy + two s16=1 stores) | `.run/backlog_drafts/func_801733FC.c` | -| 1654 | func_80174684 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174684.c` | -| 1655 | func_80178BF8 | None | other | None | near | 0 | none — MATCH (49 ins). Key: init loop pointers via &D_SYMBOL (not (T*)0x801da788 raw int, which emits lui+ori instead of lui%hi+addiu%lo). | `.run/backlog_drafts/func_80178BF8.c` | -| 1656 | func_8015D01C | None | regalloc-order | None | near | 0 | none — MATCH (uVar1 pinned $s3, uVar5 pinned $s1; param_1->s2, iVar4->s0 fall out) | `.run/backlog_drafts/func_8015D01C.c` | -| 1657 | func_80165240 | None | regalloc-order | None | near | 0 | none — MATCH (63 ins). Pins: param_3->$s3, &m->$s1, &D_80189750->$s0, &prim->$s2. | `.run/backlog_drafts/func_80165240.c` | -| 1658 | func_8016BBE0 | None | plumbing | None | near | 0 | none — MATCH (56 ins, match_one relocation-masked) | `.run/backlog_drafts/func_8016BBE0.c` | -| 1659 | func_8016BD78 | None | struct | None | near | 0 | none — MATCH (74 ins, relocation-masked) | `.run/backlog_drafts/func_8016BD78.c` | -| 1660 | func_8016BEA0 | None | plumbing | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8016BEA0.c` | -| 1661 | func_8016D688 | None | struct | None | near | 0 | none — MATCH (60 ins). Array-of-bytes decl (extern u8 D_801D9C20[]) makes gcc CSE the | `.run/backlog_drafts/func_8016D688.c` | -| 1662 | func_8016E7C8 | None | regalloc-order | None | near | 0 | none — MATCH (74 ins); register pin $s2 forces &prim into a saved reg (§17) | `.run/backlog_drafts/func_8016E7C8.c` | -| 1663 | func_8016F0AC | None | plumbing | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8016F0AC.c` | -| 1664 | func_80178B18 | None | struct | None | near | 0 | none — MATCH (pointer var forces &(*(int *)&D_8018A458) into $s0, reused for store + arg-0xC) | `.run/backlog_drafts/func_80178B18.c` | -| 1665 | func_8017B8E8 | None | struct | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8017B8E8.c` | -| 1666 | func_8017BB34 | None | struct | None | near | 0 | none — MATCH (65 ins) | `.run/backlog_drafts/func_8017BB34.c` | -| 1667 | func_8017B238 | None | regalloc-order | None | near | 0 | none — MATCH (76 ins). block-move source needs s0-pin + a zero-code barrier anchoring | `.run/backlog_drafts/func_8017B238.c` | -| 1668 | func_8017B368 | None | struct | None | near | 0 | none — MATCH (74 ins) | `.run/backlog_drafts/func_8017B368.c` | -| 1669 | func_80184F08 | None | regalloc-order | None | near | 0 | none — MATCH (145/145 ins, match_one confirmed) | `.run/backlog_drafts/func_80184F08.c` | -| 1670 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | -| 1671 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | -| 1672 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | -| 1673 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | -| 1674 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | -| 1675 | func_8017F114 | 1 | regalloc-order | 75 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8017F114.c` | -| 1676 | func_8013EF88 | 1 | struct | 108 | near | 1 | none — MATCH (108 ins, relocation-masked) | `.run/backlog_drafts/func_8013EF88.c` | -| 1677 | func_801656E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801656E8.c` | -| 1678 | func_8017D2D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D2D4.c` | -| 1679 | func_801807D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801807D8.c` | -| 1680 | func_80180AD0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180AD0.c` | -| 1681 | func_8017F758 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F758.c` | -| 1682 | func_8017FDB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FDB0.c` | -| 1683 | func_80180720 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180720.c` | -| 1684 | func_80184D80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184D80.c` | -| 1685 | func_80184A28 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184A28.c` | -| 1686 | func_8017FB2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB2C.c` | -| 1687 | func_80183724 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183724.c` | -| 1688 | func_80183AFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183AFC.c` | -| 1689 | func_8017EE50 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE50.c` | -| 1690 | func_80181FF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FF8.c` | -| 1691 | func_80185D5C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185D5C.c` | -| 1692 | func_8018AE80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AE80.c` | -| 1693 | func_80183FF4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FF4.c` | -| 1694 | func_801832F4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801832F4.c` | -| 1695 | func_8017FE4C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FE4C.c` | -| 1696 | func_801827C4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801827C4.c` | -| 1697 | func_80182B68 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182B68.c` | -| 1698 | func_80185E38 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185E38.c` | -| 1699 | func_8017D060 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D060.c` | -| 1700 | func_8017FD70 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FD70.c` | -| 1701 | func_801811D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801811D4.c` | -| 1702 | func_801819DC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801819DC.c` | -| 1703 | func_8017E67C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E67C.c` | -| 1704 | func_80184820 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184820.c` | -| 1705 | func_8018ADF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018ADF8.c` | -| 1706 | func_80186554 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186554.c` | -| 1707 | func_80180C44 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180C44.c` | -| 1708 | func_801873FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801873FC.c` | -| 1709 | func_8017EF1C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EF1C.c` | -| 1710 | func_80187540 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187540.c` | -| 1711 | func_8017F8E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F8E8.c` | -| 1712 | func_80183FB4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FB4.c` | -| 1713 | func_80180E7C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180E7C.c` | -| 1714 | func_80182F18 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182F18.c` | -| 1715 | func_80188FE0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80188FE0.c` | -| 1716 | func_801835FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801835FC.c` | -| 1717 | func_801892B4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801892B4.c` | -| 1718 | func_8017DBBC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017DBBC.c` | -| 1719 | func_8017D4A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D4A8.c` | -| 1720 | func_80184970 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184970.c` | -| 1721 | func_801819AC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801819AC.c` | -| 1722 | func_801863D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801863D4.c` | -| 1723 | func_80181540 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181540.c` | -| 1724 | func_80180694 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180694.c` | -| 1725 | func_80184560 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184560.c` | -| 1726 | func_801809D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801809D4.c` | -| 1727 | func_80180530 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180530.c` | -| 1728 | func_8017E4E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E4E0.c` | -| 1729 | func_80185864 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185864.c` | -| 1730 | func_801802A4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801802A4.c` | -| 1731 | func_80181790 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181790.c` | -| 1732 | func_80180820 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180820.c` | -| 1733 | func_80181F78 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181F78.c` | -| 1734 | func_801830A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801830A8.c` | -| 1735 | func_8017E858 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E858.c` | -| 1736 | func_80181DCC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181DCC.c` | -| 1737 | func_80186BD4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186BD4.c` | -| 1738 | func_8018452C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018452C.c` | -| 1739 | func_8017FB98 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB98.c` | -| 1740 | func_80184C9C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184C9C.c` | -| 1741 | func_8017EE14 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE14.c` | -| 1742 | func_8017E2A4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E2A4.c` | -| 1743 | func_80181DA0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181DA0.c` | -| 1744 | func_80180BFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180BFC.c` | -| 1745 | func_801856A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801856A8.c` | -| 1746 | func_80187840 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187840.c` | -| 1747 | func_8017FB44 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB44.c` | -| 1748 | func_80184E58 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184E58.c` | -| 1749 | func_80184354 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184354.c` | -| 1750 | func_8018011C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018011C.c` | -| 1751 | func_8017E29C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E29C.c` | -| 1752 | func_8017D930 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D930.c` | -| 1753 | func_80182A8C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182A8C.c` | -| 1754 | func_80181FCC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FCC.c` | -| 1755 | func_801844FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801844FC.c` | -| 1756 | func_801893E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801893E0.c` | -| 1757 | func_80186908 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186908.c` | -| 1758 | func_80189DC4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80189DC4.c` | -| 1759 | func_8018A900 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018A900.c` | -| 1760 | func_80182AB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182AB0.c` | -| 1761 | func_80183EA4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183EA4.c` | -| 1762 | func_8018B344 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018B344.c` | -| 1763 | func_80188858 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80188858.c` | -| 1764 | func_80185AD4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185AD4.c` | -| 1765 | func_8018773C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018773C.c` | -| 1766 | func_801895A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801895A8.c` | -| 1767 | func_80182E9C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182E9C.c` | -| 1768 | func_8017F378 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F378.c` | -| 1769 | func_8018F114 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018F114.c` | -| 1770 | func_80184BAC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184BAC.c` | -| 1771 | func_801852D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801852D4.c` | -| 1772 | func_80181E6C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181E6C.c` | -| 1773 | func_80186E24 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186E24.c` | -| 1774 | func_80186630 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186630.c` | -| 1775 | func_80189B60 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80189B60.c` | -| 1776 | func_8018445C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018445C.c` | -| 1777 | func_8018AA08 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AA08.c` | -| 1778 | func_80183558 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183558.c` | -| 1779 | func_80181394 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181394.c` | -| 1780 | func_80182CEC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182CEC.c` | -| 1781 | func_80190518 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80190518.c` | -| 1782 | func_8018110C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018110C.c` | -| 1783 | func_8017D460 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D460.c` | -| 1784 | func_8017FBB4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FBB4.c` | -| 1785 | func_8018C8A0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018C8A0.c` | -| 1786 | func_8018944C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018944C.c` | -| 1787 | func_8018A598 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018A598.c` | -| 1788 | func_8017EA40 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EA40.c` | -| 1789 | func_801826C8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801826C8.c` | -| 1790 | func_801854C0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801854C0.c` | -| 1791 | func_8017EC64 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EC64.c` | -| 1792 | func_80184C94 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184C94.c` | -| 1793 | func_80186D7C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186D7C.c` | -| 1794 | func_80185CE4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185CE4.c` | -| 1795 | func_8017EA68 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EA68.c` | -| 1796 | func_80180074 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180074.c` | -| 1797 | func_801847E4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801847E4.c` | -| 1798 | func_80180F2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180F2C.c` | -| 1799 | func_80180EA4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180EA4.c` | -| 1800 | func_80182470 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182470.c` | -| 1801 | func_8017E3D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E3D8.c` | -| 1802 | func_8017E558 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E558.c` | -| 1803 | func_8018386C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018386C.c` | -| 1804 | func_80187A0C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187A0C.c` | -| 1805 | func_8018893C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018893C.c` | -| 1806 | func_80186AE8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186AE8.c` | -| 1807 | func_801811E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801811E0.c` | -| 1808 | func_80183ABC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183ABC.c` | -| 1809 | func_80185BEC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185BEC.c` | -| 1810 | func_801900B0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801900B0.c` | -| 1811 | func_8017F290 | 1 | regalloc-order | 86 | near | 2 | none — MATCH. Two levers: (1) hold &D_801270CC in a `int *state` local so its | `.run/backlog_drafts/func_8017F290.c` | -| 1812 | func_8016EC0C | 1 | schedule | 88 | near | 2 | none — MATCH (88 ins). Sparse switch(uVar2) = gcc's beq-pivot+slti comparison | `.run/backlog_drafts/func_8016EC0C.c` | -| 1813 | func_8017F6B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F6B0.c` | -| 1814 | func_8017DDFC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DDFC.c` | -| 1815 | func_8017FD2C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FD2C.c` | -| 1816 | func_8018A640 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A640.c` | -| 1817 | func_80188F30 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80188F30.c` | -| 1818 | func_8018BCB4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BCB4.c` | -| 1819 | func_80185320 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185320.c` | -| 1820 | func_80185670 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185670.c` | -| 1821 | func_801880F4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801880F4.c` | -| 1822 | func_80182A14 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182A14.c` | -| 1823 | func_801817DC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801817DC.c` | -| 1824 | func_801822B8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801822B8.c` | -| 1825 | func_80182264 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182264.c` | -| 1826 | func_8017E624 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E624.c` | -| 1827 | func_8018062C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018062C.c` | -| 1828 | func_80189AE0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80189AE0.c` | -| 1829 | func_80181834 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80181834.c` | -| 1830 | func_8018A4C4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A4C4.c` | -| 1831 | func_8017DEAC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DEAC.c` | -| 1832 | func_8017EBD4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017EBD4.c` | -| 1833 | func_8017E730 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E730.c` | -| 1834 | func_8018558C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018558C.c` | -| 1835 | func_8018AF78 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018AF78.c` | -| 1836 | func_8017D880 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017D880.c` | -| 1837 | func_80189498 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80189498.c` | -| 1838 | func_8018109C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018109C.c` | -| 1839 | func_801826F0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801826F0.c` | -| 1840 | func_801843CC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801843CC.c` | -| 1841 | func_80182354 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182354.c` | -| 1842 | func_80187998 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80187998.c` | -| 1843 | func_801824A0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801824A0.c` | -| 1844 | func_8017FC8C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FC8C.c` | -| 1845 | func_8018567C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018567C.c` | -| 1846 | func_80183228 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183228.c` | -| 1847 | func_80183118 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183118.c` | -| 1848 | func_8017E404 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E404.c` | -| 1849 | func_80183B4C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183B4C.c` | -| 1850 | func_8018A260 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A260.c` | -| 1851 | func_801831B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801831B0.c` | -| 1852 | func_801879B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801879B0.c` | -| 1853 | func_801828C8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801828C8.c` | -| 1854 | func_8017FA80 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FA80.c` | -| 1855 | func_8017E874 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E874.c` | -| 1856 | func_8018B108 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018B108.c` | -| 1857 | func_80185000 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185000.c` | -| 1858 | func_8017F188 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F188.c` | -| 1859 | func_80181934 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80181934.c` | -| 1860 | func_801812E0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801812E0.c` | -| 1861 | func_80180F18 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180F18.c` | -| 1862 | func_8018C658 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018C658.c` | -| 1863 | func_80184E20 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80184E20.c` | -| 1864 | func_80187318 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80187318.c` | -| 1865 | func_80180BF0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180BF0.c` | -| 1866 | func_80184294 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80184294.c` | -| 1867 | func_80183F48 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183F48.c` | -| 1868 | func_80180834 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180834.c` | -| 1869 | func_80185C68 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185C68.c` | -| 1870 | func_8018BA9C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BA9C.c` | -| 1871 | func_80186DAC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80186DAC.c` | -| 1872 | func_80182908 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182908.c` | -| 1873 | func_8018422C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018422C.c` | -| 1874 | func_80185734 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185734.c` | -| 1875 | func_8017EE78 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017EE78.c` | -| 1876 | func_8018B054 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018B054.c` | -| 1877 | func_801804C8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801804C8.c` | -| 1878 | func_8012FCC4 | 1 | schedule | 57 | near | 3 | 3 ins — beqz(0x100) delay-slot fill. Target re-emits `move a0,s0` for func_80131B14 | `.run/backlog_drafts/func_8012FCC4.c` | -| 1879 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | -| 1880 | func_8017DA80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DA80.c` | -| 1881 | func_8017D468 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D468.c` | -| 1882 | func_80185BF4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185BF4.c` | -| 1883 | func_8017DCE4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DCE4.c` | -| 1884 | func_8017F510 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F510.c` | -| 1885 | func_80182EC4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182EC4.c` | -| 1886 | func_801802AC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801802AC.c` | -| 1887 | func_801816FC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801816FC.c` | -| 1888 | func_801808F8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801808F8.c` | -| 1889 | func_80182D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182D98.c` | -| 1890 | func_80184D28 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184D28.c` | -| 1891 | func_8017DE90 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DE90.c` | -| 1892 | func_80185070 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185070.c` | -| 1893 | func_80190480 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80190480.c` | -| 1894 | func_80180814 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180814.c` | -| 1895 | func_801827B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801827B8.c` | -| 1896 | func_8017EBB4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017EBB4.c` | -| 1897 | func_8018AFDC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AFDC.c` | -| 1898 | func_80180D34 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180D34.c` | -| 1899 | func_801858AC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801858AC.c` | -| 1900 | func_801802B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801802B8.c` | -| 1901 | func_8017F38C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F38C.c` | -| 1902 | func_8017D938 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D938.c` | -| 1903 | func_8017EDE0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017EDE0.c` | -| 1904 | func_80187008 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80187008.c` | -| 1905 | func_80185200 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185200.c` | -| 1906 | func_8018AE6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AE6C.c` | -| 1907 | func_80184A54 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184A54.c` | -| 1908 | func_80181720 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181720.c` | -| 1909 | func_80183BC8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183BC8.c` | -| 1910 | func_8017F0C0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F0C0.c` | -| 1911 | func_8018318C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018318C.c` | -| 1912 | func_801825D8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801825D8.c` | -| 1913 | func_8018D4B4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018D4B4.c` | -| 1914 | func_80181E3C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181E3C.c` | -| 1915 | func_801874E8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801874E8.c` | -| 1916 | func_80183320 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183320.c` | -| 1917 | func_801818DC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801818DC.c` | -| 1918 | func_801857D4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801857D4.c` | -| 1919 | func_8017F0B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F0B8.c` | -| 1920 | func_8018A184 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018A184.c` | -| 1921 | func_8018AE4C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AE4C.c` | -| 1922 | func_8018B234 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018B234.c` | -| 1923 | func_80180D2C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180D2C.c` | -| 1924 | func_80181D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181D98.c` | -| 1925 | func_8017F534 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F534.c` | -| 1926 | func_801861DC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801861DC.c` | -| 1927 | func_801896EC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801896EC.c` | -| 1928 | func_80184CD8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184CD8.c` | -| 1929 | func_8018C7C8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018C7C8.c` | -| 1930 | func_80187B80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80187B80.c` | -| 1931 | func_80189C14 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80189C14.c` | -| 1932 | func_80185674 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185674.c` | -| 1933 | func_80181060 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181060.c` | -| 1934 | func_801806C8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801806C8.c` | -| 1935 | func_80184594 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184594.c` | -| 1936 | func_80184C70 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184C70.c` | -| 1937 | func_80183A6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183A6C.c` | -| 1938 | func_8018CA10 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018CA10.c` | -| 1939 | func_8018672C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018672C.c` | -| 1940 | func_801894B0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801894B0.c` | -| 1941 | func_80184D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184D98.c` | -| 1942 | func_801823B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801823B8.c` | -| 1943 | func_8018CC6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018CC6C.c` | -| 1944 | func_8018B1E0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018B1E0.c` | -| 1945 | func_80184870 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184870.c` | -| 1946 | func_8017E6B0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017E6B0.c` | -| 1947 | func_801549F8 | None | schedule | None | near | 3 | 3-off at -O2 (match_one + gate flags). The n=byte keep-alive copy (addu $a3,$v0,$zero) emits BEFORE the hoisted jtbl (lui/addiu $t0); target emits it AFTER. Pure RTL emission order — a preheader source-statement is always chained before a hoisted loop-invariant, and gcc-2.7.2-psx runs no active delay-slot/list scheduler here (load-delay nops stay unfilled) to reorder them. Not reachable by any source reordering tried (~20 forms). The instruction itself is byte-identical; only its position among 3 independent preheader insns differs. Permuter can't run (pycparser rejects the register __asm__ pin) -> human/RTL-level lever needed. | `.run/backlog_drafts/func_801549F8.c` | -| 1948 | func_8012A018 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8012A018.c` | -| 1949 | func_80180B24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B24.c` | -| 1950 | func_80180B34 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B34.c` | -| 1951 | func_80181758 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181758.c` | -| 1952 | func_80188484 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188484.c` | -| 1953 | func_8018F080 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F080.c` | -| 1954 | func_8018F090 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F090.c` | -| 1955 | func_80190460 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190460.c` | -| 1956 | func_80190470 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190470.c` | -| 1957 | func_80183690 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183690.c` | -| 1958 | func_801836A0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801836A0.c` | -| 1959 | func_80188F4C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F4C.c` | -| 1960 | func_80188F5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F5C.c` | -| 1961 | func_80185CC8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CC8.c` | -| 1962 | func_80185CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CD8.c` | -| 1963 | func_8018ADEC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADEC.c` | -| 1964 | func_8018ADFC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADFC.c` | -| 1965 | func_8018478C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018478C.c` | -| 1966 | func_8018479C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018479C.c` | -| 1967 | func_8017F8E4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017F8E4.c` | -| 1968 | func_80185FA4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185FA4.c` | -| 1969 | func_80187074 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80187074.c` | -| 1970 | func_80189F14 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189F14.c` | -| 1971 | func_80182D48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182D48.c` | -| 1972 | func_8017DFBC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017DFBC.c` | -| 1973 | func_801871AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801871AC.c` | -| 1974 | func_801857D0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801857D0.c` | -| 1975 | func_801857E0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801857E0.c` | -| 1976 | func_80189F24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189F24.c` | -| 1977 | func_801834D4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801834D4.c` | -| 1978 | func_80181F14 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181F14.c` | -| 1979 | func_80185A40 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185A40.c` | -| 1980 | func_80184498 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184498.c` | -| 1981 | func_801844A8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844A8.c` | -| 1982 | func_80184850 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184850.c` | -| 1983 | func_80183098 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183098.c` | -| 1984 | func_801844DC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844DC.c` | -| 1985 | func_80189514 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189514.c` | -| 1986 | func_8018A87C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018A87C.c` | -| 1987 | func_8017FF90 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FF90.c` | -| 1988 | func_80184468 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184468.c` | -| 1989 | func_80181F24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181F24.c` | -| 1990 | func_8017E150 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E150.c` | -| 1991 | func_8017EBE4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017EBE4.c` | -| 1992 | func_80184840 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184840.c` | -| 1993 | func_80180BC4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180BC4.c` | -| 1994 | func_80184BB0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184BB0.c` | -| 1995 | func_80184180 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184180.c` | -| 1996 | func_801844CC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844CC.c` | -| 1997 | func_80184C08 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184C08.c` | -| 1998 | func_80183A1C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183A1C.c` | -| 1999 | func_80181D38 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181D38.c` | -| 2000 | func_8018A86C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018A86C.c` | -| 2001 | func_8017E44C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E44C.c` | -| 2002 | func_80184E38 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184E38.c` | -| 2003 | func_801815DC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801815DC.c` | -| 2004 | func_801871BC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801871BC.c` | -| 2005 | func_8017FDD4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FDD4.c` | -| 2006 | func_8017E904 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E904.c` | -| 2007 | func_80183BA8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183BA8.c` | -| 2008 | func_80184478 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184478.c` | -| 2009 | func_80185A50 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185A50.c` | -| 2010 | func_8017E160 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E160.c` | -| 2011 | func_8017FAE0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FAE0.c` | -| 2012 | func_8018170C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018170C.c` | -| 2013 | func_801865AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801865AC.c` | -| 2014 | func_80188CA0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188CA0.c` | -| 2015 | func_80180BB4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180BB4.c` | -| 2016 | func_80184BC0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184BC0.c` | -| 2017 | func_8017E848 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E848.c` | -| 2018 | func_80185614 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185614.c` | -| 2019 | func_80184C18 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184C18.c` | -| 2020 | func_80183A0C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183A0C.c` | -| 2021 | func_80189524 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189524.c` | -| 2022 | func_80181D48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181D48.c` | -| 2023 | func_8017E45C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E45C.c` | -| 2024 | func_80184E48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184E48.c` | -| 2025 | func_801815CC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801815CC.c` | -| 2026 | func_8017FDE4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FDE4.c` | -| 2027 | func_8017E8F4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E8F4.c` | -| 2028 | func_801834C4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801834C4.c` | -| 2029 | func_8017EBC4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017EBC4.c` | -| 2030 | func_8018659C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018659C.c` | -| 2031 | func_80183088 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183088.c` | -| 2032 | func_8017FA40 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FA40.c` | -| 2033 | func_8017E918 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E918.c` | -| 2034 | func_8017E838 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E838.c` | -| 2035 | func_80185624 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185624.c` | -| 2036 | func_8017E02C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E02C.c` | -| 2037 | func_801853C0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801853C0.c` | -| 2038 | func_8017E210 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E210.c` | -| 2039 | func_80183BB8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183BB8.c` | -| 2040 | func_801847AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801847AC.c` | -| 2041 | func_80180ED4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180ED4.c` | -| 2042 | func_8017E194 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E194.c` | -| 2043 | func_801853D0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801853D0.c` | -| 2044 | func_8017E3F0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E3F0.c` | -| 2045 | func_80183444 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183444.c` | -| 2046 | func_8017E220 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E220.c` | -| 2047 | func_8018BD94 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018BD94.c` | -| 2048 | func_80186700 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80186700.c` | -| 2049 | func_8017E004 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E004.c` | -| 2050 | func_8018314C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018314C.c` | -| 2051 | func_80183710 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183710.c` | -| 2052 | func_801845B8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801845B8.c` | -| 2053 | func_8018BA94 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018BA94.c` | -| 2054 | func_80181CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181CD8.c` | -| 2055 | func_80184880 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184880.c` | -| 2056 | func_8018CC04 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018CC04.c` | -| 2057 | func_8017DED8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017DED8.c` | -| 2058 | func_80180CA8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180CA8.c` | -| 2059 | func_80181ECC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181ECC.c` | -| 2060 | func_801844AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844AC.c` | -| 2061 | func_80183ED4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183ED4.c` | -| 2062 | func_80182E5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182E5C.c` | -| 2063 | func_8018449C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018449C.c` | -| 2064 | func_8018B2F4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018B2F4.c` | -| 2065 | func_80183638 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183638.c` | -| 2066 | func_8018455C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018455C.c` | -| 2067 | func_80181B08 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181B08.c` | -| 2068 | func_80180E70 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180E70.c` | -| 2069 | func_801823F0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801823F0.c` | -| 2070 | func_8018CBB0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018CBB0.c` | -| 2071 | func_80188510 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188510.c` | -| 2072 | func_80181A44 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181A44.c` | -| 2073 | func_80182CD4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182CD4.c` | -| 2074 | func_8018119C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018119C.c` | -| 2075 | func_8018C394 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018C394.c` | -| 2076 | func_8017EF50 | None | schedule | None | near | 4 | 4 ins — coupled first-block tie-break: addiu(0x34+1)/addu(0x10+0x2c) adjacent swap trades off vs the 0x2c/0x30 load order (can fix one or the other, not both from C), plus 0xa lands in $a1 not target's $a2 (a caller-saved reg choice; a `register short` pin to $6 triggers sll/sra sign-ext -> +3 ins). | `.run/backlog_drafts/func_8017EF50.c` | -| 2077 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | -| 2078 | func_8017CE34 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE34.c` | -| 2079 | func_8017D948 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D948.c` | -| 2080 | func_8017D2EC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D2EC.c` | -| 2081 | func_801803F0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801803F0.c` | -| 2082 | func_80180710 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180710.c` | -| 2083 | func_8017CE7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE7C.c` | -| 2084 | func_8017F7D8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7D8.c` | -| 2085 | func_8017ED98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ED98.c` | -| 2086 | func_80181B8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181B8C.c` | -| 2087 | func_8017E14C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E14C.c` | -| 2088 | func_8017D528 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D528.c` | -| 2089 | func_801900E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801900E0.c` | -| 2090 | func_8017D1F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1F4.c` | -| 2091 | func_8017DB48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DB48.c` | -| 2092 | func_8017EBD0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EBD0.c` | -| 2093 | func_80182720 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182720.c` | -| 2094 | func_8017D160 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D160.c` | -| 2095 | func_8017E9D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9D0.c` | -| 2096 | func_8017D368 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D368.c` | -| 2097 | func_80180564 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180564.c` | -| 2098 | func_801809F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801809F4.c` | -| 2099 | func_8017F250 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F250.c` | -| 2100 | func_8017F66C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F66C.c` | -| 2101 | func_8017F76C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F76C.c` | -| 2102 | func_8017F790 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F790.c` | -| 2103 | func_8017F7B4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7B4.c` | -| 2104 | func_8017CE1C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE1C.c` | -| 2105 | func_8017E9E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9E8.c` | -| 2106 | func_8017CE3C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE3C.c` | -| 2107 | func_8017E4E4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E4E4.c` | -| 2108 | func_80181E18 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181E18.c` | -| 2109 | func_801852C8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801852C8.c` | -| 2110 | func_8017ECF8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ECF8.c` | -| 2111 | func_8017E420 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E420.c` | -| 2112 | func_80181700 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181700.c` | -| 2113 | func_8017EE40 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EE40.c` | -| 2114 | func_80180DF4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180DF4.c` | -| 2115 | func_8017D4E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D4E8.c` | -| 2116 | func_8017D8C0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D8C0.c` | -| 2117 | func_8017CE44 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE44.c` | -| 2118 | func_8017D200 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D200.c` | -| 2119 | func_8017E878 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E878.c` | -| 2120 | func_8017D0E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D0E0.c` | -| 2121 | func_8017CE70 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE70.c` | -| 2122 | func_8017E7F8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E7F8.c` | -| 2123 | func_8017F05C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F05C.c` | -| 2124 | func_8017CE8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE8C.c` | -| 2125 | func_80183984 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183984.c` | -| 2126 | func_8017CE9C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE9C.c` | -| 2127 | func_8017CFE0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CFE0.c` | -| 2128 | func_8017DE58 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DE58.c` | -| 2129 | func_8017D248 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D248.c` | -| 2130 | func_80180284 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180284.c` | -| 2131 | func_80180100 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180100.c` | -| 2132 | func_8018014C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018014C.c` | -| 2133 | func_8017EE94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EE94.c` | -| 2134 | func_8017E0C8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E0C8.c` | -| 2135 | func_8017FD94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FD94.c` | -| 2136 | func_8017F0A4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F0A4.c` | -| 2137 | func_8017D8E4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D8E4.c` | -| 2138 | func_8017EABC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EABC.c` | -| 2139 | func_8018B7A4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018B7A4.c` | -| 2140 | func_80181EF0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181EF0.c` | -| 2141 | func_8017D76C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D76C.c` | -| 2142 | func_801807B0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801807B0.c` | -| 2143 | func_8017DF24 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DF24.c` | -| 2144 | func_8017E8B8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E8B8.c` | -| 2145 | func_801821B8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801821B8.c` | -| 2146 | func_8017D844 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D844.c` | -| 2147 | func_8017FE68 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FE68.c` | -| 2148 | func_8017D614 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D614.c` | -| 2149 | func_8018312C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018312C.c` | -| 2150 | func_8017FF7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FF7C.c` | -| 2151 | func_8018DA98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018DA98.c` | -| 2152 | func_8017F11C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F11C.c` | -| 2153 | func_8017D25C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D25C.c` | -| 2154 | func_8017DF4C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DF4C.c` | -| 2155 | func_80185744 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185744.c` | -| 2156 | func_80183C20 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183C20.c` | -| 2157 | func_8018550C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018550C.c` | -| 2158 | func_8017F744 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F744.c` | -| 2159 | func_80180A14 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180A14.c` | -| 2160 | func_8017D608 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D608.c` | -| 2161 | func_80181D60 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181D60.c` | -| 2162 | func_8017FAB0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FAB0.c` | -| 2163 | func_8017DA6C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA6C.c` | -| 2164 | func_8017CEC8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CEC8.c` | -| 2165 | func_80183644 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183644.c` | -| 2166 | func_80182810 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182810.c` | -| 2167 | func_80180F48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180F48.c` | -| 2168 | func_8017CE64 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE64.c` | -| 2169 | func_8017D1CC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1CC.c` | -| 2170 | func_8017F928 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F928.c` | -| 2171 | func_8017D830 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D830.c` | -| 2172 | func_8017FDA8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FDA8.c` | -| 2173 | func_80182938 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182938.c` | -| 2174 | func_8018517C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018517C.c` | -| 2175 | func_8017F09C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F09C.c` | -| 2176 | func_80182B18 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182B18.c` | -| 2177 | func_8017DEA0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DEA0.c` | -| 2178 | func_8017DA88 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA88.c` | -| 2179 | func_8017E8C4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E8C4.c` | -| 2180 | func_8017DA90 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA90.c` | -| 2181 | func_801816DC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801816DC.c` | -| 2182 | func_8017E6A0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E6A0.c` | -| 2183 | func_80180E94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180E94.c` | -| 2184 | func_80181BB4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181BB4.c` | -| 2185 | func_80180D94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180D94.c` | -| 2186 | func_8017D850 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D850.c` | -| 2187 | func_801869E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801869E0.c` | -| 2188 | func_8017DCF8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DCF8.c` | -| 2189 | func_8018C3D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018C3D0.c` | -| 2190 | func_80180190 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180190.c` | -| 2191 | func_8017E82C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E82C.c` | -| 2192 | func_80185338 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185338.c` | -| 2193 | func_8017E2E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E2E8.c` | -| 2194 | func_8017CF94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CF94.c` | -| 2195 | func_80185978 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185978.c` | -| 2196 | func_8017E534 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E534.c` | -| 2197 | func_8017DA4C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA4C.c` | -| 2198 | func_8017DCE8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DCE8.c` | -| 2199 | func_8017D674 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D674.c` | -| 2200 | func_80183904 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183904.c` | -| 2201 | func_80181AE4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181AE4.c` | -| 2202 | func_8017D490 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D490.c` | -| 2203 | func_8017D214 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D214.c` | -| 2204 | func_80181D50 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181D50.c` | -| 2205 | func_8017CEAC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CEAC.c` | -| 2206 | func_8017F1E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F1E0.c` | -| 2207 | func_8018C0D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018C0D0.c` | -| 2208 | func_8017E2CC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E2CC.c` | -| 2209 | func_80180B58 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180B58.c` | -| 2210 | func_8017D7D4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D7D4.c` | -| 2211 | func_80185E54 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185E54.c` | -| 2212 | func_80187DAC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80187DAC.c` | -| 2213 | func_80183DB8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183DB8.c` | -| 2214 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | -| 2215 | func_8017B238 | 1 | regalloc-order | 76 | near | 6 | 6 ins — gcc coalesces param_2 into callee-saved $s0 and hoists `move $s0,$a1` | `.run/backlog_drafts/func_8017B238.c` | -| 2216 | func_8017B614 | 1 | regalloc-order | 101 | near | 6 | 6 ins — param_2 lands in callee-saved $s0 (entry `move s0,a1`, sltiu/sll read s0) vs target's $a1; gcc prefers s0 (saved anyway for the late p794/p78C copies) over caller-saved $a1. Body+schedule otherwise byte-exact (101/101 ins); the late-part `__asm__("")` barrier is load-bearing (fixes the const-store schedule, 21->6). | `.run/backlog_drafts/func_8017B614.c` | -| 2217 | func_801656D0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801656D0.c` | -| 2218 | func_80165700 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80165700.c` | -| 2219 | func_80180AE8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180AE8.c` | -| 2220 | func_8017D398 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D398.c` | -| 2221 | func_8017FCCC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FCCC.c` | -| 2222 | func_80184A58 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80184A58.c` | -| 2223 | func_80182280 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182280.c` | -| 2224 | func_80180744 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180744.c` | -| 2225 | func_8017FA64 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FA64.c` | -| 2226 | func_8017EB58 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017EB58.c` | -| 2227 | func_8017F4CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F4CC.c` | -| 2228 | func_8017D624 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D624.c` | -| 2229 | func_80181C78 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181C78.c` | -| 2230 | func_801855DC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801855DC.c` | -| 2231 | func_8017FCD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FCD4.c` | -| 2232 | func_80183158 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80183158.c` | -| 2233 | func_80182E2C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182E2C.c` | -| 2234 | func_8017F704 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F704.c` | -| 2235 | func_80185C20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185C20.c` | -| 2236 | func_8017E06C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E06C.c` | -| 2237 | func_8017FA20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FA20.c` | -| 2238 | func_80187AD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80187AD4.c` | -| 2239 | func_8018595C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018595C.c` | -| 2240 | func_8017D6CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D6CC.c` | -| 2241 | func_80180CD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180CD4.c` | -| 2242 | func_8018423C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018423C.c` | -| 2243 | func_80180EE4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180EE4.c` | -| 2244 | func_80185B20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185B20.c` | -| 2245 | func_80181BD8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181BD8.c` | -| 2246 | func_801802CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801802CC.c` | -| 2247 | func_801844F8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801844F8.c` | -| 2248 | func_8017E2C4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E2C4.c` | -| 2249 | func_80185A8C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185A8C.c` | -| 2250 | func_8017F0EC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F0EC.c` | -| 2251 | func_80180FFC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180FFC.c` | -| 2252 | func_8017DFFC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017DFFC.c` | -| 2253 | func_80188F80 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80188F80.c` | -| 2254 | func_8018A744 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A744.c` | -| 2255 | func_8017F088 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F088.c` | -| 2256 | func_80181F00 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181F00.c` | -| 2257 | func_801818D4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801818D4.c` | -| 2258 | func_801805D8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801805D8.c` | -| 2259 | func_80181FF4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181FF4.c` | -| 2260 | func_80189240 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80189240.c` | -| 2261 | func_80184618 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80184618.c` | -| 2262 | func_8018413C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018413C.c` | -| 2263 | func_801816E0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801816E0.c` | -| 2264 | func_801811F0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801811F0.c` | -| 2265 | func_801819A0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801819A0.c` | -| 2266 | func_8018A698 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A698.c` | -| 2267 | func_801855F0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801855F0.c` | -| 2268 | func_8017E1DC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E1DC.c` | -| 2269 | func_80183E20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80183E20.c` | -| 2270 | func_80185AE4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185AE4.c` | -| 2271 | func_8017ED3C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017ED3C.c` | -| 2272 | func_80181854 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181854.c` | -| 2273 | func_8017ECB4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017ECB4.c` | -| 2274 | func_80182048 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182048.c` | -| 2275 | func_80181230 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181230.c` | -| 2276 | func_8017DBAC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017DBAC.c` | -| 2277 | func_8017E230 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E230.c` | -| 2278 | func_8018681C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018681C.c` | -| 2279 | func_801810BC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801810BC.c` | -| 2280 | func_8018A7CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A7CC.c` | -| 2281 | func_8018E0D4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018E0D4.c` | -| 2282 | func_80186A28 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186A28.c` | -| 2283 | func_80186A88 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186A88.c` | -| 2284 | func_80180F4C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180F4C.c` | -| 2285 | func_80186C88 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186C88.c` | -| 2286 | func_80182988 | None | loose-typing | None | near | 6 | none — MATCH (0x5c store must be unsigned short so 0xaa10 stays +43536 → ori, not addiu/sign-extend) | `.run/backlog_drafts/func_80182988.c` | -| 2287 | func_80141A60 | 1 | plumbing | 76 | near | 7 | TBD — first pass | `.run/backlog_drafts/func_80141A60.c` | -| 2288 | func_801345F8 | 1 | schedule | 106 | near | 7 | 7 ins, all pure scheduling order — maskedp copy not sunk into bnez delay slot | `.run/backlog_drafts/func_801345F8.c` | -| 2289 | func_801815D8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801815D8.c` | -| 2290 | func_80189898 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80189898.c` | -| 2291 | func_8018823C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018823C.c` | -| 2292 | func_80183E3C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E3C.c` | -| 2293 | func_8017CF40 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017CF40.c` | -| 2294 | func_8017FF6C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017FF6C.c` | -| 2295 | func_8017DB84 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017DB84.c` | -| 2296 | func_8017F04C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017F04C.c` | -| 2297 | func_80188228 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80188228.c` | -| 2298 | func_8017E450 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017E450.c` | -| 2299 | func_80180A84 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180A84.c` | -| 2300 | func_8018B184 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B184.c` | -| 2301 | func_80183E7C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E7C.c` | -| 2302 | func_80181BC4 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80181BC4.c` | -| 2303 | func_80182198 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182198.c` | -| 2304 | func_8017FF68 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017FF68.c` | -| 2305 | func_8018B5C0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B5C0.c` | -| 2306 | func_801837AC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801837AC.c` | -| 2307 | func_80180458 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180458.c` | -| 2308 | func_8018D7CC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018D7CC.c` | -| 2309 | func_80182518 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182518.c` | -| 2310 | func_80185C6C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185C6C.c` | -| 2311 | func_801807C0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801807C0.c` | -| 2312 | func_8018B450 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B450.c` | -| 2313 | func_8018146C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018146C.c` | -| 2314 | func_8017C104 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017C104.c` | -| 2315 | func_8018552C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018552C.c` | -| 2316 | func_801837A0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801837A0.c` | -| 2317 | func_80186D5C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186D5C.c` | -| 2318 | func_80184438 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184438.c` | -| 2319 | func_80185AEC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185AEC.c` | -| 2320 | func_80180410 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180410.c` | -| 2321 | func_80181FB8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80181FB8.c` | -| 2322 | func_80185A20 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185A20.c` | -| 2323 | func_80185DB8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185DB8.c` | -| 2324 | func_801860FC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801860FC.c` | -| 2325 | func_80180754 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180754.c` | -| 2326 | func_80186720 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186720.c` | -| 2327 | func_8017EA60 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017EA60.c` | -| 2328 | func_8017F710 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017F710.c` | -| 2329 | func_80184990 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184990.c` | -| 2330 | func_80185344 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185344.c` | -| 2331 | func_801828DC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801828DC.c` | -| 2332 | func_80186E34 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186E34.c` | -| 2333 | func_80184688 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184688.c` | -| 2334 | func_80182230 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182230.c` | -| 2335 | func_8018169C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018169C.c` | -| 2336 | func_80183184 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183184.c` | -| 2337 | func_80180F10 | None | regalloc-order | None | near | 7 | none — MATCH pending | `.run/backlog_drafts/func_80180F10.c` | -| 2338 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | -| 2339 | func_80185F24 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F24.c` | -| 2340 | func_80189858 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80189858.c` | -| 2341 | func_8017FFF0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FFF0.c` | -| 2342 | func_8017E908 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E908.c` | -| 2343 | func_8017CF9C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017CF9C.c` | -| 2344 | func_8017D920 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D920.c` | -| 2345 | func_8017D8AC | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D8AC.c` | -| 2346 | func_801832B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801832B0.c` | -| 2347 | func_801875C4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801875C4.c` | -| 2348 | func_801813B8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801813B8.c` | -| 2349 | func_80183664 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183664.c` | -| 2350 | func_80184734 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80184734.c` | -| 2351 | func_80185394 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185394.c` | -| 2352 | func_801825C8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801825C8.c` | -| 2353 | func_801801D4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801801D4.c` | -| 2354 | func_8018ADC0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018ADC0.c` | -| 2355 | func_8017FE20 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FE20.c` | -| 2356 | func_80182CC0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182CC0.c` | -| 2357 | func_801830B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801830B0.c` | -| 2358 | func_80182A5C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182A5C.c` | -| 2359 | func_80182E30 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182E30.c` | -| 2360 | func_8018240C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018240C.c` | -| 2361 | func_8017BF08 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017BF08.c` | -| 2362 | func_80185954 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185954.c` | -| 2363 | func_80182BFC | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182BFC.c` | -| 2364 | func_80183430 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183430.c` | -| 2365 | func_801872F8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801872F8.c` | -| 2366 | func_801855E8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801855E8.c` | -| 2367 | func_8017D58C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D58C.c` | -| 2368 | func_80186120 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80186120.c` | -| 2369 | func_8018828C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018828C.c` | -| 2370 | func_8018108C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018108C.c` | -| 2371 | func_801848B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801848B0.c` | -| 2372 | func_80181688 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181688.c` | -| 2373 | func_80181034 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181034.c` | -| 2374 | func_80188508 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80188508.c` | -| 2375 | func_801844E8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801844E8.c` | -| 2376 | func_80187370 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80187370.c` | -| 2377 | func_8018D330 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018D330.c` | -| 2378 | func_80186A70 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80186A70.c` | -| 2379 | func_8017DBE4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017DBE4.c` | -| 2380 | func_8017F474 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017F474.c` | -| 2381 | func_8017E804 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E804.c` | -| 2382 | func_80182D50 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182D50.c` | -| 2383 | func_801843B8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801843B8.c` | -| 2384 | func_80184804 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80184804.c` | -| 2385 | func_80183D60 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183D60.c` | -| 2386 | func_80181C84 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181C84.c` | -| 2387 | func_801842D4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801842D4.c` | -| 2388 | func_80185EB4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185EB4.c` | -| 2389 | func_80188690 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80188690.c` | -| 2390 | func_80185F20 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F20.c` | -| 2391 | func_80183FD8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183FD8.c` | -| 2392 | func_8018F658 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018F658.c` | -| 2393 | func_80164E40 | None | plumbing | None | near | 8 | none — MATCH (base &D_801D9728 held in one reg via u8* p, reused by byte ld/st + final word ld) | `.run/backlog_drafts/func_80164E40.c` | -| 2394 | func_80168828 | None | schedule | None | near | 8 | 8 residual (down from prior 32). idx0-14 and idx40-107 BYTE-EXACT; regalloc/loop/struct/ | `.run/backlog_drafts/func_80168828.c` | -| 2395 | func_8017F358 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F358.c` | -| 2396 | func_80180174 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180174.c` | -| 2397 | func_80180E9C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E9C.c` | -| 2398 | func_8017BEBC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017BEBC.c` | -| 2399 | func_80180854 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180854.c` | -| 2400 | func_80180E54 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E54.c` | -| 2401 | func_8017F7F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F7F4.c` | -| 2402 | func_8017F1A8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F1A8.c` | -| 2403 | func_8017EF28 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017EF28.c` | -| 2404 | func_8018A874 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018A874.c` | -| 2405 | func_8017EB24 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017EB24.c` | -| 2406 | func_801816E4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801816E4.c` | -| 2407 | func_8017D400 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D400.c` | -| 2408 | func_8017D6E8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D6E8.c` | -| 2409 | func_8017E4F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E4F8.c` | -| 2410 | func_801829F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801829F4.c` | -| 2411 | func_801822A8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801822A8.c` | -| 2412 | func_8017E954 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E954.c` | -| 2413 | func_801826FC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801826FC.c` | -| 2414 | func_80181F84 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181F84.c` | -| 2415 | func_801827FC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801827FC.c` | -| 2416 | func_8017FE88 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FE88.c` | -| 2417 | func_801806B8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801806B8.c` | -| 2418 | func_80180EC0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180EC0.c` | -| 2419 | func_80181C4C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181C4C.c` | -| 2420 | func_801847EC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801847EC.c` | -| 2421 | func_80182034 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182034.c` | -| 2422 | func_801817A4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801817A4.c` | -| 2423 | func_8017E52C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E52C.c` | -| 2424 | func_801805B0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801805B0.c` | -| 2425 | func_8018897C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018897C.c` | -| 2426 | func_8018AA88 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018AA88.c` | -| 2427 | func_8017FED4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FED4.c` | -| 2428 | func_801835F0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801835F0.c` | -| 2429 | func_8017CCD4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017CCD4.c` | -| 2430 | func_801858C4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801858C4.c` | -| 2431 | func_80185278 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80185278.c` | -| 2432 | func_8017FD78 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FD78.c` | -| 2433 | func_8018C310 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C310.c` | -| 2434 | func_80182AD4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182AD4.c` | -| 2435 | func_8018868C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018868C.c` | -| 2436 | func_8017F624 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F624.c` | -| 2437 | func_8017FEB4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FEB4.c` | -| 2438 | func_80182298 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182298.c` | -| 2439 | func_8018C878 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C878.c` | -| 2440 | func_8018531C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018531C.c` | -| 2441 | func_80187114 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80187114.c` | -| 2442 | func_80184590 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184590.c` | -| 2443 | func_80186B08 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80186B08.c` | -| 2444 | func_801802F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801802F8.c` | -| 2445 | func_80181B34 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181B34.c` | -| 2446 | func_80184C10 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184C10.c` | -| 2447 | func_801860F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801860F8.c` | -| 2448 | func_8017FFD8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FFD8.c` | -| 2449 | func_80188BF8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80188BF8.c` | -| 2450 | func_80183BD0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183BD0.c` | -| 2451 | func_801860F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801860F4.c` | -| 2452 | func_80183628 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183628.c` | -| 2453 | func_8018964C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018964C.c` | -| 2454 | func_801848D8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801848D8.c` | -| 2455 | func_801854C8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801854C8.c` | -| 2456 | func_8018A8CC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018A8CC.c` | -| 2457 | func_80184664 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184664.c` | -| 2458 | func_80181CE4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181CE4.c` | -| 2459 | func_80185528 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80185528.c` | -| 2460 | func_80187454 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80187454.c` | -| 2461 | func_8018292C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018292C.c` | -| 2462 | func_8017F7BC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F7BC.c` | -| 2463 | func_801830C8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801830C8.c` | -| 2464 | func_8017D4F0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D4F0.c` | -| 2465 | func_801825E8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801825E8.c` | -| 2466 | func_8018C3EC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C3EC.c` | -| 2467 | func_80183C1C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183C1C.c` | -| 2468 | func_8018F0E0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018F0E0.c` | -| 2469 | func_80185A00 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185A00.c` | -| 2470 | func_8017FCC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FCC0.c` | -| 2471 | func_8017F2D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F2D0.c` | -| 2472 | func_8017F27C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F27C.c` | -| 2473 | func_801833C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801833C8.c` | -| 2474 | func_8017E91C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E91C.c` | -| 2475 | func_8017D918 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D918.c` | -| 2476 | func_8017FFD0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FFD0.c` | -| 2477 | func_80180E34 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180E34.c` | -| 2478 | func_801844C4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801844C4.c` | -| 2479 | func_8018AB24 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018AB24.c` | -| 2480 | func_80188C84 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188C84.c` | -| 2481 | func_8017E184 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E184.c` | -| 2482 | func_8017D4C4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D4C4.c` | -| 2483 | func_80181434 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181434.c` | -| 2484 | func_80181A70 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181A70.c` | -| 2485 | func_8017D3D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D3D0.c` | -| 2486 | func_80181DC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181DC0.c` | -| 2487 | func_8017D564 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D564.c` | -| 2488 | func_8017DF88 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DF88.c` | -| 2489 | func_801841D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801841D0.c` | -| 2490 | func_8017D534 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D534.c` | -| 2491 | func_80181BE8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181BE8.c` | -| 2492 | func_80184204 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184204.c` | -| 2493 | func_8018534C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018534C.c` | -| 2494 | func_80184940 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184940.c` | -| 2495 | func_8017D540 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D540.c` | -| 2496 | func_80180B60 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180B60.c` | -| 2497 | func_8017FB0C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FB0C.c` | -| 2498 | func_8017D67C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D67C.c` | -| 2499 | func_8017E72C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E72C.c` | -| 2500 | func_8018175C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018175C.c` | -| 2501 | func_80189C4C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80189C4C.c` | -| 2502 | func_8017E670 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E670.c` | -| 2503 | func_80180014 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180014.c` | -| 2504 | func_8017E6D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E6D0.c` | -| 2505 | func_80180B90 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180B90.c` | -| 2506 | func_801801DC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801801DC.c` | -| 2507 | func_801848E8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801848E8.c` | -| 2508 | func_8017E094 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E094.c` | -| 2509 | func_8018082C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018082C.c` | -| 2510 | func_8018373C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018373C.c` | -| 2511 | func_8017D654 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D654.c` | -| 2512 | func_8017DF48 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DF48.c` | -| 2513 | func_8018290C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018290C.c` | -| 2514 | func_80182724 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182724.c` | -| 2515 | func_8018257C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018257C.c` | -| 2516 | func_80182EC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182EC0.c` | -| 2517 | func_80188E8C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188E8C.c` | -| 2518 | func_801806E0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801806E0.c` | -| 2519 | func_8018A5A4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018A5A4.c` | -| 2520 | func_80181AC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181AC0.c` | -| 2521 | func_8017D62C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D62C.c` | -| 2522 | func_801841A0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801841A0.c` | -| 2523 | func_80183744 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183744.c` | -| 2524 | func_8018924C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018924C.c` | -| 2525 | func_8017FFC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FFC0.c` | -| 2526 | func_8017EBD8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017EBD8.c` | -| 2527 | func_8017D514 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D514.c` | -| 2528 | func_80185778 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185778.c` | -| 2529 | func_8017EEC4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017EEC4.c` | -| 2530 | func_80184C68 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184C68.c` | -| 2531 | func_801870B4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801870B4.c` | -| 2532 | func_80185E3C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185E3C.c` | -| 2533 | func_8017F5E8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F5E8.c` | -| 2534 | func_801823D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801823D4.c` | -| 2535 | func_80186EE4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80186EE4.c` | -| 2536 | func_80180AF4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180AF4.c` | -| 2537 | func_801831FC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801831FC.c` | -| 2538 | func_801844C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801844C8.c` | -| 2539 | func_801862D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801862D4.c` | -| 2540 | func_80184578 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184578.c` | -| 2541 | func_80184634 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184634.c` | -| 2542 | func_8017F804 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F804.c` | -| 2543 | func_80183888 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183888.c` | -| 2544 | func_8017F2EC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F2EC.c` | -| 2545 | func_80188FAC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188FAC.c` | -| 2546 | func_80187224 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80187224.c` | -| 2547 | func_801850F8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801850F8.c` | -| 2548 | func_80183F7C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183F7C.c` | -| 2549 | func_801800DC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801800DC.c` | -| 2550 | func_8017F6D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F6D4.c` | -| 2551 | func_80182190 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182190.c` | -| 2552 | func_80182CB4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182CB4.c` | -| 2553 | func_80185C90 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185C90.c` | -| 2554 | func_80182380 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182380.c` | -| 2555 | func_80183524 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183524.c` | -| 2556 | func_8018EDB8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018EDB8.c` | -| 2557 | func_80190298 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80190298.c` | -| 2558 | func_80184F70 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184F70.c` | -| 2559 | func_80185060 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185060.c` | -| 2560 | func_8018311C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018311C.c` | -| 2561 | func_8018A594 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018A594.c` | -| 2562 | func_8017DED0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DED0.c` | -| 2563 | func_8017DAF0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DAF0.c` | -| 2564 | func_8018228C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018228C.c` | -| 2565 | func_80188738 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188738.c` | -| 2566 | func_801889E0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801889E0.c` | -| 2567 | func_8017DEEC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DEEC.c` | -| 2568 | func_80183FAC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183FAC.c` | -| 2569 | func_8017F300 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F300.c` | -| 2570 | func_80184794 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184794.c` | -| 2571 | func_80185648 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185648.c` | -| 2572 | func_80186D64 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80186D64.c` | -| 2573 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | -| 2574 | func_8017F7E8 | 1 | WAVE | 177 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_8017F7E8.c` | -| 2575 | func_801824D0 | 1 | WAVE | 181 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_801824D0.c` | -| 2576 | func_80165670 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80165670.c` | -| 2577 | func_80182F4C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F4C.c` | -| 2578 | func_801835C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835C8.c` | -| 2579 | func_8017D6C4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D6C4.c` | -| 2580 | func_8018268C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018268C.c` | -| 2581 | func_8018ACE8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018ACE8.c` | -| 2582 | func_80181960 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181960.c` | -| 2583 | func_8018283C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018283C.c` | -| 2584 | func_8017D7C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D7C8.c` | -| 2585 | func_8017F67C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F67C.c` | -| 2586 | func_80181724 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181724.c` | -| 2587 | func_8017F450 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F450.c` | -| 2588 | func_8017F128 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F128.c` | -| 2589 | func_80180154 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180154.c` | -| 2590 | func_80180240 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180240.c` | -| 2591 | func_8017D868 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D868.c` | -| 2592 | func_80185274 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80185274.c` | -| 2593 | func_8017E4AC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E4AC.c` | -| 2594 | func_8017FC30 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017FC30.c` | -| 2595 | func_8018825C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018825C.c` | -| 2596 | func_801833D4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801833D4.c` | -| 2597 | func_80184028 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80184028.c` | -| 2598 | func_8018485C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018485C.c` | -| 2599 | func_80185704 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80185704.c` | -| 2600 | func_80180EA8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180EA8.c` | -| 2601 | func_8018F91C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018F91C.c` | -| 2602 | func_80189354 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80189354.c` | -| 2603 | func_801835F4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835F4.c` | -| 2604 | func_801829FC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801829FC.c` | -| 2605 | func_80187404 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80187404.c` | -| 2606 | func_8018222C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018222C.c` | -| 2607 | func_801848B4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801848B4.c` | -| 2608 | func_8017E5D4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E5D4.c` | -| 2609 | func_8017DDE8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017DDE8.c` | -| 2610 | func_80182118 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182118.c` | -| 2611 | func_8017E2C0 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E2C0.c` | -| 2612 | func_80181744 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181744.c` | -| 2613 | func_8017EECC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017EECC.c` | -| 2614 | func_80182F78 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F78.c` | -| 2615 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | -| 2616 | func_8013C964 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013C964.c` | -| 2617 | func_8013B568 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013B568.c` | -| 2618 | func_80182E58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80182E58.c` | -| 2619 | func_8018150C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018150C.c` | -| 2620 | func_801803A4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801803A4.c` | -| 2621 | func_8017D7F8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017D7F8.c` | -| 2622 | func_8017FFFC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017FFFC.c` | -| 2623 | func_8018766C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018766C.c` | -| 2624 | func_8017DFF8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DFF8.c` | -| 2625 | func_8017D08C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017D08C.c` | -| 2626 | func_80180D70 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80180D70.c` | -| 2627 | func_8017DE40 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DE40.c` | -| 2628 | func_8017DBD8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DBD8.c` | -| 2629 | func_8017FB8C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017FB8C.c` | -| 2630 | func_801833BC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801833BC.c` | -| 2631 | func_8017F574 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017F574.c` | -| 2632 | func_801873B4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801873B4.c` | -| 2633 | func_80187344 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80187344.c` | -| 2634 | func_80183AC8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80183AC8.c` | -| 2635 | func_80181C08 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181C08.c` | -| 2636 | func_80185830 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80185830.c` | -| 2637 | func_801822C8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801822C8.c` | -| 2638 | func_80181388 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181388.c` | -| 2639 | func_80185C2C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80185C2C.c` | -| 2640 | func_80183BEC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80183BEC.c` | -| 2641 | func_8018CA0C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018CA0C.c` | -| 2642 | func_801846EC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801846EC.c` | -| 2643 | func_80184DB4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184DB4.c` | -| 2644 | func_8018AE08 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018AE08.c` | -| 2645 | func_80184698 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184698.c` | -| 2646 | func_80184718 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184718.c` | -| 2647 | func_8018134C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018134C.c` | -| 2648 | func_8017F4BC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017F4BC.c` | -| 2649 | func_80181070 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181070.c` | -| 2650 | func_801810A4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801810A4.c` | -| 2651 | func_801810D8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801810D8.c` | -| 2652 | func_801819CC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801819CC.c` | -| 2653 | func_80180554 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80180554.c` | -| 2654 | func_80181E5C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181E5C.c` | -| 2655 | func_80189DDC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80189DDC.c` | -| 2656 | func_8018AD70 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018AD70.c` | -| 2657 | func_8018ABE0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018ABE0.c` | -| 2658 | func_80189A60 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80189A60.c` | -| 2659 | func_8018278C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018278C.c` | -| 2660 | func_801827C0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801827C0.c` | -| 2661 | func_80186A58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80186A58.c` | -| 2662 | func_8018BFC8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018BFC8.c` | -| 2663 | func_80156044 | None | regalloc-order | None | near | 12 | none — MATCH (74 ins) | `.run/backlog_drafts/func_80156044.c` | -| 2664 | func_8013E83C | 1 | plumbing | 71 | near | 13 | none — MATCH (scalar global stores + two branches; scheduling of the (*(unsigned short *)&D_80115110) load hoist reproduced by -O2) | `.run/backlog_drafts/func_8013E83C.c` | -| 2665 | func_80185F58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185F58.c` | -| 2666 | func_8018A3C8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018A3C8.c` | -| 2667 | func_8017EA20 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EA20.c` | -| 2668 | func_80180528 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180528.c` | -| 2669 | func_8017FD44 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017FD44.c` | -| 2670 | func_8017F434 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017F434.c` | -| 2671 | func_80185EDC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185EDC.c` | -| 2672 | func_8017E414 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E414.c` | -| 2673 | func_8017E5DC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E5DC.c` | -| 2674 | func_80180BCC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180BCC.c` | -| 2675 | func_801818EC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801818EC.c` | -| 2676 | func_8017DA3C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017DA3C.c` | -| 2677 | func_8017EDA8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EDA8.c` | -| 2678 | func_801816CC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801816CC.c` | -| 2679 | func_8017E51C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E51C.c` | -| 2680 | func_80185C08 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185C08.c` | -| 2681 | func_80189F74 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80189F74.c` | -| 2682 | func_8017D914 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017D914.c` | -| 2683 | func_801828A8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801828A8.c` | -| 2684 | func_8017FD58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017FD58.c` | -| 2685 | func_80185238 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185238.c` | -| 2686 | func_8017F830 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017F830.c` | -| 2687 | func_801807B8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801807B8.c` | -| 2688 | func_8018276C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018276C.c` | -| 2689 | func_801851D8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801851D8.c` | -| 2690 | func_8018E010 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018E010.c` | -| 2691 | func_8018BF34 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018BF34.c` | -| 2692 | func_80183AF8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80183AF8.c` | -| 2693 | func_801858D0 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801858D0.c` | -| 2694 | func_80180C34 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180C34.c` | -| 2695 | func_80182D3C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80182D3C.c` | -| 2696 | func_8018BDA4 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018BDA4.c` | -| 2697 | func_8017C8E4 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017C8E4.c` | -| 2698 | func_80186D30 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80186D30.c` | -| 2699 | func_80182D6C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80182D6C.c` | -| 2700 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | -| 2701 | func_80180D10 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D10.c` | -| 2702 | func_8018316C | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018316C.c` | -| 2703 | func_8017DFC4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017DFC4.c` | -| 2704 | func_8017EB38 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017EB38.c` | -| 2705 | func_80180D44 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D44.c` | -| 2706 | func_8017E808 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017E808.c` | -| 2707 | func_801807F8 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801807F8.c` | -| 2708 | func_80180CC0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180CC0.c` | -| 2709 | func_80183094 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80183094.c` | -| 2710 | func_8017EDC4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017EDC4.c` | -| 2711 | func_80180654 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180654.c` | -| 2712 | func_8017C6F4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017C6F4.c` | -| 2713 | func_8017E4F0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017E4F0.c` | -| 2714 | func_8018B2DC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018B2DC.c` | -| 2715 | func_80183398 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80183398.c` | -| 2716 | func_801812F0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801812F0.c` | -| 2717 | func_80181468 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80181468.c` | -| 2718 | func_80184384 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80184384.c` | -| 2719 | func_8018A934 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018A934.c` | -| 2720 | func_8018B50C | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018B50C.c` | -| 2721 | func_80182844 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80182844.c` | -| 2722 | func_801884AC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801884AC.c` | -| 2723 | func_80181B90 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80181B90.c` | -| 2724 | func_80185F98 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185F98.c` | -| 2725 | func_80185EEC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185EEC.c` | -| 2726 | func_80186DE8 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80186DE8.c` | -| 2727 | func_801838EC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801838EC.c` | -| 2728 | func_80182348 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80182348.c` | -| 2729 | func_80185CD4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185CD4.c` | -| 2730 | func_801892C0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801892C0.c` | -| 2731 | func_801859E4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801859E4.c` | -| 2732 | func_80184B70 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80184B70.c` | -| 2733 | func_801871C4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801871C4.c` | -| 2734 | func_80189504 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80189504.c` | -| 2735 | func_8017C918 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017C918.c` | -| 2736 | func_801824CC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801824CC.c` | -| 2737 | func_80181784 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80181784.c` | -| 2738 | func_8017FFE8 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017FFE8.c` | -| 2739 | func_80180AAC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80180AAC.c` | -| 2740 | func_80180218 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80180218.c` | -| 2741 | func_8017FFF8 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017FFF8.c` | -| 2742 | func_80183DC4 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80183DC4.c` | -| 2743 | func_801820F0 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801820F0.c` | -| 2744 | func_8018B0EC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018B0EC.c` | -| 2745 | func_801803F4 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801803F4.c` | -| 2746 | func_8018E6EC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018E6EC.c` | -| 2747 | func_8017E818 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017E818.c` | -| 2748 | func_80181B0C | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80181B0C.c` | -| 2749 | func_80184010 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80184010.c` | -| 2750 | func_8018648C | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018648C.c` | -| 2751 | func_8017F138 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017F138.c` | -| 2752 | func_8013C938 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8013C938.c` | -| 2753 | func_8017D2F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017D2F0.c` | -| 2754 | func_8017E2A8 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E2A8.c` | -| 2755 | func_8017E0F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E0F0.c` | -| 2756 | func_8017E7D8 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E7D8.c` | -| 2757 | func_80183988 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80183988.c` | -| 2758 | func_80184154 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80184154.c` | -| 2759 | func_80182D78 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80182D78.c` | -| 2760 | func_80183074 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80183074.c` | -| 2761 | func_80184EA4 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80184EA4.c` | -| 2762 | func_8017F920 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017F920.c` | -| 2763 | func_80180EDC | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80180EDC.c` | -| 2764 | func_8017D2D0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D2D0.c` | -| 2765 | func_8017EEF4 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017EEF4.c` | -| 2766 | func_8017EB98 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017EB98.c` | -| 2767 | func_8017D8D4 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D8D4.c` | -| 2768 | func_8017E814 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017E814.c` | -| 2769 | func_80184EE0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80184EE0.c` | -| 2770 | func_80180BE0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80180BE0.c` | -| 2771 | func_8017FA44 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017FA44.c` | -| 2772 | func_801851E0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_801851E0.c` | -| 2773 | func_80186F60 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80186F60.c` | -| 2774 | func_80182D1C | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80182D1C.c` | -| 2775 | func_8018384C | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8018384C.c` | -| 2776 | func_8017F198 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017F198.c` | -| 2777 | func_8017E9D4 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017E9D4.c` | -| 2778 | func_8018AD5C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8018AD5C.c` | -| 2779 | func_80181C04 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_80181C04.c` | -| 2780 | func_8018208C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8018208C.c` | -| 2781 | func_8017FD6C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017FD6C.c` | -| 2782 | func_801877DC | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_801877DC.c` | -| 2783 | func_8014FE60 | None | schedule | None | near | 18 | none — MATCH | `.run/backlog_drafts/func_8014FE60.c` | -| 2784 | func_8017E9E4 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_8017E9E4.c` | -| 2785 | func_801827D4 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_801827D4.c` | -| 2786 | func_80185888 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80185888.c` | -| 2787 | func_80180574 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80180574.c` | -| 2788 | func_80183F1C | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80183F1C.c` | -| 2789 | func_8017FFCC | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_8017FFCC.c` | -| 2790 | func_80182344 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80182344.c` | -| 2791 | func_801802B4 | None | | None | near | 20 | residual: 20 mismatch | `.run/backlog_drafts/func_801802B4.c` | -| 2792 | func_8012ACE0 | 1 | STRUCT | 25 | near | 21 | STRUCT: 21 mismatch | `.run/backlog_drafts/func_8012ACE0.c` | -| 2793 | func_8015E018 | 1 | WAVE | 47 | near | 21 | WAVE: 21 mismatch | `.run/backlog_drafts/func_8015E018.c` | -| 2794 | func_8013E958 | 1 | schedule | 63 | near | 21 | none — MATCH (63 ins). Key: the extra `andi 0xFF` is the zero_extendqihi2 that | `.run/backlog_drafts/func_8013E958.c` | -| 2795 | func_8017DF68 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8017DF68.c` | -| 2796 | func_8017C6B8 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8017C6B8.c` | -| 2797 | func_80183D5C | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80183D5C.c` | -| 2798 | func_8018A708 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8018A708.c` | -| 2799 | func_801871E8 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_801871E8.c` | -| 2800 | func_80186758 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80186758.c` | -| 2801 | func_80188668 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80188668.c` | -| 2802 | func_8017E754 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8017E754.c` | -| 2803 | func_8018A680 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8018A680.c` | -| 2804 | func_80185B78 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_80185B78.c` | -| 2805 | func_80185A18 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_80185A18.c` | -| 2806 | func_8018ADE4 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8018ADE4.c` | -| 2807 | func_80164930 | None | regalloc-order | None | near | 22 | TBD — first draft, validating structure + s0/s1/s2/s3 allocation | `.run/backlog_drafts/func_80164930.c` | -| 2808 | func_8017E5A0 | None | | None | near | 23 | residual: 23 mismatch | `.run/backlog_drafts/func_8017E5A0.c` | -| 2809 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | -| 2810 | func_80182488 | None | | None | near | 24 | residual: 24 mismatch | `.run/backlog_drafts/func_80182488.c` | -| 2811 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | -| 2812 | func_8018DFDC | None | | None | near | 25 | residual: 25 mismatch | `.run/backlog_drafts/func_8018DFDC.c` | -| 2813 | func_8017FB68 | None | | None | near | 26 | residual: 26 mismatch | `.run/backlog_drafts/func_8017FB68.c` | -| 2814 | func_801900F4 | None | | None | near | 27 | residual: 27 mismatch | `.run/backlog_drafts/func_801900F4.c` | -| 2815 | func_8012DE2C | 1 | plumbing | 35 | near | 31 | none — MATCH (35/35 ins, relocation-masked) | `.run/backlog_drafts/func_8012DE2C.c` | -| 2816 | func_80139BE0 | 1 | loose-typing | 39 | near | 32 | target has redundant andi a1,v0,0xff (uchar zero-extend) gcc proves away; else identical | `.run/backlog_drafts/func_80139BE0.c` | -| 2817 | func_8012DDA4 | 1 | regalloc-order | 34 | near | 33 | none — MATCH | `.run/backlog_drafts/func_8012DDA4.c` | -| 2818 | func_8018E17C | None | | None | near | 35 | residual: 35 mismatch | `.run/backlog_drafts/func_8018E17C.c` | -| 2819 | func_80180F08 | None | | None | near | 37 | residual: 37 mismatch | `.run/backlog_drafts/func_80180F08.c` | -| 2820 | func_8017DB58 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017DB58.c` | -| 2821 | func_8017E840 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017E840.c` | -| 2822 | func_8017FF54 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017FF54.c` | -| 2823 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | -| 2824 | func_80180CEC | None | | None | near | 45 | residual: 45 mismatch | `.run/backlog_drafts/func_80180CEC.c` | -| 2825 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | -| 2826 | func_8017B0E4 | None | plumbing | None | near | 51 | none — MATCH | `.run/backlog_drafts/func_8017B0E4.c` | -| 2827 | func_80186A0C | None | | None | near | 53 | residual: 53 mismatch | `.run/backlog_drafts/func_80186A0C.c` | -| 2828 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | -| 2829 | func_80166F58 | None | regalloc-order | None | near | 57 | none — MATCH (69 ins). Pins $s4/$s1 for param_2/param_3 + a1/a2-pinned temps | `.run/backlog_drafts/func_80166F58.c` | -| 2830 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | -| 2831 | func_8012E364 | 1 | regalloc-order | 67 | near | 60 | 23/67 masked. Structure+idioms exact (barrier fixes the late D9498 load; k=0x1000 CSE'd into $a3 hoisted to the blez delay slot; 6 register pins land arg/$a2, k/$a3, D9498/$v1, temp_a1/$a1, var_v0(_2)/$v0). Residual is the discontinuous q<->temp_v0 reuse chain (q reuses $v0 but target puts it in $a0 reusing x's dead reg; every whole-function pin that forces q->$a0 chains hi>>5 or var_v0 wrong) + 2nd-half schedule (0x2C lhu interleaved before the +k addu; the abs copies temp_v1->$v0 via addu-move). Permuter-class (register renaming) but pins block pycparser -> hand/human finish. | `.run/backlog_drafts/func_8012E364.c` | -| 2832 | func_8016C188 | None | regalloc-order | None | near | 63 | TBD — natural regalloc for param_1/iVar1/&(*(s32 *)&D_801D9B84) across calls | `.run/backlog_drafts/func_8016C188.c` | -| 2833 | func_801457A4 | 1 | other | 79 | near | 74 | MATCH at -O0 (79 ins, reloc-masked, real -O0 flags). BANKING BLOCKER: this -O0 fn lives in the -O2 main ov_SC01_077.c; needs its own §18 -O0 split at 0x801457A4 (existing _o0.c covers 0x8013B568..0x8013C98C only). match_one is -O2 -> WRONG here. | `.run/backlog_drafts/func_801457A4.c` | -| 2834 | func_801418F8 | 1 | loose-typing | 90 | near | 74 | none — MATCH (90 ins). (*(volatile u16 *)&D_8011511A) must be volatile to force the read-back | `.run/backlog_drafts/func_801418F8.c` | -| 2835 | func_8016B6BC | 1 | schedule | 94 | near | 80 | 12-off, all in the last 12 ins (tail). First 82 ins byte-match. Target materializes | `.run/backlog_drafts/func_8016B6BC.c` | -| 2836 | func_801343C4 | 1 | schedule | 83 | near | 82 | none — MATCH (83 ins, relocation-masked) | `.run/backlog_drafts/func_801343C4.c` | -| 2837 | func_80134A74 | 1 | regalloc-order | 107 | near | 84 | structure + all 8 callee-saved regs (s0..s7) + block layout MATCH; residual is caller-saved-temp | `.run/backlog_drafts/func_80134A74.c` | -| 2838 | func_8013EE10 | 1 | struct | 94 | near | 86 | none — MATCH (94 ins). array-of-struct %lo-fold (E[]) for the 5-elt loops; | `.run/backlog_drafts/func_8013EE10.c` | -| 2839 | func_80133AB0 | 1 | regalloc-order | 137 | near | 91 | near-miss ~91 (naive idx; first 37 ins byte-exact). Logic fully reconstructed. pA pin to | `.run/backlog_drafts/func_80133AB0.c` | -| 2840 | func_8014F4C0 | None | | None | near | 127 | residual: 127 mismatch | `.run/backlog_drafts/func_8014F4C0.c` | -| 2841 | func_80166994 | None | schedule | None | near | 355 | none — MATCH (369 ins, relocation-masked) | `.run/backlog_drafts/func_80166994.c` | -| 2842 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | -| 2843 | func_8012D664 | 1 | schedule | 44 | failed | | none — MATCH | `.run/backlog_drafts/func_8012D664.c` | -| 2844 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | -| 2845 | func_80134510 | 1 | schedule | 58 | failed | | none — MATCH (58 ins) | `.run/backlog_drafts/func_80134510.c` | -| 2846 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | -| 2847 | func_80180F10 | 1 | schedule | 75 | failed | | none — MATCH (aggregate-initializer form schedules const setup after the prologue saves) | `.run/backlog_drafts/func_80180F10.c` | -| 2848 | func_8016C188 | 1 | schedule | 79 | failed | | none — MATCH (79 ins, match_one). Levers: invert if to if(iVar1!=0){big}else{small} | `.run/backlog_drafts/func_8016C188.c` | -| 2849 | func_80164930 | 1 | regalloc-order | 81 | failed | | none — MATCH (81 ins, relocation-masked) | `.run/backlog_drafts/func_80164930.c` | -| 2850 | func_80131170 | 1 | loop-guard | 88 | failed | | none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps | `.run/backlog_drafts/func_80131170.c` | -| 2851 | func_80135004 | 1 | plumbing | 89 | failed | | MATCH (89 ins). To BANK: retype (*(s16 * *)&D_801870B0) + (*(s16 * *)&D_801870AC) (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). | `.run/backlog_drafts/func_80135004.c` | -| 2852 | func_801789AC | 1 | struct | 91 | failed | | none — MATCH (91 ins, relocation-masked) | `.run/backlog_drafts/func_801789AC.c` | -| 2853 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` | -| 2854 | func_801506A4 | 1 | loose-typing | 95 | failed | | none — MATCH (95 ins). switch var must be int not u16 (u16 adds andi 0xffff promotion mask) | `.run/backlog_drafts/func_801506A4.c` | -| 2855 | func_8016BFD0 | 1 | struct | 95 | failed | | none — MATCH (95 ins). memcpy(d,s,4) -> lwl/lwr/swl/swr; MATRIX work buf as s32[16] (0x40, fills 0x10-0x4f, t[] = buf[5..7]); two SVECTOR locals at 0x50/0x58; natural saved-reg order s0=param_5/s1=param_4/s2=iVar5 | `.run/backlog_drafts/func_8016BFD0.c` | -| 2856 | func_8017B490 | 1 | schedule | 97 | failed | | none — MATCH (97 ins). Keys: (1) inverted if so the SV4 block-copy else is fallthrough and block A is bnez-far (cond = (u32)&D_801DA73C >= 0xB, a relocated-symbol compare gcc can't fold); (2) SV4{s16 a,b,c,d} align-2 8-byte copy -> lwl/lwr/swl/swr, locals at sp+0x10/0x18; (3) the DEAD block-A index = (s32)&D_801DA73C into D_8018A45C[] (WAVE16=two SV4) needs BOTH source addrs (&[idx].v0,&[idx].v1) in EXPLICIT TEMPS before call1 so base (&D_8018A45C) dies pre-call -> temp $v0 (not callee-saved), forcing the natural 2-reg alloc idx=$s0/param_1=$s1 + src2 into call1's delay slot; (4) tail: D_801DA794/D_801DA78C are SV4, re-read .a/.b/.c via lh sign-extended to s32 stores. | `.run/backlog_drafts/func_8017B490.c` | -| 2857 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` | -| 2858 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` | -| 2859 | func_8013AD38 | 1 | schedule | 122 | failed | | none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` | `.run/backlog_drafts/func_8013AD38.c` | -| 2860 | func_80131E00 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80131E00.c` | -| 2861 | func_80130D0C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80130D0C.c` | -| 2862 | func_80141788 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80141788.c` | -| 2863 | func_8017D8DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D8DC.c` | -| 2864 | func_8017F14C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F14C.c` | -| 2865 | func_80187750 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80187750.c` | -| 2866 | func_80180C70 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180C70.c` | -| 2867 | func_8017DBF4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DBF4.c` | -| 2868 | func_8017FFEC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFEC.c` | -| 2869 | func_80181918 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181918.c` | -| 2870 | func_80184018 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184018.c` | -| 2871 | func_8017DC18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DC18.c` | -| 2872 | func_801853CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801853CC.c` | -| 2873 | func_80181894 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181894.c` | -| 2874 | func_80180D18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D18.c` | -| 2875 | func_8018BFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018BFBC.c` | -| 2876 | func_80180D9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D9C.c` | -| 2877 | func_801807F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801807F4.c` | -| 2878 | func_8017FFC8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC8.c` | -| 2879 | func_8017FFA0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFA0.c` | -| 2880 | func_8017E99C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E99C.c` | -| 2881 | func_80180058 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180058.c` | -| 2882 | func_80180188 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180188.c` | -| 2883 | func_8017D584 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D584.c` | -| 2884 | func_80180294 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180294.c` | -| 2885 | func_80184504 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184504.c` | -| 2886 | func_80180B1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180B1C.c` | -| 2887 | func_80184B80 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184B80.c` | -| 2888 | func_8017E76C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E76C.c` | -| 2889 | func_8017D5B4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D5B4.c` | -| 2890 | func_8017F29C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F29C.c` | -| 2891 | func_8018253C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018253C.c` | -| 2892 | func_80181D6C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181D6C.c` | -| 2893 | func_8017F00C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F00C.c` | -| 2894 | func_801802B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801802B0.c` | -| 2895 | func_80181FDC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181FDC.c` | -| 2896 | func_8017DB3C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DB3C.c` | -| 2897 | func_801854DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801854DC.c` | -| 2898 | func_8017DA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DA1C.c` | -| 2899 | func_80180D04 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D04.c` | -| 2900 | func_8017BF20 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017BF20.c` | -| 2901 | func_8017FFC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC4.c` | -| 2902 | func_8017C004 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017C004.c` | -| 2903 | func_8017E2F0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E2F0.c` | -| 2904 | func_8017F4D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F4D4.c` | -| 2905 | func_8017E780 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E780.c` | -| 2906 | func_8018358C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018358C.c` | -| 2907 | func_801841E4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801841E4.c` | -| 2908 | func_80181738 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181738.c` | -| 2909 | func_801873D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801873D8.c` | -| 2910 | func_80181E90 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181E90.c` | -| 2911 | func_80185628 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185628.c` | -| 2912 | func_80186960 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186960.c` | -| 2913 | func_80186570 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186570.c` | -| 2914 | func_8018C840 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018C840.c` | -| 2915 | func_80183920 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183920.c` | -| 2916 | func_801904E0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801904E0.c` | -| 2917 | func_80182384 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80182384.c` | -| 2918 | func_80184268 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184268.c` | -| 2919 | func_801839BC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801839BC.c` | -| 2920 | func_80184234 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184234.c` | -| 2921 | func_801829D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801829D8.c` | -| 2922 | func_80181A78 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181A78.c` | -| 2923 | func_8018C9B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018C9B0.c` | -| 2924 | func_80186E58 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186E58.c` | -| 2925 | func_8018720C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018720C.c` | -| 2926 | func_801821FC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801821FC.c` | -| 2927 | func_80183BF0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183BF0.c` | -| 2928 | func_80180EC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180EC4.c` | -| 2929 | func_80183954 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183954.c` | -| 2930 | func_801805D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801805D4.c` | -| 2931 | func_8017EA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017EA1C.c` | -| 2932 | func_8017FE2C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FE2C.c` | -| 2933 | func_80181FA4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181FA4.c` | -| 2934 | func_80184558 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184558.c` | -| 2935 | func_8017F098 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F098.c` | -| 2936 | func_801822CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801822CC.c` | -| 2937 | func_80185BA8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185BA8.c` | -| 2938 | func_8018AECC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018AECC.c` | -| 2939 | func_8018E710 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018E710.c` | -| 2940 | func_8017FFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFBC.c` | -| 2941 | func_80183F80 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183F80.c` | -| 2942 | func_80182D9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80182D9C.c` | -| 2943 | func_80183028 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183028.c` | -| 2944 | func_80183104 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183104.c` | -| 2945 | func_801831EC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801831EC.c` | -| 2946 | func_8018326C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018326C.c` | -| 2947 | func_8018AA70 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018AA70.c` | -| 2948 | func_8018305C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018305C.c` | -| 2949 | func_801852D0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801852D0.c` | -| 2950 | func_8014D820 | None | schedule | None | failed | | structurally complete (LCS 228/304, exact 304-ins count; all calls/consts/control-flow/ | `.run/backlog_drafts/func_8014D820.c` | -| 2951 | func_8014DD8C | None | schedule | None | failed | | prologue d0/d2 computed in-place into $fp/$s7; target computes them in caller-saved $v0/$v1 then copies (addu $fp,$v0 / addu $s7,$v1 in the beqz delay slot) — a live-range-split the whole loop body already matches around | `.run/backlog_drafts/func_8014DD8C.c` | -| 2952 | func_8016BFD0 | None | struct | None | failed | | none — MATCH (95 ins). Keys: (1) 4-byte unaligned copies via `struct{char b[4];}` | `.run/backlog_drafts/func_8016BFD0.c` | -| 2953 | func_8017B490 | None | schedule | None | failed | | 3-off (97/97 ins, regs correct, tail 100% matched). Sole residual is the statically-dead | `.run/backlog_drafts/func_8017B490.c` | -| 2954 | func_80163408 | None | struct | None | failed | | none — MATCH (21 ins, relocation-masked) | `.run/backlog_drafts/func_80163408.c` | -| 2955 | func_80165140 | None | struct | None | failed | | none — MATCH (30 ins) | `.run/backlog_drafts/func_80165140.c` | -| 2956 | func_8016E95C | None | struct | None | failed | | none — MATCH (36/36 ins, match_one relocation-masked) | `.run/backlog_drafts/func_8016E95C.c` | -| 2957 | func_80178B70 | None | regalloc-order | None | failed | | none — MATCH (pending verify) | `.run/backlog_drafts/func_80178B70.c` | -| 2958 | func_801457A4 | None | other | None | failed | | none — MATCH (79 ins, relocation-masked). NOTE: -O0 fn (frame-ptr prologue) — must be | `.run/backlog_drafts/func_801457A4.c` | -| 2959 | func_80145CEC | None | struct | None | failed | | 2 residuals — (1) target RELOADS global ptr D_80126B78 before each of its 5 field accesses (f28/f18/f1a/f1c/f2c); gcc-2.7.2 CSEs the single pointer load in every clean-C form I tried (int-cast, (s8*)/(s32) M2C_FIELD, struct*), keeping ONE load. volatile forces reloads but hoists them + leaves delay-slot nops the target fills (target is NOT volatile). (2) frame 0x20 not 0x18: target reserves an unused 8-byte stack local @0x10 (address-taken local — reproduced, but every code-free escape optimizes away and a visible escape corrupts the ((int (*)(void))func_80145EE8)(0) arg). Structure/order/values/callees all match; only the alias-driven reload chain + the phantom frame local remain. Family exemplar (~130 overlays). | `.run/backlog_drafts/func_80145CEC.c` | -| 2960 | func_8016D1D8 | None | struct | None | failed | | none — MATCH (148/148) | `.run/backlog_drafts/func_8016D1D8.c` | -| 2961 | func_8017B614 | None | regalloc-order | None | failed | | 22 (from 57). Structure fully matches (SV4 align-2 block-moves + globals block + delay-slot | `.run/backlog_drafts/func_8017B614.c` | +| 201 | func_8013DD68 | 1 | regalloc-order | 187 | near | 0 | none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf 0x68 -> frame 0xA0. | `.run/backlog_drafts/func_8013DD68.c` | +| 202 | func_8013B274 | 1 | schedule | 189 | near | 0 | none — MATCH (189/189). Levers: (1) POLY_FT4 UV stores in per-vertex source order | `.run/backlog_drafts/func_8013B274.c` | +| 203 | func_8018103C | 1 | STRUCT | 579 | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018103C.c` | +| 204 | func_80165658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80165658.c` | +| 205 | func_8017CFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFD4.c` | +| 206 | func_8017CFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFFC.c` | +| 207 | func_8017CF78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF78.c` | +| 208 | func_8017CFA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA0.c` | +| 209 | func_8017D13C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D13C.c` | +| 210 | func_8017D164 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D164.c` | +| 211 | func_8017D18C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D18C.c` | +| 212 | func_8017DA9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA9C.c` | +| 213 | func_8017D5D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D4.c` | +| 214 | func_8017D5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5FC.c` | +| 215 | func_8017D02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D02C.c` | +| 216 | func_8017D054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D054.c` | +| 217 | func_8017D07C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D07C.c` | +| 218 | func_8017D430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D430.c` | +| 219 | func_8017D134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D134.c` | +| 220 | func_8017D15C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D15C.c` | +| 221 | func_8017D3FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3FC.c` | +| 222 | func_8017D6D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D4.c` | +| 223 | func_8017D964 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D964.c` | +| 224 | func_8017F458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F458.c` | +| 225 | func_8018A660 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A660.c` | +| 226 | func_80161C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80161C98.c` | +| 227 | func_80171120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171120.c` | +| 228 | func_80157544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157544.c` | +| 229 | func_8015DE58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015DE58.c` | +| 230 | func_801678B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801678B4.c` | +| 231 | func_8016F6E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F6E0.c` | +| 232 | func_8016FDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FDB4.c` | +| 233 | func_8016FFDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FFDC.c` | +| 234 | func_8017D418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D418.c` | +| 235 | func_8017D440 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D440.c` | +| 236 | func_8017E034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E034.c` | +| 237 | func_8017ED30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED30.c` | +| 238 | func_8017ED58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED58.c` | +| 239 | func_80157DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157DC4.c` | +| 240 | func_80164EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164EA4.c` | +| 241 | func_8016F8E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F8E4.c` | +| 242 | func_80171064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171064.c` | +| 243 | func_801727D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801727D0.c` | +| 244 | func_801747CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801747CC.c` | +| 245 | func_8017EE24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE24.c` | +| 246 | func_8017F40C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F40C.c` | +| 247 | func_8017D34C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D34C.c` | +| 248 | func_8017D374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D374.c` | +| 249 | func_8017F080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F080.c` | +| 250 | func_801866B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801866B0.c` | +| 251 | func_8017D00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D00C.c` | +| 252 | func_8017D034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D034.c` | +| 253 | func_80131FDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FDC.c` | +| 254 | func_80152370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152370.c` | +| 255 | func_8015E8E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E8E8.c` | +| 256 | func_80168D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168D58.c` | +| 257 | func_8016AB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016AB30.c` | +| 258 | func_8016CB84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016CB84.c` | +| 259 | func_8016FC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FC90.c` | +| 260 | func_80170748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170748.c` | +| 261 | func_80174888 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174888.c` | +| 262 | func_80143B30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143B30.c` | +| 263 | func_80143E68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143E68.c` | +| 264 | func_8015E1B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015E1B8.c` | +| 265 | func_80167A9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80167A9C.c` | +| 266 | func_801693CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801693CC.c` | +| 267 | func_80169F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169F00.c` | +| 268 | func_801704B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801704B0.c` | +| 269 | func_80170BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170BD8.c` | +| 270 | func_80170EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170EFC.c` | +| 271 | func_801714E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801714E4.c` | +| 272 | func_80173544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173544.c` | +| 273 | func_801742A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801742A4.c` | +| 274 | func_80174474 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174474.c` | +| 275 | func_8017D26C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D26C.c` | +| 276 | func_8017D7A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7A4.c` | +| 277 | func_80155580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80155580.c` | +| 278 | func_80159698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159698.c` | +| 279 | func_8015BFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BFF4.c` | +| 280 | func_8015F00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F00C.c` | +| 281 | func_80160EA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160EA4.c` | +| 282 | func_80166618 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166618.c` | +| 283 | func_8016DEA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016DEA4.c` | +| 284 | func_8016F834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F834.c` | +| 285 | func_801705F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801705F8.c` | +| 286 | func_80170810 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170810.c` | +| 287 | func_80172DAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172DAC.c` | +| 288 | func_8017CD9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD9C.c` | +| 289 | func_80136C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80136C54.c` | +| 290 | func_80153320 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153320.c` | +| 291 | func_80159B70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159B70.c` | +| 292 | func_80166018 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166018.c` | +| 293 | func_80166654 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80166654.c` | +| 294 | func_8016A700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A700.c` | +| 295 | func_8016BBA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016BBA4.c` | +| 296 | func_8016FB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FB7C.c` | +| 297 | func_8017F1C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1C8.c` | +| 298 | func_80182B9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B9C.c` | +| 299 | func_80131F64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131F64.c` | +| 300 | func_801425CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801425CC.c` | +| 301 | func_80152D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152D24.c` | +| 302 | func_801599A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801599A4.c` | +| 303 | func_8015C714 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015C714.c` | +| 304 | func_8015EE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015EE08.c` | +| 305 | func_8015F324 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F324.c` | +| 306 | func_801659DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801659DC.c` | +| 307 | func_8016D19C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016D19C.c` | +| 308 | func_801736FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801736FC.c` | +| 309 | func_801737E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801737E8.c` | +| 310 | func_8017CFE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFE4.c` | +| 311 | func_8017D1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1F8.c` | +| 312 | func_80143C38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143C38.c` | +| 313 | func_80159968 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80159968.c` | +| 314 | func_8015D4E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015D4E8.c` | +| 315 | func_80160138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80160138.c` | +| 316 | func_80162330 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162330.c` | +| 317 | func_801663FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801663FC.c` | +| 318 | func_80168744 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168744.c` | +| 319 | func_80170548 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170548.c` | +| 320 | func_80173078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173078.c` | +| 321 | func_8017390C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017390C.c` | +| 322 | func_8017496C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017496C.c` | +| 323 | func_8017BEC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEC4.c` | +| 324 | func_8017D310 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D310.c` | +| 325 | func_801449C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801449C8.c` | +| 326 | func_80151D24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151D24.c` | +| 327 | func_80153060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80153060.c` | +| 328 | func_8015824C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015824C.c` | +| 329 | func_8015AD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015AD3C.c` | +| 330 | func_8015BE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015BE38.c` | +| 331 | func_8015F7D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015F7D4.c` | +| 332 | func_80169830 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169830.c` | +| 333 | func_8016C14C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016C14C.c` | +| 334 | func_8016F798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F798.c` | +| 335 | func_8016FA84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FA84.c` | +| 336 | func_8016FF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016FF30.c` | +| 337 | func_80170150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170150.c` | +| 338 | func_8017C150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C150.c` | +| 339 | func_80131EEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131EEC.c` | +| 340 | func_80144A2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80144A2C.c` | +| 341 | func_8015CFC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015CFC0.c` | +| 342 | func_8016A020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016A020.c` | +| 343 | func_80170C74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170C74.c` | +| 344 | func_801711C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801711C0.c` | +| 345 | func_80172B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172B44.c` | +| 346 | func_80172CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80172CA0.c` | +| 347 | func_80174384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174384.c` | +| 348 | func_8017CF7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF7C.c` | +| 349 | func_8017D22C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D22C.c` | +| 350 | func_8015282C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015282C.c` | +| 351 | func_80164BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80164BA0.c` | +| 352 | func_801689D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801689D8.c` | +| 353 | func_80169B80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80169B80.c` | +| 354 | func_8016B4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016B4BC.c` | +| 355 | func_8016F9C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016F9C4.c` | +| 356 | func_80170AD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170AD8.c` | +| 357 | func_80170E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170E34.c` | +| 358 | func_8017BE60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BE60.c` | +| 359 | func_8017CE20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE20.c` | +| 360 | func_8017D424 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D424.c` | +| 361 | func_8017D6FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6FC.c` | +| 362 | func_8017E4C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4C8.c` | +| 363 | func_8017E578 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E578.c` | +| 364 | func_8017ED0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED0C.c` | +| 365 | func_8017F480 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F480.c` | +| 366 | func_8017F500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F500.c` | +| 367 | func_80180420 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180420.c` | +| 368 | func_8017DD2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD2C.c` | +| 369 | func_8017E524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E524.c` | +| 370 | func_8017E734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E734.c` | +| 371 | func_80184F8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184F8C.c` | +| 372 | func_8017CA80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CA80.c` | +| 373 | func_801814B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814B8.c` | +| 374 | func_80185B40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B40.c` | +| 375 | func_80186910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186910.c` | +| 376 | func_80186CAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186CAC.c` | +| 377 | func_80187FEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187FEC.c` | +| 378 | func_801886DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801886DC.c` | +| 379 | func_80189FD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189FD0.c` | +| 380 | func_8018A00C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A00C.c` | +| 381 | func_8017C524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C524.c` | +| 382 | func_8017C7C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C7C4.c` | +| 383 | func_80182154 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182154.c` | +| 384 | func_80182234 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182234.c` | +| 385 | func_80182414 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182414.c` | +| 386 | func_801824E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824E0.c` | +| 387 | func_80183238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183238.c` | +| 388 | func_80183718 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183718.c` | +| 389 | func_801863AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801863AC.c` | +| 390 | func_80186E30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186E30.c` | +| 391 | func_80188ECC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188ECC.c` | +| 392 | func_80189304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189304.c` | +| 393 | func_801898C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801898C8.c` | +| 394 | func_80131FA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80131FA0.c` | +| 395 | func_80152B6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152B6C.c` | +| 396 | func_80157FC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80157FC4.c` | +| 397 | func_80162834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162834.c` | +| 398 | func_80168AA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80168AA8.c` | +| 399 | func_8016901C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016901C.c` | +| 400 | func_8016D428 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016D428.c` | +| 401 | func_8016DF20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016DF20.c` | +| 402 | func_80170240 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170240.c` | +| 403 | func_801703E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801703E0.c` | +| 404 | func_80170FB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170FB0.c` | +| 405 | func_801728E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801728E4.c` | +| 406 | func_80173B4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80173B4C.c` | +| 407 | func_8017CE48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE48.c` | +| 408 | func_8017CF60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF60.c` | +| 409 | func_80143C98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80143C98.c` | +| 410 | func_80152698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152698.c` | +| 411 | func_8016E5B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016E5B8.c` | +| 412 | func_801706AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801706AC.c` | +| 413 | func_80174F28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174F28.c` | +| 414 | func_8017F878 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F878.c` | +| 415 | func_8017FE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE08.c` | +| 416 | func_8018043C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018043C.c` | +| 417 | func_801808D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801808D8.c` | +| 418 | func_80182F58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182F58.c` | +| 419 | func_80144054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80144054.c` | +| 420 | func_80152058 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80152058.c` | +| 421 | func_8015A264 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015A264.c` | +| 422 | func_80163A58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80163A58.c` | +| 423 | func_801702FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801702FC.c` | +| 424 | func_80170D68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80170D68.c` | +| 425 | func_80171260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80171260.c` | +| 426 | func_801729F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801729F0.c` | +| 427 | func_8017319C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017319C.c` | +| 428 | func_8017CDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDB4.c` | +| 429 | func_8017CF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF34.c` | +| 430 | func_8017EFEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFEC.c` | +| 431 | func_8017C078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C078.c` | +| 432 | func_8017C268 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C268.c` | +| 433 | func_8017D51C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D51C.c` | +| 434 | func_80180BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180BA0.c` | +| 435 | func_80182000 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182000.c` | +| 436 | func_8017CDB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDB8.c` | +| 437 | func_8017D1B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1B4.c` | +| 438 | func_801803A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803A0.c` | +| 439 | func_8017E170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E170.c` | +| 440 | func_8017DD1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD1C.c` | +| 441 | func_8018AB74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AB74.c` | +| 442 | func_8017D49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D49C.c` | +| 443 | func_80185D6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D6C.c` | +| 444 | func_8017D348 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D348.c` | +| 445 | func_8017E020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E020.c` | +| 446 | func_8017CD14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD14.c` | +| 447 | func_8017D54C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D54C.c` | +| 448 | func_8017DB0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB0C.c` | +| 449 | func_801826C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826C4.c` | +| 450 | func_8017E290 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E290.c` | +| 451 | func_8018592C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018592C.c` | +| 452 | func_8017ED90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED90.c` | +| 453 | func_8017D0B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0B4.c` | +| 454 | func_8017E8CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8CC.c` | +| 455 | func_8017F8C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8C8.c` | +| 456 | func_80188718 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188718.c` | +| 457 | func_8017D670 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D670.c` | +| 458 | func_8017D804 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D804.c` | +| 459 | func_8017ED68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED68.c` | +| 460 | func_8017EDB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDB4.c` | +| 461 | func_8017E304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E304.c` | +| 462 | func_8017D988 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D988.c` | +| 463 | func_8017DE44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE44.c` | +| 464 | func_8018794C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018794C.c` | +| 465 | func_80188D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188D18.c` | +| 466 | func_8017EDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDD8.c` | +| 467 | func_8017CFAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFAC.c` | +| 468 | func_8017CF70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF70.c` | +| 469 | func_801832D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801832D0.c` | +| 470 | func_8017F87C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F87C.c` | +| 471 | func_80184424 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184424.c` | +| 472 | func_8017D500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D500.c` | +| 473 | func_8017F228 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F228.c` | +| 474 | func_80188754 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188754.c` | +| 475 | func_80188C9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188C9C.c` | +| 476 | func_8017D874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D874.c` | +| 477 | func_8017DC54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC54.c` | +| 478 | func_8017D008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D008.c` | +| 479 | func_8017EDDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDDC.c` | +| 480 | func_8017EFB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFB8.c` | +| 481 | func_8017F184 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F184.c` | +| 482 | func_8017F268 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F268.c` | +| 483 | func_80183E04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183E04.c` | +| 484 | func_8017CFCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFCC.c` | +| 485 | func_8017E758 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E758.c` | +| 486 | func_8017E060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E060.c` | +| 487 | func_801870DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801870DC.c` | +| 488 | func_801876FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801876FC.c` | +| 489 | func_8017CFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFF4.c` | +| 490 | func_8017CF58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF58.c` | +| 491 | func_80181028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181028.c` | +| 492 | func_80181D3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D3C.c` | +| 493 | func_8017CF98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF98.c` | +| 494 | func_801840FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801840FC.c` | +| 495 | func_80180EF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EF4.c` | +| 496 | func_8017E6C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6C8.c` | +| 497 | func_8017D218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D218.c` | +| 498 | func_8017D664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D664.c` | +| 499 | func_8017F02C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F02C.c` | +| 500 | func_8017F154 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F154.c` | +| 501 | func_8017D8B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8B0.c` | +| 502 | func_8017D580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D580.c` | +| 503 | func_8017E740 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E740.c` | +| 504 | func_8017E950 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E950.c` | +| 505 | func_8017E0A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0A4.c` | +| 506 | func_8017EEE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEE0.c` | +| 507 | func_8017D3B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3B8.c` | +| 508 | func_8017CF1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF1C.c` | +| 509 | func_8017D698 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D698.c` | +| 510 | func_8017D174 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D174.c` | +| 511 | func_8017FB54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB54.c` | +| 512 | func_8017CF80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF80.c` | +| 513 | func_80181DEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181DEC.c` | +| 514 | func_8017F054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F054.c` | +| 515 | func_8017DCBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCBC.c` | +| 516 | func_80181274 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181274.c` | +| 517 | func_80180F3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F3C.c` | +| 518 | func_8017F768 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F768.c` | +| 519 | func_80180EE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EE0.c` | +| 520 | func_8017EA0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA0C.c` | +| 521 | func_80180C3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C3C.c` | +| 522 | func_8017D50C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D50C.c` | +| 523 | func_8017D68C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D68C.c` | +| 524 | func_8017D9FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9FC.c` | +| 525 | func_8017E2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2A0.c` | +| 526 | func_8017D798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D798.c` | +| 527 | func_8017EC84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC84.c` | +| 528 | func_8017D46C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D46C.c` | +| 529 | func_8017D370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D370.c` | +| 530 | func_8017DA10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA10.c` | +| 531 | func_8017D508 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D508.c` | +| 532 | func_8017D0A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0A0.c` | +| 533 | func_8017E77C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E77C.c` | +| 534 | func_8017F1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1A0.c` | +| 535 | func_8017EDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDBC.c` | +| 536 | func_8017CDDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDDC.c` | +| 537 | func_80183F98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183F98.c` | +| 538 | func_8017D0D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0D4.c` | +| 539 | func_8017D6C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6C0.c` | +| 540 | func_8017D884 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D884.c` | +| 541 | func_8017EA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA24.c` | +| 542 | func_8017EE00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE00.c` | +| 543 | func_8017D040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D040.c` | +| 544 | func_80182288 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182288.c` | +| 545 | func_801838F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801838F0.c` | +| 546 | func_8017D03C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D03C.c` | +| 547 | func_8017D890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D890.c` | +| 548 | func_8017DFCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFCC.c` | +| 549 | func_8017E008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E008.c` | +| 550 | func_8017DA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA24.c` | +| 551 | func_8017D770 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D770.c` | +| 552 | func_8017EA64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA64.c` | +| 553 | func_8017D908 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D908.c` | +| 554 | func_8017D544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D544.c` | +| 555 | func_8017D0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0C8.c` | +| 556 | func_8017ECBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECBC.c` | +| 557 | func_8017E84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E84C.c` | +| 558 | func_8017DDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDBC.c` | +| 559 | func_8017D24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D24C.c` | +| 560 | func_8017ECC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECC8.c` | +| 561 | func_8017EA4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA4C.c` | +| 562 | func_8017D478 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D478.c` | +| 563 | func_8017D074 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D074.c` | +| 564 | func_8017CE40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE40.c` | +| 565 | func_8018096C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018096C.c` | +| 566 | func_8017EB30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB30.c` | +| 567 | func_8017D704 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D704.c` | +| 568 | func_8017D0CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0CC.c` | +| 569 | func_8017F988 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F988.c` | +| 570 | func_80181A40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A40.c` | +| 571 | func_8018656C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018656C.c` | +| 572 | func_8017D064 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D064.c` | +| 573 | func_8017E278 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E278.c` | +| 574 | func_8017DF8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF8C.c` | +| 575 | func_8017D84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D84C.c` | +| 576 | func_8017EAB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAB0.c` | +| 577 | func_8017E030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E030.c` | +| 578 | func_8017D094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D094.c` | +| 579 | func_8017F0F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0F0.c` | +| 580 | func_8017E640 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E640.c` | +| 581 | func_8017DD44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD44.c` | +| 582 | func_8017D9B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9B8.c` | +| 583 | func_8017D0F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0F4.c` | +| 584 | func_8017D184 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D184.c` | +| 585 | func_8017DFE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFE0.c` | +| 586 | func_8017E1F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1F4.c` | +| 587 | func_8017E36C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E36C.c` | +| 588 | func_8017D290 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D290.c` | +| 589 | func_8017CDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDD8.c` | +| 590 | func_8017E01C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E01C.c` | +| 591 | func_80185934 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185934.c` | +| 592 | func_8017D04C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D04C.c` | +| 593 | func_8017DAD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAD0.c` | +| 594 | func_80183C4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C4C.c` | +| 595 | func_8017F360 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F360.c` | +| 596 | func_8017EB5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB5C.c` | +| 597 | func_8017DD64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD64.c` | +| 598 | func_80182258 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182258.c` | +| 599 | func_8017FF2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF2C.c` | +| 600 | func_80185AF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185AF8.c` | +| 601 | func_8017DBB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBB0.c` | +| 602 | func_8017DCA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCA0.c` | +| 603 | func_8017F2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2CC.c` | +| 604 | func_8017F644 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F644.c` | +| 605 | func_8017DE84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE84.c` | +| 606 | func_8017DEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEB0.c` | +| 607 | func_8017EF2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF2C.c` | +| 608 | func_80186318 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186318.c` | +| 609 | func_8017EA88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA88.c` | +| 610 | func_8017D0AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0AC.c` | +| 611 | func_8017E9C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9C8.c` | +| 612 | func_8017D7C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7C0.c` | +| 613 | func_8017F0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0C8.c` | +| 614 | func_8017F118 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F118.c` | +| 615 | func_8017EAA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAA4.c` | +| 616 | func_8017D494 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D494.c` | +| 617 | func_8017EEF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEF8.c` | +| 618 | func_8017D104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D104.c` | +| 619 | func_8017D9E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9E4.c` | +| 620 | func_8017CE60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE60.c` | +| 621 | func_8017DAAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAAC.c` | +| 622 | func_8017E1EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1EC.c` | +| 623 | func_8017E0B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0B0.c` | +| 624 | func_801827A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801827A8.c` | +| 625 | func_80182E1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E1C.c` | +| 626 | func_8017D708 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D708.c` | +| 627 | func_80181138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181138.c` | +| 628 | func_8017E778 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E778.c` | +| 629 | func_8017E044 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E044.c` | +| 630 | func_8017E240 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E240.c` | +| 631 | func_801824F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824F0.c` | +| 632 | func_8018279C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018279C.c` | +| 633 | func_8017E124 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E124.c` | +| 634 | func_80182758 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182758.c` | +| 635 | func_8017D0BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0BC.c` | +| 636 | func_8017DEA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEA8.c` | +| 637 | func_8017E6EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6EC.c` | +| 638 | func_8017E8F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8F8.c` | +| 639 | func_80186530 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186530.c` | +| 640 | func_8017DC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC74.c` | +| 641 | func_8017DE6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE6C.c` | +| 642 | func_8018ADD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ADD0.c` | +| 643 | func_8017C8B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C8B8.c` | +| 644 | func_8017F2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2A4.c` | +| 645 | func_8018151C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018151C.c` | +| 646 | func_8017DC94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC94.c` | +| 647 | func_8017DF1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF1C.c` | +| 648 | func_8017FC50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FC50.c` | +| 649 | func_8017D06C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D06C.c` | +| 650 | func_8017F49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F49C.c` | +| 651 | func_8017E110 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E110.c` | +| 652 | func_8017E138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E138.c` | +| 653 | func_8017EACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EACC.c` | +| 654 | func_8017DECC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DECC.c` | +| 655 | func_8017D934 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D934.c` | +| 656 | func_8017CDBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDBC.c` | +| 657 | func_8017E1C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1C0.c` | +| 658 | func_8017E2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2C8.c` | +| 659 | func_8017E0D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0D8.c` | +| 660 | func_8017D030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D030.c` | +| 661 | func_8018019C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018019C.c` | +| 662 | func_8017EEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEB0.c` | +| 663 | func_8017D274 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D274.c` | +| 664 | func_8017F074 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F074.c` | +| 665 | func_8017D1E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1E0.c` | +| 666 | func_8017F130 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F130.c` | +| 667 | func_8017D4A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4A0.c` | +| 668 | func_8017DD88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD88.c` | +| 669 | func_8017E984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E984.c` | +| 670 | func_8017D150 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D150.c` | +| 671 | func_8017D9B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9B4.c` | +| 672 | func_8017EBF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBF4.c` | +| 673 | func_8017EB88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB88.c` | +| 674 | func_8017EA28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA28.c` | +| 675 | func_8017DC2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC2C.c` | +| 676 | func_8017F384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F384.c` | +| 677 | func_8017D47C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D47C.c` | +| 678 | func_8017E11C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E11C.c` | +| 679 | func_80180C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C1C.c` | +| 680 | func_8017D33C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D33C.c` | +| 681 | func_8017EAD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAD8.c` | +| 682 | func_8017F254 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F254.c` | +| 683 | func_8017BFC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BFC8.c` | +| 684 | func_8017DF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF54.c` | +| 685 | func_8017E358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E358.c` | +| 686 | func_8017F370 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F370.c` | +| 687 | func_8017DA00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA00.c` | +| 688 | func_80180CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CA0.c` | +| 689 | func_8017FAD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FAD8.c` | +| 690 | func_80180C7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C7C.c` | +| 691 | func_80182860 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182860.c` | +| 692 | func_8017D2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2A4.c` | +| 693 | func_8017D2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2CC.c` | +| 694 | func_8017D1D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1D0.c` | +| 695 | func_8017ED80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED80.c` | +| 696 | func_8017FA00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA00.c` | +| 697 | func_8017FF88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF88.c` | +| 698 | func_80182030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182030.c` | +| 699 | func_8017D384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D384.c` | +| 700 | func_8017DE74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE74.c` | +| 701 | func_8017E35C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E35C.c` | +| 702 | func_8017FB4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB4C.c` | +| 703 | func_801844D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801844D4.c` | +| 704 | func_8017DD60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD60.c` | +| 705 | func_8017DE88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE88.c` | +| 706 | func_8017EF18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF18.c` | +| 707 | func_8017D1A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1A0.c` | +| 708 | func_8017FBE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBE0.c` | +| 709 | func_80182E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E34.c` | +| 710 | func_80180214 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180214.c` | +| 711 | func_8017F120 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F120.c` | +| 712 | func_8017F4A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4A0.c` | +| 713 | func_8017D524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D524.c` | +| 714 | func_80180D74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D74.c` | +| 715 | func_801819E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801819E8.c` | +| 716 | func_80181984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181984.c` | +| 717 | func_8018263C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018263C.c` | +| 718 | func_8017CE0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE0C.c` | +| 719 | func_8017F060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F060.c` | +| 720 | func_8018234C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018234C.c` | +| 721 | func_8017CD10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CD10.c` | +| 722 | func_8017E3F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E3F4.c` | +| 723 | func_80181300 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181300.c` | +| 724 | func_8017FB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB00.c` | +| 725 | func_8017D3BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3BC.c` | +| 726 | func_801803DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803DC.c` | +| 727 | func_8017DC9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC9C.c` | +| 728 | func_8017D7DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7DC.c` | +| 729 | func_8017F820 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F820.c` | +| 730 | func_8017CE94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE94.c` | +| 731 | func_8017E088 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E088.c` | +| 732 | func_8017DBB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBB4.c` | +| 733 | func_8017D078 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D078.c` | +| 734 | func_8017D4CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4CC.c` | +| 735 | func_8017FA7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA7C.c` | +| 736 | func_801800D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801800D4.c` | +| 737 | func_8017DAA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAA4.c` | +| 738 | func_8017C0E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C0E4.c` | +| 739 | func_8017D404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D404.c` | +| 740 | func_8017FA24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA24.c` | +| 741 | func_8017DCF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCF4.c` | +| 742 | func_801809FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801809FC.c` | +| 743 | func_8017D0E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0E8.c` | +| 744 | func_80183C10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C10.c` | +| 745 | func_8017F320 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F320.c` | +| 746 | func_8017EDC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDC0.c` | +| 747 | func_8017EF7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF7C.c` | +| 748 | func_8017CEB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CEB0.c` | +| 749 | func_8018133C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018133C.c` | +| 750 | func_80184238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184238.c` | +| 751 | func_801821D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801821D4.c` | +| 752 | func_801809C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801809C4.c` | +| 753 | func_80182600 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182600.c` | +| 754 | func_8017D990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D990.c` | +| 755 | func_801835C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801835C0.c` | +| 756 | func_80180994 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180994.c` | +| 757 | func_80180FF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180FF8.c` | +| 758 | func_8017D5DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5DC.c` | +| 759 | func_8017E81C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E81C.c` | +| 760 | func_8017D3A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3A4.c` | +| 761 | func_80186BC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BC4.c` | +| 762 | func_80187794 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187794.c` | +| 763 | func_80180AEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AEC.c` | +| 764 | func_8017E04C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E04C.c` | +| 765 | func_80182E04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E04.c` | +| 766 | func_8018057C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018057C.c` | +| 767 | func_8017D640 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D640.c` | +| 768 | func_8018187C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018187C.c` | +| 769 | func_80180668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180668.c` | +| 770 | func_8017DA94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA94.c` | +| 771 | func_8017DB44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB44.c` | +| 772 | func_8017CFEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFEC.c` | +| 773 | func_80180EAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EAC.c` | +| 774 | func_8017D554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D554.c` | +| 775 | func_80184DE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184DE8.c` | +| 776 | func_8017CFC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFC4.c` | +| 777 | func_8017ED60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED60.c` | +| 778 | func_8017F2E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2E0.c` | +| 779 | func_8017D220 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D220.c` | +| 780 | func_80182834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182834.c` | +| 781 | func_8017D29C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D29C.c` | +| 782 | func_80185404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185404.c` | +| 783 | func_8017E0A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0A0.c` | +| 784 | func_8017CB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CB7C.c` | +| 785 | func_8017FBE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBE8.c` | +| 786 | func_8017DA7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA7C.c` | +| 787 | func_8017EF68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF68.c` | +| 788 | func_8017D5F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5F8.c` | +| 789 | func_8017E30C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E30C.c` | +| 790 | func_8017EF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF54.c` | +| 791 | func_80183194 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183194.c` | +| 792 | func_801843F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801843F4.c` | +| 793 | func_8017D010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D010.c` | +| 794 | func_8017E978 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E978.c` | +| 795 | func_8017D1D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1D4.c` | +| 796 | func_80181B78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B78.c` | +| 797 | func_801829BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829BC.c` | +| 798 | func_8017F1BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1BC.c` | +| 799 | func_8017DB78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB78.c` | +| 800 | func_8017DD30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD30.c` | +| 801 | func_80185594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185594.c` | +| 802 | func_80185A80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A80.c` | +| 803 | func_8017D740 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D740.c` | +| 804 | func_80184674 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184674.c` | +| 805 | func_80183364 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183364.c` | +| 806 | func_80184C90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C90.c` | +| 807 | func_80180B50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B50.c` | +| 808 | func_801814B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814B0.c` | +| 809 | func_80184884 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184884.c` | +| 810 | func_8017CFC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFC8.c` | +| 811 | func_80180D58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D58.c` | +| 812 | func_8017EA84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA84.c` | +| 813 | func_8017D7C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7C4.c` | +| 814 | func_8017D620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D620.c` | +| 815 | func_8017D9A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9A8.c` | +| 816 | func_8017E854 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E854.c` | +| 817 | func_8017DDD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDD8.c` | +| 818 | func_80180280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180280.c` | +| 819 | func_80181C44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C44.c` | +| 820 | func_80185D7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D7C.c` | +| 821 | func_8017E090 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E090.c` | +| 822 | func_8017E378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E378.c` | +| 823 | func_8017E89C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E89C.c` | +| 824 | func_8017D21C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D21C.c` | +| 825 | func_8017E388 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E388.c` | +| 826 | func_8017D688 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D688.c` | +| 827 | func_8017F06C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F06C.c` | +| 828 | func_8018F6DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F6DC.c` | +| 829 | func_80185D00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185D00.c` | +| 830 | func_801801A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801A8.c` | +| 831 | func_8017F094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F094.c` | +| 832 | func_80182EE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EE8.c` | +| 833 | func_80185DE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185DE4.c` | +| 834 | func_8017F2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2A0.c` | +| 835 | func_8017DFC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFC0.c` | +| 836 | func_8017D600 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D600.c` | +| 837 | func_80181B3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B3C.c` | +| 838 | func_8017EFD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFD4.c` | +| 839 | func_8017F7F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F7F8.c` | +| 840 | func_8017D6A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6A4.c` | +| 841 | func_8017DF80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF80.c` | +| 842 | func_8017CC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CC90.c` | +| 843 | func_801832B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801832B8.c` | +| 844 | func_8017F69C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F69C.c` | +| 845 | func_801811DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811DC.c` | +| 846 | func_8018266C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018266C.c` | +| 847 | func_8017EBA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBA8.c` | +| 848 | func_801840C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801840C0.c` | +| 849 | func_8017D808 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D808.c` | +| 850 | func_80182C24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C24.c` | +| 851 | func_801843B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801843B4.c` | +| 852 | func_80182C88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C88.c` | +| 853 | func_80181128 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181128.c` | +| 854 | func_8017EB0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB0C.c` | +| 855 | func_8017EB34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB34.c` | +| 856 | func_80180384 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180384.c` | +| 857 | func_8017DE70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE70.c` | +| 858 | func_8017DC78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC78.c` | +| 859 | func_80180A38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A38.c` | +| 860 | func_80182378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182378.c` | +| 861 | func_80181874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181874.c` | +| 862 | func_8017EDCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDCC.c` | +| 863 | func_80187814 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187814.c` | +| 864 | func_8017E9DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9DC.c` | +| 865 | func_8017D578 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D578.c` | +| 866 | func_801825EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801825EC.c` | +| 867 | func_8017EC08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC08.c` | +| 868 | func_8017D8EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8EC.c` | +| 869 | func_8017E568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E568.c` | +| 870 | func_8017DF58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF58.c` | +| 871 | func_80181C6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C6C.c` | +| 872 | func_8017FBF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBF8.c` | +| 873 | func_8017CE68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE68.c` | +| 874 | func_80188080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188080.c` | +| 875 | func_8017F8AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8AC.c` | +| 876 | func_80183544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183544.c` | +| 877 | func_801859A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801859A0.c` | +| 878 | func_8017E668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E668.c` | +| 879 | func_8017D828 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D828.c` | +| 880 | func_8017DD5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD5C.c` | +| 881 | func_8017E014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E014.c` | +| 882 | func_8017E4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4BC.c` | +| 883 | func_8017FEF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FEF0.c` | +| 884 | func_8017E75C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E75C.c` | +| 885 | func_801858F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801858F0.c` | +| 886 | func_8017E4B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E4B0.c` | +| 887 | func_8017EAE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAE0.c` | +| 888 | func_8017F0D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0D4.c` | +| 889 | func_8017DC40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC40.c` | +| 890 | func_8017F3B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3B8.c` | +| 891 | func_80184CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184CD0.c` | +| 892 | func_801863B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801863B0.c` | +| 893 | func_8017FB10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB10.c` | +| 894 | func_8017D338 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D338.c` | +| 895 | func_8017D714 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D714.c` | +| 896 | func_8017D1DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1DC.c` | +| 897 | func_8017D280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D280.c` | +| 898 | func_8017D784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D784.c` | +| 899 | func_8017EE2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE2C.c` | +| 900 | func_8018006C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018006C.c` | +| 901 | func_80183520 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183520.c` | +| 902 | func_80181010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181010.c` | +| 903 | func_80182B64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B64.c` | +| 904 | func_8018739C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018739C.c` | +| 905 | func_801828F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801828F4.c` | +| 906 | func_8017ECA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECA0.c` | +| 907 | func_8017F54C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F54C.c` | +| 908 | func_8018474C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018474C.c` | +| 909 | func_80187CD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CD8.c` | +| 910 | func_8018051C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018051C.c` | +| 911 | func_8017E0D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0D0.c` | +| 912 | func_80181054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181054.c` | +| 913 | func_80181F6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F6C.c` | +| 914 | func_8017CE88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE88.c` | +| 915 | func_8017E55C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E55C.c` | +| 916 | func_8017EDA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDA4.c` | +| 917 | func_8017E1C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E1C8.c` | +| 918 | func_80181E54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E54.c` | +| 919 | func_80186EC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186EC4.c` | +| 920 | func_80182728 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182728.c` | +| 921 | func_80181020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181020.c` | +| 922 | func_80180D90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D90.c` | +| 923 | func_8017D09C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D09C.c` | +| 924 | func_8017FD8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD8C.c` | +| 925 | func_8017E58C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E58C.c` | +| 926 | func_80181E44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E44.c` | +| 927 | func_8018288C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018288C.c` | +| 928 | func_8017E7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7D0.c` | +| 929 | func_80183BF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183BF8.c` | +| 930 | func_8017F89C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F89C.c` | +| 931 | func_80180950 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180950.c` | +| 932 | func_8017E3B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E3B4.c` | +| 933 | func_8017D6D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6D0.c` | +| 934 | func_8017E9CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9CC.c` | +| 935 | func_8017D928 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D928.c` | +| 936 | func_8017DFD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFD8.c` | +| 937 | func_8017F734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F734.c` | +| 938 | func_8017DDE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDE0.c` | +| 939 | func_8017E294 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E294.c` | +| 940 | func_8017BEE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BEE4.c` | +| 941 | func_80189B3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189B3C.c` | +| 942 | func_8017E618 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E618.c` | +| 943 | func_8017D004 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D004.c` | +| 944 | func_8018355C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018355C.c` | +| 945 | func_8018BE0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BE0C.c` | +| 946 | func_8017EDA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDA0.c` | +| 947 | func_8017EEA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEA0.c` | +| 948 | func_80180F20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F20.c` | +| 949 | func_80185008 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185008.c` | +| 950 | func_80182D10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D10.c` | +| 951 | func_8018AA14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AA14.c` | +| 952 | func_8017D3C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D3C8.c` | +| 953 | func_8017F414 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F414.c` | +| 954 | func_8017D024 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D024.c` | +| 955 | func_8017F840 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F840.c` | +| 956 | func_8017FD88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD88.c` | +| 957 | func_8017E890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E890.c` | +| 958 | func_8017F0D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0D8.c` | +| 959 | func_80180030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180030.c` | +| 960 | func_801845B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845B4.c` | +| 961 | func_80180E18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E18.c` | +| 962 | func_801848A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801848A8.c` | +| 963 | func_80184C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C1C.c` | +| 964 | func_8017DB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB00.c` | +| 965 | func_8017D350 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D350.c` | +| 966 | func_80181304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181304.c` | +| 967 | func_80183C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C54.c` | +| 968 | func_8017EB4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB4C.c` | +| 969 | func_801801A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801A4.c` | +| 970 | func_80184828 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184828.c` | +| 971 | func_80180204 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180204.c` | +| 972 | func_80181500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181500.c` | +| 973 | func_80186044 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186044.c` | +| 974 | func_8017C7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C7D0.c` | +| 975 | func_8017E6FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6FC.c` | +| 976 | func_8017CDE4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CDE4.c` | +| 977 | func_8017F630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F630.c` | +| 978 | func_801847F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847F4.c` | +| 979 | func_80186500 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186500.c` | +| 980 | func_8017E048 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E048.c` | +| 981 | func_80180890 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180890.c` | +| 982 | func_80184854 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184854.c` | +| 983 | func_80180568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180568.c` | +| 984 | func_801826EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826EC.c` | +| 985 | func_80183FA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183FA0.c` | +| 986 | func_8017C114 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C114.c` | +| 987 | func_80180CA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CA4.c` | +| 988 | func_8017DA78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA78.c` | +| 989 | func_8017F024 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F024.c` | +| 990 | func_80182708 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182708.c` | +| 991 | func_8017DEA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEA4.c` | +| 992 | func_8017F0E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0E8.c` | +| 993 | func_80185720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185720.c` | +| 994 | func_8017D224 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D224.c` | +| 995 | func_8017DB34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB34.c` | +| 996 | func_8017E6C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6C0.c` | +| 997 | func_8017E7AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7AC.c` | +| 998 | func_8017D380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D380.c` | +| 999 | func_8018033C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018033C.c` | +| 1000 | func_80183284 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183284.c` | +| 1001 | func_80188634 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188634.c` | +| 1002 | func_8018A5B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A5B0.c` | +| 1003 | func_8017D450 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D450.c` | +| 1004 | func_8017D57C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D57C.c` | +| 1005 | func_8017DCF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCF0.c` | +| 1006 | func_8017DAB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAB8.c` | +| 1007 | func_8017DD9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD9C.c` | +| 1008 | func_8018189C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018189C.c` | +| 1009 | func_801801F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801F4.c` | +| 1010 | func_8017DE7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE7C.c` | +| 1011 | func_801815AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801815AC.c` | +| 1012 | func_801877E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801877E4.c` | +| 1013 | func_8017DDB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DDB0.c` | +| 1014 | func_8017DCA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCA8.c` | +| 1015 | func_801813AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801813AC.c` | +| 1016 | func_80181818 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181818.c` | +| 1017 | func_801834B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801834B4.c` | +| 1018 | func_8017ECB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECB0.c` | +| 1019 | func_80181F20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F20.c` | +| 1020 | func_80183D84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183D84.c` | +| 1021 | func_8017D01C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D01C.c` | +| 1022 | func_8017C0C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C0C8.c` | +| 1023 | func_8017D63C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D63C.c` | +| 1024 | func_8017D2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2C8.c` | +| 1025 | func_801811B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811B4.c` | +| 1026 | func_8017DE98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE98.c` | +| 1027 | func_80180D38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D38.c` | +| 1028 | func_801847A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847A4.c` | +| 1029 | func_801847FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801847FC.c` | +| 1030 | func_8018B8C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B8C4.c` | +| 1031 | func_8017D138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D138.c` | +| 1032 | func_80181478 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181478.c` | +| 1033 | func_8017E0B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E0B8.c` | +| 1034 | func_801821F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801821F8.c` | +| 1035 | func_80183624 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183624.c` | +| 1036 | func_80184C28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C28.c` | +| 1037 | func_8017D974 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D974.c` | +| 1038 | func_80184778 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184778.c` | +| 1039 | func_8017C1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C1F8.c` | +| 1040 | func_8018AF0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF0C.c` | +| 1041 | func_8017DBF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBF0.c` | +| 1042 | func_801813F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801813F0.c` | +| 1043 | func_8017D96C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D96C.c` | +| 1044 | func_80181C30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C30.c` | +| 1045 | func_8017DAA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAA0.c` | +| 1046 | func_80184AA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184AA8.c` | +| 1047 | func_8018533C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018533C.c` | +| 1048 | func_8017E700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E700.c` | +| 1049 | func_8017F870 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F870.c` | +| 1050 | func_8017E9F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9F4.c` | +| 1051 | func_801856E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801856E4.c` | +| 1052 | func_8018F63C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F63C.c` | +| 1053 | func_80187BAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BAC.c` | +| 1054 | func_8018C3F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C3F8.c` | +| 1055 | func_80182654 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182654.c` | +| 1056 | func_8018A030 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A030.c` | +| 1057 | func_8017DBC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBC0.c` | +| 1058 | func_8017DE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE38.c` | +| 1059 | func_8017DCC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DCC8.c` | +| 1060 | func_8017DE4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE4C.c` | +| 1061 | func_8017D084 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D084.c` | +| 1062 | func_8017DAF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAF4.c` | +| 1063 | func_8017F25C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F25C.c` | +| 1064 | func_8017F3A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3A8.c` | +| 1065 | func_80180850 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180850.c` | +| 1066 | func_801803B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803B8.c` | +| 1067 | func_80182A08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182A08.c` | +| 1068 | func_8018001C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018001C.c` | +| 1069 | func_80184D0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D0C.c` | +| 1070 | func_8017DBA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBA8.c` | +| 1071 | func_8017CEEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CEEC.c` | +| 1072 | func_8017DACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DACC.c` | +| 1073 | func_8017D294 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D294.c` | +| 1074 | func_8017E5E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E5E4.c` | +| 1075 | func_801846AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801846AC.c` | +| 1076 | func_8017DB5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB5C.c` | +| 1077 | func_80183FEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183FEC.c` | +| 1078 | func_80180DFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DFC.c` | +| 1079 | func_80181BD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181BD0.c` | +| 1080 | func_8017D2A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D2A0.c` | +| 1081 | func_80182148 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182148.c` | +| 1082 | func_80180E88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E88.c` | +| 1083 | func_80181F60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F60.c` | +| 1084 | func_80184D40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D40.c` | +| 1085 | func_801807DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801807DC.c` | +| 1086 | func_8017D690 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D690.c` | +| 1087 | func_8017F110 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F110.c` | +| 1088 | func_8017FB3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB3C.c` | +| 1089 | func_80183DC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DC8.c` | +| 1090 | func_8018B2A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B2A4.c` | +| 1091 | func_801845E8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845E8.c` | +| 1092 | func_801811F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801811F4.c` | +| 1093 | func_80182EA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EA0.c` | +| 1094 | func_8018525C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018525C.c` | +| 1095 | func_80186BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BD8.c` | +| 1096 | func_80181A94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A94.c` | +| 1097 | func_80183B68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B68.c` | +| 1098 | func_80187874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187874.c` | +| 1099 | func_801848AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801848AC.c` | +| 1100 | func_80187CA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CA8.c` | +| 1101 | func_8017F4C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4C4.c` | +| 1102 | func_80180144 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180144.c` | +| 1103 | func_8017E968 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E968.c` | +| 1104 | func_801881C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801881C8.c` | +| 1105 | func_8017E9D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9D8.c` | +| 1106 | func_8017F620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F620.c` | +| 1107 | func_80185BA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185BA0.c` | +| 1108 | func_80183B9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B9C.c` | +| 1109 | func_80182324 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182324.c` | +| 1110 | func_80182B90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182B90.c` | +| 1111 | func_8017E8DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8DC.c` | +| 1112 | func_80186104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186104.c` | +| 1113 | func_80186404 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186404.c` | +| 1114 | func_8017DEC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DEC4.c` | +| 1115 | func_80188040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188040.c` | +| 1116 | func_801884D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884D4.c` | +| 1117 | func_8017D0DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D0DC.c` | +| 1118 | func_80182028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182028.c` | +| 1119 | func_80183A18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A18.c` | +| 1120 | func_8017D170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D170.c` | +| 1121 | func_8017E32C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E32C.c` | +| 1122 | func_80183A10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A10.c` | +| 1123 | func_8017D19C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D19C.c` | +| 1124 | func_8017D594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D594.c` | +| 1125 | func_8017DF44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF44.c` | +| 1126 | func_80183300 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183300.c` | +| 1127 | func_8018C24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C24C.c` | +| 1128 | func_80180B54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B54.c` | +| 1129 | func_80181040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181040.c` | +| 1130 | func_8017EB1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB1C.c` | +| 1131 | func_8018AF08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF08.c` | +| 1132 | func_8018118C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018118C.c` | +| 1133 | func_80182A18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182A18.c` | +| 1134 | func_80187D80 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187D80.c` | +| 1135 | func_80188DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DC4.c` | +| 1136 | func_80185580 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185580.c` | +| 1137 | func_8018847C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018847C.c` | +| 1138 | func_8017F468 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F468.c` | +| 1139 | func_8017EEFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEFC.c` | +| 1140 | func_8017D610 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D610.c` | +| 1141 | func_8017D790 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D790.c` | +| 1142 | func_80180B2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B2C.c` | +| 1143 | func_801812FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801812FC.c` | +| 1144 | func_8017F6C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F6C4.c` | +| 1145 | func_801860BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801860BC.c` | +| 1146 | func_80182EDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182EDC.c` | +| 1147 | func_8018BDE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BDE0.c` | +| 1148 | func_8018C3A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C3A4.c` | +| 1149 | func_80186C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186C1C.c` | +| 1150 | func_801803F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803F8.c` | +| 1151 | func_801814A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814A8.c` | +| 1152 | func_8018523C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018523C.c` | +| 1153 | func_80180264 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180264.c` | +| 1154 | func_8018C5CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C5CC.c` | +| 1155 | func_8017D14C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D14C.c` | +| 1156 | func_8017D6F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D6F0.c` | +| 1157 | func_8017D700 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D700.c` | +| 1158 | func_80188204 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188204.c` | +| 1159 | func_8017E9EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9EC.c` | +| 1160 | func_8017F1C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1C4.c` | +| 1161 | func_8018A858 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A858.c` | +| 1162 | func_80184CA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184CA0.c` | +| 1163 | func_80182544 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182544.c` | +| 1164 | func_80184658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184658.c` | +| 1165 | func_80181CE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181CE0.c` | +| 1166 | func_80183D48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183D48.c` | +| 1167 | func_8017D1F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1F0.c` | +| 1168 | func_801899F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801899F8.c` | +| 1169 | func_80188650 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188650.c` | +| 1170 | func_801892CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801892CC.c` | +| 1171 | func_80180990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180990.c` | +| 1172 | func_80186A84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186A84.c` | +| 1173 | func_8017CE54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CE54.c` | +| 1174 | func_8017F568 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F568.c` | +| 1175 | func_801804DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804DC.c` | +| 1176 | func_8017EEC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEC8.c` | +| 1177 | func_8017FB78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB78.c` | +| 1178 | func_8017EBF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBF0.c` | +| 1179 | func_80181858 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181858.c` | +| 1180 | func_8017C664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C664.c` | +| 1181 | func_80181090 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181090.c` | +| 1182 | func_8017DB6C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB6C.c` | +| 1183 | func_80181438 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181438.c` | +| 1184 | func_80185880 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185880.c` | +| 1185 | func_8018912C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018912C.c` | +| 1186 | func_8017E850 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E850.c` | +| 1187 | func_80182DAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182DAC.c` | +| 1188 | func_8017F3BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3BC.c` | +| 1189 | func_80184358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184358.c` | +| 1190 | func_8017D80C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D80C.c` | +| 1191 | func_80180658 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180658.c` | +| 1192 | func_8017F344 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F344.c` | +| 1193 | func_80181E1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E1C.c` | +| 1194 | func_8018545C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018545C.c` | +| 1195 | func_8017FBA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FBA4.c` | +| 1196 | func_801861A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801861A0.c` | +| 1197 | func_80181344 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181344.c` | +| 1198 | func_80184A1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184A1C.c` | +| 1199 | func_8018B550 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B550.c` | +| 1200 | func_80186BF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186BF8.c` | +| 1201 | func_80180224 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180224.c` | +| 1202 | func_80180260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180260.c` | +| 1203 | func_80185730 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185730.c` | +| 1204 | func_80184258 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184258.c` | +| 1205 | func_8018C77C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C77C.c` | +| 1206 | func_8017D4C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4C0.c` | +| 1207 | func_8017D5A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5A0.c` | +| 1208 | func_80180DEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DEC.c` | +| 1209 | func_80187BF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BF0.c` | +| 1210 | func_80183554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183554.c` | +| 1211 | func_801818AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801818AC.c` | +| 1212 | func_8018913C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018913C.c` | +| 1213 | func_80180A58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A58.c` | +| 1214 | func_801801CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801CC.c` | +| 1215 | func_80184DDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184DDC.c` | +| 1216 | func_8017F3E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3E4.c` | +| 1217 | func_80182C68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182C68.c` | +| 1218 | func_801856F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801856F0.c` | +| 1219 | func_801830F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801830F0.c` | +| 1220 | func_8017EAC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EAC8.c` | +| 1221 | func_8017E538 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E538.c` | +| 1222 | func_8017EC70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC70.c` | +| 1223 | func_80180548 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180548.c` | +| 1224 | func_8017EFB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFB0.c` | +| 1225 | func_80188DA0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DA0.c` | +| 1226 | func_8018A484 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A484.c` | +| 1227 | func_8017F168 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F168.c` | +| 1228 | func_8017F724 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F724.c` | +| 1229 | func_80181838 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181838.c` | +| 1230 | func_80182FF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182FF0.c` | +| 1231 | func_8017D014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D014.c` | +| 1232 | func_8017FE54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE54.c` | +| 1233 | func_8018200C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018200C.c` | +| 1234 | func_80188220 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188220.c` | +| 1235 | func_801894B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801894B4.c` | +| 1236 | func_8018B65C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B65C.c` | +| 1237 | func_8017EC5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC5C.c` | +| 1238 | func_8018465C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018465C.c` | +| 1239 | func_8017D864 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D864.c` | +| 1240 | func_80181CBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181CBC.c` | +| 1241 | func_80185898 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185898.c` | +| 1242 | func_80182E08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E08.c` | +| 1243 | func_80189970 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189970.c` | +| 1244 | func_8017F2BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2BC.c` | +| 1245 | func_8017DE78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE78.c` | +| 1246 | func_80183678 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183678.c` | +| 1247 | func_8017ED04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED04.c` | +| 1248 | func_8018A528 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A528.c` | +| 1249 | func_8018A6DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A6DC.c` | +| 1250 | func_80181C74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C74.c` | +| 1251 | func_8017EA18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA18.c` | +| 1252 | func_80180CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180CD0.c` | +| 1253 | func_80181C1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181C1C.c` | +| 1254 | func_8017FA54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA54.c` | +| 1255 | func_80183C58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C58.c` | +| 1256 | func_8017D1E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D1E4.c` | +| 1257 | func_8018AF60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF60.c` | +| 1258 | func_8018B588 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B588.c` | +| 1259 | func_80181084 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181084.c` | +| 1260 | func_8018555C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018555C.c` | +| 1261 | func_80186D04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186D04.c` | +| 1262 | func_8017E79C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E79C.c` | +| 1263 | func_8017FAC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FAC8.c` | +| 1264 | func_80180D78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D78.c` | +| 1265 | func_80184B68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184B68.c` | +| 1266 | func_8017DF40 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF40.c` | +| 1267 | func_8017D5D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D5D0.c` | +| 1268 | func_8017D944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D944.c` | +| 1269 | func_8018434C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018434C.c` | +| 1270 | func_80184388 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184388.c` | +| 1271 | func_80187EDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187EDC.c` | +| 1272 | func_8017EF24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EF24.c` | +| 1273 | func_8018540C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018540C.c` | +| 1274 | func_80186FA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186FA8.c` | +| 1275 | func_8017F4D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F4D0.c` | +| 1276 | func_80188060 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188060.c` | +| 1277 | func_80189868 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189868.c` | +| 1278 | func_80189DB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189DB4.c` | +| 1279 | func_8018165C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018165C.c` | +| 1280 | func_80184430 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184430.c` | +| 1281 | func_8017F5BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F5BC.c` | +| 1282 | func_80181808 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181808.c` | +| 1283 | func_801849FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801849FC.c` | +| 1284 | func_8017EBEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EBEC.c` | +| 1285 | func_8017EE08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EE08.c` | +| 1286 | func_80180EB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180EB8.c` | +| 1287 | func_801833F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801833F0.c` | +| 1288 | func_8017D4B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D4B4.c` | +| 1289 | func_8019026C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8019026C.c` | +| 1290 | func_8017DF0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DF0C.c` | +| 1291 | func_8017F554 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F554.c` | +| 1292 | func_8017FACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FACC.c` | +| 1293 | func_8017FD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FD3C.c` | +| 1294 | func_80180F00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F00.c` | +| 1295 | func_801853F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801853F8.c` | +| 1296 | func_8017EA04 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA04.c` | +| 1297 | func_8017FF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FF30.c` | +| 1298 | func_80180840 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180840.c` | +| 1299 | func_80181068 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181068.c` | +| 1300 | func_80181254 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181254.c` | +| 1301 | func_80183BBC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183BBC.c` | +| 1302 | func_8018F704 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F704.c` | +| 1303 | func_8018B748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B748.c` | +| 1304 | func_8017D308 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D308.c` | +| 1305 | func_8017F8E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8E0.c` | +| 1306 | func_80189FCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189FCC.c` | +| 1307 | func_8017E134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E134.c` | +| 1308 | func_80186094 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186094.c` | +| 1309 | func_8018975C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018975C.c` | +| 1310 | func_8017D9D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9D0.c` | +| 1311 | func_80181E8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E8C.c` | +| 1312 | func_80186CB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186CB8.c` | +| 1313 | func_8017EFF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFF0.c` | +| 1314 | func_8017F750 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F750.c` | +| 1315 | func_80180010 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180010.c` | +| 1316 | func_8018AF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AF34.c` | +| 1317 | func_8017F2C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2C8.c` | +| 1318 | func_8017FCE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FCE8.c` | +| 1319 | func_80183054 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183054.c` | +| 1320 | func_801895A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801895A0.c` | +| 1321 | func_80189E74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189E74.c` | +| 1322 | func_80182138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182138.c` | +| 1323 | func_80182F10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182F10.c` | +| 1324 | func_80182514 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182514.c` | +| 1325 | func_80189630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189630.c` | +| 1326 | func_80184C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184C54.c` | +| 1327 | func_80186080 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186080.c` | +| 1328 | func_80186754 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186754.c` | +| 1329 | func_8018AE14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AE14.c` | +| 1330 | func_80181134 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181134.c` | +| 1331 | func_80187378 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187378.c` | +| 1332 | func_8018A8A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A8A0.c` | +| 1333 | func_8018ACD4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ACD4.c` | +| 1334 | func_8018AFB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AFB4.c` | +| 1335 | func_80183DF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DF8.c` | +| 1336 | func_80184920 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184920.c` | +| 1337 | func_8017D894 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D894.c` | +| 1338 | func_80184D70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184D70.c` | +| 1339 | func_80186834 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186834.c` | +| 1340 | func_80180534 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180534.c` | +| 1341 | func_801805D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801805D0.c` | +| 1342 | func_80185020 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185020.c` | +| 1343 | func_80188734 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188734.c` | +| 1344 | func_8017DAB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DAB4.c` | +| 1345 | func_8017F980 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F980.c` | +| 1346 | func_80183B28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183B28.c` | +| 1347 | func_80180310 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180310.c` | +| 1348 | func_80185B94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B94.c` | +| 1349 | func_801884BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884BC.c` | +| 1350 | func_80189068 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189068.c` | +| 1351 | func_80187A4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187A4C.c` | +| 1352 | func_8017C180 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C180.c` | +| 1353 | func_80180040 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180040.c` | +| 1354 | func_801851A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801851A0.c` | +| 1355 | func_80180FD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180FD0.c` | +| 1356 | func_80187014 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187014.c` | +| 1357 | func_8018A494 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A494.c` | +| 1358 | func_8017F8A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F8A8.c` | +| 1359 | func_80180DB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DB0.c` | +| 1360 | func_8017E5F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E5F0.c` | +| 1361 | func_80180A5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A5C.c` | +| 1362 | func_80184B5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184B5C.c` | +| 1363 | func_8017DB64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB64.c` | +| 1364 | func_801801C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801801C4.c` | +| 1365 | func_801810C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801810C0.c` | +| 1366 | func_8018195C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018195C.c` | +| 1367 | func_80183A24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A24.c` | +| 1368 | func_8017EC58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC58.c` | +| 1369 | func_8017EC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC74.c` | +| 1370 | func_801858EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801858EC.c` | +| 1371 | func_8017E8D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E8D0.c` | +| 1372 | func_8017F5E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F5E0.c` | +| 1373 | func_80181990 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181990.c` | +| 1374 | func_8017E318 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E318.c` | +| 1375 | func_8017F24C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F24C.c` | +| 1376 | func_8017DBF8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DBF8.c` | +| 1377 | func_80182BF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182BF4.c` | +| 1378 | func_80181D84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D84.c` | +| 1379 | func_80181E9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181E9C.c` | +| 1380 | func_80181F4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181F4C.c` | +| 1381 | func_8017D8F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8F8.c` | +| 1382 | func_8017E49C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E49C.c` | +| 1383 | func_80187924 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187924.c` | +| 1384 | func_8017FCF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FCF0.c` | +| 1385 | func_80189418 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189418.c` | +| 1386 | func_80189C48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189C48.c` | +| 1387 | func_801804A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804A0.c` | +| 1388 | func_80186984 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186984.c` | +| 1389 | func_8017DD18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DD18.c` | +| 1390 | func_8017F214 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F214.c` | +| 1391 | func_801830EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801830EC.c` | +| 1392 | func_8018ADA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ADA4.c` | +| 1393 | func_8017EC78 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EC78.c` | +| 1394 | func_8017EDC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EDC8.c` | +| 1395 | func_8017EFFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EFFC.c` | +| 1396 | func_80180C2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C2C.c` | +| 1397 | func_80185334 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185334.c` | +| 1398 | func_80188DC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188DC8.c` | +| 1399 | func_80189620 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189620.c` | +| 1400 | func_80185A2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A2C.c` | +| 1401 | func_8017DC90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC90.c` | +| 1402 | func_80183100 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183100.c` | +| 1403 | func_8018166C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018166C.c` | +| 1404 | func_80184E00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184E00.c` | +| 1405 | func_8017D9AC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D9AC.c` | +| 1406 | func_8017F594 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F594.c` | +| 1407 | func_80181198 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181198.c` | +| 1408 | func_8018425C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018425C.c` | +| 1409 | func_80185288 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185288.c` | +| 1410 | func_801884A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801884A8.c` | +| 1411 | func_8017EB74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB74.c` | +| 1412 | func_8017ECF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECF4.c` | +| 1413 | func_80185EA8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185EA8.c` | +| 1414 | func_8017E2F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E2F4.c` | +| 1415 | func_801859B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801859B8.c` | +| 1416 | func_80187A8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187A8C.c` | +| 1417 | func_8017ECC0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ECC0.c` | +| 1418 | func_8017C358 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C358.c` | +| 1419 | func_8017D8C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8C8.c` | +| 1420 | func_8017D940 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D940.c` | +| 1421 | func_801842B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801842B0.c` | +| 1422 | func_8017EEB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EEB8.c` | +| 1423 | func_80187C64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187C64.c` | +| 1424 | func_80188B74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188B74.c` | +| 1425 | func_8017C1BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C1BC.c` | +| 1426 | func_8017E6CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E6CC.c` | +| 1427 | func_801800F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801800F4.c` | +| 1428 | func_80184630 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184630.c` | +| 1429 | func_80183F4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183F4C.c` | +| 1430 | func_8017D410 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D410.c` | +| 1431 | func_8017ED74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017ED74.c` | +| 1432 | func_8018910C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018910C.c` | +| 1433 | func_8019041C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8019041C.c` | +| 1434 | func_8017F160 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F160.c` | +| 1435 | func_801802BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801802BC.c` | +| 1436 | func_80184160 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184160.c` | +| 1437 | func_80187CD0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187CD0.c` | +| 1438 | func_8017D238 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D238.c` | +| 1439 | func_8017FC84 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FC84.c` | +| 1440 | func_80184FE8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184FE8.c` | +| 1441 | func_8018BAE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BAE0.c` | +| 1442 | func_8018C0A4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C0A4.c` | +| 1443 | func_8017F3C0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F3C0.c` | +| 1444 | func_8017F84C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F84C.c` | +| 1445 | func_80181670 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181670.c` | +| 1446 | func_8017E820 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E820.c` | +| 1447 | func_8017EA2C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EA2C.c` | +| 1448 | func_8018038C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018038C.c` | +| 1449 | func_8018056C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018056C.c` | +| 1450 | func_8018C118 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C118.c` | +| 1451 | func_8018C4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C4BC.c` | +| 1452 | func_8017CF30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF30.c` | +| 1453 | func_8017FE10 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE10.c` | +| 1454 | func_8017DE68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DE68.c` | +| 1455 | func_8017EB7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB7C.c` | +| 1456 | func_8017F0A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F0A8.c` | +| 1457 | func_8017D7D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D7D0.c` | +| 1458 | func_8017D8F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D8F4.c` | +| 1459 | func_8017DA0C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DA0C.c` | +| 1460 | func_80188720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188720.c` | +| 1461 | func_8017FA90 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FA90.c` | +| 1462 | func_80180868 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180868.c` | +| 1463 | func_80188088 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188088.c` | +| 1464 | func_8017F1F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F1F8.c` | +| 1465 | func_8018774C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018774C.c` | +| 1466 | func_801829DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829DC.c` | +| 1467 | func_8017DC08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DC08.c` | +| 1468 | func_8017F508 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F508.c` | +| 1469 | func_80181124 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181124.c` | +| 1470 | func_8018AD3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AD3C.c` | +| 1471 | func_80185668 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185668.c` | +| 1472 | func_80185B5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185B5C.c` | +| 1473 | func_80180860 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180860.c` | +| 1474 | func_80180944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180944.c` | +| 1475 | func_8018F488 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018F488.c` | +| 1476 | func_8018337C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018337C.c` | +| 1477 | func_80181A5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181A5C.c` | +| 1478 | func_80187050 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187050.c` | +| 1479 | func_8018603C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018603C.c` | +| 1480 | func_8017E7A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7A8.c` | +| 1481 | func_80180028 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180028.c` | +| 1482 | func_80180AA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AA4.c` | +| 1483 | func_801824F8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801824F8.c` | +| 1484 | func_8015EEE0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8015EEE0.c` | +| 1485 | func_80181D30 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181D30.c` | +| 1486 | func_8017CF00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF00.c` | +| 1487 | func_8017CFA4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CFA4.c` | +| 1488 | func_8017D048 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017D048.c` | +| 1489 | func_80180E98 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180E98.c` | +| 1490 | func_80180F34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180F34.c` | +| 1491 | func_80181260 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181260.c` | +| 1492 | func_80183C9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183C9C.c` | +| 1493 | func_8018258C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018258C.c` | +| 1494 | func_80182E38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182E38.c` | +| 1495 | func_80183138 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183138.c` | +| 1496 | func_80183960 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183960.c` | +| 1497 | func_80185A68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185A68.c` | +| 1498 | func_80185E34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E34.c` | +| 1499 | func_8017DFAC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DFAC.c` | +| 1500 | func_80183438 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183438.c` | +| 1501 | func_80183A68 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183A68.c` | +| 1502 | func_8018A8D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A8D4.c` | +| 1503 | func_8018A910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A910.c` | +| 1504 | func_8018BC3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BC3C.c` | +| 1505 | func_8018C368 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C368.c` | +| 1506 | func_8018C73C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C73C.c` | +| 1507 | func_8017FB48 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FB48.c` | +| 1508 | func_8017BF34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BF34.c` | +| 1509 | func_8017DB70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017DB70.c` | +| 1510 | func_8017F90C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F90C.c` | +| 1511 | func_8017FE9C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FE9C.c` | +| 1512 | func_80180170 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180170.c` | +| 1513 | func_801829F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801829F0.c` | +| 1514 | func_8018338C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018338C.c` | +| 1515 | func_80183598 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183598.c` | +| 1516 | func_801841B0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801841B0.c` | +| 1517 | func_8017F050 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F050.c` | +| 1518 | func_80184878 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184878.c` | +| 1519 | func_8017E218 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E218.c` | +| 1520 | func_80180AD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180AD8.c` | +| 1521 | func_80185E4C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185E4C.c` | +| 1522 | func_8017E720 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E720.c` | +| 1523 | func_8017E824 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E824.c` | +| 1524 | func_801819E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801819E0.c` | +| 1525 | func_80185C60 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185C60.c` | +| 1526 | func_8018CC74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CC74.c` | +| 1527 | func_80187BD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187BD8.c` | +| 1528 | func_8017E7E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7E4.c` | +| 1529 | func_80180784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180784.c` | +| 1530 | func_80183280 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183280.c` | +| 1531 | func_80183380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183380.c` | +| 1532 | func_80180D14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D14.c` | +| 1533 | func_80180DB8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180DB8.c` | +| 1534 | func_80182D18 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D18.c` | +| 1535 | func_80186034 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186034.c` | +| 1536 | func_80186484 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186484.c` | +| 1537 | func_801872C8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801872C8.c` | +| 1538 | func_8018B304 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B304.c` | +| 1539 | func_8018C2CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C2CC.c` | +| 1540 | func_8018048C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018048C.c` | +| 1541 | func_8018B874 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B874.c` | +| 1542 | func_8018B9DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B9DC.c` | +| 1543 | func_8018BD58 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BD58.c` | +| 1544 | func_8018CADC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CADC.c` | +| 1545 | func_801803E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801803E0.c` | +| 1546 | func_801845EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801845EC.c` | +| 1547 | func_80186A1C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186A1C.c` | +| 1548 | func_8017CF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CF54.c` | +| 1549 | func_80180D28 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D28.c` | +| 1550 | func_80181DC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181DC4.c` | +| 1551 | func_80184ACC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184ACC.c` | +| 1552 | func_8018788C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018788C.c` | +| 1553 | func_8018DF08 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018DF08.c` | +| 1554 | func_8018EBEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018EBEC.c` | +| 1555 | func_8017F7B8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F7B8.c` | +| 1556 | func_80180104 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180104.c` | +| 1557 | func_801814D0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801814D0.c` | +| 1558 | func_801885F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801885F4.c` | +| 1559 | func_80189A20 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189A20.c` | +| 1560 | func_8018A538 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A538.c` | +| 1561 | func_8018ABF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ABF0.c` | +| 1562 | func_8018EDC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018EDC4.c` | +| 1563 | func_8017E910 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E910.c` | +| 1564 | func_8017E94C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E94C.c` | +| 1565 | func_8017E9C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E9C4.c` | +| 1566 | func_80181B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181B44.c` | +| 1567 | func_80183018 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183018.c` | +| 1568 | func_80183230 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183230.c` | +| 1569 | func_8018399C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018399C.c` | +| 1570 | func_80183DF0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183DF0.c` | +| 1571 | func_80184510 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184510.c` | +| 1572 | func_80185FC4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185FC4.c` | +| 1573 | func_801860C4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801860C4.c` | +| 1574 | func_8017BF14 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017BF14.c` | +| 1575 | func_8017C338 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C338.c` | +| 1576 | func_80184130 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184130.c` | +| 1577 | func_801851B4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801851B4.c` | +| 1578 | func_8018A94C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A94C.c` | +| 1579 | func_8017CCD8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017CCD8.c` | +| 1580 | func_8017E374 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E374.c` | +| 1581 | func_8017F96C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F96C.c` | +| 1582 | func_80188524 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188524.c` | +| 1583 | func_80189A24 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189A24.c` | +| 1584 | func_8018A3F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A3F0.c` | +| 1585 | func_8018A488 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A488.c` | +| 1586 | func_8018A748 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A748.c` | +| 1587 | func_8018AA34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AA34.c` | +| 1588 | func_8018CFF4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CFF4.c` | +| 1589 | func_8018FCC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FCC8.c` | +| 1590 | func_801805DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801805DC.c` | +| 1591 | func_801834E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801834E4.c` | +| 1592 | func_80183788 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183788.c` | +| 1593 | func_8017FEC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017FEC8.c` | +| 1594 | func_801804F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801804F4.c` | +| 1595 | func_80180B7C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180B7C.c` | +| 1596 | func_80180C94 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180C94.c` | +| 1597 | func_80180D5C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180D5C.c` | +| 1598 | func_80183EFC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80183EFC.c` | +| 1599 | func_8018593C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018593C.c` | +| 1600 | func_80185C70 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80185C70.c` | +| 1601 | func_80186688 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80186688.c` | +| 1602 | func_8017E798 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E798.c` | +| 1603 | func_8017E7D4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E7D4.c` | +| 1604 | func_80180A88 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80180A88.c` | +| 1605 | func_8018333C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018333C.c` | +| 1606 | func_80184210 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80184210.c` | +| 1607 | func_801850A0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801850A0.c` | +| 1608 | func_801868E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801868E0.c` | +| 1609 | func_801875EC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801875EC.c` | +| 1610 | func_80188B44 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188B44.c` | +| 1611 | func_8018CF54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018CF54.c` | +| 1612 | func_8018AC34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018AC34.c` | +| 1613 | func_8018ACB4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018ACB4.c` | +| 1614 | func_8018BC34 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BC34.c` | +| 1615 | func_8017E038 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E038.c` | +| 1616 | func_80181924 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80181924.c` | +| 1617 | func_8018B570 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B570.c` | +| 1618 | func_8018B6F4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018B6F4.c` | +| 1619 | func_8018BE38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018BE38.c` | +| 1620 | func_8018C5FC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C5FC.c` | +| 1621 | func_8017C4BC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017C4BC.c` | +| 1622 | func_8017E380 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E380.c` | +| 1623 | func_8017E464 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E464.c` | +| 1624 | func_8017E564 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E564.c` | +| 1625 | func_8017EB00 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017EB00.c` | +| 1626 | func_8017F2F0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F2F0.c` | +| 1627 | func_801826D8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801826D8.c` | +| 1628 | func_801874A8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801874A8.c` | +| 1629 | func_80187784 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80187784.c` | +| 1630 | func_801894E0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801894E0.c` | +| 1631 | func_8018A5E4 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018A5E4.c` | +| 1632 | func_8018FB50 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FB50.c` | +| 1633 | func_8018FB8C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018FB8C.c` | +| 1634 | func_8017F20C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017F20C.c` | +| 1635 | func_80182BC8 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182BC8.c` | +| 1636 | func_8018381C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018381C.c` | +| 1637 | func_801898DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801898DC.c` | +| 1638 | func_8017E458 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8017E458.c` | +| 1639 | func_80182D74 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80182D74.c` | +| 1640 | func_80188BB0 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188BB0.c` | +| 1641 | func_80188BEC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188BEC.c` | +| 1642 | func_80188C64 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188C64.c` | +| 1643 | func_80188CDC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80188CDC.c` | +| 1644 | func_80189B38 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80189B38.c` | +| 1645 | func_8018C4DC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018C4DC.c` | +| 1646 | func_80146C3C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80146C3C.c` | +| 1647 | func_801495C4 | None | regalloc-order | None | near | 0 | none — MATCH expected (cloned byte-matched sibling func_8014964C recipe: $16 pin + asm barriers force param_2→$s0 and rematerialize &in/&mid/mtx) | `.run/backlog_drafts/func_801495C4.c` | +| 1648 | func_80151664 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151664.c` | +| 1649 | func_80151944 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151944.c` | +| 1650 | func_80151C54 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151C54.c` | +| 1651 | func_801522CC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801522CC.c` | +| 1652 | func_80155800 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80155800.c` | +| 1653 | func_8016039C | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8016039C.c` | +| 1654 | func_80162CCC | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162CCC.c` | +| 1655 | func_801733FC | None | struct | None | near | 0 | none — modeled on sibling func_80173460 (packed 8-byte struct copy + two s16=1 stores) | `.run/backlog_drafts/func_801733FC.c` | +| 1656 | func_80174684 | None | | None | near | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80174684.c` | +| 1657 | func_80178BF8 | None | other | None | near | 0 | none — MATCH (49 ins). Key: init loop pointers via &D_SYMBOL (not (T*)0x801da788 raw int, which emits lui+ori instead of lui%hi+addiu%lo). | `.run/backlog_drafts/func_80178BF8.c` | +| 1658 | func_8015D01C | None | regalloc-order | None | near | 0 | none — MATCH (uVar1 pinned $s3, uVar5 pinned $s1; param_1->s2, iVar4->s0 fall out) | `.run/backlog_drafts/func_8015D01C.c` | +| 1659 | func_80165240 | None | regalloc-order | None | near | 0 | none — MATCH (63 ins). Pins: param_3->$s3, &m->$s1, &D_80189750->$s0, &prim->$s2. | `.run/backlog_drafts/func_80165240.c` | +| 1660 | func_8016BBE0 | None | plumbing | None | near | 0 | none — MATCH (56 ins, match_one relocation-masked) | `.run/backlog_drafts/func_8016BBE0.c` | +| 1661 | func_8016BD78 | None | struct | None | near | 0 | none — MATCH (74 ins, relocation-masked) | `.run/backlog_drafts/func_8016BD78.c` | +| 1662 | func_8016BEA0 | None | plumbing | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8016BEA0.c` | +| 1663 | func_8016D688 | None | struct | None | near | 0 | none — MATCH (60 ins). Array-of-bytes decl (extern u8 D_801D9C20[]) makes gcc CSE the | `.run/backlog_drafts/func_8016D688.c` | +| 1664 | func_8016E7C8 | None | regalloc-order | None | near | 0 | none — MATCH (74 ins); register pin $s2 forces &prim into a saved reg (§17) | `.run/backlog_drafts/func_8016E7C8.c` | +| 1665 | func_8016F0AC | None | plumbing | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8016F0AC.c` | +| 1666 | func_80178B18 | None | struct | None | near | 0 | none — MATCH (pointer var forces &(*(int *)&D_8018A458) into $s0, reused for store + arg-0xC) | `.run/backlog_drafts/func_80178B18.c` | +| 1667 | func_8017B8E8 | None | struct | None | near | 0 | none — MATCH | `.run/backlog_drafts/func_8017B8E8.c` | +| 1668 | func_8017BB34 | None | struct | None | near | 0 | none — MATCH (65 ins) | `.run/backlog_drafts/func_8017BB34.c` | +| 1669 | func_8017B238 | None | regalloc-order | None | near | 0 | none — MATCH (76 ins). block-move source needs s0-pin + a zero-code barrier anchoring | `.run/backlog_drafts/func_8017B238.c` | +| 1670 | func_8017B368 | None | struct | None | near | 0 | none — MATCH (74 ins) | `.run/backlog_drafts/func_8017B368.c` | +| 1671 | func_80184F08 | None | regalloc-order | None | near | 0 | none — MATCH (145/145 ins, match_one confirmed) | `.run/backlog_drafts/func_80184F08.c` | +| 1672 | func_80162438 | None | regalloc-order | None | near | 0 | none — MATCH (160 ins, relocation-masked). Keys: (1) base=&D_800AF630 hoisted, pinned $s2; | `.run/backlog_drafts/func_80162438.c` | +| 1673 | func_80167AE0 | None | regalloc-order | None | near | 0 | none — MATCH expected; mirrors already-matched sibling func_8016A290 (same 3-loop tail), swapping the inline matrix-setup for a func_80168070 call + constant color block. | `.run/backlog_drafts/func_80167AE0.c` | +| 1674 | func_80167DBC | None | schedule | None | near | 0 | none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. | `.run/backlog_drafts/func_80167DBC.c` | +| 1675 | func_8016A290 | None | regalloc-order | None | near | 0 | none — MATCH (284 ins). Loop-counter biv update: pinned $v0 temp + $0-add opaque copy (i = t + zr) forces the target's 2-insn `addiu v0,s1,1; addu s1,v0,zero` and keeps CSE from rewriting the (s16)t test to read s1. | `.run/backlog_drafts/func_8016A290.c` | +| 1676 | func_8016C49C | None | regalloc-order | None | near | 0 | none — MATCH (172/172, relocation-masked) | `.run/backlog_drafts/func_8016C49C.c` | +| 1677 | func_8016CF04 | None | struct | None | near | 0 | none — MATCH (166 ins) | `.run/backlog_drafts/func_8016CF04.c` | +| 1678 | func_8016DC20 | None | schedule | None | near | 0 | none — MATCH (161 ins, relocation-masked). Keys: (1) mirror sibling func_8017BEF8 coord-transform idiom (16-byte Work struct {in x,y,z,xpad @0x20; out vx,vy,vz,vpad @0x28} -> frame 0x48, in@sp+0x20/out@sp+0x28); (2) SHORT loop counter i shared across all 3 loops defeats shift-IV strength reduction; (3) loop-2 = check-first/increment-after (like loop-1) keeps search key 0x11 in $a0 (reused as the func_80146A6C a0 arg) instead of spilling to $a1; (4) place loop-3 counter reset i=0 AFTER func_800D23D0 (not before func_80146A6C(0x11)) so it schedules as $s1-reset last, not first; (5) inverted final branch (if r!=0 {loops} else fall to ddb0/func_80146C3C) matches beqz; node-alloc block mirrors sibling func_8016DA7C. | `.run/backlog_drafts/func_8016DC20.c` | +| 1679 | func_8016DF5C | None | regalloc-order | None | near | 0 | none — MATCH (156 ins). Split iVar8 live-range (top-load->else $s3, func_801465C0 | `.run/backlog_drafts/func_8016DF5C.c` | +| 1680 | func_801824D0 | None | plumbing | None | near | 0 | none — MATCH (181 ins). switch(bVar1) dispatch; counters as *p+=1;if(*p$s1 via `register int self __asm__("$17")=param_1` | `.run/backlog_drafts/func_8018514C.c` | +| 1683 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | +| 1684 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | +| 1685 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | +| 1686 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | +| 1687 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | +| 1688 | func_8017F114 | 1 | regalloc-order | 75 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8017F114.c` | +| 1689 | func_8013EF88 | 1 | struct | 108 | near | 1 | none — MATCH (108 ins, relocation-masked) | `.run/backlog_drafts/func_8013EF88.c` | +| 1690 | func_801656E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801656E8.c` | +| 1691 | func_8017D2D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D2D4.c` | +| 1692 | func_801807D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801807D8.c` | +| 1693 | func_80180AD0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180AD0.c` | +| 1694 | func_8017F758 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F758.c` | +| 1695 | func_8017FDB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FDB0.c` | +| 1696 | func_80180720 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180720.c` | +| 1697 | func_80184D80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184D80.c` | +| 1698 | func_80184A28 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184A28.c` | +| 1699 | func_8017FB2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB2C.c` | +| 1700 | func_80183724 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183724.c` | +| 1701 | func_80183AFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183AFC.c` | +| 1702 | func_8017EE50 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE50.c` | +| 1703 | func_80181FF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FF8.c` | +| 1704 | func_80185D5C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185D5C.c` | +| 1705 | func_8018AE80 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AE80.c` | +| 1706 | func_80183FF4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FF4.c` | +| 1707 | func_801832F4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801832F4.c` | +| 1708 | func_8017FE4C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FE4C.c` | +| 1709 | func_801827C4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801827C4.c` | +| 1710 | func_80182B68 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182B68.c` | +| 1711 | func_80185E38 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185E38.c` | +| 1712 | func_8017D060 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D060.c` | +| 1713 | func_8017FD70 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FD70.c` | +| 1714 | func_801811D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801811D4.c` | +| 1715 | func_801819DC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801819DC.c` | +| 1716 | func_8017E67C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E67C.c` | +| 1717 | func_80184820 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184820.c` | +| 1718 | func_8018ADF8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018ADF8.c` | +| 1719 | func_80186554 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186554.c` | +| 1720 | func_80180C44 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180C44.c` | +| 1721 | func_801873FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801873FC.c` | +| 1722 | func_8017EF1C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EF1C.c` | +| 1723 | func_80187540 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187540.c` | +| 1724 | func_8017F8E8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F8E8.c` | +| 1725 | func_80183FB4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183FB4.c` | +| 1726 | func_80180E7C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180E7C.c` | +| 1727 | func_80182F18 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182F18.c` | +| 1728 | func_80188FE0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80188FE0.c` | +| 1729 | func_801835FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801835FC.c` | +| 1730 | func_801892B4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801892B4.c` | +| 1731 | func_8017DBBC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017DBBC.c` | +| 1732 | func_8017D4A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D4A8.c` | +| 1733 | func_80184970 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184970.c` | +| 1734 | func_801819AC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801819AC.c` | +| 1735 | func_801863D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801863D4.c` | +| 1736 | func_80181540 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181540.c` | +| 1737 | func_80180694 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180694.c` | +| 1738 | func_80184560 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184560.c` | +| 1739 | func_801809D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801809D4.c` | +| 1740 | func_80180530 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180530.c` | +| 1741 | func_8017E4E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E4E0.c` | +| 1742 | func_80185864 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185864.c` | +| 1743 | func_801802A4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801802A4.c` | +| 1744 | func_80181790 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181790.c` | +| 1745 | func_80180820 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180820.c` | +| 1746 | func_80181F78 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181F78.c` | +| 1747 | func_801830A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801830A8.c` | +| 1748 | func_8017E858 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E858.c` | +| 1749 | func_80181DCC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181DCC.c` | +| 1750 | func_80186BD4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186BD4.c` | +| 1751 | func_8018452C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018452C.c` | +| 1752 | func_8017FB98 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB98.c` | +| 1753 | func_80184C9C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184C9C.c` | +| 1754 | func_8017EE14 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EE14.c` | +| 1755 | func_8017E2A4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E2A4.c` | +| 1756 | func_80181DA0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181DA0.c` | +| 1757 | func_80180BFC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180BFC.c` | +| 1758 | func_801856A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801856A8.c` | +| 1759 | func_80187840 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187840.c` | +| 1760 | func_8017FB44 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FB44.c` | +| 1761 | func_80184E58 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184E58.c` | +| 1762 | func_80184354 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184354.c` | +| 1763 | func_8018011C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018011C.c` | +| 1764 | func_8017E29C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E29C.c` | +| 1765 | func_8017D930 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D930.c` | +| 1766 | func_80182A8C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182A8C.c` | +| 1767 | func_80181FCC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181FCC.c` | +| 1768 | func_801844FC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801844FC.c` | +| 1769 | func_801893E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801893E0.c` | +| 1770 | func_80186908 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186908.c` | +| 1771 | func_80189DC4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80189DC4.c` | +| 1772 | func_8018A900 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018A900.c` | +| 1773 | func_80182AB0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182AB0.c` | +| 1774 | func_80183EA4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183EA4.c` | +| 1775 | func_8018B344 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018B344.c` | +| 1776 | func_80188858 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80188858.c` | +| 1777 | func_80185AD4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185AD4.c` | +| 1778 | func_8018773C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018773C.c` | +| 1779 | func_801895A8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801895A8.c` | +| 1780 | func_80182E9C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182E9C.c` | +| 1781 | func_8017F378 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017F378.c` | +| 1782 | func_8018F114 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018F114.c` | +| 1783 | func_80184BAC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184BAC.c` | +| 1784 | func_801852D4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801852D4.c` | +| 1785 | func_80181E6C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181E6C.c` | +| 1786 | func_80186E24 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186E24.c` | +| 1787 | func_80186630 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186630.c` | +| 1788 | func_80189B60 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80189B60.c` | +| 1789 | func_8018445C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018445C.c` | +| 1790 | func_8018AA08 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018AA08.c` | +| 1791 | func_80183558 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183558.c` | +| 1792 | func_80181394 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80181394.c` | +| 1793 | func_80182CEC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182CEC.c` | +| 1794 | func_80190518 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80190518.c` | +| 1795 | func_8018110C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018110C.c` | +| 1796 | func_8017D460 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017D460.c` | +| 1797 | func_8017FBB4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017FBB4.c` | +| 1798 | func_8018C8A0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018C8A0.c` | +| 1799 | func_8018944C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018944C.c` | +| 1800 | func_8018A598 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018A598.c` | +| 1801 | func_8017EA40 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EA40.c` | +| 1802 | func_801826C8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801826C8.c` | +| 1803 | func_801854C0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801854C0.c` | +| 1804 | func_8017EC64 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EC64.c` | +| 1805 | func_80184C94 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80184C94.c` | +| 1806 | func_80186D7C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186D7C.c` | +| 1807 | func_80185CE4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185CE4.c` | +| 1808 | func_8017EA68 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017EA68.c` | +| 1809 | func_80180074 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180074.c` | +| 1810 | func_801847E4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801847E4.c` | +| 1811 | func_80180F2C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180F2C.c` | +| 1812 | func_80180EA4 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80180EA4.c` | +| 1813 | func_80182470 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80182470.c` | +| 1814 | func_8017E3D8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E3D8.c` | +| 1815 | func_8017E558 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8017E558.c` | +| 1816 | func_8018386C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018386C.c` | +| 1817 | func_80187A0C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80187A0C.c` | +| 1818 | func_8018893C | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_8018893C.c` | +| 1819 | func_80186AE8 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80186AE8.c` | +| 1820 | func_801811E0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801811E0.c` | +| 1821 | func_80183ABC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80183ABC.c` | +| 1822 | func_80185BEC | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_80185BEC.c` | +| 1823 | func_801900B0 | None | | None | near | 1 | residual: 1 mismatch | `.run/backlog_drafts/func_801900B0.c` | +| 1824 | func_8017F290 | 1 | regalloc-order | 86 | near | 2 | none — MATCH. Two levers: (1) hold &D_801270CC in a `int *state` local so its | `.run/backlog_drafts/func_8017F290.c` | +| 1825 | func_8016EC0C | 1 | schedule | 88 | near | 2 | none — MATCH (88 ins). Sparse switch(uVar2) = gcc's beq-pivot+slti comparison | `.run/backlog_drafts/func_8016EC0C.c` | +| 1826 | func_8017F6B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F6B0.c` | +| 1827 | func_8017DDFC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DDFC.c` | +| 1828 | func_8017FD2C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FD2C.c` | +| 1829 | func_8018A640 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A640.c` | +| 1830 | func_80188F30 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80188F30.c` | +| 1831 | func_8018BCB4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BCB4.c` | +| 1832 | func_80185320 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185320.c` | +| 1833 | func_80185670 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185670.c` | +| 1834 | func_801880F4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801880F4.c` | +| 1835 | func_80182A14 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182A14.c` | +| 1836 | func_801817DC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801817DC.c` | +| 1837 | func_801822B8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801822B8.c` | +| 1838 | func_80182264 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182264.c` | +| 1839 | func_8017E624 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E624.c` | +| 1840 | func_8018062C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018062C.c` | +| 1841 | func_80189AE0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80189AE0.c` | +| 1842 | func_80181834 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80181834.c` | +| 1843 | func_8018A4C4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A4C4.c` | +| 1844 | func_8017DEAC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017DEAC.c` | +| 1845 | func_8017EBD4 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017EBD4.c` | +| 1846 | func_8017E730 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E730.c` | +| 1847 | func_8018558C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018558C.c` | +| 1848 | func_8018AF78 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018AF78.c` | +| 1849 | func_8017D880 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017D880.c` | +| 1850 | func_80189498 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80189498.c` | +| 1851 | func_8018109C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018109C.c` | +| 1852 | func_801826F0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801826F0.c` | +| 1853 | func_801843CC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801843CC.c` | +| 1854 | func_80182354 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182354.c` | +| 1855 | func_80187998 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80187998.c` | +| 1856 | func_801824A0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801824A0.c` | +| 1857 | func_8017FC8C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FC8C.c` | +| 1858 | func_8018567C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018567C.c` | +| 1859 | func_80183228 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183228.c` | +| 1860 | func_80183118 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183118.c` | +| 1861 | func_8017E404 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E404.c` | +| 1862 | func_80183B4C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183B4C.c` | +| 1863 | func_8018A260 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018A260.c` | +| 1864 | func_801831B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801831B0.c` | +| 1865 | func_801879B0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801879B0.c` | +| 1866 | func_801828C8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801828C8.c` | +| 1867 | func_8017FA80 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017FA80.c` | +| 1868 | func_8017E874 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017E874.c` | +| 1869 | func_8018B108 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018B108.c` | +| 1870 | func_80185000 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185000.c` | +| 1871 | func_8017F188 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017F188.c` | +| 1872 | func_80181934 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80181934.c` | +| 1873 | func_801812E0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801812E0.c` | +| 1874 | func_80180F18 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180F18.c` | +| 1875 | func_8018C658 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018C658.c` | +| 1876 | func_80184E20 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80184E20.c` | +| 1877 | func_80187318 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80187318.c` | +| 1878 | func_80180BF0 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180BF0.c` | +| 1879 | func_80184294 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80184294.c` | +| 1880 | func_80183F48 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80183F48.c` | +| 1881 | func_80180834 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80180834.c` | +| 1882 | func_80185C68 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185C68.c` | +| 1883 | func_8018BA9C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018BA9C.c` | +| 1884 | func_80186DAC | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80186DAC.c` | +| 1885 | func_80182908 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80182908.c` | +| 1886 | func_8018422C | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018422C.c` | +| 1887 | func_80185734 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_80185734.c` | +| 1888 | func_8017EE78 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8017EE78.c` | +| 1889 | func_8018B054 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_8018B054.c` | +| 1890 | func_801804C8 | None | | None | near | 2 | residual: 2 mismatch | `.run/backlog_drafts/func_801804C8.c` | +| 1891 | func_8012FCC4 | 1 | schedule | 57 | near | 3 | 3 ins — beqz(0x100) delay-slot fill. Target re-emits `move a0,s0` for func_80131B14 | `.run/backlog_drafts/func_8012FCC4.c` | +| 1892 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | +| 1893 | func_8017DA80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DA80.c` | +| 1894 | func_8017D468 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D468.c` | +| 1895 | func_80185BF4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185BF4.c` | +| 1896 | func_8017DCE4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DCE4.c` | +| 1897 | func_8017F510 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F510.c` | +| 1898 | func_80182EC4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182EC4.c` | +| 1899 | func_801802AC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801802AC.c` | +| 1900 | func_801816FC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801816FC.c` | +| 1901 | func_801808F8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801808F8.c` | +| 1902 | func_80182D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80182D98.c` | +| 1903 | func_80184D28 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184D28.c` | +| 1904 | func_8017DE90 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017DE90.c` | +| 1905 | func_80185070 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185070.c` | +| 1906 | func_80190480 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80190480.c` | +| 1907 | func_80180814 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180814.c` | +| 1908 | func_801827B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801827B8.c` | +| 1909 | func_8017EBB4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017EBB4.c` | +| 1910 | func_8018AFDC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AFDC.c` | +| 1911 | func_80180D34 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180D34.c` | +| 1912 | func_801858AC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801858AC.c` | +| 1913 | func_801802B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801802B8.c` | +| 1914 | func_8017F38C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F38C.c` | +| 1915 | func_8017D938 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017D938.c` | +| 1916 | func_8017EDE0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017EDE0.c` | +| 1917 | func_80187008 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80187008.c` | +| 1918 | func_80185200 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185200.c` | +| 1919 | func_8018AE6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AE6C.c` | +| 1920 | func_80184A54 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184A54.c` | +| 1921 | func_80181720 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181720.c` | +| 1922 | func_80183BC8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183BC8.c` | +| 1923 | func_8017F0C0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F0C0.c` | +| 1924 | func_8018318C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018318C.c` | +| 1925 | func_801825D8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801825D8.c` | +| 1926 | func_8018D4B4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018D4B4.c` | +| 1927 | func_80181E3C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181E3C.c` | +| 1928 | func_801874E8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801874E8.c` | +| 1929 | func_80183320 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183320.c` | +| 1930 | func_801818DC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801818DC.c` | +| 1931 | func_801857D4 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801857D4.c` | +| 1932 | func_8017F0B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F0B8.c` | +| 1933 | func_8018A184 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018A184.c` | +| 1934 | func_8018AE4C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018AE4C.c` | +| 1935 | func_8018B234 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018B234.c` | +| 1936 | func_80180D2C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80180D2C.c` | +| 1937 | func_80181D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181D98.c` | +| 1938 | func_8017F534 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017F534.c` | +| 1939 | func_801861DC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801861DC.c` | +| 1940 | func_801896EC | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801896EC.c` | +| 1941 | func_80184CD8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184CD8.c` | +| 1942 | func_8018C7C8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018C7C8.c` | +| 1943 | func_80187B80 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80187B80.c` | +| 1944 | func_80189C14 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80189C14.c` | +| 1945 | func_80185674 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80185674.c` | +| 1946 | func_80181060 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80181060.c` | +| 1947 | func_801806C8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801806C8.c` | +| 1948 | func_80184594 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184594.c` | +| 1949 | func_80184C70 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184C70.c` | +| 1950 | func_80183A6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80183A6C.c` | +| 1951 | func_8018CA10 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018CA10.c` | +| 1952 | func_8018672C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018672C.c` | +| 1953 | func_801894B0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801894B0.c` | +| 1954 | func_80184D98 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184D98.c` | +| 1955 | func_801823B8 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_801823B8.c` | +| 1956 | func_8018CC6C | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018CC6C.c` | +| 1957 | func_8018B1E0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8018B1E0.c` | +| 1958 | func_80184870 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_80184870.c` | +| 1959 | func_8017E6B0 | None | | None | near | 3 | residual: 3 mismatch | `.run/backlog_drafts/func_8017E6B0.c` | +| 1960 | func_801549F8 | None | schedule | None | near | 3 | 3-off at -O2 (match_one + gate flags). The n=byte keep-alive copy (addu $a3,$v0,$zero) emits BEFORE the hoisted jtbl (lui/addiu $t0); target emits it AFTER. Pure RTL emission order — a preheader source-statement is always chained before a hoisted loop-invariant, and gcc-2.7.2-psx runs no active delay-slot/list scheduler here (load-delay nops stay unfilled) to reorder them. Not reachable by any source reordering tried (~20 forms). The instruction itself is byte-identical; only its position among 3 independent preheader insns differs. Permuter can't run (pycparser rejects the register __asm__ pin) -> human/RTL-level lever needed. | `.run/backlog_drafts/func_801549F8.c` | +| 1961 | func_80161E08 | None | regalloc-order | None | near | 3 | none — MATCH (175 ins, relocation-masked). Giant, 3 similar guarded blocks. base=&D_800AF630 | `.run/backlog_drafts/func_80161E08.c` | +| 1962 | func_8012A018 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8012A018.c` | +| 1963 | func_80180B24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B24.c` | +| 1964 | func_80180B34 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180B34.c` | +| 1965 | func_80181758 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181758.c` | +| 1966 | func_80188484 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188484.c` | +| 1967 | func_8018F080 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F080.c` | +| 1968 | func_8018F090 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018F090.c` | +| 1969 | func_80190460 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190460.c` | +| 1970 | func_80190470 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80190470.c` | +| 1971 | func_80183690 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183690.c` | +| 1972 | func_801836A0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801836A0.c` | +| 1973 | func_80188F4C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F4C.c` | +| 1974 | func_80188F5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188F5C.c` | +| 1975 | func_80185CC8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CC8.c` | +| 1976 | func_80185CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185CD8.c` | +| 1977 | func_8018ADEC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADEC.c` | +| 1978 | func_8018ADFC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018ADFC.c` | +| 1979 | func_8018478C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018478C.c` | +| 1980 | func_8018479C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018479C.c` | +| 1981 | func_8017F8E4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017F8E4.c` | +| 1982 | func_80185FA4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185FA4.c` | +| 1983 | func_80187074 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80187074.c` | +| 1984 | func_80189F14 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189F14.c` | +| 1985 | func_80182D48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182D48.c` | +| 1986 | func_8017DFBC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017DFBC.c` | +| 1987 | func_801871AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801871AC.c` | +| 1988 | func_801857D0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801857D0.c` | +| 1989 | func_801857E0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801857E0.c` | +| 1990 | func_80189F24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189F24.c` | +| 1991 | func_801834D4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801834D4.c` | +| 1992 | func_80181F14 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181F14.c` | +| 1993 | func_80185A40 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185A40.c` | +| 1994 | func_80184498 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184498.c` | +| 1995 | func_801844A8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844A8.c` | +| 1996 | func_80184850 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184850.c` | +| 1997 | func_80183098 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183098.c` | +| 1998 | func_801844DC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844DC.c` | +| 1999 | func_80189514 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189514.c` | +| 2000 | func_8018A87C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018A87C.c` | +| 2001 | func_8017FF90 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FF90.c` | +| 2002 | func_80184468 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184468.c` | +| 2003 | func_80181F24 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181F24.c` | +| 2004 | func_8017E150 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E150.c` | +| 2005 | func_8017EBE4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017EBE4.c` | +| 2006 | func_80184840 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184840.c` | +| 2007 | func_80180BC4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180BC4.c` | +| 2008 | func_80184BB0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184BB0.c` | +| 2009 | func_80184180 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184180.c` | +| 2010 | func_801844CC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844CC.c` | +| 2011 | func_80184C08 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184C08.c` | +| 2012 | func_80183A1C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183A1C.c` | +| 2013 | func_80181D38 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181D38.c` | +| 2014 | func_8018A86C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018A86C.c` | +| 2015 | func_8017E44C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E44C.c` | +| 2016 | func_80184E38 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184E38.c` | +| 2017 | func_801815DC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801815DC.c` | +| 2018 | func_801871BC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801871BC.c` | +| 2019 | func_8017FDD4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FDD4.c` | +| 2020 | func_8017E904 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E904.c` | +| 2021 | func_80183BA8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183BA8.c` | +| 2022 | func_80184478 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184478.c` | +| 2023 | func_80185A50 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185A50.c` | +| 2024 | func_8017E160 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E160.c` | +| 2025 | func_8017FAE0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FAE0.c` | +| 2026 | func_8018170C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018170C.c` | +| 2027 | func_801865AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801865AC.c` | +| 2028 | func_80188CA0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188CA0.c` | +| 2029 | func_80180BB4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180BB4.c` | +| 2030 | func_80184BC0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184BC0.c` | +| 2031 | func_8017E848 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E848.c` | +| 2032 | func_80185614 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185614.c` | +| 2033 | func_80184C18 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184C18.c` | +| 2034 | func_80183A0C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183A0C.c` | +| 2035 | func_80189524 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80189524.c` | +| 2036 | func_80181D48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181D48.c` | +| 2037 | func_8017E45C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E45C.c` | +| 2038 | func_80184E48 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184E48.c` | +| 2039 | func_801815CC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801815CC.c` | +| 2040 | func_8017FDE4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FDE4.c` | +| 2041 | func_8017E8F4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E8F4.c` | +| 2042 | func_801834C4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801834C4.c` | +| 2043 | func_8017EBC4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017EBC4.c` | +| 2044 | func_8018659C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018659C.c` | +| 2045 | func_80183088 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183088.c` | +| 2046 | func_8017FA40 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017FA40.c` | +| 2047 | func_8017E918 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E918.c` | +| 2048 | func_8017E838 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E838.c` | +| 2049 | func_80185624 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80185624.c` | +| 2050 | func_8017E02C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E02C.c` | +| 2051 | func_801853C0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801853C0.c` | +| 2052 | func_8017E210 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E210.c` | +| 2053 | func_80183BB8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183BB8.c` | +| 2054 | func_801847AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801847AC.c` | +| 2055 | func_80180ED4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180ED4.c` | +| 2056 | func_8017E194 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E194.c` | +| 2057 | func_801853D0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801853D0.c` | +| 2058 | func_8017E3F0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E3F0.c` | +| 2059 | func_80183444 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183444.c` | +| 2060 | func_8017E220 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E220.c` | +| 2061 | func_8018BD94 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018BD94.c` | +| 2062 | func_80186700 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80186700.c` | +| 2063 | func_8017E004 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017E004.c` | +| 2064 | func_8018314C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018314C.c` | +| 2065 | func_80183710 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183710.c` | +| 2066 | func_801845B8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801845B8.c` | +| 2067 | func_8018BA94 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018BA94.c` | +| 2068 | func_80181CD8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181CD8.c` | +| 2069 | func_80184880 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80184880.c` | +| 2070 | func_8018CC04 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018CC04.c` | +| 2071 | func_8017DED8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8017DED8.c` | +| 2072 | func_80180CA8 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180CA8.c` | +| 2073 | func_80181ECC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181ECC.c` | +| 2074 | func_801844AC | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801844AC.c` | +| 2075 | func_80183ED4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183ED4.c` | +| 2076 | func_80182E5C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182E5C.c` | +| 2077 | func_8018449C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018449C.c` | +| 2078 | func_8018B2F4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018B2F4.c` | +| 2079 | func_80183638 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80183638.c` | +| 2080 | func_8018455C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018455C.c` | +| 2081 | func_80181B08 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181B08.c` | +| 2082 | func_80180E70 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80180E70.c` | +| 2083 | func_801823F0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_801823F0.c` | +| 2084 | func_8018CBB0 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018CBB0.c` | +| 2085 | func_80188510 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80188510.c` | +| 2086 | func_80181A44 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80181A44.c` | +| 2087 | func_80182CD4 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_80182CD4.c` | +| 2088 | func_8018119C | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018119C.c` | +| 2089 | func_8018C394 | None | | None | near | 4 | residual: 4 mismatch | `.run/backlog_drafts/func_8018C394.c` | +| 2090 | func_8017EF50 | None | schedule | None | near | 4 | 4 ins — coupled first-block tie-break: addiu(0x34+1)/addu(0x10+0x2c) adjacent swap trades off vs the 0x2c/0x30 load order (can fix one or the other, not both from C), plus 0xa lands in $a1 not target's $a2 (a caller-saved reg choice; a `register short` pin to $6 triggers sll/sra sign-ext -> +3 ins). | `.run/backlog_drafts/func_8017EF50.c` | +| 2091 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | +| 2092 | func_8017CE34 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE34.c` | +| 2093 | func_8017D948 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D948.c` | +| 2094 | func_8017D2EC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D2EC.c` | +| 2095 | func_801803F0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801803F0.c` | +| 2096 | func_80180710 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180710.c` | +| 2097 | func_8017CE7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE7C.c` | +| 2098 | func_8017F7D8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7D8.c` | +| 2099 | func_8017ED98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ED98.c` | +| 2100 | func_80181B8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181B8C.c` | +| 2101 | func_8017E14C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E14C.c` | +| 2102 | func_8017D528 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D528.c` | +| 2103 | func_801900E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801900E0.c` | +| 2104 | func_8017D1F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1F4.c` | +| 2105 | func_8017DB48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DB48.c` | +| 2106 | func_8017EBD0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EBD0.c` | +| 2107 | func_80182720 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182720.c` | +| 2108 | func_8017D160 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D160.c` | +| 2109 | func_8017E9D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9D0.c` | +| 2110 | func_8017D368 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D368.c` | +| 2111 | func_80180564 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180564.c` | +| 2112 | func_801809F4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801809F4.c` | +| 2113 | func_8017F250 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F250.c` | +| 2114 | func_8017F66C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F66C.c` | +| 2115 | func_8017F76C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F76C.c` | +| 2116 | func_8017F790 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F790.c` | +| 2117 | func_8017F7B4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F7B4.c` | +| 2118 | func_8017CE1C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE1C.c` | +| 2119 | func_8017E9E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E9E8.c` | +| 2120 | func_8017CE3C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE3C.c` | +| 2121 | func_8017E4E4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E4E4.c` | +| 2122 | func_80181E18 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181E18.c` | +| 2123 | func_801852C8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801852C8.c` | +| 2124 | func_8017ECF8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017ECF8.c` | +| 2125 | func_8017E420 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E420.c` | +| 2126 | func_80181700 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181700.c` | +| 2127 | func_8017EE40 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EE40.c` | +| 2128 | func_80180DF4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180DF4.c` | +| 2129 | func_8017D4E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D4E8.c` | +| 2130 | func_8017D8C0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D8C0.c` | +| 2131 | func_8017CE44 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE44.c` | +| 2132 | func_8017D200 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D200.c` | +| 2133 | func_8017E878 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E878.c` | +| 2134 | func_8017D0E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D0E0.c` | +| 2135 | func_8017CE70 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE70.c` | +| 2136 | func_8017E7F8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E7F8.c` | +| 2137 | func_8017F05C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F05C.c` | +| 2138 | func_8017CE8C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE8C.c` | +| 2139 | func_80183984 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183984.c` | +| 2140 | func_8017CE9C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE9C.c` | +| 2141 | func_8017CFE0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CFE0.c` | +| 2142 | func_8017DE58 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DE58.c` | +| 2143 | func_8017D248 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D248.c` | +| 2144 | func_80180284 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180284.c` | +| 2145 | func_80180100 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180100.c` | +| 2146 | func_8018014C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018014C.c` | +| 2147 | func_8017EE94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EE94.c` | +| 2148 | func_8017E0C8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E0C8.c` | +| 2149 | func_8017FD94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FD94.c` | +| 2150 | func_8017F0A4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F0A4.c` | +| 2151 | func_8017D8E4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D8E4.c` | +| 2152 | func_8017EABC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017EABC.c` | +| 2153 | func_8018B7A4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018B7A4.c` | +| 2154 | func_80181EF0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181EF0.c` | +| 2155 | func_8017D76C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D76C.c` | +| 2156 | func_801807B0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801807B0.c` | +| 2157 | func_8017DF24 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DF24.c` | +| 2158 | func_8017E8B8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E8B8.c` | +| 2159 | func_801821B8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801821B8.c` | +| 2160 | func_8017D844 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D844.c` | +| 2161 | func_8017FE68 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FE68.c` | +| 2162 | func_8017D614 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D614.c` | +| 2163 | func_8018312C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018312C.c` | +| 2164 | func_8017FF7C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FF7C.c` | +| 2165 | func_8018DA98 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018DA98.c` | +| 2166 | func_8017F11C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F11C.c` | +| 2167 | func_8017D25C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D25C.c` | +| 2168 | func_8017DF4C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DF4C.c` | +| 2169 | func_80185744 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185744.c` | +| 2170 | func_80183C20 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183C20.c` | +| 2171 | func_8018550C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018550C.c` | +| 2172 | func_8017F744 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F744.c` | +| 2173 | func_80180A14 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180A14.c` | +| 2174 | func_8017D608 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D608.c` | +| 2175 | func_80181D60 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181D60.c` | +| 2176 | func_8017FAB0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FAB0.c` | +| 2177 | func_8017DA6C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA6C.c` | +| 2178 | func_8017CEC8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CEC8.c` | +| 2179 | func_80183644 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183644.c` | +| 2180 | func_80182810 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182810.c` | +| 2181 | func_80180F48 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180F48.c` | +| 2182 | func_8017CE64 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CE64.c` | +| 2183 | func_8017D1CC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D1CC.c` | +| 2184 | func_8017F928 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F928.c` | +| 2185 | func_8017D830 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D830.c` | +| 2186 | func_8017FDA8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017FDA8.c` | +| 2187 | func_80182938 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182938.c` | +| 2188 | func_8018517C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018517C.c` | +| 2189 | func_8017F09C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F09C.c` | +| 2190 | func_80182B18 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80182B18.c` | +| 2191 | func_8017DEA0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DEA0.c` | +| 2192 | func_8017DA88 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA88.c` | +| 2193 | func_8017E8C4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E8C4.c` | +| 2194 | func_8017DA90 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA90.c` | +| 2195 | func_801816DC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801816DC.c` | +| 2196 | func_8017E6A0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E6A0.c` | +| 2197 | func_80180E94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180E94.c` | +| 2198 | func_80181BB4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181BB4.c` | +| 2199 | func_80180D94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180D94.c` | +| 2200 | func_8017D850 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D850.c` | +| 2201 | func_801869E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_801869E0.c` | +| 2202 | func_8017DCF8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DCF8.c` | +| 2203 | func_8018C3D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018C3D0.c` | +| 2204 | func_80180190 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180190.c` | +| 2205 | func_8017E82C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E82C.c` | +| 2206 | func_80185338 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185338.c` | +| 2207 | func_8017E2E8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E2E8.c` | +| 2208 | func_8017CF94 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CF94.c` | +| 2209 | func_80185978 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185978.c` | +| 2210 | func_8017E534 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E534.c` | +| 2211 | func_8017DA4C | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DA4C.c` | +| 2212 | func_8017DCE8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017DCE8.c` | +| 2213 | func_8017D674 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D674.c` | +| 2214 | func_80183904 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183904.c` | +| 2215 | func_80181AE4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181AE4.c` | +| 2216 | func_8017D490 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D490.c` | +| 2217 | func_8017D214 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D214.c` | +| 2218 | func_80181D50 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80181D50.c` | +| 2219 | func_8017CEAC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017CEAC.c` | +| 2220 | func_8017F1E0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017F1E0.c` | +| 2221 | func_8018C0D0 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8018C0D0.c` | +| 2222 | func_8017E2CC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017E2CC.c` | +| 2223 | func_80180B58 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80180B58.c` | +| 2224 | func_8017D7D4 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_8017D7D4.c` | +| 2225 | func_80185E54 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80185E54.c` | +| 2226 | func_80187DAC | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80187DAC.c` | +| 2227 | func_80183DB8 | None | | None | near | 5 | residual: 5 mismatch | `.run/backlog_drafts/func_80183DB8.c` | +| 2228 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | +| 2229 | func_8017B238 | 1 | regalloc-order | 76 | near | 6 | 6 ins — gcc coalesces param_2 into callee-saved $s0 and hoists `move $s0,$a1` | `.run/backlog_drafts/func_8017B238.c` | +| 2230 | func_8017B614 | 1 | regalloc-order | 101 | near | 6 | 6 ins — param_2 lands in callee-saved $s0 (entry `move s0,a1`, sltiu/sll read s0) vs target's $a1; gcc prefers s0 (saved anyway for the late p794/p78C copies) over caller-saved $a1. Body+schedule otherwise byte-exact (101/101 ins); the late-part `__asm__("")` barrier is load-bearing (fixes the const-store schedule, 21->6). | `.run/backlog_drafts/func_8017B614.c` | +| 2231 | func_801656D0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801656D0.c` | +| 2232 | func_80165700 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80165700.c` | +| 2233 | func_80180AE8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180AE8.c` | +| 2234 | func_8017D398 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D398.c` | +| 2235 | func_8017FCCC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FCCC.c` | +| 2236 | func_80184A58 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80184A58.c` | +| 2237 | func_80182280 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182280.c` | +| 2238 | func_80180744 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180744.c` | +| 2239 | func_8017FA64 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FA64.c` | +| 2240 | func_8017EB58 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017EB58.c` | +| 2241 | func_8017F4CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F4CC.c` | +| 2242 | func_8017D624 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D624.c` | +| 2243 | func_80181C78 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181C78.c` | +| 2244 | func_801855DC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801855DC.c` | +| 2245 | func_8017FCD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FCD4.c` | +| 2246 | func_80183158 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80183158.c` | +| 2247 | func_80182E2C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182E2C.c` | +| 2248 | func_8017F704 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F704.c` | +| 2249 | func_80185C20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185C20.c` | +| 2250 | func_8017E06C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E06C.c` | +| 2251 | func_8017FA20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017FA20.c` | +| 2252 | func_80187AD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80187AD4.c` | +| 2253 | func_8018595C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018595C.c` | +| 2254 | func_8017D6CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017D6CC.c` | +| 2255 | func_80180CD4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180CD4.c` | +| 2256 | func_8018423C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018423C.c` | +| 2257 | func_80180EE4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180EE4.c` | +| 2258 | func_80185B20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185B20.c` | +| 2259 | func_80181BD8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181BD8.c` | +| 2260 | func_801802CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801802CC.c` | +| 2261 | func_801844F8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801844F8.c` | +| 2262 | func_8017E2C4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E2C4.c` | +| 2263 | func_80185A8C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185A8C.c` | +| 2264 | func_8017F0EC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F0EC.c` | +| 2265 | func_80180FFC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180FFC.c` | +| 2266 | func_8017DFFC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017DFFC.c` | +| 2267 | func_80188F80 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80188F80.c` | +| 2268 | func_8018A744 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A744.c` | +| 2269 | func_8017F088 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017F088.c` | +| 2270 | func_80181F00 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181F00.c` | +| 2271 | func_801818D4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801818D4.c` | +| 2272 | func_801805D8 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801805D8.c` | +| 2273 | func_80181FF4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181FF4.c` | +| 2274 | func_80189240 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80189240.c` | +| 2275 | func_80184618 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80184618.c` | +| 2276 | func_8018413C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018413C.c` | +| 2277 | func_801816E0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801816E0.c` | +| 2278 | func_801811F0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801811F0.c` | +| 2279 | func_801819A0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801819A0.c` | +| 2280 | func_8018A698 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A698.c` | +| 2281 | func_801855F0 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801855F0.c` | +| 2282 | func_8017E1DC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E1DC.c` | +| 2283 | func_80183E20 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80183E20.c` | +| 2284 | func_80185AE4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80185AE4.c` | +| 2285 | func_8017ED3C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017ED3C.c` | +| 2286 | func_80181854 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181854.c` | +| 2287 | func_8017ECB4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017ECB4.c` | +| 2288 | func_80182048 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80182048.c` | +| 2289 | func_80181230 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80181230.c` | +| 2290 | func_8017DBAC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017DBAC.c` | +| 2291 | func_8017E230 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8017E230.c` | +| 2292 | func_8018681C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018681C.c` | +| 2293 | func_801810BC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_801810BC.c` | +| 2294 | func_8018A7CC | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018A7CC.c` | +| 2295 | func_8018E0D4 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_8018E0D4.c` | +| 2296 | func_80186A28 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186A28.c` | +| 2297 | func_80186A88 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186A88.c` | +| 2298 | func_80180F4C | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80180F4C.c` | +| 2299 | func_80186C88 | None | | None | near | 6 | residual: 6 mismatch | `.run/backlog_drafts/func_80186C88.c` | +| 2300 | func_80182988 | None | loose-typing | None | near | 6 | none — MATCH (0x5c store must be unsigned short so 0xaa10 stays +43536 → ori, not addiu/sign-extend) | `.run/backlog_drafts/func_80182988.c` | +| 2301 | func_80141A60 | 1 | plumbing | 76 | near | 7 | TBD — first pass | `.run/backlog_drafts/func_80141A60.c` | +| 2302 | func_801345F8 | 1 | schedule | 106 | near | 7 | 7 ins, all pure scheduling order — maskedp copy not sunk into bnez delay slot | `.run/backlog_drafts/func_801345F8.c` | +| 2303 | func_801815D8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801815D8.c` | +| 2304 | func_80189898 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80189898.c` | +| 2305 | func_8018823C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018823C.c` | +| 2306 | func_80183E3C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E3C.c` | +| 2307 | func_8017CF40 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017CF40.c` | +| 2308 | func_8017FF6C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017FF6C.c` | +| 2309 | func_8017DB84 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017DB84.c` | +| 2310 | func_8017F04C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017F04C.c` | +| 2311 | func_80188228 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80188228.c` | +| 2312 | func_8017E450 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017E450.c` | +| 2313 | func_80180A84 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180A84.c` | +| 2314 | func_8018B184 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B184.c` | +| 2315 | func_80183E7C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183E7C.c` | +| 2316 | func_80181BC4 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80181BC4.c` | +| 2317 | func_80182198 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182198.c` | +| 2318 | func_8017FF68 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017FF68.c` | +| 2319 | func_8018B5C0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B5C0.c` | +| 2320 | func_801837AC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801837AC.c` | +| 2321 | func_80180458 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180458.c` | +| 2322 | func_8018D7CC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018D7CC.c` | +| 2323 | func_80182518 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182518.c` | +| 2324 | func_80185C6C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185C6C.c` | +| 2325 | func_801807C0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801807C0.c` | +| 2326 | func_8018B450 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018B450.c` | +| 2327 | func_8018146C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018146C.c` | +| 2328 | func_8017C104 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017C104.c` | +| 2329 | func_8018552C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018552C.c` | +| 2330 | func_801837A0 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801837A0.c` | +| 2331 | func_80186D5C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186D5C.c` | +| 2332 | func_80184438 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184438.c` | +| 2333 | func_80185AEC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185AEC.c` | +| 2334 | func_80180410 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180410.c` | +| 2335 | func_80181FB8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80181FB8.c` | +| 2336 | func_80185A20 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185A20.c` | +| 2337 | func_80185DB8 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185DB8.c` | +| 2338 | func_801860FC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801860FC.c` | +| 2339 | func_80180754 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80180754.c` | +| 2340 | func_80186720 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186720.c` | +| 2341 | func_8017EA60 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017EA60.c` | +| 2342 | func_8017F710 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8017F710.c` | +| 2343 | func_80184990 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184990.c` | +| 2344 | func_80185344 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80185344.c` | +| 2345 | func_801828DC | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_801828DC.c` | +| 2346 | func_80186E34 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80186E34.c` | +| 2347 | func_80184688 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80184688.c` | +| 2348 | func_80182230 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80182230.c` | +| 2349 | func_8018169C | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_8018169C.c` | +| 2350 | func_80183184 | None | | None | near | 7 | residual: 7 mismatch | `.run/backlog_drafts/func_80183184.c` | +| 2351 | func_80180F10 | None | regalloc-order | None | near | 7 | none — MATCH pending | `.run/backlog_drafts/func_80180F10.c` | +| 2352 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | +| 2353 | func_80185F24 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F24.c` | +| 2354 | func_80189858 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80189858.c` | +| 2355 | func_8017FFF0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FFF0.c` | +| 2356 | func_8017E908 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E908.c` | +| 2357 | func_8017CF9C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017CF9C.c` | +| 2358 | func_8017D920 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D920.c` | +| 2359 | func_8017D8AC | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D8AC.c` | +| 2360 | func_801832B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801832B0.c` | +| 2361 | func_801875C4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801875C4.c` | +| 2362 | func_801813B8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801813B8.c` | +| 2363 | func_80183664 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183664.c` | +| 2364 | func_80184734 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80184734.c` | +| 2365 | func_80185394 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185394.c` | +| 2366 | func_801825C8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801825C8.c` | +| 2367 | func_801801D4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801801D4.c` | +| 2368 | func_8018ADC0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018ADC0.c` | +| 2369 | func_8017FE20 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017FE20.c` | +| 2370 | func_80182CC0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182CC0.c` | +| 2371 | func_801830B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801830B0.c` | +| 2372 | func_80182A5C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182A5C.c` | +| 2373 | func_80182E30 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182E30.c` | +| 2374 | func_8018240C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018240C.c` | +| 2375 | func_8017BF08 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017BF08.c` | +| 2376 | func_80185954 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185954.c` | +| 2377 | func_80182BFC | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182BFC.c` | +| 2378 | func_80183430 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183430.c` | +| 2379 | func_801872F8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801872F8.c` | +| 2380 | func_801855E8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801855E8.c` | +| 2381 | func_8017D58C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017D58C.c` | +| 2382 | func_80186120 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80186120.c` | +| 2383 | func_8018828C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018828C.c` | +| 2384 | func_8018108C | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018108C.c` | +| 2385 | func_801848B0 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801848B0.c` | +| 2386 | func_80181688 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181688.c` | +| 2387 | func_80181034 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181034.c` | +| 2388 | func_80188508 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80188508.c` | +| 2389 | func_801844E8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801844E8.c` | +| 2390 | func_80187370 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80187370.c` | +| 2391 | func_8018D330 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018D330.c` | +| 2392 | func_80186A70 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80186A70.c` | +| 2393 | func_8017DBE4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017DBE4.c` | +| 2394 | func_8017F474 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017F474.c` | +| 2395 | func_8017E804 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8017E804.c` | +| 2396 | func_80182D50 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80182D50.c` | +| 2397 | func_801843B8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801843B8.c` | +| 2398 | func_80184804 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80184804.c` | +| 2399 | func_80183D60 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183D60.c` | +| 2400 | func_80181C84 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80181C84.c` | +| 2401 | func_801842D4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_801842D4.c` | +| 2402 | func_80185EB4 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185EB4.c` | +| 2403 | func_80188690 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80188690.c` | +| 2404 | func_80185F20 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80185F20.c` | +| 2405 | func_80183FD8 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_80183FD8.c` | +| 2406 | func_8018F658 | None | | None | near | 8 | residual: 8 mismatch | `.run/backlog_drafts/func_8018F658.c` | +| 2407 | func_80164E40 | None | plumbing | None | near | 8 | none — MATCH (base &D_801D9728 held in one reg via u8* p, reused by byte ld/st + final word ld) | `.run/backlog_drafts/func_80164E40.c` | +| 2408 | func_80168828 | None | schedule | None | near | 8 | 8 residual (down from prior 32). idx0-14 and idx40-107 BYTE-EXACT; regalloc/loop/struct/ | `.run/backlog_drafts/func_80168828.c` | +| 2409 | func_8017F358 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F358.c` | +| 2410 | func_80180174 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180174.c` | +| 2411 | func_80180E9C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E9C.c` | +| 2412 | func_8017BEBC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017BEBC.c` | +| 2413 | func_80180854 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180854.c` | +| 2414 | func_80180E54 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180E54.c` | +| 2415 | func_8017F7F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F7F4.c` | +| 2416 | func_8017F1A8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F1A8.c` | +| 2417 | func_8017EF28 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017EF28.c` | +| 2418 | func_8018A874 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018A874.c` | +| 2419 | func_8017EB24 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017EB24.c` | +| 2420 | func_801816E4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801816E4.c` | +| 2421 | func_8017D400 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D400.c` | +| 2422 | func_8017D6E8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D6E8.c` | +| 2423 | func_8017E4F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E4F8.c` | +| 2424 | func_801829F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801829F4.c` | +| 2425 | func_801822A8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801822A8.c` | +| 2426 | func_8017E954 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E954.c` | +| 2427 | func_801826FC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801826FC.c` | +| 2428 | func_80181F84 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181F84.c` | +| 2429 | func_801827FC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801827FC.c` | +| 2430 | func_8017FE88 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FE88.c` | +| 2431 | func_801806B8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801806B8.c` | +| 2432 | func_80180EC0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80180EC0.c` | +| 2433 | func_80181C4C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181C4C.c` | +| 2434 | func_801847EC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801847EC.c` | +| 2435 | func_80182034 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182034.c` | +| 2436 | func_801817A4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801817A4.c` | +| 2437 | func_8017E52C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017E52C.c` | +| 2438 | func_801805B0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801805B0.c` | +| 2439 | func_8018897C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018897C.c` | +| 2440 | func_8018AA88 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018AA88.c` | +| 2441 | func_8017FED4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FED4.c` | +| 2442 | func_801835F0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801835F0.c` | +| 2443 | func_8017CCD4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017CCD4.c` | +| 2444 | func_801858C4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801858C4.c` | +| 2445 | func_80185278 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80185278.c` | +| 2446 | func_8017FD78 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FD78.c` | +| 2447 | func_8018C310 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C310.c` | +| 2448 | func_80182AD4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182AD4.c` | +| 2449 | func_8018868C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018868C.c` | +| 2450 | func_8017F624 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F624.c` | +| 2451 | func_8017FEB4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FEB4.c` | +| 2452 | func_80182298 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80182298.c` | +| 2453 | func_8018C878 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C878.c` | +| 2454 | func_8018531C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018531C.c` | +| 2455 | func_80187114 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80187114.c` | +| 2456 | func_80184590 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184590.c` | +| 2457 | func_80186B08 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80186B08.c` | +| 2458 | func_801802F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801802F8.c` | +| 2459 | func_80181B34 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181B34.c` | +| 2460 | func_80184C10 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184C10.c` | +| 2461 | func_801860F8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801860F8.c` | +| 2462 | func_8017FFD8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017FFD8.c` | +| 2463 | func_80188BF8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80188BF8.c` | +| 2464 | func_80183BD0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183BD0.c` | +| 2465 | func_801860F4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801860F4.c` | +| 2466 | func_80183628 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183628.c` | +| 2467 | func_8018964C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018964C.c` | +| 2468 | func_801848D8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801848D8.c` | +| 2469 | func_801854C8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801854C8.c` | +| 2470 | func_8018A8CC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018A8CC.c` | +| 2471 | func_80184664 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80184664.c` | +| 2472 | func_80181CE4 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80181CE4.c` | +| 2473 | func_80185528 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80185528.c` | +| 2474 | func_80187454 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80187454.c` | +| 2475 | func_8018292C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018292C.c` | +| 2476 | func_8017F7BC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017F7BC.c` | +| 2477 | func_801830C8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801830C8.c` | +| 2478 | func_8017D4F0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8017D4F0.c` | +| 2479 | func_801825E8 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_801825E8.c` | +| 2480 | func_8018C3EC | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018C3EC.c` | +| 2481 | func_80183C1C | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_80183C1C.c` | +| 2482 | func_8018F0E0 | None | | None | near | 9 | residual: 9 mismatch | `.run/backlog_drafts/func_8018F0E0.c` | +| 2483 | func_80185A00 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185A00.c` | +| 2484 | func_8017FCC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FCC0.c` | +| 2485 | func_8017F2D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F2D0.c` | +| 2486 | func_8017F27C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F27C.c` | +| 2487 | func_801833C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801833C8.c` | +| 2488 | func_8017E91C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E91C.c` | +| 2489 | func_8017D918 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D918.c` | +| 2490 | func_8017FFD0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FFD0.c` | +| 2491 | func_80180E34 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180E34.c` | +| 2492 | func_801844C4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801844C4.c` | +| 2493 | func_8018AB24 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018AB24.c` | +| 2494 | func_80188C84 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188C84.c` | +| 2495 | func_8017E184 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E184.c` | +| 2496 | func_8017D4C4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D4C4.c` | +| 2497 | func_80181434 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181434.c` | +| 2498 | func_80181A70 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181A70.c` | +| 2499 | func_8017D3D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D3D0.c` | +| 2500 | func_80181DC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181DC0.c` | +| 2501 | func_8017D564 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D564.c` | +| 2502 | func_8017DF88 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DF88.c` | +| 2503 | func_801841D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801841D0.c` | +| 2504 | func_8017D534 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D534.c` | +| 2505 | func_80181BE8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181BE8.c` | +| 2506 | func_80184204 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184204.c` | +| 2507 | func_8018534C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018534C.c` | +| 2508 | func_80184940 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184940.c` | +| 2509 | func_8017D540 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D540.c` | +| 2510 | func_80180B60 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180B60.c` | +| 2511 | func_8017FB0C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FB0C.c` | +| 2512 | func_8017D67C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D67C.c` | +| 2513 | func_8017E72C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E72C.c` | +| 2514 | func_8018175C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018175C.c` | +| 2515 | func_80189C4C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80189C4C.c` | +| 2516 | func_8017E670 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E670.c` | +| 2517 | func_80180014 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180014.c` | +| 2518 | func_8017E6D0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E6D0.c` | +| 2519 | func_80180B90 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180B90.c` | +| 2520 | func_801801DC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801801DC.c` | +| 2521 | func_801848E8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801848E8.c` | +| 2522 | func_8017E094 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017E094.c` | +| 2523 | func_8018082C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018082C.c` | +| 2524 | func_8018373C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018373C.c` | +| 2525 | func_8017D654 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D654.c` | +| 2526 | func_8017DF48 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DF48.c` | +| 2527 | func_8018290C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018290C.c` | +| 2528 | func_80182724 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182724.c` | +| 2529 | func_8018257C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018257C.c` | +| 2530 | func_80182EC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182EC0.c` | +| 2531 | func_80188E8C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188E8C.c` | +| 2532 | func_801806E0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801806E0.c` | +| 2533 | func_8018A5A4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018A5A4.c` | +| 2534 | func_80181AC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80181AC0.c` | +| 2535 | func_8017D62C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D62C.c` | +| 2536 | func_801841A0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801841A0.c` | +| 2537 | func_80183744 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183744.c` | +| 2538 | func_8018924C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018924C.c` | +| 2539 | func_8017FFC0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017FFC0.c` | +| 2540 | func_8017EBD8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017EBD8.c` | +| 2541 | func_8017D514 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017D514.c` | +| 2542 | func_80185778 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185778.c` | +| 2543 | func_8017EEC4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017EEC4.c` | +| 2544 | func_80184C68 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184C68.c` | +| 2545 | func_801870B4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801870B4.c` | +| 2546 | func_80185E3C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185E3C.c` | +| 2547 | func_8017F5E8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F5E8.c` | +| 2548 | func_801823D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801823D4.c` | +| 2549 | func_80186EE4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80186EE4.c` | +| 2550 | func_80180AF4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80180AF4.c` | +| 2551 | func_801831FC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801831FC.c` | +| 2552 | func_801844C8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801844C8.c` | +| 2553 | func_801862D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801862D4.c` | +| 2554 | func_80184578 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184578.c` | +| 2555 | func_80184634 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184634.c` | +| 2556 | func_8017F804 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F804.c` | +| 2557 | func_80183888 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183888.c` | +| 2558 | func_8017F2EC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F2EC.c` | +| 2559 | func_80188FAC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188FAC.c` | +| 2560 | func_80187224 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80187224.c` | +| 2561 | func_801850F8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801850F8.c` | +| 2562 | func_80183F7C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183F7C.c` | +| 2563 | func_801800DC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801800DC.c` | +| 2564 | func_8017F6D4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F6D4.c` | +| 2565 | func_80182190 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182190.c` | +| 2566 | func_80182CB4 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182CB4.c` | +| 2567 | func_80185C90 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185C90.c` | +| 2568 | func_80182380 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80182380.c` | +| 2569 | func_80183524 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183524.c` | +| 2570 | func_8018EDB8 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018EDB8.c` | +| 2571 | func_80190298 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80190298.c` | +| 2572 | func_80184F70 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184F70.c` | +| 2573 | func_80185060 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185060.c` | +| 2574 | func_8018311C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018311C.c` | +| 2575 | func_8018A594 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018A594.c` | +| 2576 | func_8017DED0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DED0.c` | +| 2577 | func_8017DAF0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DAF0.c` | +| 2578 | func_8018228C | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8018228C.c` | +| 2579 | func_80188738 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80188738.c` | +| 2580 | func_801889E0 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_801889E0.c` | +| 2581 | func_8017DEEC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017DEEC.c` | +| 2582 | func_80183FAC | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80183FAC.c` | +| 2583 | func_8017F300 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_8017F300.c` | +| 2584 | func_80184794 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80184794.c` | +| 2585 | func_80185648 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80185648.c` | +| 2586 | func_80186D64 | None | | None | near | 10 | residual: 10 mismatch | `.run/backlog_drafts/func_80186D64.c` | +| 2587 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | +| 2588 | func_8017F7E8 | 1 | WAVE | 177 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_8017F7E8.c` | +| 2589 | func_801824D0 | 1 | WAVE | 181 | near | 11 | WAVE: 11 mismatch | `.run/backlog_drafts/func_801824D0.c` | +| 2590 | func_80165670 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80165670.c` | +| 2591 | func_80182F4C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F4C.c` | +| 2592 | func_801835C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835C8.c` | +| 2593 | func_8017D6C4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D6C4.c` | +| 2594 | func_8018268C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018268C.c` | +| 2595 | func_8018ACE8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018ACE8.c` | +| 2596 | func_80181960 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181960.c` | +| 2597 | func_8018283C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018283C.c` | +| 2598 | func_8017D7C8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D7C8.c` | +| 2599 | func_8017F67C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F67C.c` | +| 2600 | func_80181724 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181724.c` | +| 2601 | func_8017F450 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F450.c` | +| 2602 | func_8017F128 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017F128.c` | +| 2603 | func_80180154 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180154.c` | +| 2604 | func_80180240 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180240.c` | +| 2605 | func_8017D868 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017D868.c` | +| 2606 | func_80185274 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80185274.c` | +| 2607 | func_8017E4AC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E4AC.c` | +| 2608 | func_8017FC30 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017FC30.c` | +| 2609 | func_8018825C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018825C.c` | +| 2610 | func_801833D4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801833D4.c` | +| 2611 | func_80184028 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80184028.c` | +| 2612 | func_8018485C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018485C.c` | +| 2613 | func_80185704 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80185704.c` | +| 2614 | func_80180EA8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80180EA8.c` | +| 2615 | func_8018F91C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018F91C.c` | +| 2616 | func_80189354 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80189354.c` | +| 2617 | func_801835F4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801835F4.c` | +| 2618 | func_801829FC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801829FC.c` | +| 2619 | func_80187404 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80187404.c` | +| 2620 | func_8018222C | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8018222C.c` | +| 2621 | func_801848B4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_801848B4.c` | +| 2622 | func_8017E5D4 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E5D4.c` | +| 2623 | func_8017DDE8 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017DDE8.c` | +| 2624 | func_80182118 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182118.c` | +| 2625 | func_8017E2C0 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017E2C0.c` | +| 2626 | func_80181744 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80181744.c` | +| 2627 | func_8017EECC | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_8017EECC.c` | +| 2628 | func_80182F78 | None | | None | near | 11 | residual: 11 mismatch | `.run/backlog_drafts/func_80182F78.c` | +| 2629 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | +| 2630 | func_8013C964 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013C964.c` | +| 2631 | func_8013B568 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8013B568.c` | +| 2632 | func_80182E58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80182E58.c` | +| 2633 | func_8018150C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018150C.c` | +| 2634 | func_801803A4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801803A4.c` | +| 2635 | func_8017D7F8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017D7F8.c` | +| 2636 | func_8017FFFC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017FFFC.c` | +| 2637 | func_8018766C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018766C.c` | +| 2638 | func_8017DFF8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DFF8.c` | +| 2639 | func_8017D08C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017D08C.c` | +| 2640 | func_80180D70 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80180D70.c` | +| 2641 | func_8017DE40 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DE40.c` | +| 2642 | func_8017DBD8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017DBD8.c` | +| 2643 | func_8017FB8C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017FB8C.c` | +| 2644 | func_801833BC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801833BC.c` | +| 2645 | func_8017F574 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017F574.c` | +| 2646 | func_801873B4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801873B4.c` | +| 2647 | func_80187344 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80187344.c` | +| 2648 | func_80183AC8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80183AC8.c` | +| 2649 | func_80181C08 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181C08.c` | +| 2650 | func_80185830 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80185830.c` | +| 2651 | func_801822C8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801822C8.c` | +| 2652 | func_80181388 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181388.c` | +| 2653 | func_80185C2C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80185C2C.c` | +| 2654 | func_80183BEC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80183BEC.c` | +| 2655 | func_8018CA0C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018CA0C.c` | +| 2656 | func_801846EC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801846EC.c` | +| 2657 | func_80184DB4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184DB4.c` | +| 2658 | func_8018AE08 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018AE08.c` | +| 2659 | func_80184698 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184698.c` | +| 2660 | func_80184718 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80184718.c` | +| 2661 | func_8018134C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018134C.c` | +| 2662 | func_8017F4BC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8017F4BC.c` | +| 2663 | func_80181070 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181070.c` | +| 2664 | func_801810A4 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801810A4.c` | +| 2665 | func_801810D8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801810D8.c` | +| 2666 | func_801819CC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801819CC.c` | +| 2667 | func_80180554 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80180554.c` | +| 2668 | func_80181E5C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80181E5C.c` | +| 2669 | func_80189DDC | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80189DDC.c` | +| 2670 | func_8018AD70 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018AD70.c` | +| 2671 | func_8018ABE0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018ABE0.c` | +| 2672 | func_80189A60 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80189A60.c` | +| 2673 | func_8018278C | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018278C.c` | +| 2674 | func_801827C0 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_801827C0.c` | +| 2675 | func_80186A58 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_80186A58.c` | +| 2676 | func_8018BFC8 | None | | None | near | 12 | residual: 12 mismatch | `.run/backlog_drafts/func_8018BFC8.c` | +| 2677 | func_80156044 | None | regalloc-order | None | near | 12 | none — MATCH (74 ins) | `.run/backlog_drafts/func_80156044.c` | +| 2678 | func_8013E83C | 1 | plumbing | 71 | near | 13 | none — MATCH (scalar global stores + two branches; scheduling of the (*(unsigned short *)&D_80115110) load hoist reproduced by -O2) | `.run/backlog_drafts/func_8013E83C.c` | +| 2679 | func_80185F58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185F58.c` | +| 2680 | func_8018A3C8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018A3C8.c` | +| 2681 | func_8017EA20 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EA20.c` | +| 2682 | func_80180528 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180528.c` | +| 2683 | func_8017FD44 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017FD44.c` | +| 2684 | func_8017F434 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017F434.c` | +| 2685 | func_80185EDC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185EDC.c` | +| 2686 | func_8017E414 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E414.c` | +| 2687 | func_8017E5DC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E5DC.c` | +| 2688 | func_80180BCC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180BCC.c` | +| 2689 | func_801818EC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801818EC.c` | +| 2690 | func_8017DA3C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017DA3C.c` | +| 2691 | func_8017EDA8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017EDA8.c` | +| 2692 | func_801816CC | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801816CC.c` | +| 2693 | func_8017E51C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017E51C.c` | +| 2694 | func_80185C08 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185C08.c` | +| 2695 | func_80189F74 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80189F74.c` | +| 2696 | func_8017D914 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017D914.c` | +| 2697 | func_801828A8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801828A8.c` | +| 2698 | func_8017FD58 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017FD58.c` | +| 2699 | func_80185238 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80185238.c` | +| 2700 | func_8017F830 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017F830.c` | +| 2701 | func_801807B8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801807B8.c` | +| 2702 | func_8018276C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018276C.c` | +| 2703 | func_801851D8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801851D8.c` | +| 2704 | func_8018E010 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018E010.c` | +| 2705 | func_8018BF34 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018BF34.c` | +| 2706 | func_80183AF8 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80183AF8.c` | +| 2707 | func_801858D0 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_801858D0.c` | +| 2708 | func_80180C34 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80180C34.c` | +| 2709 | func_80182D3C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80182D3C.c` | +| 2710 | func_8018BDA4 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8018BDA4.c` | +| 2711 | func_8017C8E4 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_8017C8E4.c` | +| 2712 | func_80186D30 | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80186D30.c` | +| 2713 | func_80182D6C | None | | None | near | 13 | residual: 13 mismatch | `.run/backlog_drafts/func_80182D6C.c` | +| 2714 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | +| 2715 | func_80180D10 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D10.c` | +| 2716 | func_8018316C | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018316C.c` | +| 2717 | func_8017DFC4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017DFC4.c` | +| 2718 | func_8017EB38 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017EB38.c` | +| 2719 | func_80180D44 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180D44.c` | +| 2720 | func_8017E808 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017E808.c` | +| 2721 | func_801807F8 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801807F8.c` | +| 2722 | func_80180CC0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180CC0.c` | +| 2723 | func_80183094 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80183094.c` | +| 2724 | func_8017EDC4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017EDC4.c` | +| 2725 | func_80180654 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80180654.c` | +| 2726 | func_8017C6F4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017C6F4.c` | +| 2727 | func_8017E4F0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017E4F0.c` | +| 2728 | func_8018B2DC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018B2DC.c` | +| 2729 | func_80183398 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80183398.c` | +| 2730 | func_801812F0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801812F0.c` | +| 2731 | func_80181468 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80181468.c` | +| 2732 | func_80184384 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80184384.c` | +| 2733 | func_8018A934 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018A934.c` | +| 2734 | func_8018B50C | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8018B50C.c` | +| 2735 | func_80182844 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80182844.c` | +| 2736 | func_801884AC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801884AC.c` | +| 2737 | func_80181B90 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80181B90.c` | +| 2738 | func_80185F98 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185F98.c` | +| 2739 | func_80185EEC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185EEC.c` | +| 2740 | func_80186DE8 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80186DE8.c` | +| 2741 | func_801838EC | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801838EC.c` | +| 2742 | func_80182348 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80182348.c` | +| 2743 | func_80185CD4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80185CD4.c` | +| 2744 | func_801892C0 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801892C0.c` | +| 2745 | func_801859E4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801859E4.c` | +| 2746 | func_80184B70 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80184B70.c` | +| 2747 | func_801871C4 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_801871C4.c` | +| 2748 | func_80189504 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_80189504.c` | +| 2749 | func_8017C918 | None | | None | near | 14 | residual: 14 mismatch | `.run/backlog_drafts/func_8017C918.c` | +| 2750 | func_801824CC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801824CC.c` | +| 2751 | func_80181784 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80181784.c` | +| 2752 | func_8017FFE8 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017FFE8.c` | +| 2753 | func_80180AAC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80180AAC.c` | +| 2754 | func_80180218 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80180218.c` | +| 2755 | func_8017FFF8 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017FFF8.c` | +| 2756 | func_80183DC4 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80183DC4.c` | +| 2757 | func_801820F0 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801820F0.c` | +| 2758 | func_8018B0EC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018B0EC.c` | +| 2759 | func_801803F4 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_801803F4.c` | +| 2760 | func_8018E6EC | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018E6EC.c` | +| 2761 | func_8017E818 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017E818.c` | +| 2762 | func_80181B0C | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80181B0C.c` | +| 2763 | func_80184010 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_80184010.c` | +| 2764 | func_8018648C | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8018648C.c` | +| 2765 | func_8017F138 | None | | None | near | 15 | residual: 15 mismatch | `.run/backlog_drafts/func_8017F138.c` | +| 2766 | func_8013C938 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8013C938.c` | +| 2767 | func_8017D2F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017D2F0.c` | +| 2768 | func_8017E2A8 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E2A8.c` | +| 2769 | func_8017E0F0 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E0F0.c` | +| 2770 | func_8017E7D8 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017E7D8.c` | +| 2771 | func_80183988 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80183988.c` | +| 2772 | func_80184154 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80184154.c` | +| 2773 | func_80182D78 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80182D78.c` | +| 2774 | func_80183074 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80183074.c` | +| 2775 | func_80184EA4 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80184EA4.c` | +| 2776 | func_8017F920 | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_8017F920.c` | +| 2777 | func_80180EDC | None | | None | near | 16 | residual: 16 mismatch | `.run/backlog_drafts/func_80180EDC.c` | +| 2778 | func_8017D2D0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D2D0.c` | +| 2779 | func_8017EEF4 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017EEF4.c` | +| 2780 | func_8017EB98 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017EB98.c` | +| 2781 | func_8017D8D4 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017D8D4.c` | +| 2782 | func_8017E814 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017E814.c` | +| 2783 | func_80184EE0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80184EE0.c` | +| 2784 | func_80180BE0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80180BE0.c` | +| 2785 | func_8017FA44 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8017FA44.c` | +| 2786 | func_801851E0 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_801851E0.c` | +| 2787 | func_80186F60 | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80186F60.c` | +| 2788 | func_80182D1C | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_80182D1C.c` | +| 2789 | func_8018384C | None | | None | near | 17 | residual: 17 mismatch | `.run/backlog_drafts/func_8018384C.c` | +| 2790 | func_8017F198 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017F198.c` | +| 2791 | func_8017E9D4 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017E9D4.c` | +| 2792 | func_8018AD5C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8018AD5C.c` | +| 2793 | func_80181C04 | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_80181C04.c` | +| 2794 | func_8018208C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8018208C.c` | +| 2795 | func_8017FD6C | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_8017FD6C.c` | +| 2796 | func_801877DC | None | | None | near | 18 | residual: 18 mismatch | `.run/backlog_drafts/func_801877DC.c` | +| 2797 | func_8014FE60 | None | schedule | None | near | 18 | none — MATCH | `.run/backlog_drafts/func_8014FE60.c` | +| 2798 | func_8017E9E4 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_8017E9E4.c` | +| 2799 | func_801827D4 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_801827D4.c` | +| 2800 | func_80185888 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80185888.c` | +| 2801 | func_80180574 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80180574.c` | +| 2802 | func_80183F1C | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80183F1C.c` | +| 2803 | func_8017FFCC | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_8017FFCC.c` | +| 2804 | func_80182344 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80182344.c` | +| 2805 | func_801802B4 | None | | None | near | 20 | residual: 20 mismatch | `.run/backlog_drafts/func_801802B4.c` | +| 2806 | func_8012ACE0 | 1 | STRUCT | 25 | near | 21 | STRUCT: 21 mismatch | `.run/backlog_drafts/func_8012ACE0.c` | +| 2807 | func_8015E018 | 1 | WAVE | 47 | near | 21 | WAVE: 21 mismatch | `.run/backlog_drafts/func_8015E018.c` | +| 2808 | func_8013E958 | 1 | schedule | 63 | near | 21 | none — MATCH (63 ins). Key: the extra `andi 0xFF` is the zero_extendqihi2 that | `.run/backlog_drafts/func_8013E958.c` | +| 2809 | func_8017DF68 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8017DF68.c` | +| 2810 | func_8017C6B8 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8017C6B8.c` | +| 2811 | func_80183D5C | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80183D5C.c` | +| 2812 | func_8018A708 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_8018A708.c` | +| 2813 | func_801871E8 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_801871E8.c` | +| 2814 | func_80186758 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80186758.c` | +| 2815 | func_80188668 | None | | None | near | 21 | residual: 21 mismatch | `.run/backlog_drafts/func_80188668.c` | +| 2816 | func_8017E754 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8017E754.c` | +| 2817 | func_8018A680 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8018A680.c` | +| 2818 | func_80185B78 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_80185B78.c` | +| 2819 | func_80185A18 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_80185A18.c` | +| 2820 | func_8018ADE4 | None | | None | near | 22 | residual: 22 mismatch | `.run/backlog_drafts/func_8018ADE4.c` | +| 2821 | func_80164930 | None | regalloc-order | None | near | 22 | TBD — first draft, validating structure + s0/s1/s2/s3 allocation | `.run/backlog_drafts/func_80164930.c` | +| 2822 | func_8017E5A0 | None | | None | near | 23 | residual: 23 mismatch | `.run/backlog_drafts/func_8017E5A0.c` | +| 2823 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | +| 2824 | func_80182488 | None | | None | near | 24 | residual: 24 mismatch | `.run/backlog_drafts/func_80182488.c` | +| 2825 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | +| 2826 | func_8018DFDC | None | | None | near | 25 | residual: 25 mismatch | `.run/backlog_drafts/func_8018DFDC.c` | +| 2827 | func_8017FB68 | None | | None | near | 26 | residual: 26 mismatch | `.run/backlog_drafts/func_8017FB68.c` | +| 2828 | func_801900F4 | None | | None | near | 27 | residual: 27 mismatch | `.run/backlog_drafts/func_801900F4.c` | +| 2829 | func_8012DE2C | 1 | plumbing | 35 | near | 31 | none — MATCH (35/35 ins, relocation-masked) | `.run/backlog_drafts/func_8012DE2C.c` | +| 2830 | func_80139BE0 | 1 | loose-typing | 39 | near | 32 | target has redundant andi a1,v0,0xff (uchar zero-extend) gcc proves away; else identical | `.run/backlog_drafts/func_80139BE0.c` | +| 2831 | func_8012DDA4 | 1 | regalloc-order | 34 | near | 33 | none — MATCH | `.run/backlog_drafts/func_8012DDA4.c` | +| 2832 | func_8018E17C | None | | None | near | 35 | residual: 35 mismatch | `.run/backlog_drafts/func_8018E17C.c` | +| 2833 | func_80180F08 | None | | None | near | 37 | residual: 37 mismatch | `.run/backlog_drafts/func_80180F08.c` | +| 2834 | func_8017DB58 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017DB58.c` | +| 2835 | func_8017E840 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017E840.c` | +| 2836 | func_8017FF54 | None | | None | near | 39 | residual: 39 mismatch | `.run/backlog_drafts/func_8017FF54.c` | +| 2837 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | +| 2838 | func_80180CEC | None | | None | near | 45 | residual: 45 mismatch | `.run/backlog_drafts/func_80180CEC.c` | +| 2839 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | +| 2840 | func_8017B0E4 | None | plumbing | None | near | 51 | none — MATCH | `.run/backlog_drafts/func_8017B0E4.c` | +| 2841 | func_80186A0C | None | | None | near | 53 | residual: 53 mismatch | `.run/backlog_drafts/func_80186A0C.c` | +| 2842 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | +| 2843 | func_80166F58 | None | regalloc-order | None | near | 57 | none — MATCH (69 ins). Pins $s4/$s1 for param_2/param_3 + a1/a2-pinned temps | `.run/backlog_drafts/func_80166F58.c` | +| 2844 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | +| 2845 | func_8012E364 | 1 | regalloc-order | 67 | near | 60 | 23/67 masked. Structure+idioms exact (barrier fixes the late D9498 load; k=0x1000 CSE'd into $a3 hoisted to the blez delay slot; 6 register pins land arg/$a2, k/$a3, D9498/$v1, temp_a1/$a1, var_v0(_2)/$v0). Residual is the discontinuous q<->temp_v0 reuse chain (q reuses $v0 but target puts it in $a0 reusing x's dead reg; every whole-function pin that forces q->$a0 chains hi>>5 or var_v0 wrong) + 2nd-half schedule (0x2C lhu interleaved before the +k addu; the abs copies temp_v1->$v0 via addu-move). Permuter-class (register renaming) but pins block pycparser -> hand/human finish. | `.run/backlog_drafts/func_8012E364.c` | +| 2846 | func_8016C188 | None | regalloc-order | None | near | 63 | TBD — natural regalloc for param_1/iVar1/&(*(s32 *)&D_801D9B84) across calls | `.run/backlog_drafts/func_8016C188.c` | +| 2847 | func_801457A4 | 1 | other | 79 | near | 74 | MATCH at -O0 (79 ins, reloc-masked, real -O0 flags). BANKING BLOCKER: this -O0 fn lives in the -O2 main ov_SC01_077.c; needs its own §18 -O0 split at 0x801457A4 (existing _o0.c covers 0x8013B568..0x8013C98C only). match_one is -O2 -> WRONG here. | `.run/backlog_drafts/func_801457A4.c` | +| 2848 | func_801418F8 | 1 | loose-typing | 90 | near | 74 | none — MATCH (90 ins). (*(volatile u16 *)&D_8011511A) must be volatile to force the read-back | `.run/backlog_drafts/func_801418F8.c` | +| 2849 | func_8016B6BC | 1 | schedule | 94 | near | 80 | 12-off, all in the last 12 ins (tail). First 82 ins byte-match. Target materializes | `.run/backlog_drafts/func_8016B6BC.c` | +| 2850 | func_801343C4 | 1 | schedule | 83 | near | 82 | none — MATCH (83 ins, relocation-masked) | `.run/backlog_drafts/func_801343C4.c` | +| 2851 | func_80134A74 | 1 | regalloc-order | 107 | near | 84 | structure + all 8 callee-saved regs (s0..s7) + block layout MATCH; residual is caller-saved-temp | `.run/backlog_drafts/func_80134A74.c` | +| 2852 | func_8013EE10 | 1 | struct | 94 | near | 86 | none — MATCH (94 ins). array-of-struct %lo-fold (E[]) for the 5-elt loops; | `.run/backlog_drafts/func_8013EE10.c` | +| 2853 | func_80133AB0 | 1 | regalloc-order | 137 | near | 91 | near-miss ~91 (naive idx; first 37 ins byte-exact). Logic fully reconstructed. pA pin to | `.run/backlog_drafts/func_80133AB0.c` | +| 2854 | func_801347A0 | 1 | regalloc-order | 162 | near | 117 | none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. | `.run/backlog_drafts/func_801347A0.c` | +| 2855 | func_8014F4C0 | None | | None | near | 127 | residual: 127 mismatch | `.run/backlog_drafts/func_8014F4C0.c` | +| 2856 | func_80166994 | None | schedule | None | near | 355 | none — MATCH (369 ins, relocation-masked) | `.run/backlog_drafts/func_80166994.c` | +| 2857 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | +| 2858 | func_8012D664 | 1 | schedule | 44 | failed | | none — MATCH | `.run/backlog_drafts/func_8012D664.c` | +| 2859 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | +| 2860 | func_80134510 | 1 | schedule | 58 | failed | | none — MATCH (58 ins) | `.run/backlog_drafts/func_80134510.c` | +| 2861 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | +| 2862 | func_80180F10 | 1 | schedule | 75 | failed | | none — MATCH (aggregate-initializer form schedules const setup after the prologue saves) | `.run/backlog_drafts/func_80180F10.c` | +| 2863 | func_8016C188 | 1 | schedule | 79 | failed | | none — MATCH (79 ins, match_one). Levers: invert if to if(iVar1!=0){big}else{small} | `.run/backlog_drafts/func_8016C188.c` | +| 2864 | func_80164930 | 1 | regalloc-order | 81 | failed | | none — MATCH (81 ins, relocation-masked) | `.run/backlog_drafts/func_80164930.c` | +| 2865 | func_80131170 | 1 | loop-guard | 88 | failed | | none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps | `.run/backlog_drafts/func_80131170.c` | +| 2866 | func_80135004 | 1 | plumbing | 89 | failed | | MATCH (89 ins). To BANK: retype (*(s16 * *)&D_801870B0) + (*(s16 * *)&D_801870AC) (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). | `.run/backlog_drafts/func_80135004.c` | +| 2867 | func_801789AC | 1 | struct | 91 | failed | | none — MATCH (91 ins, relocation-masked) | `.run/backlog_drafts/func_801789AC.c` | +| 2868 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` | +| 2869 | func_801506A4 | 1 | loose-typing | 95 | failed | | none — MATCH (95 ins). switch var must be int not u16 (u16 adds andi 0xffff promotion mask) | `.run/backlog_drafts/func_801506A4.c` | +| 2870 | func_8016BFD0 | 1 | struct | 95 | failed | | none — MATCH (95 ins). memcpy(d,s,4) -> lwl/lwr/swl/swr; MATRIX work buf as s32[16] (0x40, fills 0x10-0x4f, t[] = buf[5..7]); two SVECTOR locals at 0x50/0x58; natural saved-reg order s0=param_5/s1=param_4/s2=iVar5 | `.run/backlog_drafts/func_8016BFD0.c` | +| 2871 | func_8017B490 | 1 | schedule | 97 | failed | | none — MATCH (97 ins). Keys: (1) inverted if so the SV4 block-copy else is fallthrough and block A is bnez-far (cond = (u32)&D_801DA73C >= 0xB, a relocated-symbol compare gcc can't fold); (2) SV4{s16 a,b,c,d} align-2 8-byte copy -> lwl/lwr/swl/swr, locals at sp+0x10/0x18; (3) the DEAD block-A index = (s32)&D_801DA73C into D_8018A45C[] (WAVE16=two SV4) needs BOTH source addrs (&[idx].v0,&[idx].v1) in EXPLICIT TEMPS before call1 so base (&D_8018A45C) dies pre-call -> temp $v0 (not callee-saved), forcing the natural 2-reg alloc idx=$s0/param_1=$s1 + src2 into call1's delay slot; (4) tail: D_801DA794/D_801DA78C are SV4, re-read .a/.b/.c via lh sign-extended to s32 stores. | `.run/backlog_drafts/func_8017B490.c` | +| 2872 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` | +| 2873 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` | +| 2874 | func_8013AD38 | 1 | schedule | 122 | failed | | none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` | `.run/backlog_drafts/func_8013AD38.c` | +| 2875 | func_80130D48 | 1 | regalloc-order | 266 | failed | | none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). | `.run/backlog_drafts/func_80130D48.c` | +| 2876 | func_80131E00 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80131E00.c` | +| 2877 | func_80130D0C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80130D0C.c` | +| 2878 | func_80141788 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80141788.c` | +| 2879 | func_8017D8DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D8DC.c` | +| 2880 | func_8017F14C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F14C.c` | +| 2881 | func_80187750 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80187750.c` | +| 2882 | func_80180C70 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180C70.c` | +| 2883 | func_8017DBF4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DBF4.c` | +| 2884 | func_8017FFEC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFEC.c` | +| 2885 | func_80181918 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181918.c` | +| 2886 | func_80184018 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184018.c` | +| 2887 | func_8017DC18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DC18.c` | +| 2888 | func_801853CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801853CC.c` | +| 2889 | func_80181894 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181894.c` | +| 2890 | func_80180D18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D18.c` | +| 2891 | func_8018BFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018BFBC.c` | +| 2892 | func_80180D9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D9C.c` | +| 2893 | func_801807F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801807F4.c` | +| 2894 | func_8017FFC8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC8.c` | +| 2895 | func_8017FFA0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFA0.c` | +| 2896 | func_8017E99C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E99C.c` | +| 2897 | func_80180058 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180058.c` | +| 2898 | func_80180188 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180188.c` | +| 2899 | func_8017D584 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D584.c` | +| 2900 | func_80180294 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180294.c` | +| 2901 | func_80184504 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184504.c` | +| 2902 | func_80180B1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180B1C.c` | +| 2903 | func_80184B80 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184B80.c` | +| 2904 | func_8017E76C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E76C.c` | +| 2905 | func_8017D5B4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D5B4.c` | +| 2906 | func_8017F29C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F29C.c` | +| 2907 | func_8018253C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018253C.c` | +| 2908 | func_80181D6C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181D6C.c` | +| 2909 | func_8017F00C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F00C.c` | +| 2910 | func_801802B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801802B0.c` | +| 2911 | func_80181FDC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181FDC.c` | +| 2912 | func_8017DB3C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DB3C.c` | +| 2913 | func_801854DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801854DC.c` | +| 2914 | func_8017DA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DA1C.c` | +| 2915 | func_80180D04 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180D04.c` | +| 2916 | func_8017BF20 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017BF20.c` | +| 2917 | func_8017FFC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC4.c` | +| 2918 | func_8017C004 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017C004.c` | +| 2919 | func_8017E2F0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E2F0.c` | +| 2920 | func_8017F4D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F4D4.c` | +| 2921 | func_8017E780 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E780.c` | +| 2922 | func_8018358C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018358C.c` | +| 2923 | func_801841E4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801841E4.c` | +| 2924 | func_80181738 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181738.c` | +| 2925 | func_801873D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801873D8.c` | +| 2926 | func_80181E90 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181E90.c` | +| 2927 | func_80185628 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185628.c` | +| 2928 | func_80186960 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186960.c` | +| 2929 | func_80186570 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186570.c` | +| 2930 | func_8018C840 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018C840.c` | +| 2931 | func_80183920 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183920.c` | +| 2932 | func_801904E0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801904E0.c` | +| 2933 | func_80182384 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80182384.c` | +| 2934 | func_80184268 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184268.c` | +| 2935 | func_801839BC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801839BC.c` | +| 2936 | func_80184234 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184234.c` | +| 2937 | func_801829D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801829D8.c` | +| 2938 | func_80181A78 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181A78.c` | +| 2939 | func_8018C9B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018C9B0.c` | +| 2940 | func_80186E58 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80186E58.c` | +| 2941 | func_8018720C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018720C.c` | +| 2942 | func_801821FC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801821FC.c` | +| 2943 | func_80183BF0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183BF0.c` | +| 2944 | func_80180EC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180EC4.c` | +| 2945 | func_80183954 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183954.c` | +| 2946 | func_801805D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801805D4.c` | +| 2947 | func_8017EA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017EA1C.c` | +| 2948 | func_8017FE2C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FE2C.c` | +| 2949 | func_80181FA4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181FA4.c` | +| 2950 | func_80184558 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80184558.c` | +| 2951 | func_8017F098 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F098.c` | +| 2952 | func_801822CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801822CC.c` | +| 2953 | func_80185BA8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185BA8.c` | +| 2954 | func_8018AECC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018AECC.c` | +| 2955 | func_8018E710 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018E710.c` | +| 2956 | func_8017FFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFBC.c` | +| 2957 | func_80183F80 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183F80.c` | +| 2958 | func_80182D9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80182D9C.c` | +| 2959 | func_80183028 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183028.c` | +| 2960 | func_80183104 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80183104.c` | +| 2961 | func_801831EC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801831EC.c` | +| 2962 | func_8018326C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018326C.c` | +| 2963 | func_8018AA70 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018AA70.c` | +| 2964 | func_8018305C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018305C.c` | +| 2965 | func_801852D0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801852D0.c` | +| 2966 | func_8014D820 | None | schedule | None | failed | | structurally complete (LCS 228/304, exact 304-ins count; all calls/consts/control-flow/ | `.run/backlog_drafts/func_8014D820.c` | +| 2967 | func_8014DD8C | None | schedule | None | failed | | prologue d0/d2 computed in-place into $fp/$s7; target computes them in caller-saved $v0/$v1 then copies (addu $fp,$v0 / addu $s7,$v1 in the beqz delay slot) — a live-range-split the whole loop body already matches around | `.run/backlog_drafts/func_8014DD8C.c` | +| 2968 | func_8016BFD0 | None | struct | None | failed | | none — MATCH (95 ins). Keys: (1) 4-byte unaligned copies via `struct{char b[4];}` | `.run/backlog_drafts/func_8016BFD0.c` | +| 2969 | func_8017B490 | None | schedule | None | failed | | 3-off (97/97 ins, regs correct, tail 100% matched). Sole residual is the statically-dead | `.run/backlog_drafts/func_8017B490.c` | +| 2970 | func_80163408 | None | struct | None | failed | | none — MATCH (21 ins, relocation-masked) | `.run/backlog_drafts/func_80163408.c` | +| 2971 | func_80165140 | None | struct | None | failed | | none — MATCH (30 ins) | `.run/backlog_drafts/func_80165140.c` | +| 2972 | func_8016E95C | None | struct | None | failed | | none — MATCH (36/36 ins, match_one relocation-masked) | `.run/backlog_drafts/func_8016E95C.c` | +| 2973 | func_80178B70 | None | regalloc-order | None | failed | | none — MATCH (pending verify) | `.run/backlog_drafts/func_80178B70.c` | +| 2974 | func_801457A4 | None | other | None | failed | | none — MATCH (79 ins, relocation-masked). NOTE: -O0 fn (frame-ptr prologue) — must be | `.run/backlog_drafts/func_801457A4.c` | +| 2975 | func_80145CEC | None | struct | None | failed | | 2 residuals — (1) target RELOADS global ptr D_80126B78 before each of its 5 field accesses (f28/f18/f1a/f1c/f2c); gcc-2.7.2 CSEs the single pointer load in every clean-C form I tried (int-cast, (s8*)/(s32) M2C_FIELD, struct*), keeping ONE load. volatile forces reloads but hoists them + leaves delay-slot nops the target fills (target is NOT volatile). (2) frame 0x20 not 0x18: target reserves an unused 8-byte stack local @0x10 (address-taken local — reproduced, but every code-free escape optimizes away and a visible escape corrupts the ((int (*)(void))func_80145EE8)(0) arg). Structure/order/values/callees all match; only the alias-driven reload chain + the phantom frame local remain. Family exemplar (~130 overlays). | `.run/backlog_drafts/func_80145CEC.c` | +| 2976 | func_8016D1D8 | None | struct | None | failed | | none — MATCH (148/148) | `.run/backlog_drafts/func_8016D1D8.c` | +| 2977 | func_8017B614 | None | regalloc-order | None | failed | | 22 (from 57). Structure fully matches (SV4 align-2 block-moves + globals block + delay-slot | `.run/backlog_drafts/func_8017B614.c` | diff --git a/docs/decision-log.md b/docs/decision-log.md index 303d94f89..b8656c1d7 100644 --- a/docs/decision-log.md +++ b/docs/decision-log.md @@ -98,3 +98,35 @@ the session that produced it. Route TECHNICAL idioms to the cookbook; this file precision on the hard/byte-weighty band, the **permuter** for regalloc/schedule search, a **frozen small LoRA** only for the cheap ≤15-ins tail. Don't spend GPU-hours chasing band-extension on a 7B; rent a bigger GPU or use the frontier tier when the hard band is the target. + +## 2026-07-09 · Phase 25 — the GIANT def-side wall is mechanically crackable → build the lever, don't just measure (T5b batch-2) +- **Context / belief:** T5b batch-2 (the 29 giants) was scoped as a pure *measure* wave — draft, `match_one`, map the + frontier; the plan filed the def-side loose-typing wall as a T7 (post-curriculum) problem, expecting ~0 giant banks. + Belief going in: giants would mostly near-miss and feed Fable5/permuter; any that isolation-MATCHed would bank via + the gate's existing `sig_unify`/`cast` transforms. +- **What was tried that failed:** all **16** R14-verified isolation-MATCH giants banked **0/16** through `gate_stage` + AND through raw `harvest_verify`. Root cause (dug out by placing one and reading the cc1 error, not trusting the + gate's summary): `conflicting types for func_X` — the drafters wrote Ghidra-*typed* sigs (`void f(u32*, s16*)`) that + clash with the TU's **canonical** sig, which lives *inside a `DEFINE_func_*` macro* in `engine_core.h` where + `sig_unify` (a file-scope-extern rewriter) can't see it. First reconcile attempt ALSO failed twice: an `s32/s32-args` + form conflicted with the engine_core.h `void/void*` canonical; then intermediate cast-locals (`u32 *a0 = (u32*)arg0`) + *compiled* but produced the WRONG bytes (`70ff4748`) — a fresh pseudo shifted regalloc. +- **Pivot:** stop treating the def-side wall as a future-T7 abstraction and **build the lever now** + (`tools/canon_sig_reconcile.py`): strip ambient-dup typedefs/externs, rewrite the def to the engine_core.h canonical, + and **cast each changed param AT ITS USES, never via a local**. That banked `func_8013B274` byte-identical, then + **5/16** giants total; 3 swept ×134. Batch-2 turned from "measure + backlog" into "prove + partly-automate the + phase's #1 lever," pulling a chunk of T7 forward on real data. +- **Why (byte/measurement-grounded):** the cast-local vs at-use difference is a *measured* byte fact (`70ff4748` wrong + vs `d19c9580` right), not a style call — an intermediate local is a new pseudo gcc-2.7.2 may color differently; an + at-use cast is free. The whole-binary byte-gate stayed the sole arbiter throughout (G3/P9): every one of the 5 banks + is byte-identical, and R22 clean-fleet is the backstop — it caught my *own* buggy R22 harness (an unexpanded + `$(OVERLAY_BINARIES)` that only extracted 2 of 136 binaries) before any false "136/136" could be reported. +- **Hindsight / for the wiki:** when a whole *class* of candidates fails the gate identically, **read the raw compiler + error on ONE placed candidate before concluding "hard / defer"** — the summary ("0 banked") hid a *mechanical* + declaration conflict behind what looked like an intractable matching wall. The giant tier was never a matching + problem; it was a **plumbing** problem (the body was already right in isolation). General lesson for + frontier-crack→propagate→byte-gate: distinguish *codegen* residuals (permuter/Fable5) from *TU-integration* residuals + (a deterministic reconcile) early — they look identical at the gate ("0 banked") but have completely different levers, + and the integration ones are cheap ×134 wins hiding as "hard giants." Residual: non-identical ambient types and + macro-local data symbols are the genuinely-hard remainder (real `reconcile_decls`/rename work), and a reconciled body + doesn't `family_sweep` cleanly to siblings (per-sibling re-reconcile needed) — both logged for T7. diff --git a/docs/matching-cookbook.md b/docs/matching-cookbook.md index 1a723c3b2..36856a7a9 100644 --- a/docs/matching-cookbook.md +++ b/docs/matching-cookbook.md @@ -2309,3 +2309,47 @@ includes (`src/shared/engine_types.h` via `engine_core.h`), then re-sweep. **+1, (ov077 `d19c9580`) before sweeping. A broken strip / mis-ordered header surfaces as a compile failure or SHA drift at this cheap ~30s gate, before any expensive sweep. Then the full R22 clean-fleet 136/136 confirms no fleet-wide header collision. Tools: `build_engine_types.py --file/--exclude`, `family_sweep.py --no-preclassify`. + +## §41 — The DEF-SIDE canonical-sig wall: mechanically banking a drafted giant past `conflicting types` (Phase 25 T5b batch-2, 2026-07-09; `tools/canon_sig_reconcile.py`, byte-proven on `func_8013B274`) + +**The wall (dominant for GIANTS — ~universal, vs ~35% clean-bank for small fns):** a drafter writes an +**isolation-MATCH** giant body (`match_one` c=0) with Ghidra-derived **TYPED** params — `void func(u32 *a0, s16 *a2)`. +Placed in the real overlay TU it fails the whole-binary gate on `conflicting types for func_X` (a *declaration* +conflict, NOT a byte diff). The gate's `sig_unify`/`cast_call_sites` can't fix it and it banks **0/16**. Two sources: +1. The TU's callers reference the fn through the **CANONICAL signature** declared in `src/shared/engine_core.h` + (`extern void func_8013B274(s32 a0, s32 a1, void *a2);`) — but that decl lives **inside a `DEFINE_func_*` macro**, + so `sig_unify` (which rewrites file-scope externs) never sees it. The draft's typed sig conflicts with it. +2. Absent an engine_core.h decl, a caller *above* the definition gives gcc-2.7.2 an implicit K&R `int func_X()`; + the draft's `void`/typed-param def conflicts with that. (This is *why* the overlay's "Phase-17 canonical-sig + layer" at each `_a.c` top uses `s32 func(s32,…)` — it's K&R-`int`-compatible AND byte-neutral.) + +**The crack — reconcile the DEF to the canonical sig, BYTE-NEUTRALLY (3 steps, all proven on `func_8013B274` → banked +`d19c9580` byte-identical):** +1. **Strip the draft's redefinitions of ambient symbols.** A `typedef … P_TAG;` identical to `engine_types.h`'s is a + *redefinition error* in gcc-2.7.2/C89 (not "compatible" like C11). Strip identical-def typedefs; strip `extern` + decls (func / data `D_*` / `memcpy`) the TU or engine headers already declare — the draft's Ghidra-typed + re-declaration is a conflict source. (`memcpy` always: a mismatched prototype trips `conflicting types for + built-in memcpy`; the TU macros / builtin provide it.) +2. **Rewrite the def signature to the canonical** (`engine_core.h` decl if present, else the implicit-int-compatible + `s32 func(s32,…)` at the draft's arity; arity-grow adds unused params so an N-arg implicit caller still matches). +3. **Cast each type-changed param AT ITS USES — NEVER via an intermediate local.** THE load-bearing insight: + `u32 *a0 = (u32*)arg0;` at the top introduces a *fresh pseudo* → gcc allocates it a different reg → **regalloc + shifts → byte diff** (measured: cast-locals gave `70ff4748`, wrong). Casting the param in place — + `((s16*)a2)[i]`, `((s16*)param + 1)` (preserves stride!), `*(T*)p` — adds **no pseudo**, is free, and preserves the + isolation-match codegen. `tools/canon_sig_reconcile.py` blanket-wraps every use of a changed param in + `((origtype)name)` (correct for index/deref/arith/member/already-cast alike). Give it `--tu ` so it treats + that TU's already-declared symbols as ambient (strips their redundant draft externs too). + +**Result:** **5/16** batch-2 giants banked purely mechanically (`func_8013B274 80130D48 80167DBC 8016DC20 8018514C`); +3 then `family_sweep`'d **×134**. This is the phase's **#1 def-side lever**, now partly automated — reusable across the +whole giant tier AND the batch-1 backlog of "match_one-MATCH but gate-rejected" near-misses (the dominant gate-failure). + +**The residual walls (the other 11 — genuine per-fn T7, NOT this mechanical pass; backlogged with cause):** +(a) **non-identical ambient types** — draft's `SVEC`/`ApplyMatrixSV` differ in layout from `engine_types.h`'s (can't +strip: not identical; can't keep: conflicts) → needs a rename or a real layout reconcile. (b) **data symbols declared +inside `DEFINE_` macros** (`D_80078EB0`) — macro-local, not file-scope, so stripping the draft's extern leaves the body +referencing an undeclared symbol, and keeping it conflicts → `reconcile_decls.py`/§33 byte-neutral-access-cast territory. +(c) primitive-typedef redefs the reconcile missed; (d) genuine **byte-diff** (reconcile compiles but codegen differs — +back to permuter/hand). **Sweep fragility:** a reconciled body carries ov_SC01_077-specific canonical sigs/casts, so +`family_sweep` to sibling overlays (with their OWN engine_core.h decls) byte-matches only some siblings (`func_8016DC20` += 133 siblings failed → exemplar-only). A robust sweep of reconciled giants must re-reconcile per sibling TU (T7 follow-up). diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index a6d4e48a9..d8fc6f5c8 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -3,148 +3,148 @@ # source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. -FLEET REAL substantive : 246974 (of which dedup-shared 223275 via 1813 groups / 223725 instances) +FLEET REAL substantive : 247378 (of which dedup-shared 223275 via 1813 groups / 223725 instances) FLEET LINKED PsyQ objs : 959 -FLEET byte-identical : 248503 / 344306 = 72.18% (REAL+LINKED+empties) +FLEET byte-identical : 248907 / 344306 = 72.29% (REAL+LINKED+empties) FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 95796 +FLEET INCLUDE_ASM stubs : 95392 FLEET matchable : 344306 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | |---|---:|---:|---:|---:|---:|---:| | main | 54 | 2 | 959 | 1055 | 2096 | 50.3% | | resident | 123 | 0 | 0 | 125 | 146 | 85.6% | -| ov_SC01_000 | 1836 | 1669 | 0 | 1836 | 2407 | 76.3% | -| ov_SC01_001 | 1833 | 1669 | 0 | 1835 | 2471 | 74.3% | -| ov_SC01_004 | 1826 | 1660 | 0 | 1827 | 2418 | 75.6% | -| ov_SC01_005 | 1850 | 1682 | 0 | 1850 | 2508 | 73.8% | -| ov_SC01_006 | 1849 | 1682 | 0 | 1849 | 2508 | 73.7% | -| ov_SC01_008 | 1827 | 1660 | 0 | 1829 | 2430 | 75.3% | -| ov_SC01_009 | 1847 | 1661 | 0 | 1848 | 2512 | 73.6% | -| ov_SC01_074 | 1827 | 1661 | 0 | 1829 | 2429 | 75.3% | -| ov_SC01_077 | 2218 | 1624 | 0 | 2220 | 2586 | 85.8% | -| ov_SC01_080 | 1845 | 1664 | 0 | 1845 | 2517 | 73.3% | -| ov_SC01_084 | 1848 | 1664 | 0 | 1853 | 2583 | 71.7% | -| ov_SC02_000 | 1865 | 1699 | 0 | 1865 | 2688 | 69.4% | -| ov_SC02_003 | 1865 | 1699 | 0 | 1865 | 2688 | 69.4% | -| ov_SC02_004 | 1831 | 1664 | 0 | 1831 | 2405 | 76.1% | -| ov_SC02_005 | 1890 | 1660 | 0 | 1900 | 2932 | 64.8% | -| ov_SC02_011 | 1871 | 1667 | 0 | 1882 | 2898 | 64.9% | -| ov_SC02_015 | 1832 | 1666 | 0 | 1832 | 2418 | 75.8% | -| ov_SC02_016 | 1836 | 1666 | 0 | 1839 | 2550 | 72.1% | -| ov_SC02_017 | 1855 | 1666 | 0 | 1863 | 2737 | 68.1% | -| ov_SC02_021 | 1835 | 1666 | 0 | 1835 | 2441 | 75.2% | -| ov_SC02_026 | 1839 | 1664 | 0 | 1845 | 2577 | 71.6% | -| ov_SC02_027 | 1848 | 1664 | 0 | 1857 | 2697 | 68.9% | -| ov_SC02_028 | 1856 | 1664 | 0 | 1866 | 2706 | 69.0% | -| ov_SC02_031 | 1846 | 1665 | 0 | 1851 | 2567 | 72.1% | -| ov_SC02_035 | 1837 | 1664 | 0 | 1840 | 2525 | 72.9% | -| ov_SC02_039 | 1828 | 1664 | 0 | 1828 | 2420 | 75.5% | -| ov_SC02_041 | 1835 | 1664 | 0 | 1838 | 2565 | 71.7% | -| ov_SC03_001 | 1888 | 1665 | 0 | 1905 | 2874 | 66.3% | -| ov_SC03_002 | 1854 | 1669 | 0 | 1869 | 2636 | 70.9% | -| ov_SC03_003 | 1826 | 1664 | 0 | 1827 | 2427 | 75.3% | -| ov_SC03_006 | 1867 | 1670 | 0 | 1876 | 2772 | 67.7% | -| ov_SC03_007 | 1842 | 1664 | 0 | 1846 | 2628 | 70.2% | -| ov_SC03_010 | 1836 | 1664 | 0 | 1836 | 2474 | 74.2% | -| ov_SC03_011 | 1832 | 1664 | 0 | 1838 | 2532 | 72.6% | -| ov_SC03_012 | 1827 | 1664 | 0 | 1828 | 2410 | 75.9% | -| ov_SC03_013 | 1835 | 1664 | 0 | 1835 | 2497 | 73.5% | -| ov_SC03_014 | 1857 | 1689 | 0 | 1857 | 2690 | 69.0% | -| ov_SC03_015 | 1863 | 1689 | 0 | 1863 | 2690 | 69.3% | -| ov_SC03_023 | 1829 | 1664 | 0 | 1830 | 2439 | 75.0% | -| ov_SC03_024 | 1859 | 1669 | 0 | 1866 | 2646 | 70.5% | -| ov_SC03_028 | 1850 | 1664 | 0 | 1854 | 2669 | 69.5% | -| ov_SC03_029 | 1836 | 1666 | 0 | 1846 | 2649 | 69.7% | -| ov_SC03_030 | 1837 | 1668 | 0 | 1839 | 2500 | 73.6% | -| ov_SC03_031 | 1831 | 1664 | 0 | 1835 | 2519 | 72.8% | -| ov_SC03_089 | 1841 | 1664 | 0 | 1848 | 2586 | 71.5% | -| ov_SC03_090 | 1842 | 1664 | 0 | 1850 | 2630 | 70.3% | -| ov_SC03_091 | 1841 | 1664 | 0 | 1849 | 2645 | 69.9% | -| ov_SC03_092 | 1841 | 1664 | 0 | 1853 | 2592 | 71.5% | -| ov_SC03_093 | 1838 | 1664 | 0 | 1842 | 2568 | 71.7% | -| ov_SC03_094 | 1832 | 1664 | 0 | 1838 | 2581 | 71.2% | -| ov_SC03_095 | 1830 | 1664 | 0 | 1833 | 2479 | 73.9% | -| ov_SC03_096 | 1833 | 1664 | 0 | 1836 | 2470 | 74.3% | -| ov_SC03_097 | 1837 | 1664 | 0 | 1844 | 2608 | 70.7% | -| ov_SC03_098 | 1833 | 1664 | 0 | 1836 | 2546 | 72.1% | -| ov_SC03_099 | 1830 | 1664 | 0 | 1833 | 2509 | 73.1% | -| ov_SC03_100 | 1832 | 1664 | 0 | 1836 | 2544 | 72.2% | -| ov_SC03_101 | 1834 | 1664 | 0 | 1838 | 2533 | 72.6% | -| ov_SC03_102 | 1834 | 1664 | 0 | 1837 | 2497 | 73.6% | -| ov_SC03_103 | 1833 | 1666 | 0 | 1836 | 2515 | 73.0% | -| ov_SC03_104 | 1844 | 1664 | 0 | 1851 | 2621 | 70.6% | -| ov_SC03_105 | 1838 | 1664 | 0 | 1845 | 2602 | 70.9% | -| ov_SC03_108 | 1826 | 1664 | 0 | 1826 | 2448 | 74.6% | -| ov_SC03_109 | 1827 | 1664 | 0 | 1829 | 2428 | 75.3% | -| ov_SC03_110 | 1829 | 1664 | 0 | 1829 | 2473 | 74.0% | -| ov_SC03_111 | 1834 | 1664 | 0 | 1837 | 2515 | 73.0% | -| ov_SC03_112 | 1832 | 1666 | 0 | 1834 | 2531 | 72.5% | -| ov_SC03_113 | 1829 | 1666 | 0 | 1832 | 2473 | 74.1% | -| ov_SC03_114 | 1825 | 1664 | 0 | 1827 | 2419 | 75.5% | -| ov_SC03_115 | 1833 | 1664 | 0 | 1835 | 2477 | 74.1% | -| ov_SC03_116 | 1831 | 1664 | 0 | 1834 | 2443 | 75.1% | -| ov_SC03_117 | 1831 | 1664 | 0 | 1837 | 2562 | 71.7% | -| ov_SC03_118 | 1859 | 1688 | 0 | 1860 | 2690 | 69.1% | -| ov_SC03_119 | 1854 | 1688 | 0 | 1855 | 2690 | 69.0% | -| ov_SC03_121 | 1831 | 1664 | 0 | 1834 | 2464 | 74.4% | -| ov_SC03_124 | 1855 | 1660 | 0 | 1875 | 2746 | 68.3% | -| ov_SC03_125 | 1837 | 1664 | 0 | 1849 | 2593 | 71.3% | -| ov_SC03_126 | 1828 | 1666 | 0 | 1828 | 2427 | 75.3% | -| ov_SC04_000 | 1837 | 1668 | 0 | 1846 | 2551 | 72.4% | -| ov_SC04_002 | 1841 | 1664 | 0 | 1845 | 2641 | 69.9% | -| ov_SC04_003 | 1829 | 1664 | 0 | 1833 | 2507 | 73.1% | -| ov_SC04_004 | 1836 | 1664 | 0 | 1838 | 2563 | 71.7% | -| ov_SC04_005 | 1838 | 1664 | 0 | 1844 | 2617 | 70.5% | -| ov_SC04_006 | 1827 | 1664 | 0 | 1829 | 2458 | 74.4% | -| ov_SC04_007 | 1837 | 1664 | 0 | 1841 | 2574 | 71.5% | -| ov_SC04_008 | 1827 | 1664 | 0 | 1827 | 2419 | 75.5% | -| ov_SC04_009 | 1830 | 1664 | 0 | 1833 | 2445 | 75.0% | -| ov_SC04_010 | 1830 | 1664 | 0 | 1831 | 2423 | 75.6% | -| ov_SC04_011 | 1853 | 1664 | 0 | 1859 | 2808 | 66.2% | -| ov_SC04_012 | 1827 | 1664 | 0 | 1828 | 2424 | 75.4% | -| ov_SC04_015 | 1847 | 1665 | 0 | 1858 | 2616 | 71.0% | -| ov_SC04_016 | 1825 | 1664 | 0 | 1827 | 2444 | 74.8% | -| ov_SC04_018 | 1873 | 1699 | 0 | 1873 | 2862 | 65.4% | -| ov_SC04_019 | 1878 | 1699 | 0 | 1878 | 2862 | 65.6% | -| ov_SC04_020 | 1840 | 1664 | 0 | 1852 | 2572 | 72.0% | -| ov_SC04_021 | 1826 | 1666 | 0 | 1826 | 2427 | 75.2% | -| ov_SC05_000 | 1830 | 1668 | 0 | 1833 | 2426 | 75.6% | -| ov_SC05_001 | 1830 | 1664 | 0 | 1835 | 2579 | 71.2% | -| ov_SC05_002 | 1827 | 1664 | 0 | 1830 | 2447 | 74.8% | -| ov_SC05_003 | 1828 | 1664 | 0 | 1829 | 2486 | 73.6% | -| ov_SC05_004 | 1828 | 1664 | 0 | 1830 | 2469 | 74.1% | -| ov_SC05_005 | 1829 | 1664 | 0 | 1830 | 2496 | 73.3% | -| ov_SC05_006 | 1826 | 1664 | 0 | 1826 | 2434 | 75.0% | -| ov_SC05_007 | 1831 | 1664 | 0 | 1836 | 2487 | 73.8% | -| ov_SC05_008 | 1851 | 1664 | 0 | 1853 | 2548 | 72.7% | -| ov_SC05_009 | 1831 | 1664 | 0 | 1835 | 2442 | 75.1% | -| ov_SC05_010 | 1839 | 1664 | 0 | 1843 | 2593 | 71.1% | -| ov_SC05_011 | 1826 | 1664 | 0 | 1827 | 2413 | 75.7% | -| ov_SC05_017 | 1858 | 1661 | 0 | 1869 | 2847 | 65.6% | -| ov_SC05_018 | 1849 | 1664 | 0 | 1862 | 2678 | 69.5% | -| ov_SC05_019 | 1827 | 1666 | 0 | 1827 | 2427 | 75.3% | -| ov_SC06_000 | 1861 | 1673 | 0 | 1864 | 2696 | 69.1% | -| ov_SC06_006 | 1834 | 1664 | 0 | 1835 | 2516 | 72.9% | -| ov_SC06_008 | 1839 | 1666 | 0 | 1845 | 2546 | 72.5% | -| ov_SC06_010 | 1838 | 1664 | 0 | 1843 | 2522 | 73.1% | -| ov_SC06_011 | 1830 | 1664 | 0 | 1834 | 2473 | 74.2% | -| ov_SC06_013 | 1829 | 1664 | 0 | 1830 | 2429 | 75.3% | -| ov_SC06_014 | 1831 | 1664 | 0 | 1833 | 2457 | 74.6% | -| ov_SC06_015 | 1828 | 1664 | 0 | 1828 | 2425 | 75.4% | -| ov_SC06_016 | 1839 | 1664 | 0 | 1841 | 2554 | 72.1% | -| ov_SC06_018 | 1838 | 1667 | 0 | 1845 | 2670 | 69.1% | -| ov_SC06_020 | 1832 | 1666 | 0 | 1833 | 2523 | 72.7% | -| ov_SC06_022 | 1838 | 1664 | 0 | 1846 | 2647 | 69.7% | -| ov_SC06_024 | 1843 | 1664 | 0 | 1849 | 2672 | 69.2% | -| ov_SC06_025 | 1836 | 1664 | 0 | 1841 | 2577 | 71.4% | -| ov_SC06_027 | 1824 | 1664 | 0 | 1825 | 2412 | 75.7% | -| ov_SC06_029 | 1852 | 1664 | 0 | 1864 | 2667 | 69.9% | -| ov_SC06_030 | 1830 | 1664 | 0 | 1830 | 2461 | 74.4% | -| ov_SC06_032 | 1831 | 1665 | 0 | 1838 | 2663 | 69.0% | -| ov_SC06_033 | 1839 | 1665 | 0 | 1846 | 2636 | 70.0% | -| ov_SC07_000 | 1842 | 1668 | 0 | 1844 | 2526 | 73.0% | -| ov_SC07_001 | 1831 | 1664 | 0 | 1833 | 2459 | 74.5% | -| ov_SC07_002 | 1845 | 1664 | 0 | 1849 | 2584 | 71.6% | -| ov_SC07_008 | 1825 | 1664 | 0 | 1825 | 2390 | 76.4% | -| ov_SC07_009 | 1833 | 1664 | 0 | 1835 | 2434 | 75.4% | +| ov_SC01_000 | 1839 | 1669 | 0 | 1839 | 2407 | 76.4% | +| ov_SC01_001 | 1836 | 1669 | 0 | 1838 | 2471 | 74.4% | +| ov_SC01_004 | 1829 | 1660 | 0 | 1830 | 2418 | 75.7% | +| ov_SC01_005 | 1853 | 1682 | 0 | 1853 | 2508 | 73.9% | +| ov_SC01_006 | 1852 | 1682 | 0 | 1852 | 2508 | 73.8% | +| ov_SC01_008 | 1830 | 1660 | 0 | 1832 | 2430 | 75.4% | +| ov_SC01_009 | 1850 | 1661 | 0 | 1851 | 2512 | 73.7% | +| ov_SC01_074 | 1830 | 1661 | 0 | 1832 | 2429 | 75.4% | +| ov_SC01_077 | 2223 | 1624 | 0 | 2225 | 2586 | 86.0% | +| ov_SC01_080 | 1848 | 1664 | 0 | 1848 | 2517 | 73.4% | +| ov_SC01_084 | 1851 | 1664 | 0 | 1856 | 2583 | 71.9% | +| ov_SC02_000 | 1868 | 1699 | 0 | 1868 | 2688 | 69.5% | +| ov_SC02_003 | 1868 | 1699 | 0 | 1868 | 2688 | 69.5% | +| ov_SC02_004 | 1834 | 1664 | 0 | 1834 | 2405 | 76.3% | +| ov_SC02_005 | 1893 | 1660 | 0 | 1903 | 2932 | 64.9% | +| ov_SC02_011 | 1874 | 1667 | 0 | 1885 | 2898 | 65.0% | +| ov_SC02_015 | 1835 | 1666 | 0 | 1835 | 2418 | 75.9% | +| ov_SC02_016 | 1839 | 1666 | 0 | 1842 | 2550 | 72.2% | +| ov_SC02_017 | 1858 | 1666 | 0 | 1866 | 2737 | 68.2% | +| ov_SC02_021 | 1838 | 1666 | 0 | 1838 | 2441 | 75.3% | +| ov_SC02_026 | 1842 | 1664 | 0 | 1848 | 2577 | 71.7% | +| ov_SC02_027 | 1851 | 1664 | 0 | 1860 | 2697 | 69.0% | +| ov_SC02_028 | 1859 | 1664 | 0 | 1869 | 2706 | 69.1% | +| ov_SC02_031 | 1849 | 1665 | 0 | 1854 | 2567 | 72.2% | +| ov_SC02_035 | 1840 | 1664 | 0 | 1843 | 2525 | 73.0% | +| ov_SC02_039 | 1831 | 1664 | 0 | 1831 | 2420 | 75.7% | +| ov_SC02_041 | 1838 | 1664 | 0 | 1841 | 2565 | 71.8% | +| ov_SC03_001 | 1891 | 1665 | 0 | 1908 | 2874 | 66.4% | +| ov_SC03_002 | 1857 | 1669 | 0 | 1872 | 2636 | 71.0% | +| ov_SC03_003 | 1829 | 1664 | 0 | 1830 | 2427 | 75.4% | +| ov_SC03_006 | 1870 | 1670 | 0 | 1879 | 2772 | 67.8% | +| ov_SC03_007 | 1845 | 1664 | 0 | 1849 | 2628 | 70.4% | +| ov_SC03_010 | 1839 | 1664 | 0 | 1839 | 2474 | 74.3% | +| ov_SC03_011 | 1835 | 1664 | 0 | 1841 | 2532 | 72.7% | +| ov_SC03_012 | 1830 | 1664 | 0 | 1831 | 2410 | 76.0% | +| ov_SC03_013 | 1838 | 1664 | 0 | 1838 | 2497 | 73.6% | +| ov_SC03_014 | 1860 | 1689 | 0 | 1860 | 2690 | 69.1% | +| ov_SC03_015 | 1866 | 1689 | 0 | 1866 | 2690 | 69.4% | +| ov_SC03_023 | 1832 | 1664 | 0 | 1833 | 2439 | 75.2% | +| ov_SC03_024 | 1862 | 1669 | 0 | 1869 | 2646 | 70.6% | +| ov_SC03_028 | 1853 | 1664 | 0 | 1857 | 2669 | 69.6% | +| ov_SC03_029 | 1839 | 1666 | 0 | 1849 | 2649 | 69.8% | +| ov_SC03_030 | 1840 | 1668 | 0 | 1842 | 2500 | 73.7% | +| ov_SC03_031 | 1834 | 1664 | 0 | 1838 | 2519 | 73.0% | +| ov_SC03_089 | 1844 | 1664 | 0 | 1851 | 2586 | 71.6% | +| ov_SC03_090 | 1845 | 1664 | 0 | 1853 | 2630 | 70.5% | +| ov_SC03_091 | 1844 | 1664 | 0 | 1852 | 2645 | 70.0% | +| ov_SC03_092 | 1844 | 1664 | 0 | 1856 | 2592 | 71.6% | +| ov_SC03_093 | 1841 | 1664 | 0 | 1845 | 2568 | 71.8% | +| ov_SC03_094 | 1835 | 1664 | 0 | 1841 | 2581 | 71.3% | +| ov_SC03_095 | 1833 | 1664 | 0 | 1836 | 2479 | 74.1% | +| ov_SC03_096 | 1836 | 1664 | 0 | 1839 | 2470 | 74.5% | +| ov_SC03_097 | 1840 | 1664 | 0 | 1847 | 2608 | 70.8% | +| ov_SC03_098 | 1836 | 1664 | 0 | 1839 | 2546 | 72.2% | +| ov_SC03_099 | 1833 | 1664 | 0 | 1836 | 2509 | 73.2% | +| ov_SC03_100 | 1835 | 1664 | 0 | 1839 | 2544 | 72.3% | +| ov_SC03_101 | 1837 | 1664 | 0 | 1841 | 2533 | 72.7% | +| ov_SC03_102 | 1837 | 1664 | 0 | 1840 | 2497 | 73.7% | +| ov_SC03_103 | 1836 | 1666 | 0 | 1839 | 2515 | 73.1% | +| ov_SC03_104 | 1847 | 1664 | 0 | 1854 | 2621 | 70.7% | +| ov_SC03_105 | 1841 | 1664 | 0 | 1848 | 2602 | 71.0% | +| ov_SC03_108 | 1829 | 1664 | 0 | 1829 | 2448 | 74.7% | +| ov_SC03_109 | 1830 | 1664 | 0 | 1832 | 2428 | 75.5% | +| ov_SC03_110 | 1832 | 1664 | 0 | 1832 | 2473 | 74.1% | +| ov_SC03_111 | 1837 | 1664 | 0 | 1840 | 2515 | 73.2% | +| ov_SC03_112 | 1835 | 1666 | 0 | 1837 | 2531 | 72.6% | +| ov_SC03_113 | 1832 | 1666 | 0 | 1835 | 2473 | 74.2% | +| ov_SC03_114 | 1828 | 1664 | 0 | 1830 | 2419 | 75.7% | +| ov_SC03_115 | 1836 | 1664 | 0 | 1838 | 2477 | 74.2% | +| ov_SC03_116 | 1834 | 1664 | 0 | 1837 | 2443 | 75.2% | +| ov_SC03_117 | 1834 | 1664 | 0 | 1840 | 2562 | 71.8% | +| ov_SC03_118 | 1862 | 1688 | 0 | 1863 | 2690 | 69.3% | +| ov_SC03_119 | 1857 | 1688 | 0 | 1858 | 2690 | 69.1% | +| ov_SC03_121 | 1834 | 1664 | 0 | 1837 | 2464 | 74.6% | +| ov_SC03_124 | 1858 | 1660 | 0 | 1878 | 2746 | 68.4% | +| ov_SC03_125 | 1840 | 1664 | 0 | 1852 | 2593 | 71.4% | +| ov_SC03_126 | 1831 | 1666 | 0 | 1831 | 2427 | 75.4% | +| ov_SC04_000 | 1840 | 1668 | 0 | 1849 | 2551 | 72.5% | +| ov_SC04_002 | 1844 | 1664 | 0 | 1848 | 2641 | 70.0% | +| ov_SC04_003 | 1832 | 1664 | 0 | 1836 | 2507 | 73.2% | +| ov_SC04_004 | 1839 | 1664 | 0 | 1841 | 2563 | 71.8% | +| ov_SC04_005 | 1841 | 1664 | 0 | 1847 | 2617 | 70.6% | +| ov_SC04_006 | 1830 | 1664 | 0 | 1832 | 2458 | 74.5% | +| ov_SC04_007 | 1840 | 1664 | 0 | 1844 | 2574 | 71.6% | +| ov_SC04_008 | 1830 | 1664 | 0 | 1830 | 2419 | 75.7% | +| ov_SC04_009 | 1833 | 1664 | 0 | 1836 | 2445 | 75.1% | +| ov_SC04_010 | 1833 | 1664 | 0 | 1834 | 2423 | 75.7% | +| ov_SC04_011 | 1856 | 1664 | 0 | 1862 | 2808 | 66.3% | +| ov_SC04_012 | 1830 | 1664 | 0 | 1831 | 2424 | 75.5% | +| ov_SC04_015 | 1850 | 1665 | 0 | 1861 | 2616 | 71.1% | +| ov_SC04_016 | 1828 | 1664 | 0 | 1830 | 2444 | 74.9% | +| ov_SC04_018 | 1876 | 1699 | 0 | 1876 | 2862 | 65.5% | +| ov_SC04_019 | 1881 | 1699 | 0 | 1881 | 2862 | 65.7% | +| ov_SC04_020 | 1843 | 1664 | 0 | 1855 | 2572 | 72.1% | +| ov_SC04_021 | 1829 | 1666 | 0 | 1829 | 2427 | 75.4% | +| ov_SC05_000 | 1833 | 1668 | 0 | 1836 | 2426 | 75.7% | +| ov_SC05_001 | 1833 | 1664 | 0 | 1838 | 2579 | 71.3% | +| ov_SC05_002 | 1830 | 1664 | 0 | 1833 | 2447 | 74.9% | +| ov_SC05_003 | 1831 | 1664 | 0 | 1832 | 2486 | 73.7% | +| ov_SC05_004 | 1831 | 1664 | 0 | 1833 | 2469 | 74.2% | +| ov_SC05_005 | 1832 | 1664 | 0 | 1833 | 2496 | 73.4% | +| ov_SC05_006 | 1829 | 1664 | 0 | 1829 | 2434 | 75.1% | +| ov_SC05_007 | 1834 | 1664 | 0 | 1839 | 2487 | 73.9% | +| ov_SC05_008 | 1854 | 1664 | 0 | 1856 | 2548 | 72.8% | +| ov_SC05_009 | 1834 | 1664 | 0 | 1838 | 2442 | 75.3% | +| ov_SC05_010 | 1842 | 1664 | 0 | 1846 | 2593 | 71.2% | +| ov_SC05_011 | 1829 | 1664 | 0 | 1830 | 2413 | 75.8% | +| ov_SC05_017 | 1861 | 1661 | 0 | 1872 | 2847 | 65.8% | +| ov_SC05_018 | 1852 | 1664 | 0 | 1865 | 2678 | 69.6% | +| ov_SC05_019 | 1830 | 1666 | 0 | 1830 | 2427 | 75.4% | +| ov_SC06_000 | 1864 | 1673 | 0 | 1867 | 2696 | 69.3% | +| ov_SC06_006 | 1837 | 1664 | 0 | 1838 | 2516 | 73.1% | +| ov_SC06_008 | 1842 | 1666 | 0 | 1848 | 2546 | 72.6% | +| ov_SC06_010 | 1841 | 1664 | 0 | 1846 | 2522 | 73.2% | +| ov_SC06_011 | 1833 | 1664 | 0 | 1837 | 2473 | 74.3% | +| ov_SC06_013 | 1832 | 1664 | 0 | 1833 | 2429 | 75.5% | +| ov_SC06_014 | 1834 | 1664 | 0 | 1836 | 2457 | 74.7% | +| ov_SC06_015 | 1831 | 1664 | 0 | 1831 | 2425 | 75.5% | +| ov_SC06_016 | 1842 | 1664 | 0 | 1844 | 2554 | 72.2% | +| ov_SC06_018 | 1841 | 1667 | 0 | 1848 | 2670 | 69.2% | +| ov_SC06_020 | 1835 | 1666 | 0 | 1836 | 2523 | 72.8% | +| ov_SC06_022 | 1841 | 1664 | 0 | 1849 | 2647 | 69.9% | +| ov_SC06_024 | 1846 | 1664 | 0 | 1852 | 2672 | 69.3% | +| ov_SC06_025 | 1839 | 1664 | 0 | 1844 | 2577 | 71.6% | +| ov_SC06_027 | 1827 | 1664 | 0 | 1828 | 2412 | 75.8% | +| ov_SC06_029 | 1855 | 1664 | 0 | 1867 | 2667 | 70.0% | +| ov_SC06_030 | 1833 | 1664 | 0 | 1833 | 2461 | 74.5% | +| ov_SC06_032 | 1834 | 1665 | 0 | 1841 | 2663 | 69.1% | +| ov_SC06_033 | 1842 | 1665 | 0 | 1849 | 2636 | 70.1% | +| ov_SC07_000 | 1845 | 1668 | 0 | 1847 | 2526 | 73.1% | +| ov_SC07_001 | 1834 | 1664 | 0 | 1836 | 2459 | 74.7% | +| ov_SC07_002 | 1848 | 1664 | 0 | 1852 | 2584 | 71.7% | +| ov_SC07_008 | 1828 | 1664 | 0 | 1828 | 2390 | 76.5% | +| ov_SC07_009 | 1836 | 1664 | 0 | 1838 | 2434 | 75.5% | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 04734d6d2..807f49a71 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -35,7 +35,11 @@ idiom curriculum → sweep one exemplar per family (curriculum-ordered), each cr real substance):** crack the **127 draftable family exemplars** curriculum-ordered (T6 order), template/propagate ×134. - [ ] Close — clean-fleet verify · PhaseEnd synthesis · plain-English recap (R25) · Phase-26 backlog *(NOT yet — phase open)* -## FRESH SESSION — RESUME HERE (**NEXT = T5b batch-2, the ~34 giants — AWAITING DREW'S GO-AHEAD**; then batch-3 `_o0`, T5c/T5d → T6; phase OPEN, do NOT close) +## FRESH SESSION — RESUME HERE (**NEXT = T5b batch-2, the ~34 giants — IN FLIGHT 2026-07-09**; then batch-3 `_o0`, T5c/T5d → T6; phase OPEN, do NOT close) +> **BATCH-2 DONE — DEF-SIDE WALL CRACKED MECHANICALLY (2026-07-09); R22 verifying, then COMMIT.** 29 non-`_o0` un-measured giants drafted (Workflow `wf_9ce827ee-933`, drafts `.run/drafts-t5-batch2/`); **16 R14-isolation-MATCH** (`.run/t5_batch2_verify.json`) but **0 auto-banked** — ALL blocked by the **def-side canonical-sig wall** (drafts use Ghidra-typed sigs conflicting with the engine_core.h canonical, which lives inside `DEFINE_func_*` macros so `sig_unify` can't reach it). **CRACKED** → new tool **`tools/canon_sig_reconcile.py`** (strip ambient-dup typedefs/externs → rewrite def to canonical sig → **cast changed params AT USE, never intermediate locals** [locals shift regalloc → byte-diff, measured `70ff4748`≠`d19c9580`]). Cookbook **§41** + decision-log **R31 entry** written (R30/R31). +> **BANKED 5 giants mechanically:** `func_8013B274 func_80130D48 func_80167DBC` (swept **×134**) + `func_8016DC20 func_8018514C` (exemplar-only — reconciled body carries ov-specific decls, siblings failed remap). ~404 new fn-defs. Frontier map appended (29 giants → `.run/t5_frontier.jsonl`: 13 near, 11 wall, 5 banked). +> **11 walls backlogged (per-fn T7):** non-identical ambient types (`func_80167AE0` SVEC, `func_8016A290` ApplyMatrixSV), macro-local data symbols (`func_80162438` D_80078EB0, `func_80161E08` D_801D9670, +others `reconcile_decls`/§33 territory), `u8` primitive redef (`func_8016CF04`), byte-diff (`func_801824D0`). **13 nears** = permuter-ILS/Fable5 fuel (`func_80134C20` c=3, `func_801365B8` c=11, `func_80136824` c=28 closest). +> **RESUME:** (a) R22 (`.run/t5b2_r22.log`, run `ba10w4gum`) — MUST be **136/136** before commit (R22 caught a buggy R22-harness earlier: `$(OVERLAY_BINARIES)` unexpanded → use `BINS="main resident $(ls -d src/ov_*/|xargs -n1 basename)"`). (b) If green: **commit** batch-2 (5 banks + 3×134 sweep + `canon_sig_reconcile.py` + cookbook §41 + decision-log + backlog + CURRENT_PHASE) — Drew pushes (R6). (c) Recompute fleet %. If R22 shows a real break: diagnose/revert (source spot-checks passed: ov_SC01_000/02_000/06_015/07_009 all BYTE-IDENTICAL clean). **T5b batch-1 (cheap tier, 83) COMPLETE 2026-07-08, fleet → 72.18%.** How to resume: reuse the proven pipeline — `wave_targets`/the giant list from `.run/t5_targets.json` (bucket=GIANT, 34) → generate a §12-robust wave (copy the `.run/t5_scaleup_cont.js` pattern: worker_wave head + waves-of-10 + retry, targets embedded — sandbox can't read files) → Opus-xHigh Workflow → independent `match_one` (R14) → split-file `gate_stage --no-propagate` → `family_sweep --only ` → R22 clean-fleet 136/136 → commit. Frontier map accumulates in `.run/t5_frontier.jsonl` (93 exemplars so far). Giants: crack tractable directly (pilot cracked the 369-ins `func_80166994`), backlog intrinsic walls for Fable5/permuter; the -O0 ones (batch-3 + `func_801457A4`) need an -O0 `match_one`. **Effort: Max orchestrator + xHigh workers (NOT global Ultracode) — confirmed by Drew.** **Phase is OPEN.** Order: T7-mechanical (done) → T4 (done, FAILED) → **T5 (pilot + batch-1 DONE 2026-07-08, fleet→72.18%; batch-2 giants NEXT, awaiting Drew)** → T6 → T7-cracking → Close. T5 mechanics validated end-to-end (`worker_wave` Opus-xHigh → independent `match_one` → `gate_stage` diff --git a/src/ov_SC01_000/ov_SC01_000.c b/src/ov_SC01_000/ov_SC01_000.c index 03859e8ae..ace758b6c 100644 --- a/src/ov_SC01_000/ov_SC01_000.c +++ b/src/ov_SC01_000/ov_SC01_000.c @@ -1108,7 +1108,175 @@ INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_80130C08); INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EFE8[]; +extern s16 D_8017F018[]; +extern s16 D_8017F078[]; +extern s16 D_8017F080[]; +extern s16 D_8017F0A0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F018; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F078; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F080; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F0A0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EFE8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_80131170); @@ -1642,7 +1810,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F350, D_8017F352, D_8017F354, D_8017F356, D_8017F358, D_8017F35A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F352 < ang)) goto outer_else; + if (!(ang < D_8017F358)) goto inner_else; + if (ang < D_8017F354) { *(s16 *)L = D_8017F354; goto done; } + if (D_8017F356 < ang) { *(s16 *)L = D_8017F356; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F350) { *(s16 *)L = D_8017F350; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F35A < ang) { *(s16 *)L = D_8017F35A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000", func_8013B568); diff --git a/src/ov_SC01_000/ov_SC01_000_after.c b/src/ov_SC01_000/ov_SC01_000_after.c index bbb9455ca..622c15553 100644 --- a/src/ov_SC01_000/ov_SC01_000_after.c +++ b/src/ov_SC01_000/ov_SC01_000_after.c @@ -4403,7 +4403,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181B44[]; +extern u8 D_80181B58[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181B44; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181B58; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_001/ov_SC01_001.c b/src/ov_SC01_001/ov_SC01_001.c index 54e9a45b3..be4cb910f 100644 --- a/src/ov_SC01_001/ov_SC01_001.c +++ b/src/ov_SC01_001/ov_SC01_001.c @@ -1110,7 +1110,175 @@ INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_80130C08); INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183C38[]; +extern s16 D_80183C68[]; +extern s16 D_80183CC8[]; +extern s16 D_80183CD0[]; +extern s16 D_80183CF0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183C68; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80183CC8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183CD0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183CF0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80183C38; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_80131170); @@ -1639,7 +1807,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80183FA0, D_80183FA2, D_80183FA4, D_80183FA6, D_80183FA8, D_80183FAA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183FA2 < ang)) goto outer_else; + if (!(ang < D_80183FA8)) goto inner_else; + if (ang < D_80183FA4) { *(s16 *)L = D_80183FA4; goto done; } + if (D_80183FA6 < ang) { *(s16 *)L = D_80183FA6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183FA0) { *(s16 *)L = D_80183FA0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183FAA < ang) { *(s16 *)L = D_80183FAA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001", func_8013B568); diff --git a/src/ov_SC01_001/ov_SC01_001_after.c b/src/ov_SC01_001/ov_SC01_001_after.c index 08aea8028..c8036c2b9 100644 --- a/src/ov_SC01_001/ov_SC01_001_after.c +++ b/src/ov_SC01_001/ov_SC01_001_after.c @@ -4385,7 +4385,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80186794[]; +extern u8 D_801867A8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80186794; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801867A8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_004/ov_SC01_004.c b/src/ov_SC01_004/ov_SC01_004.c index 27d4bd5b2..31f05bdf4 100644 --- a/src/ov_SC01_004/ov_SC01_004.c +++ b/src/ov_SC01_004/ov_SC01_004.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_80130C08); INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F5FC[]; +extern s16 D_8017F62C[]; +extern s16 D_8017F68C[]; +extern s16 D_8017F694[]; +extern s16 D_8017F6B4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F62C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F68C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F694; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F6B4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F5FC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_80131170); @@ -1654,7 +1822,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F964, D_8017F966, D_8017F968, D_8017F96A, D_8017F96C, D_8017F96E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F966 < ang)) goto outer_else; + if (!(ang < D_8017F96C)) goto inner_else; + if (ang < D_8017F968) { *(s16 *)L = D_8017F968; goto done; } + if (D_8017F96A < ang) { *(s16 *)L = D_8017F96A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F964) { *(s16 *)L = D_8017F964; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F96E < ang) { *(s16 *)L = D_8017F96E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004", func_8013B568); diff --git a/src/ov_SC01_004/ov_SC01_004_after.c b/src/ov_SC01_004/ov_SC01_004_after.c index fc5c34984..bca276dcc 100644 --- a/src/ov_SC01_004/ov_SC01_004_after.c +++ b/src/ov_SC01_004/ov_SC01_004_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182158[]; +extern u8 D_8018216C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182158; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018216C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_005/ov_SC01_005.c b/src/ov_SC01_005/ov_SC01_005.c index 122505f1b..c925eb600 100644 --- a/src/ov_SC01_005/ov_SC01_005.c +++ b/src/ov_SC01_005/ov_SC01_005.c @@ -1102,7 +1102,175 @@ INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_80130C08); INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182790[]; +extern s16 D_801827C0[]; +extern s16 D_80182820[]; +extern s16 D_80182828[]; +extern s16 D_80182848[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801827C0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182820; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182828; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182848; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182790; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_80131170); @@ -1631,7 +1799,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AFA < ang)) goto outer_else; + if (!(ang < D_80182B00)) goto inner_else; + if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } + if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005", func_8013B568); diff --git a/src/ov_SC01_005/ov_SC01_005_after.c b/src/ov_SC01_005/ov_SC01_005_after.c index c4cd390ed..d9423acef 100644 --- a/src/ov_SC01_005/ov_SC01_005_after.c +++ b/src/ov_SC01_005/ov_SC01_005_after.c @@ -4388,7 +4388,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801852EC[]; +extern u8 D_80185300[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801852EC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185300; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_006/ov_SC01_006.c b/src/ov_SC01_006/ov_SC01_006.c index e04715beb..182b1ef11 100644 --- a/src/ov_SC01_006/ov_SC01_006.c +++ b/src/ov_SC01_006/ov_SC01_006.c @@ -1102,7 +1102,175 @@ INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_80130C08); INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182790[]; +extern s16 D_801827C0[]; +extern s16 D_80182820[]; +extern s16 D_80182828[]; +extern s16 D_80182848[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801827C0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182820; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182828; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182848; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182790; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_80131170); @@ -1631,7 +1799,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AFA < ang)) goto outer_else; + if (!(ang < D_80182B00)) goto inner_else; + if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } + if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006", func_8013B568); diff --git a/src/ov_SC01_006/ov_SC01_006_after.c b/src/ov_SC01_006/ov_SC01_006_after.c index 227187621..49ec5a240 100644 --- a/src/ov_SC01_006/ov_SC01_006_after.c +++ b/src/ov_SC01_006/ov_SC01_006_after.c @@ -4388,7 +4388,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801852EC[]; +extern u8 D_80185300[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801852EC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185300; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_008/ov_SC01_008.c b/src/ov_SC01_008/ov_SC01_008.c index 0b6e0f594..7bc4825c8 100644 --- a/src/ov_SC01_008/ov_SC01_008.c +++ b/src/ov_SC01_008/ov_SC01_008.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_80130C08); INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FB70[]; +extern s16 D_8017FBA0[]; +extern s16 D_8017FC00[]; +extern s16 D_8017FC08[]; +extern s16 D_8017FC28[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FBA0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017FC00; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FC08; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FC28; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017FB70; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_80131170); @@ -1654,7 +1822,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017FED8, D_8017FEDA, D_8017FEDC, D_8017FEDE, D_8017FEE0, D_8017FEE2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FEDA < ang)) goto outer_else; + if (!(ang < D_8017FEE0)) goto inner_else; + if (ang < D_8017FEDC) { *(s16 *)L = D_8017FEDC; goto done; } + if (D_8017FEDE < ang) { *(s16 *)L = D_8017FEDE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FED8) { *(s16 *)L = D_8017FED8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FEE2 < ang) { *(s16 *)L = D_8017FEE2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008", func_8013B568); diff --git a/src/ov_SC01_008/ov_SC01_008_after.c b/src/ov_SC01_008/ov_SC01_008_after.c index 4dacbe8e3..0dee91fbc 100644 --- a/src/ov_SC01_008/ov_SC01_008_after.c +++ b/src/ov_SC01_008/ov_SC01_008_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801826CC[]; +extern u8 D_801826E0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801826CC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801826E0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_009/ov_SC01_009.c b/src/ov_SC01_009/ov_SC01_009.c index 100b37822..d0959133e 100644 --- a/src/ov_SC01_009/ov_SC01_009.c +++ b/src/ov_SC01_009/ov_SC01_009.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_80130C08); INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182D58[]; +extern s16 D_80182D88[]; +extern s16 D_80182DE8[]; +extern s16 D_80182DF0[]; +extern s16 D_80182E10[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182D88; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182DE8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182DF0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182E10; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182D58; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_80131170); @@ -1654,7 +1822,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801830C0, D_801830C2, D_801830C4, D_801830C6, D_801830C8, D_801830CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801830C2 < ang)) goto outer_else; + if (!(ang < D_801830C8)) goto inner_else; + if (ang < D_801830C4) { *(s16 *)L = D_801830C4; goto done; } + if (D_801830C6 < ang) { *(s16 *)L = D_801830C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801830C0) { *(s16 *)L = D_801830C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801830CA < ang) { *(s16 *)L = D_801830CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009", func_8013B568); diff --git a/src/ov_SC01_009/ov_SC01_009_after.c b/src/ov_SC01_009/ov_SC01_009_after.c index 2a338b999..447decf15 100644 --- a/src/ov_SC01_009/ov_SC01_009_after.c +++ b/src/ov_SC01_009/ov_SC01_009_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801858B4[]; +extern u8 D_801858C8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801858B4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801858C8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_074/ov_SC01_074.c b/src/ov_SC01_074/ov_SC01_074.c index 48a56406d..6c3fe9a57 100644 --- a/src/ov_SC01_074/ov_SC01_074.c +++ b/src/ov_SC01_074/ov_SC01_074.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_80130C08); INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E9D8[]; +extern s16 D_8017EA08[]; +extern s16 D_8017EA68[]; +extern s16 D_8017EA70[]; +extern s16 D_8017EA90[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA08; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EA68; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA70; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA90; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E9D8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017ED40, D_8017ED42, D_8017ED44, D_8017ED46, D_8017ED48, D_8017ED4A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017ED42 < ang)) goto outer_else; + if (!(ang < D_8017ED48)) goto inner_else; + if (ang < D_8017ED44) { *(s16 *)L = D_8017ED44; goto done; } + if (D_8017ED46 < ang) { *(s16 *)L = D_8017ED46; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017ED40) { *(s16 *)L = D_8017ED40; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017ED4A < ang) { *(s16 *)L = D_8017ED4A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074", func_8013B568); diff --git a/src/ov_SC01_074/ov_SC01_074_after.c b/src/ov_SC01_074/ov_SC01_074_after.c index a4739733a..1fb144a14 100644 --- a/src/ov_SC01_074/ov_SC01_074_after.c +++ b/src/ov_SC01_074/ov_SC01_074_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181534[]; +extern u8 D_80181548[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181534; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181548; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_077/ov_SC01_077_a.c b/src/ov_SC01_077/ov_SC01_077_a.c index 6b1dbb249..80073b9b7 100644 --- a/src/ov_SC01_077/ov_SC01_077_a.c +++ b/src/ov_SC01_077/ov_SC01_077_a.c @@ -1754,7 +1754,174 @@ void func_80130D0C(void *a0) { D_80186EAC[*(u8 *)((s32)a0 + 0xC1)](); } -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_a", func_80130D48); +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186EFC[]; +extern s16 D_80186F2C[]; +extern s16 D_80186F8C[]; +extern s16 D_80186F94[]; +extern s16 D_80186FB4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186F2C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186F8C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186F94; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186FB4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186EFC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_a", func_80131170); @@ -2644,6 +2811,110 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_a", func_8013B274); +// @class: schedule +// @stuck: none — MATCH (189/189). Levers: (1) POLY_FT4 UV stores in per-vertex source order +// (u0,v0),(u1,v1),(u2,v2),(u3,v3) -> exact const-materialize schedule + 0xEF held in $v1 across +// the angle branch, u3 store fills the bnez delay slot. (2) vertex reads *(volatile s32*) force +// the target's reload-each-vertex (defeats CSE). (3) addPrim via P_TAG 24-bit bitfield store +// (value-mask-first order, cookbook §36). (4) raw lwc2/mvmva/swc2 inline-asm + memory clobbers. +#include "common.h" + + +extern void *func_80010A08(s32); +extern s16 D_80187264, D_80187266, D_80187268, D_8018726A, D_8018726C, D_8018726E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187266 < ang)) goto outer_else; + if (!(ang < D_8018726C)) goto inner_else; + if (ang < D_80187268) { *(s16 *)L = D_80187268; goto done; } + if (D_8018726A < ang) { *(s16 *)L = D_8018726A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187264) { *(s16 *)L = D_80187264; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018726E < ang) { *(s16 *)L = D_8018726E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + /* func_8013B568..func_8013C964 (16 contiguous fns) moved to ov_SC01_077_o0.c — built -O0 (Phase-19 T1). */ diff --git a/src/ov_SC01_077/ov_SC01_077_after.c b/src/ov_SC01_077/ov_SC01_077_after.c index e146efa49..24e43134c 100644 --- a/src/ov_SC01_077/ov_SC01_077_after.c +++ b/src/ov_SC01_077/ov_SC01_077_after.c @@ -6010,7 +6010,94 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_80167DBC); +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189A58[]; +extern u8 D_80189A6C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189A58; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80189A6C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + // @class: struct // @stuck: none — MATCH (99 ins, relocation-masked); array-decay (§18) kept mid/dir/pos stack-resident @@ -6754,7 +6841,92 @@ DEFINE_func_8016DB34() /* dedup: shared engine-core @0x8016DB34 (src/shared) */ DEFINE_func_8016DBD8() /* dedup: shared engine-core @0x8016DBD8 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_8016DC20); +// @class: schedule +// @stuck: none — MATCH (161 ins, relocation-masked). Keys: (1) mirror sibling func_8017BEF8 coord-transform idiom (16-byte Work struct {in x,y,z,xpad @0x20; out vx,vy,vz,vpad @0x28} -> frame 0x48, in@sp+0x20/out@sp+0x28); (2) SHORT loop counter i shared across all 3 loops defeats shift-IV strength reduction; (3) loop-2 = check-first/increment-after (like loop-1) keeps search key 0x11 in $a0 (reused as the func_80146A6C a0 arg) instead of spilling to $a1; (4) place loop-3 counter reset i=0 AFTER func_800D23D0 (not before func_80146A6C(0x11)) so it schedules as $s1-reset last, not first; (5) inverted final branch (if r!=0 {loops} else fall to ddb0/func_80146C3C) matches beqz; node-alloc block mirrors sibling func_8016DA7C. +#include "common.h" + +typedef struct { + u16 x, y, z, xpad; /* 0x00 : in -> sp+0x20 */ + u16 vx, vy, vz, vpad; /* 0x08 : out -> sp+0x28 */ +} Work8016; + +extern s32 D_8011D030; +extern s16 D_801DA2C0; +extern s16 D_801DA2C4; +extern s32 D_80189E20; +extern s32 D_80189E2C; +s32 func_8016DC20(s32 param_1) { + u16 *p; + short i; + s32 obj; + s32 r; + s32 node; + s32 e; + Work8016 w; + + i = 0; + p = (u16 *)&D_8011D030; + obj = *(s32 *)(param_1 + 0x34); + do { + if ((p != (u16 *)param_1) && (*p == 0x34)) goto done; + i = i + 1; + p += 0x2c; + } while (i < 0x1e); + + func_80149374(obj, param_1 + 4); + r = func_801619D0((void *)obj); + i = 0; + if (r != 0) { + p = (u16 *)&D_8011D030; + do { + if (*p == 0x11) goto ddb0; + i = i + 1; + p += 0x2c; + } while (i < 0x1e); + + func_80146A6C(0x11, (void *)param_1, *(s16 *)(param_1 + 6), + (s16)(*(u16 *)(param_1 + 0xA) - 8), + *(s16 *)(param_1 + 0xE), 0, 0); + w.x = *(u16 *)(param_1 + 6); + w.y = *(u16 *)(param_1 + 0xA); + w.z = *(u16 *)(param_1 + 0xE); + func_800D20C0(&w.x, &w.vx, 0); + w.vy = 0; + func_800D23D0(&w.vx); + i = 0; + do { + e = func_80146A6C(0x12, (void *)param_1, *(s16 *)(obj + 6), + *(s16 *)(obj + 0xA), *(s16 *)(obj + 0xE), + i, 0); + if (e != 0) { + *(s16 *)(e + 0x12) = w.vx; + *(s16 *)(e + 0x16) = w.vy; + *(s16 *)(e + 0x1A) = 0; + } + i = i + 2; + } while (i < 3); + goto done; + } +ddb0: + if (((D_801DA2C0 != *(s16 *)(obj + 6)) || (D_801DA2C4 != *(s16 *)(obj + 0xE))) + && (node = func_800D21C4(param_1, &D_80189E20, 0x18), node != 0)) { + D_801DA2C0 = *(u16 *)(obj + 6); + D_801DA2C4 = *(u16 *)(obj + 0xE); + func_800D1FC8(param_1, 7); + *(s32 *)(param_1 + 0x20) = node; + *(u16 *)(node + 0x1A) = 0x3000; + *(u16 *)(node + 0x18) = 0x3000; + *(u8 *)(node + 0x26) = 0xFF; + *(u32 *)(node + 4) = *(u32 *)(node + 4) | 0x50000000; + func_80128EA8(node, param_1 + 0x24, (s32)&D_80189E2C); + func_80128ED8(node, param_1 + 0x24); + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; + return; + } +done: + ((void (*)(s32))func_80146C3C)(param_1); +} + extern void (*D_80189E4C[])(void); @@ -11521,7 +11693,109 @@ s32 func_80184ED8(s32 a0, s32 a1) { INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_80184F08); -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_8018514C); +// @class: regalloc-order +// @stuck: none — MATCH (168 ins). Keys: (1) pin param->$s1 via `register int self __asm__("$17")=param_1` +// (natural alloc put the short loop-counter in $s1); (2) block2's guarded dest via a test-temp +// `td=load; if(td){dest=td; ...}` forces the range-split `lw $a1; addu $s3,$a1,$0` the target has; +// (3) counter is `short i` do-while (keeps the `addu $s2,$v0,$0` raw-copy + sll16/sra16 compare); +// (4) gcc-2.7.2 loads s8/s16 via lbu/lhu+shift-extend (not lb/lh) so `signed char *p; *(s16*)buf=*p++` +// emits lbu;sll24;sra24;sh; (5) else-branch zero-byte asm barrier forces `addu $a0,$s1,$0` (else gcc +// reuses the still-live incoming $a0 with a nop delay slot). +extern signed char D_80199178[]; + +s32 func_8018514C(s32 param_1) { + register int self __asm__("$17") = ((int)param_1); + int iVar6; + int iVar1; + unsigned char buf[0x34]; + signed char *p; + short i; + int dest; + int td; + unsigned short t; + + iVar1 = *(int *)(self + 0x1c); + iVar6 = *(int *)(self + 0x20); + *(int *)(self + 0x1c) = iVar1 + 1; + if (iVar1 < 2) { + p = D_80199178; + i = 0; + dest = *(int *)(self + 0xcc); + t = *(unsigned short *)(self + 0x70); + *(short *)(buf + 0x0c) = 0; + *(short *)(buf + 0x0a) = 0; + *(short *)(buf + 0x08) = 0; + *(short *)(buf + 0x1c) = 0; + *(short *)(buf + 0x14) = 0; + *(short *)(buf + 0x04) = 0; + buf[0x22] = 0; + buf[0x21] = 0; + buf[0x20] = 0; + buf[0x2a] = 0; + buf[0x29] = 0; + buf[0x28] = 0; + buf[0x2e] = 0; + buf[0x2d] = 0; + buf[0x2c] = 0; + *(int *)(buf + 0x30) = 0x50000000; + buf[0x25] = t; + buf[0x26] = t; + buf[0x24] = t; + do { + *(short *)(buf + 0x00) = *p++; + *(short *)(buf + 0x02) = *p++; + *(short *)(buf + 0x10) = *p++; + *(short *)(buf + 0x12) = *p++; + *(short *)(buf + 0x18) = *p++; + *(short *)(buf + 0x1a) = *p--; + func_80017758(buf, (void *)dest); + i++; + } while (i < 4); + + td = *(int *)(self + 0xd0); + if (td != 0) { + dest = td; + p = D_80199178; + i = 0; + t = *(unsigned short *)(self + 0x70); + *(short *)(buf + 0x0c) = 0; + *(short *)(buf + 0x0a) = 0; + *(short *)(buf + 0x08) = 0; + *(short *)(buf + 0x1c) = 0; + *(short *)(buf + 0x14) = 0; + *(short *)(buf + 0x04) = 0; + buf[0x22] = 0; + buf[0x21] = 0; + buf[0x20] = 0; + buf[0x2a] = 0; + buf[0x29] = 0; + buf[0x28] = 0; + buf[0x2e] = 0; + buf[0x2d] = 0; + buf[0x2c] = 0; + *(int *)(buf + 0x30) = 0x50000000; + buf[0x25] = t; + buf[0x26] = t; + buf[0x24] = t; + do { + *(short *)(buf + 0x00) = *p++; + *(short *)(buf + 0x02) = *p++; + *(short *)(buf + 0x10) = *p++; + *(short *)(buf + 0x12) = *p++; + *(short *)(buf + 0x18) = *p++; + *(short *)(buf + 0x1a) = *p--; + func_80017758(buf, (void *)dest); + i++; + } while (i < 4); + } + *(short *)(self + 0x70) = *(short *)(self + 0x70) >> 1; + *(unsigned short *)(iVar6 + 0x2c) |= 1; + } else { + __asm__ __volatile__("" : "=r"(self) : "0"(self)); + func_8012C218((void *)self); + } +} + extern s32 (*D_801991C4[])(); diff --git a/src/ov_SC01_080/ov_SC01_080.c b/src/ov_SC01_080/ov_SC01_080.c index 430456399..74ddb4660 100644 --- a/src/ov_SC01_080/ov_SC01_080.c +++ b/src/ov_SC01_080/ov_SC01_080.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_80130C08); INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183938[]; +extern s16 D_80183968[]; +extern s16 D_801839C8[]; +extern s16 D_801839D0[]; +extern s16 D_801839F0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183968; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801839C8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801839D0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801839F0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80183938; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80183CA0, D_80183CA2, D_80183CA4, D_80183CA6, D_80183CA8, D_80183CAA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183CA2 < ang)) goto outer_else; + if (!(ang < D_80183CA8)) goto inner_else; + if (ang < D_80183CA4) { *(s16 *)L = D_80183CA4; goto done; } + if (D_80183CA6 < ang) { *(s16 *)L = D_80183CA6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183CA0) { *(s16 *)L = D_80183CA0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183CAA < ang) { *(s16 *)L = D_80183CAA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080", func_8013B568); diff --git a/src/ov_SC01_080/ov_SC01_080_after.c b/src/ov_SC01_080/ov_SC01_080_after.c index 75d45e801..6cf102171 100644 --- a/src/ov_SC01_080/ov_SC01_080_after.c +++ b/src/ov_SC01_080/ov_SC01_080_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80186494[]; +extern u8 D_801864A8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80186494; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801864A8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC01_084/ov_SC01_084.c b/src/ov_SC01_084/ov_SC01_084.c index 8fbabdfbc..90816d0c5 100644 --- a/src/ov_SC01_084/ov_SC01_084.c +++ b/src/ov_SC01_084/ov_SC01_084.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_80130C08); INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_80130D0C); -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186C2C[]; +extern s16 D_80186C5C[]; +extern s16 D_80186CBC[]; +extern s16 D_80186CC4[]; +extern s16 D_80186CE4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186C5C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186CBC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186CC4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186CE4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186C2C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80186F94, D_80186F96, D_80186F98, D_80186F9A, D_80186F9C, D_80186F9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186F96 < ang)) goto outer_else; + if (!(ang < D_80186F9C)) goto inner_else; + if (ang < D_80186F98) { *(s16 *)L = D_80186F98; goto done; } + if (D_80186F9A < ang) { *(s16 *)L = D_80186F9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186F94) { *(s16 *)L = D_80186F94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80186F9E < ang) { *(s16 *)L = D_80186F9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084", func_8013B568); diff --git a/src/ov_SC01_084/ov_SC01_084_after.c b/src/ov_SC01_084/ov_SC01_084_after.c index c01076ea2..79b1959cf 100644 --- a/src/ov_SC01_084/ov_SC01_084_after.c +++ b/src/ov_SC01_084/ov_SC01_084_after.c @@ -4393,7 +4393,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189788[]; +extern u8 D_8018979C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189788; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018979C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_000/ov_SC02_000.c b/src/ov_SC02_000/ov_SC02_000.c index bfdd94744..12ca6e327 100644 --- a/src/ov_SC02_000/ov_SC02_000.c +++ b/src/ov_SC02_000/ov_SC02_000.c @@ -1110,7 +1110,175 @@ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80130C08); INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AFDC[]; +extern s16 D_8018B00C[]; +extern s16 D_8018B06C[]; +extern s16 D_8018B074[]; +extern s16 D_8018B094[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B00C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B06C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B074; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B094; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018AFDC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_80131170); @@ -1639,7 +1807,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B346 < ang)) goto outer_else; + if (!(ang < D_8018B34C)) goto inner_else; + if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } + if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000", func_8013B568); diff --git a/src/ov_SC02_000/ov_SC02_000_after.c b/src/ov_SC02_000/ov_SC02_000_after.c index 944af8a97..aac9bc5d5 100644 --- a/src/ov_SC02_000/ov_SC02_000_after.c +++ b/src/ov_SC02_000/ov_SC02_000_after.c @@ -4379,7 +4379,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018DB38[]; +extern u8 D_8018DB4C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018DB38; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018DB4C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_003/ov_SC02_003.c b/src/ov_SC02_003/ov_SC02_003.c index e5cb6cffc..eafffb6b0 100644 --- a/src/ov_SC02_003/ov_SC02_003.c +++ b/src/ov_SC02_003/ov_SC02_003.c @@ -1110,7 +1110,175 @@ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80130C08); INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AFDC[]; +extern s16 D_8018B00C[]; +extern s16 D_8018B06C[]; +extern s16 D_8018B074[]; +extern s16 D_8018B094[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B00C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B06C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B074; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B094; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018AFDC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_80131170); @@ -1639,7 +1807,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B346 < ang)) goto outer_else; + if (!(ang < D_8018B34C)) goto inner_else; + if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } + if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003", func_8013B568); diff --git a/src/ov_SC02_003/ov_SC02_003_after.c b/src/ov_SC02_003/ov_SC02_003_after.c index fd165dae1..d24543b94 100644 --- a/src/ov_SC02_003/ov_SC02_003_after.c +++ b/src/ov_SC02_003/ov_SC02_003_after.c @@ -4379,7 +4379,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018DB38[]; +extern u8 D_8018DB4C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018DB38; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018DB4C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_004/ov_SC02_004.c b/src/ov_SC02_004/ov_SC02_004.c index 6e8ebf24c..07e1249df 100644 --- a/src/ov_SC02_004/ov_SC02_004.c +++ b/src/ov_SC02_004/ov_SC02_004.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_80130C08); INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E0BC[]; +extern s16 D_8017E0EC[]; +extern s16 D_8017E14C[]; +extern s16 D_8017E154[]; +extern s16 D_8017E174[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E0EC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E14C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E154; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E174; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E0BC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E424, D_8017E426, D_8017E428, D_8017E42A, D_8017E42C, D_8017E42E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E426 < ang)) goto outer_else; + if (!(ang < D_8017E42C)) goto inner_else; + if (ang < D_8017E428) { *(s16 *)L = D_8017E428; goto done; } + if (D_8017E42A < ang) { *(s16 *)L = D_8017E42A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E424) { *(s16 *)L = D_8017E424; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E42E < ang) { *(s16 *)L = D_8017E42E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004", func_8013B568); diff --git a/src/ov_SC02_004/ov_SC02_004_after.c b/src/ov_SC02_004/ov_SC02_004_after.c index 76beca43e..72d2c3b19 100644 --- a/src/ov_SC02_004/ov_SC02_004_after.c +++ b/src/ov_SC02_004/ov_SC02_004_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80180C18[]; +extern u8 D_80180C2C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80180C18; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80180C2C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_005/ov_SC02_005.c b/src/ov_SC02_005/ov_SC02_005.c index f7fd11078..cca06e7f5 100644 --- a/src/ov_SC02_005/ov_SC02_005.c +++ b/src/ov_SC02_005/ov_SC02_005.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_80130C08); INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80190CC0[]; +extern s16 D_80190CF0[]; +extern s16 D_80190D50[]; +extern s16 D_80190D58[]; +extern s16 D_80190D78[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80190CF0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80190D50; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80190D58; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80190D78; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80190CC0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80191028, D_8019102A, D_8019102C, D_8019102E, D_80191030, D_80191032; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8019102A < ang)) goto outer_else; + if (!(ang < D_80191030)) goto inner_else; + if (ang < D_8019102C) { *(s16 *)L = D_8019102C; goto done; } + if (D_8019102E < ang) { *(s16 *)L = D_8019102E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191028) { *(s16 *)L = D_80191028; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191032 < ang) { *(s16 *)L = D_80191032; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005", func_8013B568); diff --git a/src/ov_SC02_005/ov_SC02_005_after.c b/src/ov_SC02_005/ov_SC02_005_after.c index 1870b0aa5..d448033a5 100644 --- a/src/ov_SC02_005/ov_SC02_005_after.c +++ b/src/ov_SC02_005/ov_SC02_005_after.c @@ -4413,7 +4413,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8019381C[]; +extern u8 D_80193830[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8019381C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80193830; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_011/ov_SC02_011.c b/src/ov_SC02_011/ov_SC02_011.c index 9a030526a..8fb2390b5 100644 --- a/src/ov_SC02_011/ov_SC02_011.c +++ b/src/ov_SC02_011/ov_SC02_011.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_80130C08); INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80191110[]; +extern s16 D_80191140[]; +extern s16 D_801911A0[]; +extern s16 D_801911A8[]; +extern s16 D_801911C8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80191140; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801911A0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801911A8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801911C8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80191110; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80191478, D_8019147A, D_8019147C, D_8019147E, D_80191480, D_80191482; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8019147A < ang)) goto outer_else; + if (!(ang < D_80191480)) goto inner_else; + if (ang < D_8019147C) { *(s16 *)L = D_8019147C; goto done; } + if (D_8019147E < ang) { *(s16 *)L = D_8019147E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191478) { *(s16 *)L = D_80191478; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191482 < ang) { *(s16 *)L = D_80191482; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011", func_8013B568); diff --git a/src/ov_SC02_011/ov_SC02_011_after.c b/src/ov_SC02_011/ov_SC02_011_after.c index 98b711f37..7f836306e 100644 --- a/src/ov_SC02_011/ov_SC02_011_after.c +++ b/src/ov_SC02_011/ov_SC02_011_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80193C6C[]; +extern u8 D_80193C80[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80193C6C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80193C80; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_015/ov_SC02_015.c b/src/ov_SC02_015/ov_SC02_015.c index fe36f7c3a..596677aeb 100644 --- a/src/ov_SC02_015/ov_SC02_015.c +++ b/src/ov_SC02_015/ov_SC02_015.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_80130C08); INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E624[]; +extern s16 D_8017E654[]; +extern s16 D_8017E6B4[]; +extern s16 D_8017E6BC[]; +extern s16 D_8017E6DC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E654; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E6B4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E6BC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E6DC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E624; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E98C, D_8017E98E, D_8017E990, D_8017E992, D_8017E994, D_8017E996; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E98E < ang)) goto outer_else; + if (!(ang < D_8017E994)) goto inner_else; + if (ang < D_8017E990) { *(s16 *)L = D_8017E990; goto done; } + if (D_8017E992 < ang) { *(s16 *)L = D_8017E992; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E98C) { *(s16 *)L = D_8017E98C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E996 < ang) { *(s16 *)L = D_8017E996; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015", func_8013B568); diff --git a/src/ov_SC02_015/ov_SC02_015_after.c b/src/ov_SC02_015/ov_SC02_015_after.c index aa99a443d..a173d816f 100644 --- a/src/ov_SC02_015/ov_SC02_015_after.c +++ b/src/ov_SC02_015/ov_SC02_015_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181180[]; +extern u8 D_80181194[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181180; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181194; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_016/ov_SC02_016.c b/src/ov_SC02_016/ov_SC02_016.c index 9f676f6fd..21820811a 100644 --- a/src/ov_SC02_016/ov_SC02_016.c +++ b/src/ov_SC02_016/ov_SC02_016.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_80130C08); INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018485C[]; +extern s16 D_8018488C[]; +extern s16 D_801848EC[]; +extern s16 D_801848F4[]; +extern s16 D_80184914[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018488C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801848EC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801848F4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184914; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018485C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184BC4, D_80184BC6, D_80184BC8, D_80184BCA, D_80184BCC, D_80184BCE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184BC6 < ang)) goto outer_else; + if (!(ang < D_80184BCC)) goto inner_else; + if (ang < D_80184BC8) { *(s16 *)L = D_80184BC8; goto done; } + if (D_80184BCA < ang) { *(s16 *)L = D_80184BCA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184BC4) { *(s16 *)L = D_80184BC4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184BCE < ang) { *(s16 *)L = D_80184BCE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016", func_8013B568); diff --git a/src/ov_SC02_016/ov_SC02_016_after.c b/src/ov_SC02_016/ov_SC02_016_after.c index 70bb00e79..0ee35a43d 100644 --- a/src/ov_SC02_016/ov_SC02_016_after.c +++ b/src/ov_SC02_016/ov_SC02_016_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801873B8[]; +extern u8 D_801873CC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801873B8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801873CC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_017/ov_SC02_017.c b/src/ov_SC02_017/ov_SC02_017.c index 5f8516f4a..83edeb888 100644 --- a/src/ov_SC02_017/ov_SC02_017.c +++ b/src/ov_SC02_017/ov_SC02_017.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_80130C08); INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018A8B4[]; +extern s16 D_8018A8E4[]; +extern s16 D_8018A944[]; +extern s16 D_8018A94C[]; +extern s16 D_8018A96C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A8E4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018A944; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A94C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A96C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018A8B4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018AC1C, D_8018AC1E, D_8018AC20, D_8018AC22, D_8018AC24, D_8018AC26; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018AC1E < ang)) goto outer_else; + if (!(ang < D_8018AC24)) goto inner_else; + if (ang < D_8018AC20) { *(s16 *)L = D_8018AC20; goto done; } + if (D_8018AC22 < ang) { *(s16 *)L = D_8018AC22; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018AC1C) { *(s16 *)L = D_8018AC1C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018AC26 < ang) { *(s16 *)L = D_8018AC26; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017", func_8013B568); diff --git a/src/ov_SC02_017/ov_SC02_017_after.c b/src/ov_SC02_017/ov_SC02_017_after.c index 6b58d29c6..6ccdf65f2 100644 --- a/src/ov_SC02_017/ov_SC02_017_after.c +++ b/src/ov_SC02_017/ov_SC02_017_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018D410[]; +extern u8 D_8018D424[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018D410; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018D424; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_021/ov_SC02_021.c b/src/ov_SC02_021/ov_SC02_021.c index a6f9cb0b1..13fb6d7ae 100644 --- a/src/ov_SC02_021/ov_SC02_021.c +++ b/src/ov_SC02_021/ov_SC02_021.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_80130C08); INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FEA8[]; +extern s16 D_8017FED8[]; +extern s16 D_8017FF38[]; +extern s16 D_8017FF40[]; +extern s16 D_8017FF60[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FED8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017FF38; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FF40; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FF60; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017FEA8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180210, D_80180212, D_80180214, D_80180216, D_80180218, D_8018021A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180212 < ang)) goto outer_else; + if (!(ang < D_80180218)) goto inner_else; + if (ang < D_80180214) { *(s16 *)L = D_80180214; goto done; } + if (D_80180216 < ang) { *(s16 *)L = D_80180216; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180210) { *(s16 *)L = D_80180210; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018021A < ang) { *(s16 *)L = D_8018021A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021", func_8013B568); diff --git a/src/ov_SC02_021/ov_SC02_021_after.c b/src/ov_SC02_021/ov_SC02_021_after.c index e3539be8e..b43e3a5b9 100644 --- a/src/ov_SC02_021/ov_SC02_021_after.c +++ b/src/ov_SC02_021/ov_SC02_021_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182A04[]; +extern u8 D_80182A18[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182A04; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182A18; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_026/ov_SC02_026.c b/src/ov_SC02_026/ov_SC02_026.c index 41044cca0..13cb48be7 100644 --- a/src/ov_SC02_026/ov_SC02_026.c +++ b/src/ov_SC02_026/ov_SC02_026.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_80130C08); INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801864FC[]; +extern s16 D_8018652C[]; +extern s16 D_8018658C[]; +extern s16 D_80186594[]; +extern s16 D_801865B4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018652C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018658C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186594; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801865B4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801864FC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80186864, D_80186866, D_80186868, D_8018686A, D_8018686C, D_8018686E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186866 < ang)) goto outer_else; + if (!(ang < D_8018686C)) goto inner_else; + if (ang < D_80186868) { *(s16 *)L = D_80186868; goto done; } + if (D_8018686A < ang) { *(s16 *)L = D_8018686A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186864) { *(s16 *)L = D_80186864; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018686E < ang) { *(s16 *)L = D_8018686E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026", func_8013B568); diff --git a/src/ov_SC02_026/ov_SC02_026_after.c b/src/ov_SC02_026/ov_SC02_026_after.c index 04cf6d408..421162313 100644 --- a/src/ov_SC02_026/ov_SC02_026_after.c +++ b/src/ov_SC02_026/ov_SC02_026_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189058[]; +extern u8 D_8018906C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189058; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018906C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_027/ov_SC02_027.c b/src/ov_SC02_027/ov_SC02_027.c index 18a131193..dd2585672 100644 --- a/src/ov_SC02_027/ov_SC02_027.c +++ b/src/ov_SC02_027/ov_SC02_027.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_80130C08); INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B620[]; +extern s16 D_8018B650[]; +extern s16 D_8018B6B0[]; +extern s16 D_8018B6B8[]; +extern s16 D_8018B6D8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B650; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B6B0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B6B8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B6D8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018B620; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018B988, D_8018B98A, D_8018B98C, D_8018B98E, D_8018B990, D_8018B992; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B98A < ang)) goto outer_else; + if (!(ang < D_8018B990)) goto inner_else; + if (ang < D_8018B98C) { *(s16 *)L = D_8018B98C; goto done; } + if (D_8018B98E < ang) { *(s16 *)L = D_8018B98E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B988) { *(s16 *)L = D_8018B988; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B992 < ang) { *(s16 *)L = D_8018B992; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027", func_8013B568); diff --git a/src/ov_SC02_027/ov_SC02_027_after.c b/src/ov_SC02_027/ov_SC02_027_after.c index 73632a63d..2d72e2ce2 100644 --- a/src/ov_SC02_027/ov_SC02_027_after.c +++ b/src/ov_SC02_027/ov_SC02_027_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E17C[]; +extern u8 D_8018E190[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E17C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E190; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_028/ov_SC02_028.c b/src/ov_SC02_028/ov_SC02_028.c index b011a0eb5..3024b45b6 100644 --- a/src/ov_SC02_028/ov_SC02_028.c +++ b/src/ov_SC02_028/ov_SC02_028.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_80130C08); INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B824[]; +extern s16 D_8018B854[]; +extern s16 D_8018B8B4[]; +extern s16 D_8018B8BC[]; +extern s16 D_8018B8DC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B854; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B8B4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B8BC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B8DC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018B824; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018BB8C, D_8018BB8E, D_8018BB90, D_8018BB92, D_8018BB94, D_8018BB96; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BB8E < ang)) goto outer_else; + if (!(ang < D_8018BB94)) goto inner_else; + if (ang < D_8018BB90) { *(s16 *)L = D_8018BB90; goto done; } + if (D_8018BB92 < ang) { *(s16 *)L = D_8018BB92; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BB8C) { *(s16 *)L = D_8018BB8C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BB96 < ang) { *(s16 *)L = D_8018BB96; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028", func_8013B568); diff --git a/src/ov_SC02_028/ov_SC02_028_after.c b/src/ov_SC02_028/ov_SC02_028_after.c index a86e6cabb..55940efb8 100644 --- a/src/ov_SC02_028/ov_SC02_028_after.c +++ b/src/ov_SC02_028/ov_SC02_028_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E380[]; +extern u8 D_8018E394[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E380; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E394; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_031/ov_SC02_031.c b/src/ov_SC02_031/ov_SC02_031.c index b771dc8cc..d9fd69b8b 100644 --- a/src/ov_SC02_031/ov_SC02_031.c +++ b/src/ov_SC02_031/ov_SC02_031.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_80130C08); INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185050[]; +extern s16 D_80185080[]; +extern s16 D_801850E0[]; +extern s16 D_801850E8[]; +extern s16 D_80185108[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185080; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801850E0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801850E8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185108; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185050; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801853B8, D_801853BA, D_801853BC, D_801853BE, D_801853C0, D_801853C2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801853BA < ang)) goto outer_else; + if (!(ang < D_801853C0)) goto inner_else; + if (ang < D_801853BC) { *(s16 *)L = D_801853BC; goto done; } + if (D_801853BE < ang) { *(s16 *)L = D_801853BE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801853B8) { *(s16 *)L = D_801853B8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801853C2 < ang) { *(s16 *)L = D_801853C2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031", func_8013B568); diff --git a/src/ov_SC02_031/ov_SC02_031_after.c b/src/ov_SC02_031/ov_SC02_031_after.c index 6c7491814..f1ff6c1ac 100644 --- a/src/ov_SC02_031/ov_SC02_031_after.c +++ b/src/ov_SC02_031/ov_SC02_031_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187BAC[]; +extern u8 D_80187BC0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187BAC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187BC0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_035/ov_SC02_035.c b/src/ov_SC02_035/ov_SC02_035.c index f7d36b47b..cb28b52d2 100644 --- a/src/ov_SC02_035/ov_SC02_035.c +++ b/src/ov_SC02_035/ov_SC02_035.c @@ -1116,7 +1116,175 @@ INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_80130C08); INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801848B0[]; +extern s16 D_801848E0[]; +extern s16 D_80184940[]; +extern s16 D_80184948[]; +extern s16 D_80184968[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801848E0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80184940; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184948; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184968; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801848B0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_80131170); @@ -1655,7 +1823,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184C18, D_80184C1A, D_80184C1C, D_80184C1E, D_80184C20, D_80184C22; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184C1A < ang)) goto outer_else; + if (!(ang < D_80184C20)) goto inner_else; + if (ang < D_80184C1C) { *(s16 *)L = D_80184C1C; goto done; } + if (D_80184C1E < ang) { *(s16 *)L = D_80184C1E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184C18) { *(s16 *)L = D_80184C18; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184C22 < ang) { *(s16 *)L = D_80184C22; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035", func_8013B568); diff --git a/src/ov_SC02_035/ov_SC02_035_after.c b/src/ov_SC02_035/ov_SC02_035_after.c index 870dbd512..0c732d207 100644 --- a/src/ov_SC02_035/ov_SC02_035_after.c +++ b/src/ov_SC02_035/ov_SC02_035_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018740C[]; +extern u8 D_80187420[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018740C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187420; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_039/ov_SC02_039.c b/src/ov_SC02_039/ov_SC02_039.c index e4fd19db3..d09499c12 100644 --- a/src/ov_SC02_039/ov_SC02_039.c +++ b/src/ov_SC02_039/ov_SC02_039.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_80130C08); INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F4DC[]; +extern s16 D_8017F50C[]; +extern s16 D_8017F56C[]; +extern s16 D_8017F574[]; +extern s16 D_8017F594[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F50C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F56C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F574; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F594; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F4DC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F844, D_8017F846, D_8017F848, D_8017F84A, D_8017F84C, D_8017F84E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F846 < ang)) goto outer_else; + if (!(ang < D_8017F84C)) goto inner_else; + if (ang < D_8017F848) { *(s16 *)L = D_8017F848; goto done; } + if (D_8017F84A < ang) { *(s16 *)L = D_8017F84A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F844) { *(s16 *)L = D_8017F844; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F84E < ang) { *(s16 *)L = D_8017F84E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039", func_8013B568); diff --git a/src/ov_SC02_039/ov_SC02_039_after.c b/src/ov_SC02_039/ov_SC02_039_after.c index 39f7c50dd..3c141742e 100644 --- a/src/ov_SC02_039/ov_SC02_039_after.c +++ b/src/ov_SC02_039/ov_SC02_039_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182038[]; +extern u8 D_8018204C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182038; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018204C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC02_041/ov_SC02_041.c b/src/ov_SC02_041/ov_SC02_041.c index 3f609d1d8..acf021d08 100644 --- a/src/ov_SC02_041/ov_SC02_041.c +++ b/src/ov_SC02_041/ov_SC02_041.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_80130C08); INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_80130D0C); -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801851AC[]; +extern s16 D_801851DC[]; +extern s16 D_8018523C[]; +extern s16 D_80185244[]; +extern s16 D_80185264[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801851DC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018523C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185244; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185264; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801851AC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185514, D_80185516, D_80185518, D_8018551A, D_8018551C, D_8018551E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185516 < ang)) goto outer_else; + if (!(ang < D_8018551C)) goto inner_else; + if (ang < D_80185518) { *(s16 *)L = D_80185518; goto done; } + if (D_8018551A < ang) { *(s16 *)L = D_8018551A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185514) { *(s16 *)L = D_80185514; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018551E < ang) { *(s16 *)L = D_8018551E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041", func_8013B568); diff --git a/src/ov_SC02_041/ov_SC02_041_after.c b/src/ov_SC02_041/ov_SC02_041_after.c index ea22d8294..30ec5863d 100644 --- a/src/ov_SC02_041/ov_SC02_041_after.c +++ b/src/ov_SC02_041/ov_SC02_041_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187D08[]; +extern u8 D_80187D1C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187D08; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187D1C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_001/ov_SC03_001.c b/src/ov_SC03_001/ov_SC03_001.c index 6fb3ae24a..8f90f0a8f 100644 --- a/src/ov_SC03_001/ov_SC03_001.c +++ b/src/ov_SC03_001/ov_SC03_001.c @@ -1110,7 +1110,175 @@ INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_80130C08); INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D8EC[]; +extern s16 D_8018D91C[]; +extern s16 D_8018D97C[]; +extern s16 D_8018D984[]; +extern s16 D_8018D9A4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D91C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018D97C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D984; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D9A4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018D8EC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_80131170); @@ -1639,7 +1807,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018DC54, D_8018DC56, D_8018DC58, D_8018DC5A, D_8018DC5C, D_8018DC5E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018DC56 < ang)) goto outer_else; + if (!(ang < D_8018DC5C)) goto inner_else; + if (ang < D_8018DC58) { *(s16 *)L = D_8018DC58; goto done; } + if (D_8018DC5A < ang) { *(s16 *)L = D_8018DC5A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018DC54) { *(s16 *)L = D_8018DC54; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018DC5E < ang) { *(s16 *)L = D_8018DC5E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001", func_8013B568); diff --git a/src/ov_SC03_001/ov_SC03_001_after.c b/src/ov_SC03_001/ov_SC03_001_after.c index da150d0c8..81107bdff 100644 --- a/src/ov_SC03_001/ov_SC03_001_after.c +++ b/src/ov_SC03_001/ov_SC03_001_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80190448[]; +extern u8 D_8019045C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80190448; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8019045C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_002/ov_SC03_002.c b/src/ov_SC03_002/ov_SC03_002.c index face7e3b7..b2d2a8114 100644 --- a/src/ov_SC03_002/ov_SC03_002.c +++ b/src/ov_SC03_002/ov_SC03_002.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_80130C08); INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801858DC[]; +extern s16 D_8018590C[]; +extern s16 D_8018596C[]; +extern s16 D_80185974[]; +extern s16 D_80185994[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018590C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018596C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185974; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185994; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801858DC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185C44, D_80185C46, D_80185C48, D_80185C4A, D_80185C4C, D_80185C4E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185C46 < ang)) goto outer_else; + if (!(ang < D_80185C4C)) goto inner_else; + if (ang < D_80185C48) { *(s16 *)L = D_80185C48; goto done; } + if (D_80185C4A < ang) { *(s16 *)L = D_80185C4A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185C44) { *(s16 *)L = D_80185C44; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185C4E < ang) { *(s16 *)L = D_80185C4E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002", func_8013B568); diff --git a/src/ov_SC03_002/ov_SC03_002_after.c b/src/ov_SC03_002/ov_SC03_002_after.c index 402cc5503..738d768be 100644 --- a/src/ov_SC03_002/ov_SC03_002_after.c +++ b/src/ov_SC03_002/ov_SC03_002_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188438[]; +extern u8 D_8018844C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188438; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018844C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_003/ov_SC03_003.c b/src/ov_SC03_003/ov_SC03_003.c index 04294249b..02f620e0d 100644 --- a/src/ov_SC03_003/ov_SC03_003.c +++ b/src/ov_SC03_003/ov_SC03_003.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_80130C08); INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F6A4[]; +extern s16 D_8017F6D4[]; +extern s16 D_8017F734[]; +extern s16 D_8017F73C[]; +extern s16 D_8017F75C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F6D4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F734; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F73C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F75C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F6A4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017FA0C, D_8017FA0E, D_8017FA10, D_8017FA12, D_8017FA14, D_8017FA16; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FA0E < ang)) goto outer_else; + if (!(ang < D_8017FA14)) goto inner_else; + if (ang < D_8017FA10) { *(s16 *)L = D_8017FA10; goto done; } + if (D_8017FA12 < ang) { *(s16 *)L = D_8017FA12; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FA0C) { *(s16 *)L = D_8017FA0C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FA16 < ang) { *(s16 *)L = D_8017FA16; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003", func_8013B568); diff --git a/src/ov_SC03_003/ov_SC03_003_after.c b/src/ov_SC03_003/ov_SC03_003_after.c index 14ed5109a..df61a894b 100644 --- a/src/ov_SC03_003/ov_SC03_003_after.c +++ b/src/ov_SC03_003/ov_SC03_003_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182200[]; +extern u8 D_80182214[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182200; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182214; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_006/ov_SC03_006.c b/src/ov_SC03_006/ov_SC03_006.c index c214d0784..4b2538487 100644 --- a/src/ov_SC03_006/ov_SC03_006.c +++ b/src/ov_SC03_006/ov_SC03_006.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_80130C08); INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018C9C0[]; +extern s16 D_8018C9F0[]; +extern s16 D_8018CA50[]; +extern s16 D_8018CA58[]; +extern s16 D_8018CA78[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018C9F0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018CA50; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CA58; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CA78; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018C9C0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018CD28, D_8018CD2A, D_8018CD2C, D_8018CD2E, D_8018CD30, D_8018CD32; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018CD2A < ang)) goto outer_else; + if (!(ang < D_8018CD30)) goto inner_else; + if (ang < D_8018CD2C) { *(s16 *)L = D_8018CD2C; goto done; } + if (D_8018CD2E < ang) { *(s16 *)L = D_8018CD2E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018CD28) { *(s16 *)L = D_8018CD28; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018CD32 < ang) { *(s16 *)L = D_8018CD32; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006", func_8013B568); diff --git a/src/ov_SC03_006/ov_SC03_006_after.c b/src/ov_SC03_006/ov_SC03_006_after.c index dbbc2904c..c5dbd705b 100644 --- a/src/ov_SC03_006/ov_SC03_006_after.c +++ b/src/ov_SC03_006/ov_SC03_006_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018F51C[]; +extern u8 D_8018F530[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018F51C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018F530; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_007/ov_SC03_007.c b/src/ov_SC03_007/ov_SC03_007.c index 86bee0eab..9b1734b4c 100644 --- a/src/ov_SC03_007/ov_SC03_007.c +++ b/src/ov_SC03_007/ov_SC03_007.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_80130C08); INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801877B8[]; +extern s16 D_801877E8[]; +extern s16 D_80187848[]; +extern s16 D_80187850[]; +extern s16 D_80187870[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801877E8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80187848; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187850; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187870; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801877B8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80187B20, D_80187B22, D_80187B24, D_80187B26, D_80187B28, D_80187B2A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187B22 < ang)) goto outer_else; + if (!(ang < D_80187B28)) goto inner_else; + if (ang < D_80187B24) { *(s16 *)L = D_80187B24; goto done; } + if (D_80187B26 < ang) { *(s16 *)L = D_80187B26; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187B20) { *(s16 *)L = D_80187B20; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187B2A < ang) { *(s16 *)L = D_80187B2A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007", func_8013B568); diff --git a/src/ov_SC03_007/ov_SC03_007_after.c b/src/ov_SC03_007/ov_SC03_007_after.c index 80cdc2fc4..85e178c5f 100644 --- a/src/ov_SC03_007/ov_SC03_007_after.c +++ b/src/ov_SC03_007/ov_SC03_007_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018A314[]; +extern u8 D_8018A328[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018A314; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018A328; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_010/ov_SC03_010.c b/src/ov_SC03_010/ov_SC03_010.c index 71114d028..ed43b0973 100644 --- a/src/ov_SC03_010/ov_SC03_010.c +++ b/src/ov_SC03_010/ov_SC03_010.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_80130C08); INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801802D8[]; +extern s16 D_80180308[]; +extern s16 D_80180368[]; +extern s16 D_80180370[]; +extern s16 D_80180390[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180308; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80180368; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180370; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180390; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801802D8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180640, D_80180642, D_80180644, D_80180646, D_80180648, D_8018064A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180642 < ang)) goto outer_else; + if (!(ang < D_80180648)) goto inner_else; + if (ang < D_80180644) { *(s16 *)L = D_80180644; goto done; } + if (D_80180646 < ang) { *(s16 *)L = D_80180646; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180640) { *(s16 *)L = D_80180640; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018064A < ang) { *(s16 *)L = D_8018064A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010", func_8013B568); diff --git a/src/ov_SC03_010/ov_SC03_010_after.c b/src/ov_SC03_010/ov_SC03_010_after.c index 7f94be896..4efe47845 100644 --- a/src/ov_SC03_010/ov_SC03_010_after.c +++ b/src/ov_SC03_010/ov_SC03_010_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182E34[]; +extern u8 D_80182E48[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182E34; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182E48; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_011/ov_SC03_011.c b/src/ov_SC03_011/ov_SC03_011.c index b878ea5ae..40ee641df 100644 --- a/src/ov_SC03_011/ov_SC03_011.c +++ b/src/ov_SC03_011/ov_SC03_011.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130C08); INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181648[]; +extern s16 D_80181678[]; +extern s16 D_801816D8[]; +extern s16 D_801816E0[]; +extern s16 D_80181700[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181678; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801816D8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801816E0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181700; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181648; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801819B0, D_801819B2, D_801819B4, D_801819B6, D_801819B8, D_801819BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801819B2 < ang)) goto outer_else; + if (!(ang < D_801819B8)) goto inner_else; + if (ang < D_801819B4) { *(s16 *)L = D_801819B4; goto done; } + if (D_801819B6 < ang) { *(s16 *)L = D_801819B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801819B0) { *(s16 *)L = D_801819B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801819BA < ang) { *(s16 *)L = D_801819BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B568); diff --git a/src/ov_SC03_011/ov_SC03_011_after.c b/src/ov_SC03_011/ov_SC03_011_after.c index 27e55ae61..bf2b8b2d2 100644 --- a/src/ov_SC03_011/ov_SC03_011_after.c +++ b/src/ov_SC03_011/ov_SC03_011_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801841A4[]; +extern u8 D_801841B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801841A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801841B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_012/ov_SC03_012.c b/src/ov_SC03_012/ov_SC03_012.c index 474a94896..00a5e6175 100644 --- a/src/ov_SC03_012/ov_SC03_012.c +++ b/src/ov_SC03_012/ov_SC03_012.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_80130C08); INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E528[]; +extern s16 D_8017E558[]; +extern s16 D_8017E5B8[]; +extern s16 D_8017E5C0[]; +extern s16 D_8017E5E0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E558; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E5B8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E5C0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E5E0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E528; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E890, D_8017E892, D_8017E894, D_8017E896, D_8017E898, D_8017E89A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E892 < ang)) goto outer_else; + if (!(ang < D_8017E898)) goto inner_else; + if (ang < D_8017E894) { *(s16 *)L = D_8017E894; goto done; } + if (D_8017E896 < ang) { *(s16 *)L = D_8017E896; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E890) { *(s16 *)L = D_8017E890; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E89A < ang) { *(s16 *)L = D_8017E89A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012", func_8013B568); diff --git a/src/ov_SC03_012/ov_SC03_012_after.c b/src/ov_SC03_012/ov_SC03_012_after.c index 2a143f898..93c718159 100644 --- a/src/ov_SC03_012/ov_SC03_012_after.c +++ b/src/ov_SC03_012/ov_SC03_012_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181084[]; +extern u8 D_80181098[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181084; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181098; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_013/ov_SC03_013.c b/src/ov_SC03_013/ov_SC03_013.c index a9913007b..05082fce6 100644 --- a/src/ov_SC03_013/ov_SC03_013.c +++ b/src/ov_SC03_013/ov_SC03_013.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_80130C08); INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181310[]; +extern s16 D_80181340[]; +extern s16 D_801813A0[]; +extern s16 D_801813A8[]; +extern s16 D_801813C8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181340; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801813A0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801813A8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801813C8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181310; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80181678, D_8018167A, D_8018167C, D_8018167E, D_80181680, D_80181682; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018167A < ang)) goto outer_else; + if (!(ang < D_80181680)) goto inner_else; + if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } + if (D_8018167E < ang) { *(s16 *)L = D_8018167E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181678) { *(s16 *)L = D_80181678; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013", func_8013B568); diff --git a/src/ov_SC03_013/ov_SC03_013_after.c b/src/ov_SC03_013/ov_SC03_013_after.c index b2168f18c..7300c7722 100644 --- a/src/ov_SC03_013/ov_SC03_013_after.c +++ b/src/ov_SC03_013/ov_SC03_013_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80183E6C[]; +extern u8 D_80183E80[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80183E6C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80183E80; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_014/ov_SC03_014.c b/src/ov_SC03_014/ov_SC03_014.c index c5b0b7d84..99180bab2 100644 --- a/src/ov_SC03_014/ov_SC03_014.c +++ b/src/ov_SC03_014/ov_SC03_014.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_80130C08); INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B94C[]; +extern s16 D_8018B97C[]; +extern s16 D_8018B9DC[]; +extern s16 D_8018B9E4[]; +extern s16 D_8018BA04[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B97C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B9DC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B9E4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BA04; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018B94C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BCB6 < ang)) goto outer_else; + if (!(ang < D_8018BCBC)) goto inner_else; + if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } + if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014", func_8013B568); diff --git a/src/ov_SC03_014/ov_SC03_014_after.c b/src/ov_SC03_014/ov_SC03_014_after.c index 1ad9fd310..3facd3401 100644 --- a/src/ov_SC03_014/ov_SC03_014_after.c +++ b/src/ov_SC03_014/ov_SC03_014_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E4A8[]; +extern u8 D_8018E4BC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E4A8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E4BC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_015/ov_SC03_015.c b/src/ov_SC03_015/ov_SC03_015.c index 337f958a8..dbdd5ff8b 100644 --- a/src/ov_SC03_015/ov_SC03_015.c +++ b/src/ov_SC03_015/ov_SC03_015.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_80130C08); INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B94C[]; +extern s16 D_8018B97C[]; +extern s16 D_8018B9DC[]; +extern s16 D_8018B9E4[]; +extern s16 D_8018BA04[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B97C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B9DC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B9E4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BA04; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018B94C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BCB6 < ang)) goto outer_else; + if (!(ang < D_8018BCBC)) goto inner_else; + if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } + if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015", func_8013B568); diff --git a/src/ov_SC03_015/ov_SC03_015_after.c b/src/ov_SC03_015/ov_SC03_015_after.c index e1dcf157c..c37df5eeb 100644 --- a/src/ov_SC03_015/ov_SC03_015_after.c +++ b/src/ov_SC03_015/ov_SC03_015_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E4A8[]; +extern u8 D_8018E4BC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E4A8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E4BC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_023/ov_SC03_023.c b/src/ov_SC03_023/ov_SC03_023.c index 3a6216ac8..608af023c 100644 --- a/src/ov_SC03_023/ov_SC03_023.c +++ b/src/ov_SC03_023/ov_SC03_023.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_80130C08); INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F2C8[]; +extern s16 D_8017F2F8[]; +extern s16 D_8017F358[]; +extern s16 D_8017F360[]; +extern s16 D_8017F380[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F2F8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F358; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F360; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F380; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F2C8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F630, D_8017F632, D_8017F634, D_8017F636, D_8017F638, D_8017F63A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F632 < ang)) goto outer_else; + if (!(ang < D_8017F638)) goto inner_else; + if (ang < D_8017F634) { *(s16 *)L = D_8017F634; goto done; } + if (D_8017F636 < ang) { *(s16 *)L = D_8017F636; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F630) { *(s16 *)L = D_8017F630; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F63A < ang) { *(s16 *)L = D_8017F63A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023", func_8013B568); diff --git a/src/ov_SC03_023/ov_SC03_023_after.c b/src/ov_SC03_023/ov_SC03_023_after.c index f90430105..240ef2c35 100644 --- a/src/ov_SC03_023/ov_SC03_023_after.c +++ b/src/ov_SC03_023/ov_SC03_023_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181E24[]; +extern u8 D_80181E38[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181E24; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181E38; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_024/ov_SC03_024.c b/src/ov_SC03_024/ov_SC03_024.c index 866a278e2..87e3f7f5c 100644 --- a/src/ov_SC03_024/ov_SC03_024.c +++ b/src/ov_SC03_024/ov_SC03_024.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_80130C08); INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801872EC[]; +extern s16 D_8018731C[]; +extern s16 D_8018737C[]; +extern s16 D_80187384[]; +extern s16 D_801873A4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018731C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018737C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187384; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801873A4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801872EC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80187654, D_80187656, D_80187658, D_8018765A, D_8018765C, D_8018765E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187656 < ang)) goto outer_else; + if (!(ang < D_8018765C)) goto inner_else; + if (ang < D_80187658) { *(s16 *)L = D_80187658; goto done; } + if (D_8018765A < ang) { *(s16 *)L = D_8018765A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187654) { *(s16 *)L = D_80187654; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018765E < ang) { *(s16 *)L = D_8018765E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024", func_8013B568); diff --git a/src/ov_SC03_024/ov_SC03_024_after.c b/src/ov_SC03_024/ov_SC03_024_after.c index 7ab1a9f11..4399ec412 100644 --- a/src/ov_SC03_024/ov_SC03_024_after.c +++ b/src/ov_SC03_024/ov_SC03_024_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189E48[]; +extern u8 D_80189E5C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189E48; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80189E5C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_028/ov_SC03_028.c b/src/ov_SC03_028/ov_SC03_028.c index 4a9ad0186..b27ec900d 100644 --- a/src/ov_SC03_028/ov_SC03_028.c +++ b/src/ov_SC03_028/ov_SC03_028.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_80130C08); INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018BDB8[]; +extern s16 D_8018BDE8[]; +extern s16 D_8018BE48[]; +extern s16 D_8018BE50[]; +extern s16 D_8018BE70[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BDE8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018BE48; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BE50; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BE70; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018BDB8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018C120, D_8018C122, D_8018C124, D_8018C126, D_8018C128, D_8018C12A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018C122 < ang)) goto outer_else; + if (!(ang < D_8018C128)) goto inner_else; + if (ang < D_8018C124) { *(s16 *)L = D_8018C124; goto done; } + if (D_8018C126 < ang) { *(s16 *)L = D_8018C126; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018C120) { *(s16 *)L = D_8018C120; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018C12A < ang) { *(s16 *)L = D_8018C12A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028", func_8013B568); diff --git a/src/ov_SC03_028/ov_SC03_028_after.c b/src/ov_SC03_028/ov_SC03_028_after.c index 5b38ac4f6..a18452d5c 100644 --- a/src/ov_SC03_028/ov_SC03_028_after.c +++ b/src/ov_SC03_028/ov_SC03_028_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E914[]; +extern u8 D_8018E928[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E914; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E928; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_029/ov_SC03_029.c b/src/ov_SC03_029/ov_SC03_029.c index 19a7b7d33..69495a811 100644 --- a/src/ov_SC03_029/ov_SC03_029.c +++ b/src/ov_SC03_029/ov_SC03_029.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_80130C08); INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187BF0[]; +extern s16 D_80187C20[]; +extern s16 D_80187C80[]; +extern s16 D_80187C88[]; +extern s16 D_80187CA8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187C20; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80187C80; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187C88; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187CA8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80187BF0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80187F58, D_80187F5A, D_80187F5C, D_80187F5E, D_80187F60, D_80187F62; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187F5A < ang)) goto outer_else; + if (!(ang < D_80187F60)) goto inner_else; + if (ang < D_80187F5C) { *(s16 *)L = D_80187F5C; goto done; } + if (D_80187F5E < ang) { *(s16 *)L = D_80187F5E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187F58) { *(s16 *)L = D_80187F58; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187F62 < ang) { *(s16 *)L = D_80187F62; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029", func_8013B568); diff --git a/src/ov_SC03_029/ov_SC03_029_after.c b/src/ov_SC03_029/ov_SC03_029_after.c index c9000454e..e0d2d7dbc 100644 --- a/src/ov_SC03_029/ov_SC03_029_after.c +++ b/src/ov_SC03_029/ov_SC03_029_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018A74C[]; +extern u8 D_8018A760[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018A74C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018A760; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_030/ov_SC03_030.c b/src/ov_SC03_030/ov_SC03_030.c index b7aa2ea01..54549d03d 100644 --- a/src/ov_SC03_030/ov_SC03_030.c +++ b/src/ov_SC03_030/ov_SC03_030.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130C08); INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018222C[]; +extern s16 D_8018225C[]; +extern s16 D_801822BC[]; +extern s16 D_801822C4[]; +extern s16 D_801822E4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018225C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801822BC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822C4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822E4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018222C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182594, D_80182596, D_80182598, D_8018259A, D_8018259C, D_8018259E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182596 < ang)) goto outer_else; + if (!(ang < D_8018259C)) goto inner_else; + if (ang < D_80182598) { *(s16 *)L = D_80182598; goto done; } + if (D_8018259A < ang) { *(s16 *)L = D_8018259A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182594) { *(s16 *)L = D_80182594; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018259E < ang) { *(s16 *)L = D_8018259E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B568); diff --git a/src/ov_SC03_030/ov_SC03_030_after.c b/src/ov_SC03_030/ov_SC03_030_after.c index 764cdcdcf..cde809d09 100644 --- a/src/ov_SC03_030/ov_SC03_030_after.c +++ b/src/ov_SC03_030/ov_SC03_030_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80184D88[]; +extern u8 D_80184D9C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80184D88; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80184D9C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_031/ov_SC03_031.c b/src/ov_SC03_031/ov_SC03_031.c index 56a83dc0d..248c3eee0 100644 --- a/src/ov_SC03_031/ov_SC03_031.c +++ b/src/ov_SC03_031/ov_SC03_031.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_80130C08); INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182748[]; +extern s16 D_80182778[]; +extern s16 D_801827D8[]; +extern s16 D_801827E0[]; +extern s16 D_80182800[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182778; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801827D8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801827E0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182800; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182748; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182AB0, D_80182AB2, D_80182AB4, D_80182AB6, D_80182AB8, D_80182ABA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AB2 < ang)) goto outer_else; + if (!(ang < D_80182AB8)) goto inner_else; + if (ang < D_80182AB4) { *(s16 *)L = D_80182AB4; goto done; } + if (D_80182AB6 < ang) { *(s16 *)L = D_80182AB6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AB0) { *(s16 *)L = D_80182AB0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182ABA < ang) { *(s16 *)L = D_80182ABA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031", func_8013B568); diff --git a/src/ov_SC03_031/ov_SC03_031_after.c b/src/ov_SC03_031/ov_SC03_031_after.c index 9b4cfa649..bd243d0cb 100644 --- a/src/ov_SC03_031/ov_SC03_031_after.c +++ b/src/ov_SC03_031/ov_SC03_031_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801852A4[]; +extern u8 D_801852B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801852A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801852B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_089/ov_SC03_089.c b/src/ov_SC03_089/ov_SC03_089.c index 27b5df05e..5f44a1f51 100644 --- a/src/ov_SC03_089/ov_SC03_089.c +++ b/src/ov_SC03_089/ov_SC03_089.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_80130C08); INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189A44[]; +extern s16 D_80189A74[]; +extern s16 D_80189AD4[]; +extern s16 D_80189ADC[]; +extern s16 D_80189AFC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189A74; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80189AD4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189ADC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189AFC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80189A44; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80189DAC, D_80189DAE, D_80189DB0, D_80189DB2, D_80189DB4, D_80189DB6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80189DAE < ang)) goto outer_else; + if (!(ang < D_80189DB4)) goto inner_else; + if (ang < D_80189DB0) { *(s16 *)L = D_80189DB0; goto done; } + if (D_80189DB2 < ang) { *(s16 *)L = D_80189DB2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80189DAC) { *(s16 *)L = D_80189DAC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80189DB6 < ang) { *(s16 *)L = D_80189DB6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089", func_8013B568); diff --git a/src/ov_SC03_089/ov_SC03_089_after.c b/src/ov_SC03_089/ov_SC03_089_after.c index 91b863cab..76aca01a6 100644 --- a/src/ov_SC03_089/ov_SC03_089_after.c +++ b/src/ov_SC03_089/ov_SC03_089_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018C5A0[]; +extern u8 D_8018C5B4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018C5A0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018C5B4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_090/ov_SC03_090.c b/src/ov_SC03_090/ov_SC03_090.c index a6115d142..d54aab0fd 100644 --- a/src/ov_SC03_090/ov_SC03_090.c +++ b/src/ov_SC03_090/ov_SC03_090.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_80130C08); INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018BE68[]; +extern s16 D_8018BE98[]; +extern s16 D_8018BEF8[]; +extern s16 D_8018BF00[]; +extern s16 D_8018BF20[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BE98; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018BEF8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BF00; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018BF20; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018BE68; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018C1D0, D_8018C1D2, D_8018C1D4, D_8018C1D6, D_8018C1D8, D_8018C1DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018C1D2 < ang)) goto outer_else; + if (!(ang < D_8018C1D8)) goto inner_else; + if (ang < D_8018C1D4) { *(s16 *)L = D_8018C1D4; goto done; } + if (D_8018C1D6 < ang) { *(s16 *)L = D_8018C1D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018C1D0) { *(s16 *)L = D_8018C1D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018C1DA < ang) { *(s16 *)L = D_8018C1DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090", func_8013B568); diff --git a/src/ov_SC03_090/ov_SC03_090_after.c b/src/ov_SC03_090/ov_SC03_090_after.c index 08ec8cdd9..df0224a32 100644 --- a/src/ov_SC03_090/ov_SC03_090_after.c +++ b/src/ov_SC03_090/ov_SC03_090_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018E9C4[]; +extern u8 D_8018E9D8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018E9C4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018E9D8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_091/ov_SC03_091.c b/src/ov_SC03_091/ov_SC03_091.c index e84fc5118..e28930273 100644 --- a/src/ov_SC03_091/ov_SC03_091.c +++ b/src/ov_SC03_091/ov_SC03_091.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_80130C08); INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018CD10[]; +extern s16 D_8018CD40[]; +extern s16 D_8018CDA0[]; +extern s16 D_8018CDA8[]; +extern s16 D_8018CDC8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CD40; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018CDA0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CDA8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CDC8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018CD10; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018D078, D_8018D07A, D_8018D07C, D_8018D07E, D_8018D080, D_8018D082; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D07A < ang)) goto outer_else; + if (!(ang < D_8018D080)) goto inner_else; + if (ang < D_8018D07C) { *(s16 *)L = D_8018D07C; goto done; } + if (D_8018D07E < ang) { *(s16 *)L = D_8018D07E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D078) { *(s16 *)L = D_8018D078; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D082 < ang) { *(s16 *)L = D_8018D082; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091", func_8013B568); diff --git a/src/ov_SC03_091/ov_SC03_091_after.c b/src/ov_SC03_091/ov_SC03_091_after.c index eea01bd00..3b0b67fa2 100644 --- a/src/ov_SC03_091/ov_SC03_091_after.c +++ b/src/ov_SC03_091/ov_SC03_091_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018F86C[]; +extern u8 D_8018F880[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018F86C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018F880; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_092/ov_SC03_092.c b/src/ov_SC03_092/ov_SC03_092.c index eb30e0604..b3abbf498 100644 --- a/src/ov_SC03_092/ov_SC03_092.c +++ b/src/ov_SC03_092/ov_SC03_092.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_80130C08); INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801850E0[]; +extern s16 D_80185110[]; +extern s16 D_80185170[]; +extern s16 D_80185178[]; +extern s16 D_80185198[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185110; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185170; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185178; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185198; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801850E0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185448, D_8018544A, D_8018544C, D_8018544E, D_80185450, D_80185452; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018544A < ang)) goto outer_else; + if (!(ang < D_80185450)) goto inner_else; + if (ang < D_8018544C) { *(s16 *)L = D_8018544C; goto done; } + if (D_8018544E < ang) { *(s16 *)L = D_8018544E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185448) { *(s16 *)L = D_80185448; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185452 < ang) { *(s16 *)L = D_80185452; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092", func_8013B568); diff --git a/src/ov_SC03_092/ov_SC03_092_after.c b/src/ov_SC03_092/ov_SC03_092_after.c index 61c387986..42ac75655 100644 --- a/src/ov_SC03_092/ov_SC03_092_after.c +++ b/src/ov_SC03_092/ov_SC03_092_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187C3C[]; +extern u8 D_80187C50[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187C3C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187C50; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_093/ov_SC03_093.c b/src/ov_SC03_093/ov_SC03_093.c index 3b29f6edc..beff57e79 100644 --- a/src/ov_SC03_093/ov_SC03_093.c +++ b/src/ov_SC03_093/ov_SC03_093.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_80130C08); INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801862B8[]; +extern s16 D_801862E8[]; +extern s16 D_80186348[]; +extern s16 D_80186350[]; +extern s16 D_80186370[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801862E8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186348; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186350; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186370; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801862B8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80186620, D_80186622, D_80186624, D_80186626, D_80186628, D_8018662A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186622 < ang)) goto outer_else; + if (!(ang < D_80186628)) goto inner_else; + if (ang < D_80186624) { *(s16 *)L = D_80186624; goto done; } + if (D_80186626 < ang) { *(s16 *)L = D_80186626; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186620) { *(s16 *)L = D_80186620; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018662A < ang) { *(s16 *)L = D_8018662A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093", func_8013B568); diff --git a/src/ov_SC03_093/ov_SC03_093_after.c b/src/ov_SC03_093/ov_SC03_093_after.c index 5f3fb9123..3556e9dd5 100644 --- a/src/ov_SC03_093/ov_SC03_093_after.c +++ b/src/ov_SC03_093/ov_SC03_093_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188E14[]; +extern u8 D_80188E28[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188E14; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188E28; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_094/ov_SC03_094.c b/src/ov_SC03_094/ov_SC03_094.c index 425970110..5e9f993f1 100644 --- a/src/ov_SC03_094/ov_SC03_094.c +++ b/src/ov_SC03_094/ov_SC03_094.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_80130C08); INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187CB4[]; +extern s16 D_80187CE4[]; +extern s16 D_80187D44[]; +extern s16 D_80187D4C[]; +extern s16 D_80187D6C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187CE4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80187D44; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187D4C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187D6C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80187CB4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018801C, D_8018801E, D_80188020, D_80188022, D_80188024, D_80188026; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018801E < ang)) goto outer_else; + if (!(ang < D_80188024)) goto inner_else; + if (ang < D_80188020) { *(s16 *)L = D_80188020; goto done; } + if (D_80188022 < ang) { *(s16 *)L = D_80188022; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018801C) { *(s16 *)L = D_8018801C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188026 < ang) { *(s16 *)L = D_80188026; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094", func_8013B568); diff --git a/src/ov_SC03_094/ov_SC03_094_after.c b/src/ov_SC03_094/ov_SC03_094_after.c index 5342b5b49..683d05db1 100644 --- a/src/ov_SC03_094/ov_SC03_094_after.c +++ b/src/ov_SC03_094/ov_SC03_094_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018A810[]; +extern u8 D_8018A824[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018A810; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018A824; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_095/ov_SC03_095.c b/src/ov_SC03_095/ov_SC03_095.c index e7a0e010a..2b98bcab3 100644 --- a/src/ov_SC03_095/ov_SC03_095.c +++ b/src/ov_SC03_095/ov_SC03_095.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_80130C08); INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181314[]; +extern s16 D_80181344[]; +extern s16 D_801813A4[]; +extern s16 D_801813AC[]; +extern s16 D_801813CC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181344; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801813A4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801813AC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801813CC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181314; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018167C, D_8018167E, D_80181680, D_80181682, D_80181684, D_80181686; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018167E < ang)) goto outer_else; + if (!(ang < D_80181684)) goto inner_else; + if (ang < D_80181680) { *(s16 *)L = D_80181680; goto done; } + if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181686 < ang) { *(s16 *)L = D_80181686; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095", func_8013B568); diff --git a/src/ov_SC03_095/ov_SC03_095_after.c b/src/ov_SC03_095/ov_SC03_095_after.c index dcb869c2d..9c6923bc0 100644 --- a/src/ov_SC03_095/ov_SC03_095_after.c +++ b/src/ov_SC03_095/ov_SC03_095_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80183E70[]; +extern u8 D_80183E84[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80183E70; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80183E84; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_096/ov_SC03_096.c b/src/ov_SC03_096/ov_SC03_096.c index 4b3b0f1ad..57a1822dc 100644 --- a/src/ov_SC03_096/ov_SC03_096.c +++ b/src/ov_SC03_096/ov_SC03_096.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_80130C08); INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180E94[]; +extern s16 D_80180EC4[]; +extern s16 D_80180F24[]; +extern s16 D_80180F2C[]; +extern s16 D_80180F4C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180EC4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80180F24; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180F2C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180F4C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80180E94; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801811FC, D_801811FE, D_80181200, D_80181202, D_80181204, D_80181206; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801811FE < ang)) goto outer_else; + if (!(ang < D_80181204)) goto inner_else; + if (ang < D_80181200) { *(s16 *)L = D_80181200; goto done; } + if (D_80181202 < ang) { *(s16 *)L = D_80181202; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801811FC) { *(s16 *)L = D_801811FC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181206 < ang) { *(s16 *)L = D_80181206; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096", func_8013B568); diff --git a/src/ov_SC03_096/ov_SC03_096_after.c b/src/ov_SC03_096/ov_SC03_096_after.c index 05d14274d..36be7dc5c 100644 --- a/src/ov_SC03_096/ov_SC03_096_after.c +++ b/src/ov_SC03_096/ov_SC03_096_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801839F0[]; +extern u8 D_80183A04[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801839F0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80183A04; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_097/ov_SC03_097.c b/src/ov_SC03_097/ov_SC03_097.c index e0bf6e4be..f18815b14 100644 --- a/src/ov_SC03_097/ov_SC03_097.c +++ b/src/ov_SC03_097/ov_SC03_097.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_80130C08); INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186274[]; +extern s16 D_801862A4[]; +extern s16 D_80186304[]; +extern s16 D_8018630C[]; +extern s16 D_8018632C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801862A4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186304; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018630C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018632C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186274; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801865DC, D_801865DE, D_801865E0, D_801865E2, D_801865E4, D_801865E6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801865DE < ang)) goto outer_else; + if (!(ang < D_801865E4)) goto inner_else; + if (ang < D_801865E0) { *(s16 *)L = D_801865E0; goto done; } + if (D_801865E2 < ang) { *(s16 *)L = D_801865E2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801865DC) { *(s16 *)L = D_801865DC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801865E6 < ang) { *(s16 *)L = D_801865E6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097", func_8013B568); diff --git a/src/ov_SC03_097/ov_SC03_097_after.c b/src/ov_SC03_097/ov_SC03_097_after.c index 944058159..753c13118 100644 --- a/src/ov_SC03_097/ov_SC03_097_after.c +++ b/src/ov_SC03_097/ov_SC03_097_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188DD0[]; +extern u8 D_80188DE4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188DD0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188DE4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_098/ov_SC03_098.c b/src/ov_SC03_098/ov_SC03_098.c index f4b1d02c0..bc04f1c79 100644 --- a/src/ov_SC03_098/ov_SC03_098.c +++ b/src/ov_SC03_098/ov_SC03_098.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_80130C08); INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185700[]; +extern s16 D_80185730[]; +extern s16 D_80185790[]; +extern s16 D_80185798[]; +extern s16 D_801857B8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185730; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185790; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185798; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801857B8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185700; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185A68, D_80185A6A, D_80185A6C, D_80185A6E, D_80185A70, D_80185A72; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185A6A < ang)) goto outer_else; + if (!(ang < D_80185A70)) goto inner_else; + if (ang < D_80185A6C) { *(s16 *)L = D_80185A6C; goto done; } + if (D_80185A6E < ang) { *(s16 *)L = D_80185A6E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185A68) { *(s16 *)L = D_80185A68; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185A72 < ang) { *(s16 *)L = D_80185A72; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098", func_8013B568); diff --git a/src/ov_SC03_098/ov_SC03_098_after.c b/src/ov_SC03_098/ov_SC03_098_after.c index 4023e765a..71117d003 100644 --- a/src/ov_SC03_098/ov_SC03_098_after.c +++ b/src/ov_SC03_098/ov_SC03_098_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018825C[]; +extern u8 D_80188270[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018825C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188270; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_099/ov_SC03_099.c b/src/ov_SC03_099/ov_SC03_099.c index 5ffe0fd94..a2713ad1d 100644 --- a/src/ov_SC03_099/ov_SC03_099.c +++ b/src/ov_SC03_099/ov_SC03_099.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_80130C08); INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183800[]; +extern s16 D_80183830[]; +extern s16 D_80183890[]; +extern s16 D_80183898[]; +extern s16 D_801838B8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183830; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80183890; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183898; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801838B8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80183800; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80183B68, D_80183B6A, D_80183B6C, D_80183B6E, D_80183B70, D_80183B72; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183B6A < ang)) goto outer_else; + if (!(ang < D_80183B70)) goto inner_else; + if (ang < D_80183B6C) { *(s16 *)L = D_80183B6C; goto done; } + if (D_80183B6E < ang) { *(s16 *)L = D_80183B6E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183B68) { *(s16 *)L = D_80183B68; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183B72 < ang) { *(s16 *)L = D_80183B72; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099", func_8013B568); diff --git a/src/ov_SC03_099/ov_SC03_099_after.c b/src/ov_SC03_099/ov_SC03_099_after.c index dc58059ba..979d31bd2 100644 --- a/src/ov_SC03_099/ov_SC03_099_after.c +++ b/src/ov_SC03_099/ov_SC03_099_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018635C[]; +extern u8 D_80186370[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018635C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80186370; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_100/ov_SC03_100.c b/src/ov_SC03_100/ov_SC03_100.c index a447d221d..b83a633ab 100644 --- a/src/ov_SC03_100/ov_SC03_100.c +++ b/src/ov_SC03_100/ov_SC03_100.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_80130C08); INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184CCC[]; +extern s16 D_80184CFC[]; +extern s16 D_80184D5C[]; +extern s16 D_80184D64[]; +extern s16 D_80184D84[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184CFC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80184D5C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D64; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D84; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184CCC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185034, D_80185036, D_80185038, D_8018503A, D_8018503C, D_8018503E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185036 < ang)) goto outer_else; + if (!(ang < D_8018503C)) goto inner_else; + if (ang < D_80185038) { *(s16 *)L = D_80185038; goto done; } + if (D_8018503A < ang) { *(s16 *)L = D_8018503A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185034) { *(s16 *)L = D_80185034; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018503E < ang) { *(s16 *)L = D_8018503E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100", func_8013B568); diff --git a/src/ov_SC03_100/ov_SC03_100_after.c b/src/ov_SC03_100/ov_SC03_100_after.c index 0c6a84e61..e9228260a 100644 --- a/src/ov_SC03_100/ov_SC03_100_after.c +++ b/src/ov_SC03_100/ov_SC03_100_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187828[]; +extern u8 D_8018783C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187828; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018783C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_101/ov_SC03_101.c b/src/ov_SC03_101/ov_SC03_101.c index 9199bebef..d25269c4e 100644 --- a/src/ov_SC03_101/ov_SC03_101.c +++ b/src/ov_SC03_101/ov_SC03_101.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_80130C08); INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183CA8[]; +extern s16 D_80183CD8[]; +extern s16 D_80183D38[]; +extern s16 D_80183D40[]; +extern s16 D_80183D60[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183CD8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80183D38; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183D40; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183D60; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80183CA8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184010, D_80184012, D_80184014, D_80184016, D_80184018, D_8018401A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184012 < ang)) goto outer_else; + if (!(ang < D_80184018)) goto inner_else; + if (ang < D_80184014) { *(s16 *)L = D_80184014; goto done; } + if (D_80184016 < ang) { *(s16 *)L = D_80184016; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184010) { *(s16 *)L = D_80184010; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018401A < ang) { *(s16 *)L = D_8018401A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101", func_8013B568); diff --git a/src/ov_SC03_101/ov_SC03_101_after.c b/src/ov_SC03_101/ov_SC03_101_after.c index 0fa3b6632..eb11133ac 100644 --- a/src/ov_SC03_101/ov_SC03_101_after.c +++ b/src/ov_SC03_101/ov_SC03_101_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80186804[]; +extern u8 D_80186818[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80186804; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80186818; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_102/ov_SC03_102.c b/src/ov_SC03_102/ov_SC03_102.c index 78a1e7f23..dcc3e9503 100644 --- a/src/ov_SC03_102/ov_SC03_102.c +++ b/src/ov_SC03_102/ov_SC03_102.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_80130C08); INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186560[]; +extern s16 D_80186590[]; +extern s16 D_801865F0[]; +extern s16 D_801865F8[]; +extern s16 D_80186618[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186590; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801865F0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801865F8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186618; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186560; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801868C8, D_801868CA, D_801868CC, D_801868CE, D_801868D0, D_801868D2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801868CA < ang)) goto outer_else; + if (!(ang < D_801868D0)) goto inner_else; + if (ang < D_801868CC) { *(s16 *)L = D_801868CC; goto done; } + if (D_801868CE < ang) { *(s16 *)L = D_801868CE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801868C8) { *(s16 *)L = D_801868C8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801868D2 < ang) { *(s16 *)L = D_801868D2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102", func_8013B568); diff --git a/src/ov_SC03_102/ov_SC03_102_after.c b/src/ov_SC03_102/ov_SC03_102_after.c index 563289aeb..4323a484d 100644 --- a/src/ov_SC03_102/ov_SC03_102_after.c +++ b/src/ov_SC03_102/ov_SC03_102_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801890BC[]; +extern u8 D_801890D0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801890BC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801890D0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_103/ov_SC03_103.c b/src/ov_SC03_103/ov_SC03_103.c index 81e3cb7a6..cb5c2b08e 100644 --- a/src/ov_SC03_103/ov_SC03_103.c +++ b/src/ov_SC03_103/ov_SC03_103.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130C08); INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184510[]; +extern s16 D_80184540[]; +extern s16 D_801845A0[]; +extern s16 D_801845A8[]; +extern s16 D_801845C8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184540; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801845A0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845A8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845C8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184510; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184878, D_8018487A, D_8018487C, D_8018487E, D_80184880, D_80184882; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018487A < ang)) goto outer_else; + if (!(ang < D_80184880)) goto inner_else; + if (ang < D_8018487C) { *(s16 *)L = D_8018487C; goto done; } + if (D_8018487E < ang) { *(s16 *)L = D_8018487E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184878) { *(s16 *)L = D_80184878; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184882 < ang) { *(s16 *)L = D_80184882; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B568); diff --git a/src/ov_SC03_103/ov_SC03_103_after.c b/src/ov_SC03_103/ov_SC03_103_after.c index 43451747f..57da28e69 100644 --- a/src/ov_SC03_103/ov_SC03_103_after.c +++ b/src/ov_SC03_103/ov_SC03_103_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018706C[]; +extern u8 D_80187080[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018706C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187080; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_104/ov_SC03_104.c b/src/ov_SC03_104/ov_SC03_104.c index 73fc3bc50..7da451c7b 100644 --- a/src/ov_SC03_104/ov_SC03_104.c +++ b/src/ov_SC03_104/ov_SC03_104.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_80130C08); INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B0A0[]; +extern s16 D_8018B0D0[]; +extern s16 D_8018B130[]; +extern s16 D_8018B138[]; +extern s16 D_8018B158[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B0D0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B130; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B138; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B158; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018B0A0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018B408, D_8018B40A, D_8018B40C, D_8018B40E, D_8018B410, D_8018B412; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B40A < ang)) goto outer_else; + if (!(ang < D_8018B410)) goto inner_else; + if (ang < D_8018B40C) { *(s16 *)L = D_8018B40C; goto done; } + if (D_8018B40E < ang) { *(s16 *)L = D_8018B40E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B408) { *(s16 *)L = D_8018B408; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B412 < ang) { *(s16 *)L = D_8018B412; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104", func_8013B568); diff --git a/src/ov_SC03_104/ov_SC03_104_after.c b/src/ov_SC03_104/ov_SC03_104_after.c index 536bbe7bb..45f63b558 100644 --- a/src/ov_SC03_104/ov_SC03_104_after.c +++ b/src/ov_SC03_104/ov_SC03_104_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018DBFC[]; +extern u8 D_8018DC10[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018DBFC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018DC10; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_105/ov_SC03_105.c b/src/ov_SC03_105/ov_SC03_105.c index 538f8196c..f326fa000 100644 --- a/src/ov_SC03_105/ov_SC03_105.c +++ b/src/ov_SC03_105/ov_SC03_105.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_80130C08); INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018A728[]; +extern s16 D_8018A758[]; +extern s16 D_8018A7B8[]; +extern s16 D_8018A7C0[]; +extern s16 D_8018A7E0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A758; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018A7B8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A7C0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018A7E0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018A728; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018AA90, D_8018AA92, D_8018AA94, D_8018AA96, D_8018AA98, D_8018AA9A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018AA92 < ang)) goto outer_else; + if (!(ang < D_8018AA98)) goto inner_else; + if (ang < D_8018AA94) { *(s16 *)L = D_8018AA94; goto done; } + if (D_8018AA96 < ang) { *(s16 *)L = D_8018AA96; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018AA90) { *(s16 *)L = D_8018AA90; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018AA9A < ang) { *(s16 *)L = D_8018AA9A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105", func_8013B568); diff --git a/src/ov_SC03_105/ov_SC03_105_after.c b/src/ov_SC03_105/ov_SC03_105_after.c index 2e289b803..0ddc583eb 100644 --- a/src/ov_SC03_105/ov_SC03_105_after.c +++ b/src/ov_SC03_105/ov_SC03_105_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018D284[]; +extern u8 D_8018D298[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018D284; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018D298; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_108/ov_SC03_108.c b/src/ov_SC03_108/ov_SC03_108.c index 0569ded09..fc9cd56b1 100644 --- a/src/ov_SC03_108/ov_SC03_108.c +++ b/src/ov_SC03_108/ov_SC03_108.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_80130C08); INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181080[]; +extern s16 D_801810B0[]; +extern s16 D_80181110[]; +extern s16 D_80181118[]; +extern s16 D_80181138[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801810B0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80181110; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181118; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181138; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181080; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801813E8, D_801813EA, D_801813EC, D_801813EE, D_801813F0, D_801813F2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801813EA < ang)) goto outer_else; + if (!(ang < D_801813F0)) goto inner_else; + if (ang < D_801813EC) { *(s16 *)L = D_801813EC; goto done; } + if (D_801813EE < ang) { *(s16 *)L = D_801813EE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801813E8) { *(s16 *)L = D_801813E8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801813F2 < ang) { *(s16 *)L = D_801813F2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108", func_8013B568); diff --git a/src/ov_SC03_108/ov_SC03_108_after.c b/src/ov_SC03_108/ov_SC03_108_after.c index 29fb92112..bba7e9863 100644 --- a/src/ov_SC03_108/ov_SC03_108_after.c +++ b/src/ov_SC03_108/ov_SC03_108_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80183BDC[]; +extern u8 D_80183BF0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80183BDC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80183BF0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_109/ov_SC03_109.c b/src/ov_SC03_109/ov_SC03_109.c index b2fc71c74..9090fa321 100644 --- a/src/ov_SC03_109/ov_SC03_109.c +++ b/src/ov_SC03_109/ov_SC03_109.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_80130C08); INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E72C[]; +extern s16 D_8017E75C[]; +extern s16 D_8017E7BC[]; +extern s16 D_8017E7C4[]; +extern s16 D_8017E7E4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E75C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E7BC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E7C4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E7E4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E72C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017EA94, D_8017EA96, D_8017EA98, D_8017EA9A, D_8017EA9C, D_8017EA9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017EA96 < ang)) goto outer_else; + if (!(ang < D_8017EA9C)) goto inner_else; + if (ang < D_8017EA98) { *(s16 *)L = D_8017EA98; goto done; } + if (D_8017EA9A < ang) { *(s16 *)L = D_8017EA9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017EA94) { *(s16 *)L = D_8017EA94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017EA9E < ang) { *(s16 *)L = D_8017EA9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109", func_8013B568); diff --git a/src/ov_SC03_109/ov_SC03_109_after.c b/src/ov_SC03_109/ov_SC03_109_after.c index a0e395707..666f42e8f 100644 --- a/src/ov_SC03_109/ov_SC03_109_after.c +++ b/src/ov_SC03_109/ov_SC03_109_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181288[]; +extern u8 D_8018129C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181288; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018129C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_110/ov_SC03_110.c b/src/ov_SC03_110/ov_SC03_110.c index 3618ae0f0..04d6caaab 100644 --- a/src/ov_SC03_110/ov_SC03_110.c +++ b/src/ov_SC03_110/ov_SC03_110.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_80130C08); INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018214C[]; +extern s16 D_8018217C[]; +extern s16 D_801821DC[]; +extern s16 D_801821E4[]; +extern s16 D_80182204[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018217C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801821DC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801821E4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182204; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018214C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801824B4, D_801824B6, D_801824B8, D_801824BA, D_801824BC, D_801824BE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801824B6 < ang)) goto outer_else; + if (!(ang < D_801824BC)) goto inner_else; + if (ang < D_801824B8) { *(s16 *)L = D_801824B8; goto done; } + if (D_801824BA < ang) { *(s16 *)L = D_801824BA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801824B4) { *(s16 *)L = D_801824B4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801824BE < ang) { *(s16 *)L = D_801824BE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110", func_8013B568); diff --git a/src/ov_SC03_110/ov_SC03_110_after.c b/src/ov_SC03_110/ov_SC03_110_after.c index 5892069df..f9784dcff 100644 --- a/src/ov_SC03_110/ov_SC03_110_after.c +++ b/src/ov_SC03_110/ov_SC03_110_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80184CA8[]; +extern u8 D_80184CBC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80184CA8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80184CBC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_111/ov_SC03_111.c b/src/ov_SC03_111/ov_SC03_111.c index 2786845db..1753f3295 100644 --- a/src/ov_SC03_111/ov_SC03_111.c +++ b/src/ov_SC03_111/ov_SC03_111.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_80130C08); INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184D00[]; +extern s16 D_80184D30[]; +extern s16 D_80184D90[]; +extern s16 D_80184D98[]; +extern s16 D_80184DB8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D30; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80184D90; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D98; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184DB8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184D00; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185068, D_8018506A, D_8018506C, D_8018506E, D_80185070, D_80185072; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018506A < ang)) goto outer_else; + if (!(ang < D_80185070)) goto inner_else; + if (ang < D_8018506C) { *(s16 *)L = D_8018506C; goto done; } + if (D_8018506E < ang) { *(s16 *)L = D_8018506E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185068) { *(s16 *)L = D_80185068; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185072 < ang) { *(s16 *)L = D_80185072; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111", func_8013B568); diff --git a/src/ov_SC03_111/ov_SC03_111_after.c b/src/ov_SC03_111/ov_SC03_111_after.c index 53799617a..c375df468 100644 --- a/src/ov_SC03_111/ov_SC03_111_after.c +++ b/src/ov_SC03_111/ov_SC03_111_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018785C[]; +extern u8 D_80187870[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018785C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187870; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_112/ov_SC03_112.c b/src/ov_SC03_112/ov_SC03_112.c index 9a7965e8c..bc13892e8 100644 --- a/src/ov_SC03_112/ov_SC03_112.c +++ b/src/ov_SC03_112/ov_SC03_112.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_80130C08); INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185B08[]; +extern s16 D_80185B38[]; +extern s16 D_80185B98[]; +extern s16 D_80185BA0[]; +extern s16 D_80185BC0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185B38; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185B98; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185BA0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185BC0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185B08; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185E70, D_80185E72, D_80185E74, D_80185E76, D_80185E78, D_80185E7A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185E72 < ang)) goto outer_else; + if (!(ang < D_80185E78)) goto inner_else; + if (ang < D_80185E74) { *(s16 *)L = D_80185E74; goto done; } + if (D_80185E76 < ang) { *(s16 *)L = D_80185E76; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185E70) { *(s16 *)L = D_80185E70; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185E7A < ang) { *(s16 *)L = D_80185E7A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112", func_8013B568); diff --git a/src/ov_SC03_112/ov_SC03_112_after.c b/src/ov_SC03_112/ov_SC03_112_after.c index 7b00a5f25..c63d8cb49 100644 --- a/src/ov_SC03_112/ov_SC03_112_after.c +++ b/src/ov_SC03_112/ov_SC03_112_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188664[]; +extern u8 D_80188678[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188664; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188678; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_113/ov_SC03_113.c b/src/ov_SC03_113/ov_SC03_113.c index ed340188d..50a89c058 100644 --- a/src/ov_SC03_113/ov_SC03_113.c +++ b/src/ov_SC03_113/ov_SC03_113.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_80130C08); INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801831B8[]; +extern s16 D_801831E8[]; +extern s16 D_80183248[]; +extern s16 D_80183250[]; +extern s16 D_80183270[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801831E8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80183248; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183250; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183270; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801831B8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80183520, D_80183522, D_80183524, D_80183526, D_80183528, D_8018352A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183522 < ang)) goto outer_else; + if (!(ang < D_80183528)) goto inner_else; + if (ang < D_80183524) { *(s16 *)L = D_80183524; goto done; } + if (D_80183526 < ang) { *(s16 *)L = D_80183526; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183520) { *(s16 *)L = D_80183520; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018352A < ang) { *(s16 *)L = D_8018352A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113", func_8013B568); diff --git a/src/ov_SC03_113/ov_SC03_113_after.c b/src/ov_SC03_113/ov_SC03_113_after.c index bb2729566..6c5b5b42e 100644 --- a/src/ov_SC03_113/ov_SC03_113_after.c +++ b/src/ov_SC03_113/ov_SC03_113_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80185D14[]; +extern u8 D_80185D28[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80185D14; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185D28; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_114/ov_SC03_114.c b/src/ov_SC03_114/ov_SC03_114.c index 72369fce1..441b7ccc7 100644 --- a/src/ov_SC03_114/ov_SC03_114.c +++ b/src/ov_SC03_114/ov_SC03_114.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_80130C08); INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EE20[]; +extern s16 D_8017EE50[]; +extern s16 D_8017EEB0[]; +extern s16 D_8017EEB8[]; +extern s16 D_8017EED8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EE50; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EEB0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EEB8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EED8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EE20; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F188, D_8017F18A, D_8017F18C, D_8017F18E, D_8017F190, D_8017F192; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F18A < ang)) goto outer_else; + if (!(ang < D_8017F190)) goto inner_else; + if (ang < D_8017F18C) { *(s16 *)L = D_8017F18C; goto done; } + if (D_8017F18E < ang) { *(s16 *)L = D_8017F18E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F188) { *(s16 *)L = D_8017F188; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F192 < ang) { *(s16 *)L = D_8017F192; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114", func_8013B568); diff --git a/src/ov_SC03_114/ov_SC03_114_after.c b/src/ov_SC03_114/ov_SC03_114_after.c index 094e0d484..aa486ab12 100644 --- a/src/ov_SC03_114/ov_SC03_114_after.c +++ b/src/ov_SC03_114/ov_SC03_114_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018197C[]; +extern u8 D_80181990[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018197C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181990; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_115/ov_SC03_115.c b/src/ov_SC03_115/ov_SC03_115.c index a796c93de..031172a32 100644 --- a/src/ov_SC03_115/ov_SC03_115.c +++ b/src/ov_SC03_115/ov_SC03_115.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_80130C08); INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018088C[]; +extern s16 D_801808BC[]; +extern s16 D_8018091C[]; +extern s16 D_80180924[]; +extern s16 D_80180944[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801808BC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018091C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180924; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180944; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018088C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180BF4, D_80180BF6, D_80180BF8, D_80180BFA, D_80180BFC, D_80180BFE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180BF6 < ang)) goto outer_else; + if (!(ang < D_80180BFC)) goto inner_else; + if (ang < D_80180BF8) { *(s16 *)L = D_80180BF8; goto done; } + if (D_80180BFA < ang) { *(s16 *)L = D_80180BFA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180BF4) { *(s16 *)L = D_80180BF4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180BFE < ang) { *(s16 *)L = D_80180BFE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115", func_8013B568); diff --git a/src/ov_SC03_115/ov_SC03_115_after.c b/src/ov_SC03_115/ov_SC03_115_after.c index d1b0038e3..407f36448 100644 --- a/src/ov_SC03_115/ov_SC03_115_after.c +++ b/src/ov_SC03_115/ov_SC03_115_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801833E8[]; +extern u8 D_801833FC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801833E8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801833FC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_116/ov_SC03_116.c b/src/ov_SC03_116/ov_SC03_116.c index d943ad3e6..91c1e6fea 100644 --- a/src/ov_SC03_116/ov_SC03_116.c +++ b/src/ov_SC03_116/ov_SC03_116.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_80130C08); INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182C90[]; +extern s16 D_80182CC0[]; +extern s16 D_80182D20[]; +extern s16 D_80182D28[]; +extern s16 D_80182D48[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182CC0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182D20; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182D28; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182D48; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182C90; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182FF8, D_80182FFA, D_80182FFC, D_80182FFE, D_80183000, D_80183002; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182FFA < ang)) goto outer_else; + if (!(ang < D_80183000)) goto inner_else; + if (ang < D_80182FFC) { *(s16 *)L = D_80182FFC; goto done; } + if (D_80182FFE < ang) { *(s16 *)L = D_80182FFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182FF8) { *(s16 *)L = D_80182FF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183002 < ang) { *(s16 *)L = D_80183002; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116", func_8013B568); diff --git a/src/ov_SC03_116/ov_SC03_116_after.c b/src/ov_SC03_116/ov_SC03_116_after.c index 4f394738e..408963102 100644 --- a/src/ov_SC03_116/ov_SC03_116_after.c +++ b/src/ov_SC03_116/ov_SC03_116_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801857EC[]; +extern u8 D_80185800[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801857EC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185800; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_117/ov_SC03_117.c b/src/ov_SC03_117/ov_SC03_117.c index e64f0b83e..6bc1370fb 100644 --- a/src/ov_SC03_117/ov_SC03_117.c +++ b/src/ov_SC03_117/ov_SC03_117.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_80130C08); INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184C9C[]; +extern s16 D_80184CCC[]; +extern s16 D_80184D2C[]; +extern s16 D_80184D34[]; +extern s16 D_80184D54[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184CCC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80184D2C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D34; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184D54; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184C9C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185004, D_80185006, D_80185008, D_8018500A, D_8018500C, D_8018500E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185006 < ang)) goto outer_else; + if (!(ang < D_8018500C)) goto inner_else; + if (ang < D_80185008) { *(s16 *)L = D_80185008; goto done; } + if (D_8018500A < ang) { *(s16 *)L = D_8018500A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185004) { *(s16 *)L = D_80185004; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018500E < ang) { *(s16 *)L = D_8018500E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117", func_8013B568); diff --git a/src/ov_SC03_117/ov_SC03_117_after.c b/src/ov_SC03_117/ov_SC03_117_after.c index d919593a0..16554e72a 100644 --- a/src/ov_SC03_117/ov_SC03_117_after.c +++ b/src/ov_SC03_117/ov_SC03_117_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801877F8[]; +extern u8 D_8018780C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801877F8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018780C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_118/ov_SC03_118.c b/src/ov_SC03_118/ov_SC03_118.c index 2802568f2..13babceea 100644 --- a/src/ov_SC03_118/ov_SC03_118.c +++ b/src/ov_SC03_118/ov_SC03_118.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_80130C08); INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189D48[]; +extern s16 D_80189D78[]; +extern s16 D_80189DD8[]; +extern s16 D_80189DE0[]; +extern s16 D_80189E00[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189D78; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80189DD8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189DE0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189E00; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80189D48; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018A0B2 < ang)) goto outer_else; + if (!(ang < D_8018A0B8)) goto inner_else; + if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } + if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118", func_8013B568); diff --git a/src/ov_SC03_118/ov_SC03_118_after.c b/src/ov_SC03_118/ov_SC03_118_after.c index 1d3c1e19b..550c47d28 100644 --- a/src/ov_SC03_118/ov_SC03_118_after.c +++ b/src/ov_SC03_118/ov_SC03_118_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018C8A4[]; +extern u8 D_8018C8B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018C8A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018C8B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_119/ov_SC03_119.c b/src/ov_SC03_119/ov_SC03_119.c index cf956c978..24cc4506f 100644 --- a/src/ov_SC03_119/ov_SC03_119.c +++ b/src/ov_SC03_119/ov_SC03_119.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_80130C08); INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189D48[]; +extern s16 D_80189D78[]; +extern s16 D_80189DD8[]; +extern s16 D_80189DE0[]; +extern s16 D_80189E00[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189D78; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80189DD8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189DE0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80189E00; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80189D48; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018A0B2 < ang)) goto outer_else; + if (!(ang < D_8018A0B8)) goto inner_else; + if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } + if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119", func_8013B568); diff --git a/src/ov_SC03_119/ov_SC03_119_after.c b/src/ov_SC03_119/ov_SC03_119_after.c index 46d65371b..ecd4c0a09 100644 --- a/src/ov_SC03_119/ov_SC03_119_after.c +++ b/src/ov_SC03_119/ov_SC03_119_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018C8A4[]; +extern u8 D_8018C8B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018C8A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018C8B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_121/ov_SC03_121.c b/src/ov_SC03_121/ov_SC03_121.c index 1ca3bd2fc..9593b921a 100644 --- a/src/ov_SC03_121/ov_SC03_121.c +++ b/src/ov_SC03_121/ov_SC03_121.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_80130C08); INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182564[]; +extern s16 D_80182594[]; +extern s16 D_801825F4[]; +extern s16 D_801825FC[]; +extern s16 D_8018261C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182594; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801825F4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801825FC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018261C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182564; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801828CC, D_801828CE, D_801828D0, D_801828D2, D_801828D4, D_801828D6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801828CE < ang)) goto outer_else; + if (!(ang < D_801828D4)) goto inner_else; + if (ang < D_801828D0) { *(s16 *)L = D_801828D0; goto done; } + if (D_801828D2 < ang) { *(s16 *)L = D_801828D2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801828CC) { *(s16 *)L = D_801828CC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801828D6 < ang) { *(s16 *)L = D_801828D6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121", func_8013B568); diff --git a/src/ov_SC03_121/ov_SC03_121_after.c b/src/ov_SC03_121/ov_SC03_121_after.c index 95c56f9c4..71ba5dc9f 100644 --- a/src/ov_SC03_121/ov_SC03_121_after.c +++ b/src/ov_SC03_121/ov_SC03_121_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801850C0[]; +extern u8 D_801850D4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801850C0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801850D4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_124/ov_SC03_124.c b/src/ov_SC03_124/ov_SC03_124.c index 74911a02c..3f41b5a53 100644 --- a/src/ov_SC03_124/ov_SC03_124.c +++ b/src/ov_SC03_124/ov_SC03_124.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_80130C08); INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AF90[]; +extern s16 D_8018AFC0[]; +extern s16 D_8018B020[]; +extern s16 D_8018B028[]; +extern s16 D_8018B048[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018AFC0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018B020; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B028; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018B048; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018AF90; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018B2F8, D_8018B2FA, D_8018B2FC, D_8018B2FE, D_8018B300, D_8018B302; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B2FA < ang)) goto outer_else; + if (!(ang < D_8018B300)) goto inner_else; + if (ang < D_8018B2FC) { *(s16 *)L = D_8018B2FC; goto done; } + if (D_8018B2FE < ang) { *(s16 *)L = D_8018B2FE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B2F8) { *(s16 *)L = D_8018B2F8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B302 < ang) { *(s16 *)L = D_8018B302; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124", func_8013B568); diff --git a/src/ov_SC03_124/ov_SC03_124_after.c b/src/ov_SC03_124/ov_SC03_124_after.c index facb948b9..030571bda 100644 --- a/src/ov_SC03_124/ov_SC03_124_after.c +++ b/src/ov_SC03_124/ov_SC03_124_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018DAEC[]; +extern u8 D_8018DB00[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018DAEC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018DB00; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_125/ov_SC03_125.c b/src/ov_SC03_125/ov_SC03_125.c index 91650ed85..6638d96b0 100644 --- a/src/ov_SC03_125/ov_SC03_125.c +++ b/src/ov_SC03_125/ov_SC03_125.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_80130C08); INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184160[]; +extern s16 D_80184190[]; +extern s16 D_801841F0[]; +extern s16 D_801841F8[]; +extern s16 D_80184218[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184190; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801841F0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801841F8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184218; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184160; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801844C8, D_801844CA, D_801844CC, D_801844CE, D_801844D0, D_801844D2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801844CA < ang)) goto outer_else; + if (!(ang < D_801844D0)) goto inner_else; + if (ang < D_801844CC) { *(s16 *)L = D_801844CC; goto done; } + if (D_801844CE < ang) { *(s16 *)L = D_801844CE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801844C8) { *(s16 *)L = D_801844C8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801844D2 < ang) { *(s16 *)L = D_801844D2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125", func_8013B568); diff --git a/src/ov_SC03_125/ov_SC03_125_after.c b/src/ov_SC03_125/ov_SC03_125_after.c index ebfc19ca5..1a77fcf6c 100644 --- a/src/ov_SC03_125/ov_SC03_125_after.c +++ b/src/ov_SC03_125/ov_SC03_125_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80186CBC[]; +extern u8 D_80186CD0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80186CBC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80186CD0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC03_126/ov_SC03_126.c b/src/ov_SC03_126/ov_SC03_126.c index 3b1d4da28..d222ab5df 100644 --- a/src/ov_SC03_126/ov_SC03_126.c +++ b/src/ov_SC03_126/ov_SC03_126.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_80130C08); INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_80130D0C); -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F688; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F6E8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F6F0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F710; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F658; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126", func_8013B568); diff --git a/src/ov_SC03_126/ov_SC03_126_after.c b/src/ov_SC03_126/ov_SC03_126_after.c index f211140e7..bc16e9ca1 100644 --- a/src/ov_SC03_126/ov_SC03_126_after.c +++ b/src/ov_SC03_126/ov_SC03_126_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801821B4[]; +extern u8 D_801821C8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801821B4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801821C8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_000/ov_SC04_000.c b/src/ov_SC04_000/ov_SC04_000.c index cfd7705cf..9b8296f28 100644 --- a/src/ov_SC04_000/ov_SC04_000.c +++ b/src/ov_SC04_000/ov_SC04_000.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_80130C08); INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183664[]; +extern s16 D_80183694[]; +extern s16 D_801836F4[]; +extern s16 D_801836FC[]; +extern s16 D_8018371C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80183694; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801836F4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801836FC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018371C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80183664; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801839CC, D_801839CE, D_801839D0, D_801839D2, D_801839D4, D_801839D6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801839CE < ang)) goto outer_else; + if (!(ang < D_801839D4)) goto inner_else; + if (ang < D_801839D0) { *(s16 *)L = D_801839D0; goto done; } + if (D_801839D2 < ang) { *(s16 *)L = D_801839D2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801839CC) { *(s16 *)L = D_801839CC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801839D6 < ang) { *(s16 *)L = D_801839D6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000", func_8013B568); diff --git a/src/ov_SC04_000/ov_SC04_000_after.c b/src/ov_SC04_000/ov_SC04_000_after.c index d80fcf609..150b77c6c 100644 --- a/src/ov_SC04_000/ov_SC04_000_after.c +++ b/src/ov_SC04_000/ov_SC04_000_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801861C0[]; +extern u8 D_801861D4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801861C0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801861D4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_002/ov_SC04_002.c b/src/ov_SC04_002/ov_SC04_002.c index ce467b57a..da759bc45 100644 --- a/src/ov_SC04_002/ov_SC04_002.c +++ b/src/ov_SC04_002/ov_SC04_002.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_80130C08); INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801887D0[]; +extern s16 D_80188800[]; +extern s16 D_80188860[]; +extern s16 D_80188868[]; +extern s16 D_80188888[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188800; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80188860; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188868; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188888; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801887D0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80188B38, D_80188B3A, D_80188B3C, D_80188B3E, D_80188B40, D_80188B42; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80188B3A < ang)) goto outer_else; + if (!(ang < D_80188B40)) goto inner_else; + if (ang < D_80188B3C) { *(s16 *)L = D_80188B3C; goto done; } + if (D_80188B3E < ang) { *(s16 *)L = D_80188B3E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80188B38) { *(s16 *)L = D_80188B38; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188B42 < ang) { *(s16 *)L = D_80188B42; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002", func_8013B568); diff --git a/src/ov_SC04_002/ov_SC04_002_after.c b/src/ov_SC04_002/ov_SC04_002_after.c index f4bd9a66e..eb242d0e5 100644 --- a/src/ov_SC04_002/ov_SC04_002_after.c +++ b/src/ov_SC04_002/ov_SC04_002_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018B32C[]; +extern u8 D_8018B340[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018B32C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018B340; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_003/ov_SC04_003.c b/src/ov_SC04_003/ov_SC04_003.c index 64f50ec86..23ac270a3 100644 --- a/src/ov_SC04_003/ov_SC04_003.c +++ b/src/ov_SC04_003/ov_SC04_003.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_80130C08); INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018256C[]; +extern s16 D_8018259C[]; +extern s16 D_801825FC[]; +extern s16 D_80182604[]; +extern s16 D_80182624[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018259C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801825FC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182604; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182624; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018256C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801828D4, D_801828D6, D_801828D8, D_801828DA, D_801828DC, D_801828DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801828D6 < ang)) goto outer_else; + if (!(ang < D_801828DC)) goto inner_else; + if (ang < D_801828D8) { *(s16 *)L = D_801828D8; goto done; } + if (D_801828DA < ang) { *(s16 *)L = D_801828DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801828D4) { *(s16 *)L = D_801828D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801828DE < ang) { *(s16 *)L = D_801828DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003", func_8013B568); diff --git a/src/ov_SC04_003/ov_SC04_003_after.c b/src/ov_SC04_003/ov_SC04_003_after.c index ce2d8a598..c0de11e06 100644 --- a/src/ov_SC04_003/ov_SC04_003_after.c +++ b/src/ov_SC04_003/ov_SC04_003_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801850C8[]; +extern u8 D_801850DC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801850C8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801850DC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_004/ov_SC04_004.c b/src/ov_SC04_004/ov_SC04_004.c index cc0642edc..b82e775b4 100644 --- a/src/ov_SC04_004/ov_SC04_004.c +++ b/src/ov_SC04_004/ov_SC04_004.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_80130C08); INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184AA0[]; +extern s16 D_80184AD0[]; +extern s16 D_80184B30[]; +extern s16 D_80184B38[]; +extern s16 D_80184B58[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184AD0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80184B30; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184B38; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184B58; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184AA0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184E08, D_80184E0A, D_80184E0C, D_80184E0E, D_80184E10, D_80184E12; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184E0A < ang)) goto outer_else; + if (!(ang < D_80184E10)) goto inner_else; + if (ang < D_80184E0C) { *(s16 *)L = D_80184E0C; goto done; } + if (D_80184E0E < ang) { *(s16 *)L = D_80184E0E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184E08) { *(s16 *)L = D_80184E08; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184E12 < ang) { *(s16 *)L = D_80184E12; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004", func_8013B568); diff --git a/src/ov_SC04_004/ov_SC04_004_after.c b/src/ov_SC04_004/ov_SC04_004_after.c index 6d9e55c1b..c4d932c54 100644 --- a/src/ov_SC04_004/ov_SC04_004_after.c +++ b/src/ov_SC04_004/ov_SC04_004_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801875FC[]; +extern u8 D_80187610[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801875FC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187610; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_005/ov_SC04_005.c b/src/ov_SC04_005/ov_SC04_005.c index b2b128750..39ff5ab74 100644 --- a/src/ov_SC04_005/ov_SC04_005.c +++ b/src/ov_SC04_005/ov_SC04_005.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_80130C08); INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187ED4[]; +extern s16 D_80187F04[]; +extern s16 D_80187F64[]; +extern s16 D_80187F6C[]; +extern s16 D_80187F8C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187F04; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80187F64; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187F6C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80187F8C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80187ED4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018823C, D_8018823E, D_80188240, D_80188242, D_80188244, D_80188246; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018823E < ang)) goto outer_else; + if (!(ang < D_80188244)) goto inner_else; + if (ang < D_80188240) { *(s16 *)L = D_80188240; goto done; } + if (D_80188242 < ang) { *(s16 *)L = D_80188242; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018823C) { *(s16 *)L = D_8018823C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188246 < ang) { *(s16 *)L = D_80188246; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005", func_8013B568); diff --git a/src/ov_SC04_005/ov_SC04_005_after.c b/src/ov_SC04_005/ov_SC04_005_after.c index 2b32202fe..9c3879fb1 100644 --- a/src/ov_SC04_005/ov_SC04_005_after.c +++ b/src/ov_SC04_005/ov_SC04_005_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018AA30[]; +extern u8 D_8018AA44[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018AA30; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018AA44; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_006/ov_SC04_006.c b/src/ov_SC04_006/ov_SC04_006.c index 76a368d77..96256fcdd 100644 --- a/src/ov_SC04_006/ov_SC04_006.c +++ b/src/ov_SC04_006/ov_SC04_006.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_80130C08); INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FFB4[]; +extern s16 D_8017FFE4[]; +extern s16 D_80180044[]; +extern s16 D_8018004C[]; +extern s16 D_8018006C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017FFE4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80180044; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018004C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018006C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017FFB4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018031C, D_8018031E, D_80180320, D_80180322, D_80180324, D_80180326; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018031E < ang)) goto outer_else; + if (!(ang < D_80180324)) goto inner_else; + if (ang < D_80180320) { *(s16 *)L = D_80180320; goto done; } + if (D_80180322 < ang) { *(s16 *)L = D_80180322; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018031C) { *(s16 *)L = D_8018031C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180326 < ang) { *(s16 *)L = D_80180326; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006", func_8013B568); diff --git a/src/ov_SC04_006/ov_SC04_006_after.c b/src/ov_SC04_006/ov_SC04_006_after.c index 17c139503..f01f7e550 100644 --- a/src/ov_SC04_006/ov_SC04_006_after.c +++ b/src/ov_SC04_006/ov_SC04_006_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182B10[]; +extern u8 D_80182B24[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182B10; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182B24; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_007/ov_SC04_007.c b/src/ov_SC04_007/ov_SC04_007.c index 5b955c7f6..52085b295 100644 --- a/src/ov_SC04_007/ov_SC04_007.c +++ b/src/ov_SC04_007/ov_SC04_007.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_80130C08); INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185F6C[]; +extern s16 D_80185F9C[]; +extern s16 D_80185FFC[]; +extern s16 D_80186004[]; +extern s16 D_80186024[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185F9C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185FFC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186004; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186024; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185F6C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801862D4, D_801862D6, D_801862D8, D_801862DA, D_801862DC, D_801862DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801862D6 < ang)) goto outer_else; + if (!(ang < D_801862DC)) goto inner_else; + if (ang < D_801862D8) { *(s16 *)L = D_801862D8; goto done; } + if (D_801862DA < ang) { *(s16 *)L = D_801862DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801862D4) { *(s16 *)L = D_801862D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801862DE < ang) { *(s16 *)L = D_801862DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007", func_8013B568); diff --git a/src/ov_SC04_007/ov_SC04_007_after.c b/src/ov_SC04_007/ov_SC04_007_after.c index 7e6b2c044..39d1b97af 100644 --- a/src/ov_SC04_007/ov_SC04_007_after.c +++ b/src/ov_SC04_007/ov_SC04_007_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188AC8[]; +extern u8 D_80188ADC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188AC8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188ADC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_008/ov_SC04_008.c b/src/ov_SC04_008/ov_SC04_008.c index f68ca32d0..991f663b1 100644 --- a/src/ov_SC04_008/ov_SC04_008.c +++ b/src/ov_SC04_008/ov_SC04_008.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_80130C08); INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EEA4[]; +extern s16 D_8017EED4[]; +extern s16 D_8017EF34[]; +extern s16 D_8017EF3C[]; +extern s16 D_8017EF5C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EED4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EF34; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF3C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF5C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EEA4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F20E < ang)) goto outer_else; + if (!(ang < D_8017F214)) goto inner_else; + if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } + if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008", func_8013B568); diff --git a/src/ov_SC04_008/ov_SC04_008_after.c b/src/ov_SC04_008/ov_SC04_008_after.c index db627c3a2..65fdb3771 100644 --- a/src/ov_SC04_008/ov_SC04_008_after.c +++ b/src/ov_SC04_008/ov_SC04_008_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181A00[]; +extern u8 D_80181A14[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181A00; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181A14; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_009/ov_SC04_009.c b/src/ov_SC04_009/ov_SC04_009.c index eebbf66e5..8db942542 100644 --- a/src/ov_SC04_009/ov_SC04_009.c +++ b/src/ov_SC04_009/ov_SC04_009.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_80130C08); INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EED0[]; +extern s16 D_8017EF00[]; +extern s16 D_8017EF60[]; +extern s16 D_8017EF68[]; +extern s16 D_8017EF88[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF00; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EF60; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF68; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF88; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EED0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F238, D_8017F23A, D_8017F23C, D_8017F23E, D_8017F240, D_8017F242; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F23A < ang)) goto outer_else; + if (!(ang < D_8017F240)) goto inner_else; + if (ang < D_8017F23C) { *(s16 *)L = D_8017F23C; goto done; } + if (D_8017F23E < ang) { *(s16 *)L = D_8017F23E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F238) { *(s16 *)L = D_8017F238; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F242 < ang) { *(s16 *)L = D_8017F242; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009", func_8013B568); diff --git a/src/ov_SC04_009/ov_SC04_009_after.c b/src/ov_SC04_009/ov_SC04_009_after.c index b6901cc48..63d3895f5 100644 --- a/src/ov_SC04_009/ov_SC04_009_after.c +++ b/src/ov_SC04_009/ov_SC04_009_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181A2C[]; +extern u8 D_80181A40[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181A2C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181A40; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_010/ov_SC04_010.c b/src/ov_SC04_010/ov_SC04_010.c index 96802011c..0247609c1 100644 --- a/src/ov_SC04_010/ov_SC04_010.c +++ b/src/ov_SC04_010/ov_SC04_010.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_80130C08); INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E57C[]; +extern s16 D_8017E5AC[]; +extern s16 D_8017E60C[]; +extern s16 D_8017E614[]; +extern s16 D_8017E634[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E5AC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E60C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E614; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E634; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E57C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E8E4, D_8017E8E6, D_8017E8E8, D_8017E8EA, D_8017E8EC, D_8017E8EE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E8E6 < ang)) goto outer_else; + if (!(ang < D_8017E8EC)) goto inner_else; + if (ang < D_8017E8E8) { *(s16 *)L = D_8017E8E8; goto done; } + if (D_8017E8EA < ang) { *(s16 *)L = D_8017E8EA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E8E4) { *(s16 *)L = D_8017E8E4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E8EE < ang) { *(s16 *)L = D_8017E8EE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010", func_8013B568); diff --git a/src/ov_SC04_010/ov_SC04_010_after.c b/src/ov_SC04_010/ov_SC04_010_after.c index 4165ff025..ccc6d082f 100644 --- a/src/ov_SC04_010/ov_SC04_010_after.c +++ b/src/ov_SC04_010/ov_SC04_010_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801810D8[]; +extern u8 D_801810EC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801810D8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801810EC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_011/ov_SC04_011.c b/src/ov_SC04_011/ov_SC04_011.c index ff48db51a..134e3066a 100644 --- a/src/ov_SC04_011/ov_SC04_011.c +++ b/src/ov_SC04_011/ov_SC04_011.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_80130C08); INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8019080C[]; +extern s16 D_8019083C[]; +extern s16 D_8019089C[]; +extern s16 D_801908A4[]; +extern s16 D_801908C4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8019083C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8019089C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801908A4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801908C4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8019080C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80190B74, D_80190B76, D_80190B78, D_80190B7A, D_80190B7C, D_80190B7E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80190B76 < ang)) goto outer_else; + if (!(ang < D_80190B7C)) goto inner_else; + if (ang < D_80190B78) { *(s16 *)L = D_80190B78; goto done; } + if (D_80190B7A < ang) { *(s16 *)L = D_80190B7A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80190B74) { *(s16 *)L = D_80190B74; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80190B7E < ang) { *(s16 *)L = D_80190B7E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011", func_8013B568); diff --git a/src/ov_SC04_011/ov_SC04_011_after.c b/src/ov_SC04_011/ov_SC04_011_after.c index 2eac5e8f0..760cd9dbd 100644 --- a/src/ov_SC04_011/ov_SC04_011_after.c +++ b/src/ov_SC04_011/ov_SC04_011_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80193368[]; +extern u8 D_8019337C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80193368; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8019337C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_012/ov_SC04_012.c b/src/ov_SC04_012/ov_SC04_012.c index 01414ea0c..b8707f9dd 100644 --- a/src/ov_SC04_012/ov_SC04_012.c +++ b/src/ov_SC04_012/ov_SC04_012.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_80130C08); INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E9E0[]; +extern s16 D_8017EA10[]; +extern s16 D_8017EA70[]; +extern s16 D_8017EA78[]; +extern s16 D_8017EA98[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA10; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EA70; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA78; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EA98; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E9E0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017ED48, D_8017ED4A, D_8017ED4C, D_8017ED4E, D_8017ED50, D_8017ED52; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017ED4A < ang)) goto outer_else; + if (!(ang < D_8017ED50)) goto inner_else; + if (ang < D_8017ED4C) { *(s16 *)L = D_8017ED4C; goto done; } + if (D_8017ED4E < ang) { *(s16 *)L = D_8017ED4E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017ED48) { *(s16 *)L = D_8017ED48; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017ED52 < ang) { *(s16 *)L = D_8017ED52; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012", func_8013B568); diff --git a/src/ov_SC04_012/ov_SC04_012_after.c b/src/ov_SC04_012/ov_SC04_012_after.c index 8c81e9e0b..6510d6e48 100644 --- a/src/ov_SC04_012/ov_SC04_012_after.c +++ b/src/ov_SC04_012/ov_SC04_012_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018153C[]; +extern u8 D_80181550[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018153C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181550; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_015/ov_SC04_015.c b/src/ov_SC04_015/ov_SC04_015.c index 92f5eee10..88b2fd5bb 100644 --- a/src/ov_SC04_015/ov_SC04_015.c +++ b/src/ov_SC04_015/ov_SC04_015.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_80130C08); INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184918[]; +extern s16 D_80184948[]; +extern s16 D_801849A8[]; +extern s16 D_801849B0[]; +extern s16 D_801849D0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184948; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801849A8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801849B0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801849D0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184918; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80184C80, D_80184C82, D_80184C84, D_80184C86, D_80184C88, D_80184C8A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184C82 < ang)) goto outer_else; + if (!(ang < D_80184C88)) goto inner_else; + if (ang < D_80184C84) { *(s16 *)L = D_80184C84; goto done; } + if (D_80184C86 < ang) { *(s16 *)L = D_80184C86; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184C80) { *(s16 *)L = D_80184C80; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184C8A < ang) { *(s16 *)L = D_80184C8A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015", func_8013B568); diff --git a/src/ov_SC04_015/ov_SC04_015_after.c b/src/ov_SC04_015/ov_SC04_015_after.c index c65955f94..fdf18e533 100644 --- a/src/ov_SC04_015/ov_SC04_015_after.c +++ b/src/ov_SC04_015/ov_SC04_015_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187474[]; +extern u8 D_80187488[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187474; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187488; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_016/ov_SC04_016.c b/src/ov_SC04_016/ov_SC04_016.c index b6d92756f..6d5fffc16 100644 --- a/src/ov_SC04_016/ov_SC04_016.c +++ b/src/ov_SC04_016/ov_SC04_016.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_80130C08); INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801803DC[]; +extern s16 D_8018040C[]; +extern s16 D_8018046C[]; +extern s16 D_80180474[]; +extern s16 D_80180494[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018040C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018046C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180474; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180494; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801803DC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180744, D_80180746, D_80180748, D_8018074A, D_8018074C, D_8018074E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180746 < ang)) goto outer_else; + if (!(ang < D_8018074C)) goto inner_else; + if (ang < D_80180748) { *(s16 *)L = D_80180748; goto done; } + if (D_8018074A < ang) { *(s16 *)L = D_8018074A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180744) { *(s16 *)L = D_80180744; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018074E < ang) { *(s16 *)L = D_8018074E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016", func_8013B568); diff --git a/src/ov_SC04_016/ov_SC04_016_after.c b/src/ov_SC04_016/ov_SC04_016_after.c index 02b5bad66..65e5d8de2 100644 --- a/src/ov_SC04_016/ov_SC04_016_after.c +++ b/src/ov_SC04_016/ov_SC04_016_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182F38[]; +extern u8 D_80182F4C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182F38; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182F4C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_018/ov_SC04_018.c b/src/ov_SC04_018/ov_SC04_018.c index acbe283b7..d986c7a0a 100644 --- a/src/ov_SC04_018/ov_SC04_018.c +++ b/src/ov_SC04_018/ov_SC04_018.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_80130C08); INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5F4[]; +extern s16 D_8018D624[]; +extern s16 D_8018D684[]; +extern s16 D_8018D68C[]; +extern s16 D_8018D6AC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D624; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018D684; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D68C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D6AC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018D5F4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D95E < ang)) goto outer_else; + if (!(ang < D_8018D964)) goto inner_else; + if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } + if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018", func_8013B568); diff --git a/src/ov_SC04_018/ov_SC04_018_after.c b/src/ov_SC04_018/ov_SC04_018_after.c index b345bc2e1..f7db31ab4 100644 --- a/src/ov_SC04_018/ov_SC04_018_after.c +++ b/src/ov_SC04_018/ov_SC04_018_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80190150[]; +extern u8 D_80190164[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80190150; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80190164; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_019/ov_SC04_019.c b/src/ov_SC04_019/ov_SC04_019.c index 37ec42732..fb6855a93 100644 --- a/src/ov_SC04_019/ov_SC04_019.c +++ b/src/ov_SC04_019/ov_SC04_019.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_80130C08); INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5F4[]; +extern s16 D_8018D624[]; +extern s16 D_8018D684[]; +extern s16 D_8018D68C[]; +extern s16 D_8018D6AC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D624; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018D684; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D68C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D6AC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018D5F4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D95E < ang)) goto outer_else; + if (!(ang < D_8018D964)) goto inner_else; + if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } + if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019", func_8013B568); diff --git a/src/ov_SC04_019/ov_SC04_019_after.c b/src/ov_SC04_019/ov_SC04_019_after.c index 3a85f2c92..97d1671f1 100644 --- a/src/ov_SC04_019/ov_SC04_019_after.c +++ b/src/ov_SC04_019/ov_SC04_019_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80190150[]; +extern u8 D_80190164[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80190150; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80190164; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_020/ov_SC04_020.c b/src/ov_SC04_020/ov_SC04_020.c index 886b896fa..dde8bc4c9 100644 --- a/src/ov_SC04_020/ov_SC04_020.c +++ b/src/ov_SC04_020/ov_SC04_020.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_80130C08); INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018372C[]; +extern s16 D_8018375C[]; +extern s16 D_801837BC[]; +extern s16 D_801837C4[]; +extern s16 D_801837E4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018375C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801837BC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801837C4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801837E4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018372C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80183A94, D_80183A96, D_80183A98, D_80183A9A, D_80183A9C, D_80183A9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183A96 < ang)) goto outer_else; + if (!(ang < D_80183A9C)) goto inner_else; + if (ang < D_80183A98) { *(s16 *)L = D_80183A98; goto done; } + if (D_80183A9A < ang) { *(s16 *)L = D_80183A9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183A94) { *(s16 *)L = D_80183A94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183A9E < ang) { *(s16 *)L = D_80183A9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020", func_8013B568); diff --git a/src/ov_SC04_020/ov_SC04_020_after.c b/src/ov_SC04_020/ov_SC04_020_after.c index 02ede4f44..3b947cec5 100644 --- a/src/ov_SC04_020/ov_SC04_020_after.c +++ b/src/ov_SC04_020/ov_SC04_020_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80186288[]; +extern u8 D_8018629C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80186288; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018629C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC04_021/ov_SC04_021.c b/src/ov_SC04_021/ov_SC04_021.c index 7655d4a95..ed007901d 100644 --- a/src/ov_SC04_021/ov_SC04_021.c +++ b/src/ov_SC04_021/ov_SC04_021.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_80130C08); INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_80130D0C); -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F688; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F6E8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F6F0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F710; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F658; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021", func_8013B568); diff --git a/src/ov_SC04_021/ov_SC04_021_after.c b/src/ov_SC04_021/ov_SC04_021_after.c index 509c1d0f5..f82039f0d 100644 --- a/src/ov_SC04_021/ov_SC04_021_after.c +++ b/src/ov_SC04_021/ov_SC04_021_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801821B4[]; +extern u8 D_801821C8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801821B4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801821C8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_000/ov_SC05_000.c b/src/ov_SC05_000/ov_SC05_000.c index ad10bbd7e..289e95d3a 100644 --- a/src/ov_SC05_000/ov_SC05_000.c +++ b/src/ov_SC05_000/ov_SC05_000.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_80130C08); INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E66C[]; +extern s16 D_8017E69C[]; +extern s16 D_8017E6FC[]; +extern s16 D_8017E704[]; +extern s16 D_8017E724[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E69C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E6FC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E704; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E724; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E66C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E9D4, D_8017E9D6, D_8017E9D8, D_8017E9DA, D_8017E9DC, D_8017E9DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E9D6 < ang)) goto outer_else; + if (!(ang < D_8017E9DC)) goto inner_else; + if (ang < D_8017E9D8) { *(s16 *)L = D_8017E9D8; goto done; } + if (D_8017E9DA < ang) { *(s16 *)L = D_8017E9DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E9D4) { *(s16 *)L = D_8017E9D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E9DE < ang) { *(s16 *)L = D_8017E9DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000", func_8013B568); diff --git a/src/ov_SC05_000/ov_SC05_000_after.c b/src/ov_SC05_000/ov_SC05_000_after.c index 5a4957deb..dd198fab4 100644 --- a/src/ov_SC05_000/ov_SC05_000_after.c +++ b/src/ov_SC05_000/ov_SC05_000_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801811C8[]; +extern u8 D_801811DC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801811C8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801811DC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_001/ov_SC05_001.c b/src/ov_SC05_001/ov_SC05_001.c index c36f53756..585c73f18 100644 --- a/src/ov_SC05_001/ov_SC05_001.c +++ b/src/ov_SC05_001/ov_SC05_001.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_80130C08); INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185E48[]; +extern s16 D_80185E78[]; +extern s16 D_80185ED8[]; +extern s16 D_80185EE0[]; +extern s16 D_80185F00[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185E78; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185ED8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185EE0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185F00; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185E48; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801861B0, D_801861B2, D_801861B4, D_801861B6, D_801861B8, D_801861BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801861B2 < ang)) goto outer_else; + if (!(ang < D_801861B8)) goto inner_else; + if (ang < D_801861B4) { *(s16 *)L = D_801861B4; goto done; } + if (D_801861B6 < ang) { *(s16 *)L = D_801861B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801861B0) { *(s16 *)L = D_801861B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801861BA < ang) { *(s16 *)L = D_801861BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001", func_8013B568); diff --git a/src/ov_SC05_001/ov_SC05_001_after.c b/src/ov_SC05_001/ov_SC05_001_after.c index 0fb44cfb4..186f1753e 100644 --- a/src/ov_SC05_001/ov_SC05_001_after.c +++ b/src/ov_SC05_001/ov_SC05_001_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801889A4[]; +extern u8 D_801889B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801889A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801889B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_002/ov_SC05_002.c b/src/ov_SC05_002/ov_SC05_002.c index 7e9670500..b3a4c625e 100644 --- a/src/ov_SC05_002/ov_SC05_002.c +++ b/src/ov_SC05_002/ov_SC05_002.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_80130C08); INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180608[]; +extern s16 D_80180638[]; +extern s16 D_80180698[]; +extern s16 D_801806A0[]; +extern s16 D_801806C0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180638; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80180698; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801806A0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801806C0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80180608; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180970, D_80180972, D_80180974, D_80180976, D_80180978, D_8018097A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180972 < ang)) goto outer_else; + if (!(ang < D_80180978)) goto inner_else; + if (ang < D_80180974) { *(s16 *)L = D_80180974; goto done; } + if (D_80180976 < ang) { *(s16 *)L = D_80180976; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180970) { *(s16 *)L = D_80180970; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018097A < ang) { *(s16 *)L = D_8018097A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002", func_8013B568); diff --git a/src/ov_SC05_002/ov_SC05_002_after.c b/src/ov_SC05_002/ov_SC05_002_after.c index 75ae09eb9..305c90c67 100644 --- a/src/ov_SC05_002/ov_SC05_002_after.c +++ b/src/ov_SC05_002/ov_SC05_002_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80183164[]; +extern u8 D_80183178[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80183164; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80183178; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_003/ov_SC05_003.c b/src/ov_SC05_003/ov_SC05_003.c index 818950102..0a654bbed 100644 --- a/src/ov_SC05_003/ov_SC05_003.c +++ b/src/ov_SC05_003/ov_SC05_003.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_80130C08); INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182940[]; +extern s16 D_80182970[]; +extern s16 D_801829D0[]; +extern s16 D_801829D8[]; +extern s16 D_801829F8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182970; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801829D0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801829D8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801829F8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182940; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182CA8, D_80182CAA, D_80182CAC, D_80182CAE, D_80182CB0, D_80182CB2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182CAA < ang)) goto outer_else; + if (!(ang < D_80182CB0)) goto inner_else; + if (ang < D_80182CAC) { *(s16 *)L = D_80182CAC; goto done; } + if (D_80182CAE < ang) { *(s16 *)L = D_80182CAE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182CA8) { *(s16 *)L = D_80182CA8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182CB2 < ang) { *(s16 *)L = D_80182CB2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003", func_8013B568); diff --git a/src/ov_SC05_003/ov_SC05_003_after.c b/src/ov_SC05_003/ov_SC05_003_after.c index 9d8d893ed..f9356bc9c 100644 --- a/src/ov_SC05_003/ov_SC05_003_after.c +++ b/src/ov_SC05_003/ov_SC05_003_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018549C[]; +extern u8 D_801854B0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018549C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801854B0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_004/ov_SC05_004.c b/src/ov_SC05_004/ov_SC05_004.c index 10b98b673..0582ec8bc 100644 --- a/src/ov_SC05_004/ov_SC05_004.c +++ b/src/ov_SC05_004/ov_SC05_004.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130C08); INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181A4C[]; +extern s16 D_80181A7C[]; +extern s16 D_80181ADC[]; +extern s16 D_80181AE4[]; +extern s16 D_80181B04[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181A7C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80181ADC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181AE4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181B04; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181A4C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80181DB4, D_80181DB6, D_80181DB8, D_80181DBA, D_80181DBC, D_80181DBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80181DB6 < ang)) goto outer_else; + if (!(ang < D_80181DBC)) goto inner_else; + if (ang < D_80181DB8) { *(s16 *)L = D_80181DB8; goto done; } + if (D_80181DBA < ang) { *(s16 *)L = D_80181DBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181DB4) { *(s16 *)L = D_80181DB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181DBE < ang) { *(s16 *)L = D_80181DBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B568); diff --git a/src/ov_SC05_004/ov_SC05_004_after.c b/src/ov_SC05_004/ov_SC05_004_after.c index 783ce7d28..1d47df041 100644 --- a/src/ov_SC05_004/ov_SC05_004_after.c +++ b/src/ov_SC05_004/ov_SC05_004_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801845A8[]; +extern u8 D_801845BC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801845A8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801845BC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_005/ov_SC05_005.c b/src/ov_SC05_005/ov_SC05_005.c index d315beaee..069d4b758 100644 --- a/src/ov_SC05_005/ov_SC05_005.c +++ b/src/ov_SC05_005/ov_SC05_005.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_80130C08); INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182820[]; +extern s16 D_80182850[]; +extern s16 D_801828B0[]; +extern s16 D_801828B8[]; +extern s16 D_801828D8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182850; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801828B0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801828B8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801828D8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182820; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182B88, D_80182B8A, D_80182B8C, D_80182B8E, D_80182B90, D_80182B92; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182B8A < ang)) goto outer_else; + if (!(ang < D_80182B90)) goto inner_else; + if (ang < D_80182B8C) { *(s16 *)L = D_80182B8C; goto done; } + if (D_80182B8E < ang) { *(s16 *)L = D_80182B8E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182B88) { *(s16 *)L = D_80182B88; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B92 < ang) { *(s16 *)L = D_80182B92; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005", func_8013B568); diff --git a/src/ov_SC05_005/ov_SC05_005_after.c b/src/ov_SC05_005/ov_SC05_005_after.c index 5416413ea..778760377 100644 --- a/src/ov_SC05_005/ov_SC05_005_after.c +++ b/src/ov_SC05_005/ov_SC05_005_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018537C[]; +extern u8 D_80185390[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018537C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185390; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_006/ov_SC05_006.c b/src/ov_SC05_006/ov_SC05_006.c index 17444ac21..3cdb47447 100644 --- a/src/ov_SC05_006/ov_SC05_006.c +++ b/src/ov_SC05_006/ov_SC05_006.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_80130C08); INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F840[]; +extern s16 D_8017F870[]; +extern s16 D_8017F8D0[]; +extern s16 D_8017F8D8[]; +extern s16 D_8017F8F8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F870; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F8D0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F8D8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F8F8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F840; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017FBA8, D_8017FBAA, D_8017FBAC, D_8017FBAE, D_8017FBB0, D_8017FBB2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FBAA < ang)) goto outer_else; + if (!(ang < D_8017FBB0)) goto inner_else; + if (ang < D_8017FBAC) { *(s16 *)L = D_8017FBAC; goto done; } + if (D_8017FBAE < ang) { *(s16 *)L = D_8017FBAE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FBA8) { *(s16 *)L = D_8017FBA8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FBB2 < ang) { *(s16 *)L = D_8017FBB2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006", func_8013B568); diff --git a/src/ov_SC05_006/ov_SC05_006_after.c b/src/ov_SC05_006/ov_SC05_006_after.c index ac5033c16..2b5e78ac8 100644 --- a/src/ov_SC05_006/ov_SC05_006_after.c +++ b/src/ov_SC05_006/ov_SC05_006_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018239C[]; +extern u8 D_801823B0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018239C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801823B0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_007/ov_SC05_007.c b/src/ov_SC05_007/ov_SC05_007.c index b85bab3aa..6bf37c13f 100644 --- a/src/ov_SC05_007/ov_SC05_007.c +++ b/src/ov_SC05_007/ov_SC05_007.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_80130C08); INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180E3C[]; +extern s16 D_80180E6C[]; +extern s16 D_80180ECC[]; +extern s16 D_80180ED4[]; +extern s16 D_80180EF4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180E6C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80180ECC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180ED4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180EF4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80180E3C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801811A4, D_801811A6, D_801811A8, D_801811AA, D_801811AC, D_801811AE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801811A6 < ang)) goto outer_else; + if (!(ang < D_801811AC)) goto inner_else; + if (ang < D_801811A8) { *(s16 *)L = D_801811A8; goto done; } + if (D_801811AA < ang) { *(s16 *)L = D_801811AA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801811A4) { *(s16 *)L = D_801811A4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801811AE < ang) { *(s16 *)L = D_801811AE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007", func_8013B568); diff --git a/src/ov_SC05_007/ov_SC05_007_after.c b/src/ov_SC05_007/ov_SC05_007_after.c index 7be13f6d7..7698b798f 100644 --- a/src/ov_SC05_007/ov_SC05_007_after.c +++ b/src/ov_SC05_007/ov_SC05_007_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80183998[]; +extern u8 D_801839AC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80183998; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801839AC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_008/ov_SC05_008.c b/src/ov_SC05_008/ov_SC05_008.c index a71016f95..740351679 100644 --- a/src/ov_SC05_008/ov_SC05_008.c +++ b/src/ov_SC05_008/ov_SC05_008.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_80130C08); INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182D94[]; +extern s16 D_80182DC4[]; +extern s16 D_80182E24[]; +extern s16 D_80182E2C[]; +extern s16 D_80182E4C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182DC4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182E24; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182E2C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182E4C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182D94; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801830FC, D_801830FE, D_80183100, D_80183102, D_80183104, D_80183106; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801830FE < ang)) goto outer_else; + if (!(ang < D_80183104)) goto inner_else; + if (ang < D_80183100) { *(s16 *)L = D_80183100; goto done; } + if (D_80183102 < ang) { *(s16 *)L = D_80183102; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801830FC) { *(s16 *)L = D_801830FC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183106 < ang) { *(s16 *)L = D_80183106; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008", func_8013B568); diff --git a/src/ov_SC05_008/ov_SC05_008_after.c b/src/ov_SC05_008/ov_SC05_008_after.c index a0d71c09e..46967697a 100644 --- a/src/ov_SC05_008/ov_SC05_008_after.c +++ b/src/ov_SC05_008/ov_SC05_008_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801858F0[]; +extern u8 D_80185904[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801858F0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80185904; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_009/ov_SC05_009.c b/src/ov_SC05_009/ov_SC05_009.c index 92d14b65b..eb93bce72 100644 --- a/src/ov_SC05_009/ov_SC05_009.c +++ b/src/ov_SC05_009/ov_SC05_009.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_80130C08); INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EEA4[]; +extern s16 D_8017EED4[]; +extern s16 D_8017EF34[]; +extern s16 D_8017EF3C[]; +extern s16 D_8017EF5C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EED4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EF34; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF3C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF5C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EEA4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F20E < ang)) goto outer_else; + if (!(ang < D_8017F214)) goto inner_else; + if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } + if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009", func_8013B568); diff --git a/src/ov_SC05_009/ov_SC05_009_after.c b/src/ov_SC05_009/ov_SC05_009_after.c index 1d7abb4ec..0fcad3a76 100644 --- a/src/ov_SC05_009/ov_SC05_009_after.c +++ b/src/ov_SC05_009/ov_SC05_009_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181A00[]; +extern u8 D_80181A14[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181A00; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181A14; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_010/ov_SC05_010.c b/src/ov_SC05_010/ov_SC05_010.c index cdb67b421..2158b6189 100644 --- a/src/ov_SC05_010/ov_SC05_010.c +++ b/src/ov_SC05_010/ov_SC05_010.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_80130C08); INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80188D80[]; +extern s16 D_80188DB0[]; +extern s16 D_80188E10[]; +extern s16 D_80188E18[]; +extern s16 D_80188E38[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188DB0; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80188E10; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188E18; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188E38; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80188D80; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801890E8, D_801890EA, D_801890EC, D_801890EE, D_801890F0, D_801890F2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801890EA < ang)) goto outer_else; + if (!(ang < D_801890F0)) goto inner_else; + if (ang < D_801890EC) { *(s16 *)L = D_801890EC; goto done; } + if (D_801890EE < ang) { *(s16 *)L = D_801890EE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801890E8) { *(s16 *)L = D_801890E8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801890F2 < ang) { *(s16 *)L = D_801890F2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010", func_8013B568); diff --git a/src/ov_SC05_010/ov_SC05_010_after.c b/src/ov_SC05_010/ov_SC05_010_after.c index ecbf154ed..690f461ea 100644 --- a/src/ov_SC05_010/ov_SC05_010_after.c +++ b/src/ov_SC05_010/ov_SC05_010_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018B8DC[]; +extern u8 D_8018B8F0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018B8DC; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018B8F0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_011/ov_SC05_011.c b/src/ov_SC05_011/ov_SC05_011.c index 20dae8d3c..b0edf1402 100644 --- a/src/ov_SC05_011/ov_SC05_011.c +++ b/src/ov_SC05_011/ov_SC05_011.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_80130C08); INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E0F8[]; +extern s16 D_8017E128[]; +extern s16 D_8017E188[]; +extern s16 D_8017E190[]; +extern s16 D_8017E1B0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E128; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E188; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E190; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E1B0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E0F8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E460, D_8017E462, D_8017E464, D_8017E466, D_8017E468, D_8017E46A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E462 < ang)) goto outer_else; + if (!(ang < D_8017E468)) goto inner_else; + if (ang < D_8017E464) { *(s16 *)L = D_8017E464; goto done; } + if (D_8017E466 < ang) { *(s16 *)L = D_8017E466; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E460) { *(s16 *)L = D_8017E460; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E46A < ang) { *(s16 *)L = D_8017E46A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011", func_8013B568); diff --git a/src/ov_SC05_011/ov_SC05_011_after.c b/src/ov_SC05_011/ov_SC05_011_after.c index 1055876b8..f7c7e143e 100644 --- a/src/ov_SC05_011/ov_SC05_011_after.c +++ b/src/ov_SC05_011/ov_SC05_011_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80180C54[]; +extern u8 D_80180C68[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80180C54; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80180C68; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_017/ov_SC05_017.c b/src/ov_SC05_017/ov_SC05_017.c index e61b7f15c..2b47eac37 100644 --- a/src/ov_SC05_017/ov_SC05_017.c +++ b/src/ov_SC05_017/ov_SC05_017.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_80130C08); INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5B8[]; +extern s16 D_8018D5E8[]; +extern s16 D_8018D648[]; +extern s16 D_8018D650[]; +extern s16 D_8018D670[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D5E8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018D648; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D650; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D670; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018D5B8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018D920, D_8018D922, D_8018D924, D_8018D926, D_8018D928, D_8018D92A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D922 < ang)) goto outer_else; + if (!(ang < D_8018D928)) goto inner_else; + if (ang < D_8018D924) { *(s16 *)L = D_8018D924; goto done; } + if (D_8018D926 < ang) { *(s16 *)L = D_8018D926; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D920) { *(s16 *)L = D_8018D920; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D92A < ang) { *(s16 *)L = D_8018D92A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017", func_8013B568); diff --git a/src/ov_SC05_017/ov_SC05_017_after.c b/src/ov_SC05_017/ov_SC05_017_after.c index 9680e9237..8da3a171e 100644 --- a/src/ov_SC05_017/ov_SC05_017_after.c +++ b/src/ov_SC05_017/ov_SC05_017_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80190114[]; +extern u8 D_80190128[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80190114; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80190128; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_018/ov_SC05_018.c b/src/ov_SC05_018/ov_SC05_018.c index 09ee315e7..b56c1406e 100644 --- a/src/ov_SC05_018/ov_SC05_018.c +++ b/src/ov_SC05_018/ov_SC05_018.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_80130C08); INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186D14[]; +extern s16 D_80186D44[]; +extern s16 D_80186DA4[]; +extern s16 D_80186DAC[]; +extern s16 D_80186DCC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186D44; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186DA4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186DAC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186DCC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186D14; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018707C, D_8018707E, D_80187080, D_80187082, D_80187084, D_80187086; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018707E < ang)) goto outer_else; + if (!(ang < D_80187084)) goto inner_else; + if (ang < D_80187080) { *(s16 *)L = D_80187080; goto done; } + if (D_80187082 < ang) { *(s16 *)L = D_80187082; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018707C) { *(s16 *)L = D_8018707C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187086 < ang) { *(s16 *)L = D_80187086; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018", func_8013B568); diff --git a/src/ov_SC05_018/ov_SC05_018_after.c b/src/ov_SC05_018/ov_SC05_018_after.c index 78374085e..802ddfcb6 100644 --- a/src/ov_SC05_018/ov_SC05_018_after.c +++ b/src/ov_SC05_018/ov_SC05_018_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189870[]; +extern u8 D_80189884[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189870; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80189884; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC05_019/ov_SC05_019.c b/src/ov_SC05_019/ov_SC05_019.c index 4d11fdfdd..f41ebcaf4 100644 --- a/src/ov_SC05_019/ov_SC05_019.c +++ b/src/ov_SC05_019/ov_SC05_019.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_80130C08); INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_80130D0C); -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F688; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F6E8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F6F0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F710; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017F658; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019", func_8013B568); diff --git a/src/ov_SC05_019/ov_SC05_019_after.c b/src/ov_SC05_019/ov_SC05_019_after.c index c2da2db4b..25b76685c 100644 --- a/src/ov_SC05_019/ov_SC05_019_after.c +++ b/src/ov_SC05_019/ov_SC05_019_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801821B4[]; +extern u8 D_801821C8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801821B4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801821C8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_000/ov_SC06_000.c b/src/ov_SC06_000/ov_SC06_000.c index edd53784b..5e225f7f6 100644 --- a/src/ov_SC06_000/ov_SC06_000.c +++ b/src/ov_SC06_000/ov_SC06_000.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130C08); INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80188668[]; +extern s16 D_80188698[]; +extern s16 D_801886F8[]; +extern s16 D_80188700[]; +extern s16 D_80188720[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188698; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801886F8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188700; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188720; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80188668; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801889D0, D_801889D2, D_801889D4, D_801889D6, D_801889D8, D_801889DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801889D2 < ang)) goto outer_else; + if (!(ang < D_801889D8)) goto inner_else; + if (ang < D_801889D4) { *(s16 *)L = D_801889D4; goto done; } + if (D_801889D6 < ang) { *(s16 *)L = D_801889D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801889D0) { *(s16 *)L = D_801889D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801889DA < ang) { *(s16 *)L = D_801889DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B568); diff --git a/src/ov_SC06_000/ov_SC06_000_after.c b/src/ov_SC06_000/ov_SC06_000_after.c index 4f3433c74..a4dd6d36b 100644 --- a/src/ov_SC06_000/ov_SC06_000_after.c +++ b/src/ov_SC06_000/ov_SC06_000_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018B1C4[]; +extern u8 D_8018B1D8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018B1C4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018B1D8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_006/ov_SC06_006.c b/src/ov_SC06_006/ov_SC06_006.c index a8dd72462..41fc79ae3 100644 --- a/src/ov_SC06_006/ov_SC06_006.c +++ b/src/ov_SC06_006/ov_SC06_006.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_80130C08); INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018218C[]; +extern s16 D_801821BC[]; +extern s16 D_8018221C[]; +extern s16 D_80182224[]; +extern s16 D_80182244[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801821BC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018221C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182224; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182244; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018218C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801824F4, D_801824F6, D_801824F8, D_801824FA, D_801824FC, D_801824FE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801824F6 < ang)) goto outer_else; + if (!(ang < D_801824FC)) goto inner_else; + if (ang < D_801824F8) { *(s16 *)L = D_801824F8; goto done; } + if (D_801824FA < ang) { *(s16 *)L = D_801824FA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801824F4) { *(s16 *)L = D_801824F4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801824FE < ang) { *(s16 *)L = D_801824FE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006", func_8013B568); diff --git a/src/ov_SC06_006/ov_SC06_006_after.c b/src/ov_SC06_006/ov_SC06_006_after.c index 2c6ff9038..dfc311a92 100644 --- a/src/ov_SC06_006/ov_SC06_006_after.c +++ b/src/ov_SC06_006/ov_SC06_006_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80184CE8[]; +extern u8 D_80184CFC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80184CE8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80184CFC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_008/ov_SC06_008.c b/src/ov_SC06_008/ov_SC06_008.c index 2510df40f..56b622add 100644 --- a/src/ov_SC06_008/ov_SC06_008.c +++ b/src/ov_SC06_008/ov_SC06_008.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_80130C08); INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185BF4[]; +extern s16 D_80185C24[]; +extern s16 D_80185C84[]; +extern s16 D_80185C8C[]; +extern s16 D_80185CAC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185C24; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185C84; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185C8C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185CAC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185BF4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80185F5C, D_80185F5E, D_80185F60, D_80185F62, D_80185F64, D_80185F66; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185F5E < ang)) goto outer_else; + if (!(ang < D_80185F64)) goto inner_else; + if (ang < D_80185F60) { *(s16 *)L = D_80185F60; goto done; } + if (D_80185F62 < ang) { *(s16 *)L = D_80185F62; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185F5C) { *(s16 *)L = D_80185F5C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185F66 < ang) { *(s16 *)L = D_80185F66; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008", func_8013B568); diff --git a/src/ov_SC06_008/ov_SC06_008_after.c b/src/ov_SC06_008/ov_SC06_008_after.c index 11120404a..e0b53aa9b 100644 --- a/src/ov_SC06_008/ov_SC06_008_after.c +++ b/src/ov_SC06_008/ov_SC06_008_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80188750[]; +extern u8 D_80188764[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80188750; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80188764; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_010/ov_SC06_010.c b/src/ov_SC06_010/ov_SC06_010.c index 8d5c754c5..1a177f939 100644 --- a/src/ov_SC06_010/ov_SC06_010.c +++ b/src/ov_SC06_010/ov_SC06_010.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130C08); INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186DD0[]; +extern s16 D_80186E00[]; +extern s16 D_80186E60[]; +extern s16 D_80186E68[]; +extern s16 D_80186E88[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E00; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186E60; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E68; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E88; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186DD0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80187138, D_8018713A, D_8018713C, D_8018713E, D_80187140, D_80187142; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018713A < ang)) goto outer_else; + if (!(ang < D_80187140)) goto inner_else; + if (ang < D_8018713C) { *(s16 *)L = D_8018713C; goto done; } + if (D_8018713E < ang) { *(s16 *)L = D_8018713E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187138) { *(s16 *)L = D_80187138; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187142 < ang) { *(s16 *)L = D_80187142; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B568); diff --git a/src/ov_SC06_010/ov_SC06_010_after.c b/src/ov_SC06_010/ov_SC06_010_after.c index 0d50b0844..1c8b98729 100644 --- a/src/ov_SC06_010/ov_SC06_010_after.c +++ b/src/ov_SC06_010/ov_SC06_010_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018992C[]; +extern u8 D_80189940[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018992C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80189940; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_011/ov_SC06_011.c b/src/ov_SC06_011/ov_SC06_011.c index e5780e443..4a872297c 100644 --- a/src/ov_SC06_011/ov_SC06_011.c +++ b/src/ov_SC06_011/ov_SC06_011.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_80130C08); INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180830[]; +extern s16 D_80180860[]; +extern s16 D_801808C0[]; +extern s16 D_801808C8[]; +extern s16 D_801808E8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180860; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801808C0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801808C8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801808E8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80180830; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180B98, D_80180B9A, D_80180B9C, D_80180B9E, D_80180BA0, D_80180BA2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180B9A < ang)) goto outer_else; + if (!(ang < D_80180BA0)) goto inner_else; + if (ang < D_80180B9C) { *(s16 *)L = D_80180B9C; goto done; } + if (D_80180B9E < ang) { *(s16 *)L = D_80180B9E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180B98) { *(s16 *)L = D_80180B98; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180BA2 < ang) { *(s16 *)L = D_80180BA2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011", func_8013B568); diff --git a/src/ov_SC06_011/ov_SC06_011_after.c b/src/ov_SC06_011/ov_SC06_011_after.c index 44543cbdd..0ac7022c4 100644 --- a/src/ov_SC06_011/ov_SC06_011_after.c +++ b/src/ov_SC06_011/ov_SC06_011_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018338C[]; +extern u8 D_801833A0[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018338C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801833A0; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_013/ov_SC06_013.c b/src/ov_SC06_013/ov_SC06_013.c index 51201b868..fb144c871 100644 --- a/src/ov_SC06_013/ov_SC06_013.c +++ b/src/ov_SC06_013/ov_SC06_013.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_80130C08); INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EFAC[]; +extern s16 D_8017EFDC[]; +extern s16 D_8017F03C[]; +extern s16 D_8017F044[]; +extern s16 D_8017F064[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EFDC; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017F03C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F044; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017F064; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EFAC; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F314, D_8017F316, D_8017F318, D_8017F31A, D_8017F31C, D_8017F31E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F316 < ang)) goto outer_else; + if (!(ang < D_8017F31C)) goto inner_else; + if (ang < D_8017F318) { *(s16 *)L = D_8017F318; goto done; } + if (D_8017F31A < ang) { *(s16 *)L = D_8017F31A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F314) { *(s16 *)L = D_8017F314; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F31E < ang) { *(s16 *)L = D_8017F31E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013", func_8013B568); diff --git a/src/ov_SC06_013/ov_SC06_013_after.c b/src/ov_SC06_013/ov_SC06_013_after.c index 2edf3271d..7f3ea5212 100644 --- a/src/ov_SC06_013/ov_SC06_013_after.c +++ b/src/ov_SC06_013/ov_SC06_013_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80181B08[]; +extern u8 D_80181B1C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80181B08; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80181B1C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_014/ov_SC06_014.c b/src/ov_SC06_014/ov_SC06_014.c index 3701b320d..d12cbb7d0 100644 --- a/src/ov_SC06_014/ov_SC06_014.c +++ b/src/ov_SC06_014/ov_SC06_014.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_80130C08); INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180310[]; +extern s16 D_80180340[]; +extern s16 D_801803A0[]; +extern s16 D_801803A8[]; +extern s16 D_801803C8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80180340; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801803A0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801803A8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801803C8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80180310; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80180678, D_8018067A, D_8018067C, D_8018067E, D_80180680, D_80180682; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018067A < ang)) goto outer_else; + if (!(ang < D_80180680)) goto inner_else; + if (ang < D_8018067C) { *(s16 *)L = D_8018067C; goto done; } + if (D_8018067E < ang) { *(s16 *)L = D_8018067E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180678) { *(s16 *)L = D_80180678; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180682 < ang) { *(s16 *)L = D_80180682; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014", func_8013B568); diff --git a/src/ov_SC06_014/ov_SC06_014_after.c b/src/ov_SC06_014/ov_SC06_014_after.c index 84cbf4710..a2ef33eab 100644 --- a/src/ov_SC06_014/ov_SC06_014_after.c +++ b/src/ov_SC06_014/ov_SC06_014_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80182E6C[]; +extern u8 D_80182E80[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80182E6C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80182E80; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_015/ov_SC06_015.c b/src/ov_SC06_015/ov_SC06_015.c index 2716d40d7..b9b3bc856 100644 --- a/src/ov_SC06_015/ov_SC06_015.c +++ b/src/ov_SC06_015/ov_SC06_015.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_80130C08); INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EE68[]; +extern s16 D_8017EE98[]; +extern s16 D_8017EEF8[]; +extern s16 D_8017EF00[]; +extern s16 D_8017EF20[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EE98; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017EEF8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF00; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017EF20; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017EE68; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017F1D0, D_8017F1D2, D_8017F1D4, D_8017F1D6, D_8017F1D8, D_8017F1DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F1D2 < ang)) goto outer_else; + if (!(ang < D_8017F1D8)) goto inner_else; + if (ang < D_8017F1D4) { *(s16 *)L = D_8017F1D4; goto done; } + if (D_8017F1D6 < ang) { *(s16 *)L = D_8017F1D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F1D0) { *(s16 *)L = D_8017F1D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F1DA < ang) { *(s16 *)L = D_8017F1DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015", func_8013B568); diff --git a/src/ov_SC06_015/ov_SC06_015_after.c b/src/ov_SC06_015/ov_SC06_015_after.c index 781865124..cc06dcaed 100644 --- a/src/ov_SC06_015/ov_SC06_015_after.c +++ b/src/ov_SC06_015/ov_SC06_015_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801819C4[]; +extern u8 D_801819D8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801819C4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801819D8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_016/ov_SC06_016.c b/src/ov_SC06_016/ov_SC06_016.c index f00e0a46c..b60966ad8 100644 --- a/src/ov_SC06_016/ov_SC06_016.c +++ b/src/ov_SC06_016/ov_SC06_016.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_80130C08); INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185278[]; +extern s16 D_801852A8[]; +extern s16 D_80185308[]; +extern s16 D_80185310[]; +extern s16 D_80185330[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801852A8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185308; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185310; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80185330; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185278; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801855E0, D_801855E2, D_801855E4, D_801855E6, D_801855E8, D_801855EA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801855E2 < ang)) goto outer_else; + if (!(ang < D_801855E8)) goto inner_else; + if (ang < D_801855E4) { *(s16 *)L = D_801855E4; goto done; } + if (D_801855E6 < ang) { *(s16 *)L = D_801855E6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801855E0) { *(s16 *)L = D_801855E0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801855EA < ang) { *(s16 *)L = D_801855EA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016", func_8013B568); diff --git a/src/ov_SC06_016/ov_SC06_016_after.c b/src/ov_SC06_016/ov_SC06_016_after.c index 9abd8823c..0d65d9e5c 100644 --- a/src/ov_SC06_016/ov_SC06_016_after.c +++ b/src/ov_SC06_016/ov_SC06_016_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187DD4[]; +extern u8 D_80187DE8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187DD4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187DE8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_018/ov_SC06_018.c b/src/ov_SC06_018/ov_SC06_018.c index a3ada4b41..d681a5531 100644 --- a/src/ov_SC06_018/ov_SC06_018.c +++ b/src/ov_SC06_018/ov_SC06_018.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_80130C08); INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801939B4[]; +extern s16 D_801939E4[]; +extern s16 D_80193A44[]; +extern s16 D_80193A4C[]; +extern s16 D_80193A6C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801939E4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80193A44; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80193A4C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80193A6C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_801939B4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80193D1C, D_80193D1E, D_80193D20, D_80193D22, D_80193D24, D_80193D26; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80193D1E < ang)) goto outer_else; + if (!(ang < D_80193D24)) goto inner_else; + if (ang < D_80193D20) { *(s16 *)L = D_80193D20; goto done; } + if (D_80193D22 < ang) { *(s16 *)L = D_80193D22; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80193D1C) { *(s16 *)L = D_80193D1C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80193D26 < ang) { *(s16 *)L = D_80193D26; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018", func_8013B568); diff --git a/src/ov_SC06_018/ov_SC06_018_after.c b/src/ov_SC06_018/ov_SC06_018_after.c index 3d6abb47b..ceea91a2f 100644 --- a/src/ov_SC06_018/ov_SC06_018_after.c +++ b/src/ov_SC06_018/ov_SC06_018_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80196510[]; +extern u8 D_80196524[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80196510; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80196524; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_020/ov_SC06_020.c b/src/ov_SC06_020/ov_SC06_020.c index d10017a14..e5a609e85 100644 --- a/src/ov_SC06_020/ov_SC06_020.c +++ b/src/ov_SC06_020/ov_SC06_020.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_80130C08); INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018543C[]; +extern s16 D_8018546C[]; +extern s16 D_801854CC[]; +extern s16 D_801854D4[]; +extern s16 D_801854F4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018546C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801854CC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801854D4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801854F4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018543C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801857A4, D_801857A6, D_801857A8, D_801857AA, D_801857AC, D_801857AE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801857A6 < ang)) goto outer_else; + if (!(ang < D_801857AC)) goto inner_else; + if (ang < D_801857A8) { *(s16 *)L = D_801857A8; goto done; } + if (D_801857AA < ang) { *(s16 *)L = D_801857AA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801857A4) { *(s16 *)L = D_801857A4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801857AE < ang) { *(s16 *)L = D_801857AE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020", func_8013B568); diff --git a/src/ov_SC06_020/ov_SC06_020_after.c b/src/ov_SC06_020/ov_SC06_020_after.c index 41cffe840..9f6de467a 100644 --- a/src/ov_SC06_020/ov_SC06_020_after.c +++ b/src/ov_SC06_020/ov_SC06_020_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187F98[]; +extern u8 D_80187FAC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187F98; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187FAC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_022/ov_SC06_022.c b/src/ov_SC06_022/ov_SC06_022.c index 945e79612..61d0f7587 100644 --- a/src/ov_SC06_022/ov_SC06_022.c +++ b/src/ov_SC06_022/ov_SC06_022.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_80130C08); INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D6F8[]; +extern s16 D_8018D728[]; +extern s16 D_8018D788[]; +extern s16 D_8018D790[]; +extern s16 D_8018D7B0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D728; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018D788; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D790; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018D7B0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018D6F8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018DA60, D_8018DA62, D_8018DA64, D_8018DA66, D_8018DA68, D_8018DA6A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018DA62 < ang)) goto outer_else; + if (!(ang < D_8018DA68)) goto inner_else; + if (ang < D_8018DA64) { *(s16 *)L = D_8018DA64; goto done; } + if (D_8018DA66 < ang) { *(s16 *)L = D_8018DA66; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018DA60) { *(s16 *)L = D_8018DA60; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018DA6A < ang) { *(s16 *)L = D_8018DA6A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022", func_8013B568); diff --git a/src/ov_SC06_022/ov_SC06_022_after.c b/src/ov_SC06_022/ov_SC06_022_after.c index 5cb9e1693..c15b71ad4 100644 --- a/src/ov_SC06_022/ov_SC06_022_after.c +++ b/src/ov_SC06_022/ov_SC06_022_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80190254[]; +extern u8 D_80190268[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80190254; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80190268; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_024/ov_SC06_024.c b/src/ov_SC06_024/ov_SC06_024.c index 19df9c6a9..e8955450e 100644 --- a/src/ov_SC06_024/ov_SC06_024.c +++ b/src/ov_SC06_024/ov_SC06_024.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_80130C08); INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018FBD0[]; +extern s16 D_8018FC00[]; +extern s16 D_8018FC60[]; +extern s16 D_8018FC68[]; +extern s16 D_8018FC88[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018FC00; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018FC60; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018FC68; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018FC88; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018FBD0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018FF38, D_8018FF3A, D_8018FF3C, D_8018FF3E, D_8018FF40, D_8018FF42; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018FF3A < ang)) goto outer_else; + if (!(ang < D_8018FF40)) goto inner_else; + if (ang < D_8018FF3C) { *(s16 *)L = D_8018FF3C; goto done; } + if (D_8018FF3E < ang) { *(s16 *)L = D_8018FF3E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018FF38) { *(s16 *)L = D_8018FF38; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018FF42 < ang) { *(s16 *)L = D_8018FF42; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024", func_8013B568); diff --git a/src/ov_SC06_024/ov_SC06_024_after.c b/src/ov_SC06_024/ov_SC06_024_after.c index cbb2f50fa..af7821639 100644 --- a/src/ov_SC06_024/ov_SC06_024_after.c +++ b/src/ov_SC06_024/ov_SC06_024_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8019272C[]; +extern u8 D_80192740[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8019272C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80192740; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_025/ov_SC06_025.c b/src/ov_SC06_025/ov_SC06_025.c index 34350414f..09f2c66fd 100644 --- a/src/ov_SC06_025/ov_SC06_025.c +++ b/src/ov_SC06_025/ov_SC06_025.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_80130C08); INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185074[]; +extern s16 D_801850A4[]; +extern s16 D_80185104[]; +extern s16 D_8018510C[]; +extern s16 D_8018512C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801850A4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80185104; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018510C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018512C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80185074; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801853DC, D_801853DE, D_801853E0, D_801853E2, D_801853E4, D_801853E6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801853DE < ang)) goto outer_else; + if (!(ang < D_801853E4)) goto inner_else; + if (ang < D_801853E0) { *(s16 *)L = D_801853E0; goto done; } + if (D_801853E2 < ang) { *(s16 *)L = D_801853E2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801853DC) { *(s16 *)L = D_801853DC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801853E6 < ang) { *(s16 *)L = D_801853E6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025", func_8013B568); diff --git a/src/ov_SC06_025/ov_SC06_025_after.c b/src/ov_SC06_025/ov_SC06_025_after.c index a366a4291..e0cd7218a 100644 --- a/src/ov_SC06_025/ov_SC06_025_after.c +++ b/src/ov_SC06_025/ov_SC06_025_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80187BD0[]; +extern u8 D_80187BE4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80187BD0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80187BE4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_027/ov_SC06_027.c b/src/ov_SC06_027/ov_SC06_027.c index 510cfb256..db2301832 100644 --- a/src/ov_SC06_027/ov_SC06_027.c +++ b/src/ov_SC06_027/ov_SC06_027.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_80130C08); INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E3B4[]; +extern s16 D_8017E3E4[]; +extern s16 D_8017E444[]; +extern s16 D_8017E44C[]; +extern s16 D_8017E46C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E3E4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E444; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E44C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E46C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E3B4; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E71C, D_8017E71E, D_8017E720, D_8017E722, D_8017E724, D_8017E726; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E71E < ang)) goto outer_else; + if (!(ang < D_8017E724)) goto inner_else; + if (ang < D_8017E720) { *(s16 *)L = D_8017E720; goto done; } + if (D_8017E722 < ang) { *(s16 *)L = D_8017E722; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E71C) { *(s16 *)L = D_8017E71C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E726 < ang) { *(s16 *)L = D_8017E726; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027", func_8013B568); diff --git a/src/ov_SC06_027/ov_SC06_027_after.c b/src/ov_SC06_027/ov_SC06_027_after.c index 908430827..59ec8111a 100644 --- a/src/ov_SC06_027/ov_SC06_027_after.c +++ b/src/ov_SC06_027/ov_SC06_027_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80180F10[]; +extern u8 D_80180F24[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80180F10; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80180F24; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_029/ov_SC06_029.c b/src/ov_SC06_029/ov_SC06_029.c index acaa68a3f..953cd2f4e 100644 --- a/src/ov_SC06_029/ov_SC06_029.c +++ b/src/ov_SC06_029/ov_SC06_029.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_80130C08); INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018C948[]; +extern s16 D_8018C978[]; +extern s16 D_8018C9D8[]; +extern s16 D_8018C9E0[]; +extern s16 D_8018CA00[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018C978; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018C9D8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018C9E0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018CA00; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018C948; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8018CCB0, D_8018CCB2, D_8018CCB4, D_8018CCB6, D_8018CCB8, D_8018CCBA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018CCB2 < ang)) goto outer_else; + if (!(ang < D_8018CCB8)) goto inner_else; + if (ang < D_8018CCB4) { *(s16 *)L = D_8018CCB4; goto done; } + if (D_8018CCB6 < ang) { *(s16 *)L = D_8018CCB6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018CCB0) { *(s16 *)L = D_8018CCB0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018CCBA < ang) { *(s16 *)L = D_8018CCBA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029", func_8013B568); diff --git a/src/ov_SC06_029/ov_SC06_029_after.c b/src/ov_SC06_029/ov_SC06_029_after.c index 6d2e405bb..9f7b19261 100644 --- a/src/ov_SC06_029/ov_SC06_029_after.c +++ b/src/ov_SC06_029/ov_SC06_029_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018F4A4[]; +extern u8 D_8018F4B8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018F4A4; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018F4B8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_030/ov_SC06_030.c b/src/ov_SC06_030/ov_SC06_030.c index 0f41263b5..dc3e6344b 100644 --- a/src/ov_SC06_030/ov_SC06_030.c +++ b/src/ov_SC06_030/ov_SC06_030.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_80130C08); INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182238[]; +extern s16 D_80182268[]; +extern s16 D_801822C8[]; +extern s16 D_801822D0[]; +extern s16 D_801822F0[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182268; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801822C8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822D0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822F0; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182238; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_801825A0, D_801825A2, D_801825A4, D_801825A6, D_801825A8, D_801825AA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801825A2 < ang)) goto outer_else; + if (!(ang < D_801825A8)) goto inner_else; + if (ang < D_801825A4) { *(s16 *)L = D_801825A4; goto done; } + if (D_801825A6 < ang) { *(s16 *)L = D_801825A6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801825A0) { *(s16 *)L = D_801825A0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801825AA < ang) { *(s16 *)L = D_801825AA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030", func_8013B568); diff --git a/src/ov_SC06_030/ov_SC06_030_after.c b/src/ov_SC06_030/ov_SC06_030_after.c index 2e1721f79..c658ea503 100644 --- a/src/ov_SC06_030/ov_SC06_030_after.c +++ b/src/ov_SC06_030/ov_SC06_030_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80184D94[]; +extern u8 D_80184DA8[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80184D94; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80184DA8; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_032/ov_SC06_032.c b/src/ov_SC06_032/ov_SC06_032.c index 4a97ed730..e5bf93ec9 100644 --- a/src/ov_SC06_032/ov_SC06_032.c +++ b/src/ov_SC06_032/ov_SC06_032.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_80130C08); INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80193704[]; +extern s16 D_80193734[]; +extern s16 D_80193794[]; +extern s16 D_8019379C[]; +extern s16 D_801937BC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80193734; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80193794; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8019379C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801937BC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80193704; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80193A6C, D_80193A6E, D_80193A70, D_80193A72, D_80193A74, D_80193A76; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80193A6E < ang)) goto outer_else; + if (!(ang < D_80193A74)) goto inner_else; + if (ang < D_80193A70) { *(s16 *)L = D_80193A70; goto done; } + if (D_80193A72 < ang) { *(s16 *)L = D_80193A72; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80193A6C) { *(s16 *)L = D_80193A6C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80193A76 < ang) { *(s16 *)L = D_80193A76; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032", func_8013B568); diff --git a/src/ov_SC06_032/ov_SC06_032_after.c b/src/ov_SC06_032/ov_SC06_032_after.c index a62cc5015..fbcd0387a 100644 --- a/src/ov_SC06_032/ov_SC06_032_after.c +++ b/src/ov_SC06_032/ov_SC06_032_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80196260[]; +extern u8 D_80196274[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80196260; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80196274; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC06_033/ov_SC06_033.c b/src/ov_SC06_033/ov_SC06_033.c index e25b853da..f922e172f 100644 --- a/src/ov_SC06_033/ov_SC06_033.c +++ b/src/ov_SC06_033/ov_SC06_033.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_80130C08); INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_80130D0C); -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80191C14[]; +extern s16 D_80191C44[]; +extern s16 D_80191CA4[]; +extern s16 D_80191CAC[]; +extern s16 D_80191CCC[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80191C44; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80191CA4; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80191CAC; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80191CCC; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80191C14; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80191F7C, D_80191F7E, D_80191F80, D_80191F82, D_80191F84, D_80191F86; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80191F7E < ang)) goto outer_else; + if (!(ang < D_80191F84)) goto inner_else; + if (ang < D_80191F80) { *(s16 *)L = D_80191F80; goto done; } + if (D_80191F82 < ang) { *(s16 *)L = D_80191F82; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191F7C) { *(s16 *)L = D_80191F7C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191F86 < ang) { *(s16 *)L = D_80191F86; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033", func_8013B568); diff --git a/src/ov_SC06_033/ov_SC06_033_after.c b/src/ov_SC06_033/ov_SC06_033_after.c index 9a91ef0a2..e27df4985 100644 --- a/src/ov_SC06_033/ov_SC06_033_after.c +++ b/src/ov_SC06_033/ov_SC06_033_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80194770[]; +extern u8 D_80194784[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80194770; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80194784; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC07_000/ov_SC07_000.c b/src/ov_SC07_000/ov_SC07_000.c index e0dcfbd5a..78ea3c0b3 100644 --- a/src/ov_SC07_000/ov_SC07_000.c +++ b/src/ov_SC07_000/ov_SC07_000.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_80130C08); INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_80130D0C); -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182A5C[]; +extern s16 D_80182A8C[]; +extern s16 D_80182AEC[]; +extern s16 D_80182AF4[]; +extern s16 D_80182B14[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182A8C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80182AEC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182AF4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80182B14; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80182A5C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80182DC4, D_80182DC6, D_80182DC8, D_80182DCA, D_80182DCC, D_80182DCE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182DC6 < ang)) goto outer_else; + if (!(ang < D_80182DCC)) goto inner_else; + if (ang < D_80182DC8) { *(s16 *)L = D_80182DC8; goto done; } + if (D_80182DCA < ang) { *(s16 *)L = D_80182DCA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182DC4) { *(s16 *)L = D_80182DC4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182DCE < ang) { *(s16 *)L = D_80182DCE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000", func_8013B568); diff --git a/src/ov_SC07_000/ov_SC07_000_after.c b/src/ov_SC07_000/ov_SC07_000_after.c index 52e37e0d2..a0daae87e 100644 --- a/src/ov_SC07_000/ov_SC07_000_after.c +++ b/src/ov_SC07_000/ov_SC07_000_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_801855B8[]; +extern u8 D_801855CC[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_801855B8; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_801855CC; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC07_001/ov_SC07_001.c b/src/ov_SC07_001/ov_SC07_001.c index ea774bb5b..ff41ee04b 100644 --- a/src/ov_SC07_001/ov_SC07_001.c +++ b/src/ov_SC07_001/ov_SC07_001.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_80130C08); INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_80130D0C); -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018190C[]; +extern s16 D_8018193C[]; +extern s16 D_8018199C[]; +extern s16 D_801819A4[]; +extern s16 D_801819C4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018193C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8018199C; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801819A4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801819C4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018190C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80181C74, D_80181C76, D_80181C78, D_80181C7A, D_80181C7C, D_80181C7E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80181C76 < ang)) goto outer_else; + if (!(ang < D_80181C7C)) goto inner_else; + if (ang < D_80181C78) { *(s16 *)L = D_80181C78; goto done; } + if (D_80181C7A < ang) { *(s16 *)L = D_80181C7A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181C74) { *(s16 *)L = D_80181C74; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181C7E < ang) { *(s16 *)L = D_80181C7E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001", func_8013B568); diff --git a/src/ov_SC07_001/ov_SC07_001_after.c b/src/ov_SC07_001/ov_SC07_001_after.c index 77a1477de..338f61727 100644 --- a/src/ov_SC07_001/ov_SC07_001_after.c +++ b/src/ov_SC07_001/ov_SC07_001_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80184468[]; +extern u8 D_8018447C[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80184468; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_8018447C; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC07_002/ov_SC07_002.c b/src/ov_SC07_002/ov_SC07_002.c index 132a0d962..287923db7 100644 --- a/src/ov_SC07_002/ov_SC07_002.c +++ b/src/ov_SC07_002/ov_SC07_002.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_80130C08); INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_80130D0C); -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186BC8[]; +extern s16 D_80186BF8[]; +extern s16 D_80186C58[]; +extern s16 D_80186C60[]; +extern s16 D_80186C80[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186BF8; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186C58; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186C60; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186C80; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186BC8; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_80186F30, D_80186F32, D_80186F34, D_80186F36, D_80186F38, D_80186F3A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186F32 < ang)) goto outer_else; + if (!(ang < D_80186F38)) goto inner_else; + if (ang < D_80186F34) { *(s16 *)L = D_80186F34; goto done; } + if (D_80186F36 < ang) { *(s16 *)L = D_80186F36; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186F30) { *(s16 *)L = D_80186F30; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80186F3A < ang) { *(s16 *)L = D_80186F3A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002", func_8013B568); diff --git a/src/ov_SC07_002/ov_SC07_002_after.c b/src/ov_SC07_002/ov_SC07_002_after.c index 6e2f11f0d..66d888809 100644 --- a/src/ov_SC07_002/ov_SC07_002_after.c +++ b/src/ov_SC07_002/ov_SC07_002_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80189724[]; +extern u8 D_80189738[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80189724; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80189738; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC07_008/ov_SC07_008.c b/src/ov_SC07_008/ov_SC07_008.c index 3a8f02f12..1aa3ae8c4 100644 --- a/src/ov_SC07_008/ov_SC07_008.c +++ b/src/ov_SC07_008/ov_SC07_008.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_80130C08); INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_80130D0C); -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017D6E0[]; +extern s16 D_8017D710[]; +extern s16 D_8017D770[]; +extern s16 D_8017D778[]; +extern s16 D_8017D798[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017D710; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017D770; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017D778; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017D798; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017D6E0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017DA48, D_8017DA4A, D_8017DA4C, D_8017DA4E, D_8017DA50, D_8017DA52; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017DA4A < ang)) goto outer_else; + if (!(ang < D_8017DA50)) goto inner_else; + if (ang < D_8017DA4C) { *(s16 *)L = D_8017DA4C; goto done; } + if (D_8017DA4E < ang) { *(s16 *)L = D_8017DA4E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017DA48) { *(s16 *)L = D_8017DA48; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017DA52 < ang) { *(s16 *)L = D_8017DA52; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008", func_8013B568); diff --git a/src/ov_SC07_008/ov_SC07_008_after.c b/src/ov_SC07_008/ov_SC07_008_after.c index e9e145f33..82d48e4fb 100644 --- a/src/ov_SC07_008/ov_SC07_008_after.c +++ b/src/ov_SC07_008/ov_SC07_008_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_8018023C[]; +extern u8 D_80180250[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_8018023C; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80180250; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/src/ov_SC07_009/ov_SC07_009.c b/src/ov_SC07_009/ov_SC07_009.c index 828314166..a1c304e13 100644 --- a/src/ov_SC07_009/ov_SC07_009.c +++ b/src/ov_SC07_009/ov_SC07_009.c @@ -1114,7 +1114,175 @@ INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_80130C08); INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_80130D0C); -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_80130D48); + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E184[]; +extern s16 D_8017E1B4[]; +extern s16 D_8017E214[]; +extern s16 D_8017E21C[]; +extern s16 D_8017E23C[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E1B4; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_8017E214; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E21C; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8017E23C; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8017E184; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_80131170); @@ -1643,7 +1811,104 @@ DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_8013B274); + + +extern void *func_80010A08(s32); +extern s16 D_8017E4EC, D_8017E4EE, D_8017E4F0, D_8017E4F2, D_8017E4F4, D_8017E4F6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E4EE < ang)) goto outer_else; + if (!(ang < D_8017E4F4)) goto inner_else; + if (ang < D_8017E4F0) { *(s16 *)L = D_8017E4F0; goto done; } + if (D_8017E4F2 < ang) { *(s16 *)L = D_8017E4F2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E4EC) { *(s16 *)L = D_8017E4EC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E4F6 < ang) { *(s16 *)L = D_8017E4F6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009", func_8013B568); diff --git a/src/ov_SC07_009/ov_SC07_009_after.c b/src/ov_SC07_009/ov_SC07_009_after.c index e4efdf63c..cbbdc4191 100644 --- a/src/ov_SC07_009/ov_SC07_009_after.c +++ b/src/ov_SC07_009/ov_SC07_009_after.c @@ -4387,7 +4387,95 @@ DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_after", func_80167AE0); -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_after", func_80167DBC); + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80180CE0[]; +extern u8 D_80180CF4[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80180CE0; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80180CF4; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ diff --git a/tools/canon_sig_reconcile.py b/tools/canon_sig_reconcile.py new file mode 100644 index 000000000..852c82715 --- /dev/null +++ b/tools/canon_sig_reconcile.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +"""Def-side-wall reconcile (Phase-25 T5b/T7 lever). + +A drafter writes an isolation-MATCH giant body with Ghidra-derived TYPED parameters +(void func(u32 *a0, s16 *a2)). Placed in the real overlay TU it hits `conflicting types`: +the TU's callers reference the function through the CANONICAL signature declared in +src/shared/engine_core.h (extern void func(s32, s32, void*)) — or, absent that, through +gcc-2.7.2's implicit K&R `int func()` from a call site above the definition. The gate's +sig_unify can't reach the engine_core.h decl (it lives inside a DEFINE_ macro) so the +draft never banks. + +This reconciles the DEF to the canonical signature, BYTE-NEUTRALLY: + 1. strip the draft's redefinitions of types already in src/shared/engine_types.h + (identical-definition typedefs — a redef is a hard error in gcc-2.7.2 / C89); + 2. rewrite the def signature to the canonical (return type + positional param types; + arity-grow adds unused params so an implicit-int caller with N args still matches); + 3. cast each type-changed param AT ITS USES — never via an intermediate local, which + introduces a fresh pseudo and shifts register allocation (proven: cast-locals broke + func_8013B274, at-use casts banked it byte-identical). + +The whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9) — a wrong +reconcile simply fails to bank. Canonical form comes from engine_core.h when present, +else the implicit-int-compatible `s32 func(s32,...)` (matches K&R `int func()`). + +Usage: + tools/canon_sig_reconcile.py --fn func_8013B274 --draft .run/drafts-t5-batch2/func_8013B274.c \ + --out .run/t5b2-recon/func_8013B274.c [--sig 'void func_8013B274(s32 a0, s32 a1, void *a2)'] +""" +import re, os, argparse + +EC = 'src/shared/engine_core.h' +ET = 'src/shared/engine_types.h' + + +def ambient_typedefs(): + """name -> normalized single-line 'typedef struct {...} name;' from engine_types.h.""" + et = open(ET).read() + out = {} + for m in re.finditer(r'typedef\s+struct\s*\{[^}{]*\}\s*([A-Za-z_]\w*)\s*;', et): + out[m.group(1)] = re.sub(r'\s+', ' ', m.group(0)).strip() + return out + + +def canonical_from_engine_core(fn): + """Return the canonical 'ret ... fn(params)' decl string from engine_core.h, or None.""" + ec = open(EC).read() + m = re.search(r'extern\s+([^;]*?\b' + re.escape(fn) + r'\s*\(([^;]*)\))\s*;', ec) + return (re.sub(r'\s+', ' ', m.group(1)).strip()) if m else None + + +def split_params(param_str): + """Split a C parameter list on top-level commas -> ['s32 a0', 's16 *a2', ...].""" + param_str = param_str.strip() + if param_str in ('', 'void'): + return [] + out, depth, cur = [], 0, '' + for ch in param_str: + if ch in '([': + depth += 1 + elif ch in ')]': + depth -= 1 + if ch == ',' and depth == 0: + out.append(cur.strip()); cur = '' + else: + cur += ch + if cur.strip(): + out.append(cur.strip()) + return out + + +def parse_param(p): + """'s16 *a2' -> ('s16 *', 'a2'). 'void' / unnamed -> (p, None).""" + m = re.match(r'^(.*?)([A-Za-z_]\w*)\s*$', p.strip()) + if not m: + return (p.strip(), None) + typ, name = m.group(1).strip(), m.group(2) + # a bare type token with no name (e.g. 's32', 'void *') -> name is None + if typ == '' and name in ('void', 's32', 'u32', 'int', 's16', 'u16', 's8', 'u8', 'char', 'long'): + return (name, None) + return (typ, name) + + +def parse_sig(sig, fn): + """'void func_X(s32 a0, s16 *a2)' -> (ret, [(type,name),...]).""" + m = re.match(r'^(.*?)\b' + re.escape(fn) + r'\s*\((.*)\)\s*$', sig.strip(), re.S) + if not m: + raise ValueError(f'cannot parse sig: {sig!r}') + ret = m.group(1).strip() + params = [parse_param(p) for p in split_params(m.group(2))] + return ret, params + + +def cast_uses(body, name, orig_type): + """Blanket-wrap EVERY body use of `name` in `((orig_type)name)`. This preserves the + original semantics of every use — pointer arithmetic (`name + 1` keeps orig stride), + index (`name[i]`), deref (`*name`), member (`name->f`), pass-through, AND already-cast + uses (`(P_TAG*)name` -> `(P_TAG*)((orig)name)`, same bits) — all byte-neutral (a cast + emits no code). Targeted patterns missed arithmetic (void*+1 != s16*+1); blanket is + correct and safe (\\b avoids substrings; the def line is in `head`, not `body`).""" + ot = orig_type.strip() + return re.sub(r'\b' + re.escape(name) + r'\b', '((' + ot + ')' + name + ')', body) + + +def strip_conflicting_externs(draft, ambient): + """Remove the draft's redundant `extern` decls — the `conflicting types` source. The TU's + #includes (common.h + engine_core.h) and its per-TU canonical-sig layer already declare + these; the draft's Ghidra-typed re-declaration conflicts. Strip an extern when its symbol + is in `ambient` (declared by engine_core.h/engine_types.h or the target TU), and always + strip a `memcpy` extern (the TU's macros / gcc builtin provide it — a mismatched prototype + triggers `conflicting types for built-in memcpy`). A genuinely-draft-local extern (symbol + NOT ambient) is kept; the byte-gate is the sole arbiter (G3/P9).""" + def drop_fn(m): + return '' if m.group(1) in ambient else m.group(0) + # extern function decls (func_XXXX or memcpy/library) + draft = re.sub(r'^\s*extern\s+[^;\n]*?\b(func_[0-9A-Fa-f]+)\s*\([^;\n]*\)\s*;\s*\n', + drop_fn, draft, flags=re.M) + draft = re.sub(r'^\s*extern\s+[^;\n]*?\bmemcpy\s*\([^;\n]*\)\s*;\s*\n', '', draft, flags=re.M) + # extern DATA decls (one line may declare several: `extern s16 D_a, D_b;`) + def drop_data(m): + names = re.findall(r'\b(D_[0-9A-Fa-f]+)\b', m.group(0)) + return '' if names and all(n in ambient for n in names) else m.group(0) + draft = re.sub(r'^\s*extern\s+[^;\n]*\bD_[0-9A-Fa-f]+[^;\n]*;\s*\n', drop_data, draft, flags=re.M) + return draft + + +def ambient_symbol_names(tu_path=None): + """Every func_/D_ symbol declared by engine_core.h/engine_types.h (and the target TU, if + given) — the set whose draft re-declarations are redundant + conflict-prone.""" + names = set() + for p in (EC, ET, tu_path): + if p and os.path.exists(p): + txt = open(p).read() + names |= set(re.findall(r'\b(func_[0-9A-Fa-f]+)\b', txt)) + names |= set(re.findall(r'\b(D_[0-9A-Fa-f]+)\b', txt)) + return names + + +def reconcile(fn, draft, canon_sig=None, tu_path=None): + amb = ambient_typedefs() + # 1) strip ambient-dup typedefs (identical definition only -> byte-neutral) + def strip_td(m): + name = m.group(1); norm = re.sub(r'\s+', ' ', m.group(0)).strip() + return '' if (name in amb and amb[name] == norm) else m.group(0) + draft = re.sub(r'typedef\s+struct\s*\{[^}{]*\}\s*([A-Za-z_]\w*)\s*;\n?', strip_td, draft) + + # 1b) strip the draft's redundant externs (func/data/memcpy) that engine_core.h/the TU declares + draft = strip_conflicting_externs(draft, ambient_symbol_names(tu_path)) + + # locate the definition signature (ret fn(params) {) + dm = re.search(r'\n((?:[A-Za-z_][\w ]*?\*?\s*)\b' + re.escape(fn) + r'\s*\([^;{]*\))\s*\n?\{', draft) + if not dm: + raise ValueError(f'no definition of {fn} found in draft') + draft_sig = dm.group(1) + dret, dparams = parse_sig(draft_sig, fn) + + # 2) determine canonical + canon_sig = canon_sig or canonical_from_engine_core(fn) + if not canon_sig: + # implicit-int-compatible fallback: s32 return + s32 params, keep draft arity + cret, cparams = 's32', [('s32', None)] * len(dparams) + else: + cret, cparams = parse_sig(canon_sig, fn) + + # 3) build the new param list (keep DRAFT names; use CANONICAL types positionally), + # and record which positions changed type (need at-use casts). + new_params, changed = [], [] + for i in range(max(len(dparams), len(cparams))): + dt, dn = dparams[i] if i < len(dparams) else (None, None) + ct, cn = cparams[i] if i < len(cparams) else (None, None) + if dt is None: # arity grow: canonical has an extra param + new_params.append(f'{ct} _unused{i}'); continue + if ct is None: # canonical shorter (rare) — keep draft param as-is + new_params.append(f'{dt} {dn}' if dn else dt); continue + ntd = re.sub(r'\s+', ' ', dt).strip() + ntc = re.sub(r'\s+', ' ', ct).strip() + if dn is None: + new_params.append(ct); continue + new_params.append(f'{ct} {dn}' if not ct.endswith('*') else f'{ct}{dn}') + if ntc != ntd: + changed.append((dn, dt)) + + new_sig = f'{cret} {fn}(' + ', '.join(new_params) + ')' + + # split body from the def line so casts only touch the body + head, body = draft[:dm.start(1)], draft[dm.end(1):] + for name, orig_type in changed: + body = cast_uses(body, name, orig_type) + + return head + new_sig + body + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument('--fn', required=True) + ap.add_argument('--draft', required=True) + ap.add_argument('--out', required=True) + ap.add_argument('--sig', default=None, help='explicit canonical sig (else engine_core.h / implicit-int)') + ap.add_argument('--tu', default=None, help='target TU .c (its already-declared symbols are treated as ambient)') + a = ap.parse_args() + out = reconcile(a.fn, open(a.draft).read(), a.sig, a.tu) + os.makedirs(os.path.dirname(a.out), exist_ok=True) + open(a.out, 'w').write(out) + canon = a.sig or canonical_from_engine_core(a.fn) or '(implicit-int s32-form)' + print(f'{a.fn}: reconciled -> {a.out} [canonical: {canon}]') + + +if __name__ == '__main__': + main()