diff --git a/.run/P36/delever/calibration.json b/.run/P36/delever/calibration.json index 94050cf0a..fafcfc633 100644 --- a/.run/P36/delever/calibration.json +++ b/.run/P36/delever/calibration.json @@ -1,5 +1,5 @@ { - "head": "242e2864c", + "head": "73fb6c442", "stamp": "15956e4a96c4", "generated": "2026-09-11 02:38", "aliases": [ @@ -21,206 +21,206 @@ "main": { "objects": 85, "identical": 85, - "seconds": 6.484999999999999, - "mean_s": 0.076 + "seconds": 6.350999999999997, + "mean_s": 0.075 }, "ov_SC03_014": { "objects": 32, "identical": 32, - "seconds": 4.385, + "seconds": 4.37, "mean_s": 0.137 }, "ov_SC03_015": { "objects": 32, "identical": 32, - "seconds": 4.223000000000001, - "mean_s": 0.132 + "seconds": 4.188000000000001, + "mean_s": 0.131 }, "ov_SC04_011": { "objects": 28, "identical": 28, - "seconds": 3.6639999999999997, - "mean_s": 0.131 + "seconds": 3.6850000000000005, + "mean_s": 0.132 } }, "per_object_seconds": { - "build/src/800.o": 0.695, - "build/src/800_b.o": 0.075, - "build/src/800_b_2.o": 0.276, - "build/src/800_b_o0a.o": 0.062, - "build/src/800_c.o": 0.188, - "build/src/800b2.o": 0.067, + "build/src/800.o": 0.706, + "build/src/800_b.o": 0.083, + "build/src/800_b_2.o": 0.299, + "build/src/800_b_o0a.o": 0.059, + "build/src/800_c.o": 0.175, + "build/src/800b2.o": 0.076, "build/src/apicard1.o": 0.065, - "build/src/apicard2.o": 0.058, - "build/src/apicard3.o": 0.073, - "build/src/apicard4.o": 0.081, - "build/src/apicard5.o": 0.07, - "build/src/apicard6.o": 0.095, - "build/src/apicard7.o": 0.064, - "build/src/boot.o": 0.084, - "build/src/gap.o": 0.077, - "build/src/libapi1.o": 0.086, - "build/src/libapi2.o": 0.063, - "build/src/libc2_1.o": 0.06, + "build/src/apicard2.o": 0.084, + "build/src/apicard3.o": 0.069, + "build/src/apicard4.o": 0.088, + "build/src/apicard5.o": 0.066, + "build/src/apicard6.o": 0.056, + "build/src/apicard7.o": 0.075, + "build/src/boot.o": 0.088, + "build/src/gap.o": 0.061, + "build/src/libapi1.o": 0.069, + "build/src/libapi2.o": 0.057, + "build/src/libc2_1.o": 0.055, "build/src/libc2_2.o": 0.057, - "build/src/libcd1.o": 0.072, - "build/src/libcd2.o": 0.059, - "build/src/libetc.o": 0.06, - "build/src/libgpu.o": 0.063, - "build/src/libgpu2.o": 0.052, - "build/src/libgs1.o": 0.058, - "build/src/libgs2.o": 0.047, - "build/src/libgs3.o": 0.056, - "build/src/libgs4.o": 0.064, - "build/src/libgs5.o": 0.064, - "build/src/libgs6.o": 0.071, + "build/src/libcd1.o": 0.066, + "build/src/libcd2.o": 0.062, + "build/src/libetc.o": 0.071, + "build/src/libgpu.o": 0.059, + "build/src/libgpu2.o": 0.056, + "build/src/libgs1.o": 0.057, + "build/src/libgs2.o": 0.049, + "build/src/libgs3.o": 0.053, + "build/src/libgs4.o": 0.052, + "build/src/libgs5.o": 0.058, + "build/src/libgs6.o": 0.075, "build/src/libgs7.o": 0.064, - "build/src/libgs8.o": 0.064, - "build/src/libgte1.o": 0.059, - "build/src/libgte10.o": 0.061, - "build/src/libgte11.o": 0.053, + "build/src/libgs8.o": 0.073, + "build/src/libgte1.o": 0.06, + "build/src/libgte10.o": 0.057, + "build/src/libgte11.o": 0.063, "build/src/libgte12.o": 0.063, - "build/src/libgte13.o": 0.055, - "build/src/libgte14.o": 0.06, - "build/src/libgte15.o": 0.06, - "build/src/libgte16.o": 0.062, - "build/src/libgte17.o": 0.061, - "build/src/libgte18.o": 0.058, - "build/src/libgte19.o": 0.058, + "build/src/libgte13.o": 0.052, + "build/src/libgte14.o": 0.066, + "build/src/libgte15.o": 0.07, + "build/src/libgte16.o": 0.066, + "build/src/libgte17.o": 0.065, + "build/src/libgte18.o": 0.062, + "build/src/libgte19.o": 0.059, "build/src/libgte2.o": 0.057, - "build/src/libgte20.o": 0.066, - "build/src/libgte21.o": 0.059, - "build/src/libgte22.o": 0.082, - "build/src/libgte23.o": 0.078, - "build/src/libgte24.o": 0.069, - "build/src/libgte25.o": 0.071, - "build/src/libgte26.o": 0.062, - "build/src/libgte27.o": 0.059, - "build/src/libgte28.o": 0.05, - "build/src/libgte29.o": 0.065, - "build/src/libgte3.o": 0.067, - "build/src/libgte30.o": 0.064, - "build/src/libgte4.o": 0.066, - "build/src/libgte5.o": 0.065, - "build/src/libgte6.o": 0.067, - "build/src/libgte7.o": 0.062, - "build/src/libgte8.o": 0.055, + "build/src/libgte20.o": 0.056, + "build/src/libgte21.o": 0.06, + "build/src/libgte22.o": 0.058, + "build/src/libgte23.o": 0.064, + "build/src/libgte24.o": 0.063, + "build/src/libgte25.o": 0.058, + "build/src/libgte26.o": 0.063, + "build/src/libgte27.o": 0.058, + "build/src/libgte28.o": 0.058, + "build/src/libgte29.o": 0.051, + "build/src/libgte3.o": 0.072, + "build/src/libgte30.o": 0.058, + "build/src/libgte4.o": 0.054, + "build/src/libgte5.o": 0.06, + "build/src/libgte6.o": 0.056, + "build/src/libgte7.o": 0.056, + "build/src/libgte8.o": 0.059, "build/src/libgte9.o": 0.063, - "build/src/libmcrd1.o": 0.071, - "build/src/libmcrd2.o": 0.07, - "build/src/libpad1.o": 0.066, - "build/src/libpad2.o": 0.067, - "build/src/sgap.o": 0.068, - "build/src/sgap_2.o": 0.083, - "build/src/sgap_3.o": 0.072, - "build/src/sgap_4.o": 0.07, - "build/src/sgap_5.o": 0.06, - "build/src/sgap_6.o": 0.067, - "build/src/sgap_8.o": 0.077, - "build/src/snd1.o": 0.068, - "build/src/snd10.o": 0.06, - "build/src/snd11.o": 0.06, - "build/src/snd12.o": 0.065, - "build/src/snd2.o": 0.075, - "build/src/snd3.o": 0.055, - "build/src/snd4.o": 0.061, - "build/src/snd5.o": 0.059, - "build/src/snd6.o": 0.066, - "build/src/snd7.o": 0.06, - "build/src/snd8.o": 0.055, - "build/src/snd9.o": 0.063, - "build/src/ov_SC03_014/ov_SC03_014.o": 0.111, - "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.493, - "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.372, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.055, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.064, - "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.116, - "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.146, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.113, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.076, - "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.075, - "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.168, + "build/src/libmcrd1.o": 0.069, + "build/src/libmcrd2.o": 0.049, + "build/src/libpad1.o": 0.064, + "build/src/libpad2.o": 0.064, + "build/src/sgap.o": 0.069, + "build/src/sgap_2.o": 0.068, + "build/src/sgap_3.o": 0.064, + "build/src/sgap_4.o": 0.064, + "build/src/sgap_5.o": 0.053, + "build/src/sgap_6.o": 0.06, + "build/src/sgap_8.o": 0.068, + "build/src/snd1.o": 0.074, + "build/src/snd10.o": 0.067, + "build/src/snd11.o": 0.064, + "build/src/snd12.o": 0.058, + "build/src/snd2.o": 0.069, + "build/src/snd3.o": 0.066, + "build/src/snd4.o": 0.063, + "build/src/snd5.o": 0.065, + "build/src/snd6.o": 0.063, + "build/src/snd7.o": 0.067, + "build/src/snd8.o": 0.052, + "build/src/snd9.o": 0.061, + "build/src/ov_SC03_014/ov_SC03_014.o": 0.125, + "build/src/ov_SC03_014/ov_SC03_014_after.o": 0.489, + "build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.387, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.06, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.059, + "build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.115, + "build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.145, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.099, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.081, + "build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.067, + "build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.159, "build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.067, - "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.175, - "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.102, - "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.063, + "build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.17, + "build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.091, + "build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.064, "build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.061, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.089, - "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.433, - "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.244, - "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.09, - "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.196, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.095, + "build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.454, + "build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.233, + "build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.089, + "build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.188, "build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.052, - "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.081, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.06, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.166, - "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.177, - "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.048, - "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.266, - "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.051, - "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.056, + "build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.086, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.064, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.14, + "build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.183, + "build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.049, + "build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.265, + "build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.059, + "build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.053, "build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.053, - "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.066, - "build/src/ov_SC03_015/ov_SC03_015.o": 0.106, - "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.474, - "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.384, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.046, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.048, - "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.112, - "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.132, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.104, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.062, - "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.058, - "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.179, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.063, - "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.142, - "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.089, - "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.051, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.061, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.09, - "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.432, - "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.228, - "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.09, - "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.186, - "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.055, - "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.1, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.06, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.152, - "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.189, - "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.044, - "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.256, + "build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.068, + "build/src/ov_SC03_015/ov_SC03_015.o": 0.099, + "build/src/ov_SC03_015/ov_SC03_015_after.o": 0.477, + "build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.358, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.051, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.039, + "build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.111, + "build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.124, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.098, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.07, + "build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.061, + "build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.168, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.066, + "build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.15, + "build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.079, + "build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.064, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.067, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.093, + "build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.426, + "build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.23, + "build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.083, + "build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.192, + "build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.053, + "build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.076, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.054, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.163, + "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.195, + "build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.045, + "build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.26, "build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.059, - "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.051, + "build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.054, "build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.054, - "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.066, - "build/src/ov_SC04_011/ov_SC04_011.o": 0.113, - "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.406, - "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.305, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.046, - "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.041, + "build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.069, + "build/src/ov_SC04_011/ov_SC04_011.o": 0.124, + "build/src/ov_SC04_011/ov_SC04_011_after.o": 0.408, + "build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.329, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.047, + "build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.054, "build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.118, - "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.14, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.104, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.078, - "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.05, - "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.164, + "build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.136, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.108, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.068, + "build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.057, + "build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.173, "build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.069, - "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.14, - "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.085, - "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.064, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.058, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.086, - "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.328, - "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.206, - "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.098, - "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.167, + "build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.147, + "build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.07, + "build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.066, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.06, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.079, + "build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.326, + "build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.207, + "build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.089, + "build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.154, "build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.058, - "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.078, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.053, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.093, - "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.41, - "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.055, - "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.051 + "build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.087, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.057, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.087, + "build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.406, + "build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.046, + "build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.055 }, "ok": true, "seconds": 2.1 diff --git a/.run/P36/delever/ledger.jsonl b/.run/P36/delever/ledger.jsonl index 050166264..060d74e33 100644 --- a/.run/P36/delever/ledger.jsonl +++ b/.run/P36/delever/ledger.jsonl @@ -29445,3 +29445,9 @@ {"ts": "2026-09-11 02:37:51", "label": "s104_e17", "rung": "E", "calib": {"head": "8ba79cb9e", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC05_010/ov_SC05_010_jr_8017C8D0.c", "fn": "func_8017E1D4", "addr": 2149048788, "aliases": null, "header": false, "includers": 0, "nhash_before": "339f47ffeb09f92752988df39dbc71128e2d1942", "nhash_after": "1333678984b8fea2ed719a0a84d9373e3b683c79", "source": ".run/P36/agents/ov_SC04_011__func_8017E558/scratch/copies/func_8017E1D4.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.115, "objects": ["build/src/ov_SC05_010/ov_SC05_010_jr_8017C8D0.o"], "before_text": "void func_8017E1D4(void *arg0) {\n extern GroupRec_801EB5C8_8017E02C D_801C6FA8[8];\n extern void func_8017E368();\n extern void func_80146C3C();\n s32 cnt2;\n s32 i;\n s32 j;\n register s32 base __asm__(\"$5\"); // !FAKE: pin $5 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n {\n register s32 sym __asm__(\"$2\") = (s32)((u8 *)D_801C6FA8); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus9)\n base = sym + i * 0x1D0;\n }\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n func_8017E368(arg0);\n }\n if (cnt2 == 0x80) {\n ((void (*)(u8 *))func_80146C3C)(arg0);\n }\n}\n", "after_text": "void func_8017E1D4(void *arg0) {\n extern GroupRec_801EB5C8_8017E02C D_801C6FA8[8];\n extern void func_8017E368();\n extern void func_80146C3C();\n s32 cnt2;\n s32 i;\n s32 j;\n s32 base;\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n base = (s32)((u8 *)D_801C6FA8 + i * 0x1D0);\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n func_8017E368(arg0, base);\n }\n if (cnt2 == 0x80) {\n ((void (*)(u8 *))func_80146C3C)(arg0);\n }\n}\n"} {"ts": "2026-09-11 02:38:09", "label": "s104_e17", "rung": "E", "calib": {"head": "88d261576", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c", "fn": "func_8017E7E8", "addr": 2149050344, "aliases": null, "header": false, "includers": 0, "nhash_before": "1286bb6391ade7b2a3c27c1fe85e55312e0937ce", "nhash_after": "686e03de753fef216b75593f6208064b7a840b75", "source": ".run/P36/agents/ov_SC04_011__func_8017E558/scratch/copies/func_8017E7E8.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.202, "objects": ["build/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.o"], "before_text": "void func_8017E7E8(void *arg0) {\n extern GroupRec_801EB5C8_8017E640 D_8019E1B8[8];\n extern void func_8017E97C(s32 a0, s32 a1);\n s32 cnt2;\n s32 i;\n s32 j;\n register s32 base __asm__(\"$5\"); // !FAKE: pin $5 \u2014 NEEDED DIFFERS (P36 rung B tus10)\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n {\n register s32 sym __asm__(\"$2\") = (s32)((u8 *)D_8019E1B8); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus10)\n base = sym + i * 0x1D0;\n }\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n ((void (*)(void *))func_8017E97C)(arg0);\n }\n if (cnt2 == 0x80) {\n ((void (*)(void *))func_80146C3C)(arg0);\n }\n}\n", "after_text": "void func_8017E7E8(void *arg0) {\n extern GroupRec_801EB5C8_8017E640 D_8019E1B8[8];\n extern void func_8017E97C(s32 a0, s32 a1);\n s32 cnt2;\n s32 i;\n s32 j;\n s32 base;\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n base = (s32)((u8 *)D_8019E1B8 + i * 0x1D0);\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n func_8017E97C((s32)arg0, base);\n }\n if (cnt2 == 0x80) {\n ((void (*)(void *))func_80146C3C)(arg0);\n }\n}\n"} {"ts": "2026-09-11 02:38:26", "label": "s104_e17", "rung": "E", "calib": {"head": "242e2864c", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC06_029/ov_SC06_029_jr_8017C954.c", "fn": "func_8017DDE0", "addr": 2149047776, "aliases": null, "header": false, "includers": 0, "nhash_before": "0585c82546daa5079a525f79b5dbb6eb32622346", "nhash_after": "3e3c08663c4f81afbe3881b09e8ddbee99821757", "source": ".run/P36/agents/ov_SC04_011__func_8017E558/scratch/copies/func_8017DDE0.c", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.208, "objects": ["build/src/ov_SC06_029/ov_SC06_029_jr_8017C954.o"], "before_text": "void func_8017DDE0(void *arg0) {\n typedef struct {\n u16 f0;\n u16 f2;\n u16 f4;\n u16 f6;\n u16 f8;\n u16 fA;\n s32 fC;\n s32 f10;\n s32 f14;\n s32 f18;\n } SubRec_801EB5C8_8017DC38; /* 0x1C */\n\n typedef struct {\n u16 g0;\n u16 g2;\n s32 g4;\n s32 g8;\n s32 gC;\n SubRec_801EB5C8_8017DC38 subs[16];\n } GroupRec_801EB5C8_8017DC38; /* 0x1D0 */\n\n extern GroupRec_801EB5C8_8017DC38 D_801DCCA8[8];\n /* \u00a717a-1: the fleet canonical for these callees is the NO-PROTOTYPE form,\n * with the intended signature applied AT THE CALL SITE. A concrete prototype\n * here collides with the sibling decls -> `conflicting types for ...`.\n * func_8017DF74 is defined later in this very TU as (s32, s32) and is called\n * here with one argument \u2014 () keeps that C89-compatible. */\n extern void func_8017DF74();\n extern void func_80146C3C();\n s32 cnt2;\n s32 i;\n s32 j;\n register s32 base __asm__(\"$5\"); // !FAKE: pin $5 \u2014 NEEDED DIFFERS (P36 rung B tus10)\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n {\n register s32 sym __asm__(\"$2\") = (s32)((u8 *)D_801DCCA8); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus10)\n base = sym + i * 0x1D0;\n }\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n func_8017DF74(arg0);\n }\n if (cnt2 == 0x80) {\n ((void (*)(u8 *))func_80146C3C)(arg0);\n }\n}\n", "after_text": "void func_8017DDE0(void *arg0) {\n typedef struct {\n u16 f0;\n u16 f2;\n u16 f4;\n u16 f6;\n u16 f8;\n u16 fA;\n s32 fC;\n s32 f10;\n s32 f14;\n s32 f18;\n } SubRec_801EB5C8_8017DC38; /* 0x1C */\n\n typedef struct {\n u16 g0;\n u16 g2;\n s32 g4;\n s32 g8;\n s32 gC;\n SubRec_801EB5C8_8017DC38 subs[16];\n } GroupRec_801EB5C8_8017DC38; /* 0x1D0 */\n\n extern GroupRec_801EB5C8_8017DC38 D_801DCCA8[8];\n /* \u00a717a-1: the fleet canonical for these callees is the NO-PROTOTYPE form,\n * with the intended signature applied AT THE CALL SITE. A concrete prototype\n * here collides with the sibling decls -> `conflicting types for ...`.\n * func_8017DF74 is defined later in this very TU as (s32, s32) and takes the\n * group base as its second argument (P36 S104 e17). */\n extern void func_8017DF74();\n extern void func_80146C3C();\n s32 cnt2;\n s32 i;\n s32 j;\n s32 base;\n s32 p;\n s32 vel;\n s32 pos;\n u16 life;\n s32 f18;\n\n cnt2 = 0;\n for (i = 0; i < 8; i++) {\n base = (s32)&D_801DCCA8[i];\n if (*(s16 *)(base) == 0) {\n *(s32 *)(base + 0xC) = *(s32 *)(base + 0xC) + 0x10000;\n }\n for (j = 0; j < 16; j++) {\n p = base + 0x10 + j * 0x1C;\n switch (*(s16 *)(p)) {\n case 0:\n vel = *(s32 *)(p + 0xC) + *(s32 *)(p + 0x10);\n pos = *(s32 *)(p + 0x14);\n life = *(u16 *)(p + 2) - 1;\n pos = pos + vel;\n *(s32 *)(p + 0x14) = pos;\n *(s32 *)(p + 0xC) = vel;\n *(u16 *)(p + 2) = life;\n if ((s16)life == -1) {\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + *(u16 *)(p + 6);\n *(u16 *)(p + 0xA) = *(u16 *)(p + 0xA) + 0x10;\n break;\n case 1:\n *(u16 *)(p + 4) = *(u16 *)(p + 4) + 0x80;\n f18 = *(s32 *)(p + 0x18) - 8;\n *(s32 *)(p + 0x18) = f18;\n if (f18 < 0) {\n *(s32 *)(p + 0x18) = 0;\n *(u16 *)(p) = *(u16 *)(p) + 1;\n }\n break;\n case 2:\n cnt2 = cnt2 + 1;\n break;\n }\n }\n func_8017DF74(arg0, base);\n }\n if (cnt2 == 0x80) {\n ((void (*)(u8 *))func_80146C3C)(arg0);\n }\n}\n"} +{"ts": "2026-09-11 02:38:44", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c", "fn": "func_8017DF84", "addr": 2149048196, "aliases": null, "header": false, "includers": 0, "nhash_before": "e767ad5c1533aed6d9a206d56ee8a4bc265faa74", "nhash_after": "080551179cbd22dfcabd9ea2d399b08aac63e58b", "source": "delever_regen R39 dup-join g.opz = za; @192", "verdict": "LEVER-FREE", "sites": [], "compiles": 2, "seconds": 0.201, "objects": ["build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o", "build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o"], "before_text": "void func_8017DF84(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n typedef struct { u32 w0, w1, w2; } Prim;\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n typedef struct { s16 vx; u16 vy; s16 vz, pad; } SVec;\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern short D_800B9A02;\n extern u16 D_8018F250[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec v[3]; /* sp+0xA0 */\n SVec vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec *vp;\n Prim *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n __asm__ volatile (\"\"); /* \u00a747 live-length slider (carried from the twin) */ // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus7)\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec *)va;\n v[1] = *(SVec *)vb;\n v[2] = *(SVec *)vc;\n w = w >> 16;\n v[0].vy += D_8018F250[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_8018F250[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_8018F250[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n }\n g.opz = za;\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec *)vd;\n vdv.vy += D_8018F250[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n", "after_text": "void func_8017DF84(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n typedef struct { u32 w0, w1, w2; } Prim;\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n typedef struct { s16 vx; u16 vy; s16 vz, pad; } SVec;\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern short D_800B9A02;\n extern u16 D_8018F250[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec v[3]; /* sp+0xA0 */\n SVec vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec *vp;\n Prim *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec *)va;\n v[1] = *(SVec *)vb;\n v[2] = *(SVec *)vc;\n w = w >> 16;\n v[0].vy += D_8018F250[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_8018F250[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_8018F250[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n }\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec *)vd;\n vdv.vy += D_8018F250[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n"} +{"ts": "2026-09-11 02:38:46", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c", "fn": "func_8017FA5C", "addr": 2149055068, "aliases": null, "header": false, "includers": 0, "nhash_before": "272245096f8be4a209b516d3f06dd1179745ef25", "nhash_after": "ecc7868648a76348a6c64041c1f43e5c6a952c43", "source": "delever_regen R39 dup-join g.opz = za; @187", "verdict": "LEVER-FREE", "sites": [], "compiles": 2, "seconds": 0.238, "objects": ["build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o", "build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o"], "before_text": "void func_8017FA5C(s32 arg0, s32 arg1, s32 arg2)\n{\n typedef struct { u32 w0, w1, w2; } Prim;\n /* vy UNSIGNED: the `+= xoff` reads it with lhu, not lh. */\n typedef struct { s16 vx; u16 vy; s16 vz, pad; } SVec;\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern short D_800B9A02;\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec v[3]; /* sp+0xA0 */\n SVec vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim;\n s32 nparts;\n s32 j;\n u32 nprim;\n u32 i;\n Part *part;\n SVec *vp;\n Prim *prim;\n u8 *pkt;\n u32 ot;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 xoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n vtx = *(u8 **)(arg1 + 0x10);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n xoff = arg2;\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + xoff;\n my = (wy >> 16) + xoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n __asm__ volatile (\"\"); /* \u00a747 live-length slider: splits the &g.sz0/&g.sz1 254/254 tie */ // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus8)\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec *)va;\n v[1] = *(SVec *)vb;\n v[2] = *(SVec *)vc;\n w = w >> 16;\n v[0].vy += xoff;\n v[1].vy += xoff;\n v[2].vy += xoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n }\n g.opz = za;\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0];\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & 0xFFFFFF) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & 0xFFFFFF);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec *)vd;\n vdv.vy += xoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0];\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & 0xFFFFFF) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & 0xFFFFFF);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n", "after_text": "void func_8017FA5C(s32 arg0, s32 arg1, s32 arg2)\n{\n typedef struct { u32 w0, w1, w2; } Prim;\n /* vy UNSIGNED: the `+= xoff` reads it with lhu, not lh. */\n typedef struct { s16 vx; u16 vy; s16 vz, pad; } SVec;\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern short D_800B9A02;\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec v[3]; /* sp+0xA0 */\n SVec vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim;\n s32 nparts;\n s32 j;\n u32 nprim;\n u32 i;\n Part *part;\n SVec *vp;\n Prim *prim;\n u8 *pkt;\n u32 ot;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 xoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n vtx = *(u8 **)(arg1 + 0x10);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n xoff = arg2;\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + xoff;\n my = (wy >> 16) + xoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec *)va;\n v[1] = *(SVec *)vb;\n v[2] = *(SVec *)vc;\n w = w >> 16;\n v[0].vy += xoff;\n v[1].vy += xoff;\n v[2].vy += xoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n }\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0];\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & 0xFFFFFF) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & 0xFFFFFF);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec *)vd;\n vdv.vy += xoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0];\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & 0xFFFFFF) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & 0xFFFFFF);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n"} +{"ts": "2026-09-11 02:38:47", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_111/ov_SC03_111_jr_8017EC58.c", "fn": "func_8017FB38", "addr": 2149055288, "aliases": null, "header": false, "includers": 0, "nhash_before": "272008100ff4e93c41842d4509deb7ff67f13305", "nhash_after": "0f4dd7a4878ac3a5e8b1bb37d6d41f3c501cb4da", "source": "delever_regen R39 dup-join g.opz = za; @189", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.14, "objects": ["build/src/ov_SC03_111/ov_SC03_111_jr_8017EC58.o"], "before_text": "void func_8017FB38(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern u16 D_801887C4[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec_8017FB38 v[3]; /* sp+0xA0 */\n SVec_8017FB38 vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec_8017FB38 *vp;\n Prim_8017FB38 *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n __asm__ volatile (\"\"); /* \u00a747 live-length slider (carried from the twin) */ // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus8)\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim_8017FB38 *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec_8017FB38 *)va;\n v[1] = *(SVec_8017FB38 *)vb;\n v[2] = *(SVec_8017FB38 *)vc;\n w = w >> 16;\n v[0].vy += D_801887C4[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_801887C4[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_801887C4[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n }\n g.opz = za;\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec_8017FB38 *)vd;\n vdv.vy += D_801887C4[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n", "after_text": "void func_8017FB38(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern u16 D_801887C4[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec_8017FB38 v[3]; /* sp+0xA0 */\n SVec_8017FB38 vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec_8017FB38 *vp;\n Prim_8017FB38 *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim_8017FB38 *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec_8017FB38 *)va;\n v[1] = *(SVec_8017FB38 *)vb;\n v[2] = *(SVec_8017FB38 *)vc;\n w = w >> 16;\n v[0].vy += D_801887C4[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_801887C4[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_801887C4[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n }\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec_8017FB38 *)vd;\n vdv.vy += D_801887C4[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n"} +{"ts": "2026-09-11 02:38:49", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.c", "fn": "func_8017E498", "addr": 2149049496, "aliases": null, "header": false, "includers": 0, "nhash_before": "2099da65cd0f59186d546e0265175f0503603284", "nhash_after": "261f94dc34eedec2984da29f4a160701352a2839", "source": "delever_regen R39 dup-join *(u16 *)(a0 + 0x34) += 1 @15", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.079, "objects": ["build/src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.o"], "before_text": "void func_8017E498(s32 a0) {\n u16 *mode = (u16 *)&D_80126B58; /* \u00a720: address force_reg'd into $s1 at entry */\n switch (*(u16 *)(a0 + 0x34)) {\n case 0:\n if (func_8012BE54(a0) < 0x1900) {\n if ((u32)(*mode - 2) >= 2) {\n if ((func_80029178(0x8C) & 0xFF) == 0) {\n func_80178B18(a0, (s32)D_8018865C);\n /* LOAD-BEARING (\u00a75a cross-jump barrier, zero bytes): without it\n jump2 tail-merges the two identical [set $a0][jal] arms into one\n shared call site and the function comes out 2 instructions short. */\n __asm__ __volatile__(\"\"); // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus8)\n } else {\n func_80178B18(a0, (s32)D_8018866C);\n }\n *(u16 *)(a0 + 0x34) += 1;\n }\n }\n break;\n case 1:\n if (((s32 (*)(s32))func_80178970)(a0) != 0) {\n ((void (*)(s32))func_80178D18)(a0);\n *(u16 *)(a0 + 0x34) = 3;\n if ((func_80029178(0x8C) & 0xFF) == 0) {\n *(u16 *)(a0 + 0x34) = 2;\n }\n }\n break;\n case 3:\n if (func_8012BE54(a0) < 0x1900) {\n if ((u32)(*mode - 2) >= 2) {\n if (func_8014CB58() == 4) {\n func_8014B598(4, (s32)D_80188350_p);\n if (func_8017CF24() != 0) {\n *(s16 *)(a0 + 0x84) = 0x5A;\n *(u16 *)(a0 + 0x34) += 1;\n }\n }\n }\n }\n break;\n case 4: {\n /* \u00a7167-10 \u2014 the guard read and the arm's re-read of this ONE signed-narrow\n lvalue are what mint the `addu $v1,$v0,$zero` copy AND the orphan 8 bytes of\n frame (0x28, not 0x20). Hoisting it into a local deletes both. */\n if (*(s16 *)(a0 + 0x84) != 0) {\n *(s16 *)(a0 + 0x84) = *(s16 *)(a0 + 0x84) - 1;\n if (*(s16 *)(a0 + 0x84) == 0) {\n func_800D0C48(0);\n }\n }\n if (((s32 (*)(void))func_8017CF40)() != 0) {\n s32 obj = *(s32 *)(a0 + 0xCC);\n if (obj != 0) {\n func_80180A70(obj);\n *(s32 *)(a0 + 0xCC) = 0;\n func_8017EA1C(a0);\n }\n *(u16 *)(a0 + 0x34) += 1;\n }\n break;\n }\n case 5:\n if (func_8014CB2C() < 0) {\n func_8016F0AC();\n func_8017E6A0(a0);\n }\n break;\n }\n}\n", "after_text": "void func_8017E498(s32 a0) {\n u16 *mode = (u16 *)&D_80126B58; /* \u00a720: address force_reg'd into $s1 at entry */\n switch (*(u16 *)(a0 + 0x34)) {\n case 0:\n if (func_8012BE54(a0) < 0x1900) {\n if ((u32)(*mode - 2) >= 2) {\n if ((func_80029178(0x8C) & 0xFF) == 0) {\n func_80178B18(a0, (s32)D_8018865C);\n /* LOAD-BEARING (\u00a75a cross-jump barrier, zero bytes): without it\n jump2 tail-merges the two identical [set $a0][jal] arms into one\n shared call site and the function comes out 2 instructions short. */\n *(u16 *)(a0 + 0x34) += 1;\n } else {\n func_80178B18(a0, (s32)D_8018866C);\n *(u16 *)(a0 + 0x34) += 1;\n }\n }\n }\n break;\n case 1:\n if (((s32 (*)(s32))func_80178970)(a0) != 0) {\n ((void (*)(s32))func_80178D18)(a0);\n *(u16 *)(a0 + 0x34) = 3;\n if ((func_80029178(0x8C) & 0xFF) == 0) {\n *(u16 *)(a0 + 0x34) = 2;\n }\n }\n break;\n case 3:\n if (func_8012BE54(a0) < 0x1900) {\n if ((u32)(*mode - 2) >= 2) {\n if (func_8014CB58() == 4) {\n func_8014B598(4, (s32)D_80188350_p);\n if (func_8017CF24() != 0) {\n *(s16 *)(a0 + 0x84) = 0x5A;\n *(u16 *)(a0 + 0x34) += 1;\n }\n }\n }\n }\n break;\n case 4: {\n /* \u00a7167-10 \u2014 the guard read and the arm's re-read of this ONE signed-narrow\n lvalue are what mint the `addu $v1,$v0,$zero` copy AND the orphan 8 bytes of\n frame (0x28, not 0x20). Hoisting it into a local deletes both. */\n if (*(s16 *)(a0 + 0x84) != 0) {\n *(s16 *)(a0 + 0x84) = *(s16 *)(a0 + 0x84) - 1;\n if (*(s16 *)(a0 + 0x84) == 0) {\n func_800D0C48(0);\n }\n }\n if (((s32 (*)(void))func_8017CF40)() != 0) {\n s32 obj = *(s32 *)(a0 + 0xCC);\n if (obj != 0) {\n func_80180A70(obj);\n *(s32 *)(a0 + 0xCC) = 0;\n func_8017EA1C(a0);\n }\n *(u16 *)(a0 + 0x34) += 1;\n }\n break;\n }\n case 5:\n if (func_8014CB2C() < 0) {\n func_8016F0AC();\n func_8017E6A0(a0);\n }\n break;\n }\n}\n"} +{"ts": "2026-09-11 02:38:51", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c", "fn": "func_80180A64", "addr": 2149059172, "aliases": null, "header": false, "includers": 0, "nhash_before": "7771cce64f44595f307c195082971b4e1656dd05", "nhash_after": "e8fd289879325f689985eb3460591b54e8830ecd", "source": "delever_regen R39 dup-join g.opz = za; @189", "verdict": "LEVER-FREE", "sites": [], "compiles": 2, "seconds": 0.183, "objects": ["build/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.o", "build/src/ov_SC03_119/ov_SC03_119_jr_8017FB84.o"], "before_text": "void func_80180A64(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern u16 D_8018DAB4[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec_80180A64 v[3]; /* sp+0xA0 */\n SVec_80180A64 vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec_80180A64 *vp;\n Prim_80180A64 *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n __asm__ volatile (\"\"); /* \u00a747 live-length slider (carried from the twin) */ // !FAKE: barrier \u2014 NEEDED DIFFERS (P36 rung B tus8)\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim_80180A64 *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec_80180A64 *)va;\n v[1] = *(SVec_80180A64 *)vb;\n v[2] = *(SVec_80180A64 *)vc;\n w = w >> 16;\n v[0].vy += D_8018DAB4[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_8018DAB4[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_8018DAB4[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n }\n g.opz = za;\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec_80180A64 *)vd;\n vdv.vy += D_8018DAB4[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n", "after_text": "void func_80180A64(s32 arg0, s32 arg1, s32 arg2, s32 arg3)\n{\n /* vy UNSIGNED: the `+=` reads it with lhu, not lh. */\n\n extern s32 func_800491EC(void);\n extern void func_800547D8(s32, MATRIX2 *);\n extern void func_80052E38(MATRIX2 *);\n extern u8 *D_800A5E60;\n extern u8 D_800A6610[];\n extern u16 D_8018DAB4[];\n\n DVECTOR2 tmpxy[4]; /* sp+0x10 */\n SVECTOR2 box[8]; /* sp+0x20 */\n SVECTOR2 sxy[8]; /* sp+0x60 */\n SVec_80180A64 v[3]; /* sp+0xA0 */\n SVec_80180A64 vdv; /* sp+0xB8 */\n MATRIX2 mtx; /* sp+0xC0 */\n struct { long otz, flag, opz, sz0, sz1, sz2, sz3; } g; /* sp+0xE0 */\n\n s32 lim; /* spill 0x100 */\n u32 ot; /* spill 0x108 */\n s32 nparts; /* spill 0x110 */\n s32 j;\n u32 nprim;\n u32 i;\n Part *part; /* spill 0x118 */\n SVec_80180A64 *vp;\n Prim_80180A64 *prim;\n u8 *pkt;\n u8 *vtx;\n u8 *va, *vb, *vc, *vd;\n u32 w;\n u32 m24;\n s32 code; /* SIGNED: the switch tree uses slti, not sltiu */\n u32 wx, wy, wz;\n s32 rot;\n s32 zoff;\n s32 xa32, xb32, t32;\n s32 xmn1, xmx1, xmn2, xmx2;\n s32 mnc, mxc;\n s16 my, mny, mx, mn;\n\n if (*(s32 *)arg0 == 0) {\n lim = func_800491EC() + *(s32 *)(arg0 + 0x64);\n func_800547D8(arg0 + 0x10, &mtx);\n func_80052E38(&mtx);\n pkt = D_800A5E60;\n\n nparts = *(s32 *)(arg1 + 8);\n ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];\n rot = arg2;\n zoff = arg3;\n vtx = *(u8 **)(arg1 + 0x10);\n part = (Part *)(arg1 + 0x14);\n\n for (j = 0; j < nparts; j++, part++) {\n wx = part->xx;\n mn = wx;\n mx = wx >> 16;\n wy = part->yy;\n mny = wy + zoff;\n my = (wy >> 16) + zoff;\n wz = part->zz;\n box[0].vx = mn; box[0].vy = mny; box[0].vz = wz;\n box[1].vx = mx; box[1].vy = mny; box[1].vz = wz;\n box[2].vx = mn; box[2].vy = mny; box[2].vz = wz >> 16;\n box[3].vx = mx; box[3].vy = mny; box[3].vz = wz >> 16;\n\n gte_ldv3c(&box[0]);\n gte_rtpt();\n gte_stsxy3(&sxy[0], &sxy[1], &sxy[2]);\n gte_ldv0(&box[3]);\n gte_rtps();\n\n box[4].vx = mn; box[4].vy = my; box[4].vz = wz;\n box[5].vx = mx; box[5].vy = my; box[5].vz = wz;\n box[6].vx = mn; box[6].vy = my; box[6].vz = wz >> 16;\n box[7].vx = mx; box[7].vy = my; box[7].vz = wz >> 16;\n\n gte_stsxy(&sxy[3]);\n gte_ldv3c(&box[4]);\n gte_rtpt();\n gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]);\n gte_ldv0(&box[7]);\n gte_rtps();\n gte_stsxy(&sxy[7]);\n gte_stszotz(&g.otz);\n\n if (lim >= g.otz) {\n xa32 = sxy[0].vx;\n xb32 = sxy[1].vx;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vx;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vx;\n xb32 = sxy[5].vx;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vx;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0xA0 && (s16)mnc < 0xA1) {\n xa32 = sxy[0].vy;\n xb32 = sxy[1].vy;\n if (xb32 < xa32) { xmx1 = xa32; xmn1 = xb32; } else { xmn1 = xa32; xmx1 = xb32; }\n t32 = sxy[2].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n t32 = sxy[3].vy;\n if (xmx1 < t32) xmx1 = t32; else if (t32 < xmn1) xmn1 = t32;\n xa32 = sxy[4].vy;\n xb32 = sxy[5].vy;\n if (xb32 < xa32) { xmx2 = xa32; xmn2 = xb32; } else { xmn2 = xa32; xmx2 = xb32; }\n t32 = sxy[6].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n t32 = sxy[7].vy;\n if (xmx2 < t32) xmx2 = t32; else if (t32 < xmn2) xmn2 = t32;\n mnc = xmn1;\n if (xmn2 < xmn1) mnc = xmn2;\n mxc = xmx1;\n if (mxc < xmx2) mxc = xmx2;\n if ((s16)mxc >= -0x6E && (s16)mnc < 0x6F) {\n prim = (Prim_80180A64 *)part->prim;\n nprim = part->nprim;\n for (i = 0; i < nprim; i++, prim++) {\n m24 = 0xFFFFFF;\n vp = &vdv;\n w = prim->w1;\n va = vtx + (w & 0xFFFF);\n vb = vtx + (w >> 16);\n w = prim->w2;\n vc = vtx + (w & 0xFFFF);\n v[0] = *(SVec_80180A64 *)va;\n v[1] = *(SVec_80180A64 *)vb;\n v[2] = *(SVec_80180A64 *)vc;\n w = w >> 16;\n v[0].vy += D_8018DAB4[(v[0].vz + rot) & 0xFF] + zoff;\n v[1].vy += D_8018DAB4[(v[1].vz + rot) & 0xFF] + zoff;\n v[2].vy += D_8018DAB4[(v[2].vz + rot) & 0xFF] + zoff;\n gte_ldv3c(&v[0]);\n gte_rtpt();\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_nclip();\n code = w & 7;\n vd = vtx + (w & 0xFFF8);\n gte_stopz(&g.opz);\n if (g.opz > 0) {\n switch (code) {\n case 6:\n case 7:\n gte_stsxy3_ft3(pkt);\n gte_stsz3(&g.sz0, &g.sz1, &g.sz2);\n if (((PolyFT3 *)pkt)->x0 > ((PolyFT3 *)pkt)->x1) {\n mx = ((PolyFT3 *)pkt)->x0;\n mn = ((PolyFT3 *)pkt)->x1;\n } else {\n mn = ((PolyFT3 *)pkt)->x0;\n mx = ((PolyFT3 *)pkt)->x1;\n }\n if (((PolyFT3 *)pkt)->x2 > mx) mx = ((PolyFT3 *)pkt)->x2;\n else if (((PolyFT3 *)pkt)->x2 < mn) mn = ((PolyFT3 *)pkt)->x2;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT3 *)pkt)->y0 > ((PolyFT3 *)pkt)->y1) {\n my = ((PolyFT3 *)pkt)->y0;\n mny = ((PolyFT3 *)pkt)->y1;\n } else {\n mny = ((PolyFT3 *)pkt)->y0;\n my = ((PolyFT3 *)pkt)->y1;\n }\n if (((PolyFT3 *)pkt)->y2 > my) my = ((PolyFT3 *)pkt)->y2;\n else if (((PolyFT3 *)pkt)->y2 < mny) mny = ((PolyFT3 *)pkt)->y2;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za;\n u32 *otp;\n u32 *tp;\n if (g.sz0 > g.sz1) {\n za = g.sz0;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n } else {\n za = g.sz1;\n if (za < g.sz2) za = g.sz2;\n g.opz = za;\n }\n if (code == 7) g.opz = za + 0x200;\n tp = (u32 *)prim->w0;\n ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT3 *)pkt)->uvc0 = tp[1];\n ((PolyFT3 *)pkt)->uvp1 = tp[2];\n ((PolyFT3 *)pkt)->uv2 = tp[3];\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x7000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n break;\n case 2:\n case 3:\n gte_stsxy3c(&tmpxy[0]);\n vdv = *(SVec_80180A64 *)vd;\n vdv.vy += D_8018DAB4[(vdv.vz + rot) & 0xFF] + zoff;\n gte_ldv0(vp);\n gte_rtps();\n if (tmpxy[0].vx > tmpxy[1].vx) {\n mx = tmpxy[0].vx;\n mn = tmpxy[1].vx;\n } else {\n mn = tmpxy[0].vx;\n mx = tmpxy[1].vx;\n }\n if (tmpxy[2].vx > mx) mx = tmpxy[2].vx;\n else if (tmpxy[2].vx < mn) mn = tmpxy[2].vx;\n if (tmpxy[0].vy > tmpxy[1].vy) {\n my = tmpxy[0].vy;\n mny = tmpxy[1].vy;\n } else {\n mny = tmpxy[0].vy;\n my = tmpxy[1].vy;\n }\n if (tmpxy[2].vy > my) my = tmpxy[2].vy;\n else if (tmpxy[2].vy < mny) mny = tmpxy[2].vy;\n gte_stflg(&g.flag);\n if (!(g.flag & 0x7F85E000)) {\n gte_stsz4(&g.sz0, &g.sz1, &g.sz2, &g.sz3);\n gte_stsxy((long *)&((PolyFT4 *)pkt)->x3);\n if (((PolyFT4 *)pkt)->x3 < mn) mn = ((PolyFT4 *)pkt)->x3;\n else if (mx < ((PolyFT4 *)pkt)->x3) mx = ((PolyFT4 *)pkt)->x3;\n if (mx >= -0xA0 && mn < 0xA1) {\n if (((PolyFT4 *)pkt)->y3 < mny) mny = ((PolyFT4 *)pkt)->y3;\n else if (my < ((PolyFT4 *)pkt)->y3) my = ((PolyFT4 *)pkt)->y3;\n if (my >= -0x6E && mny < 0x6F) {\n s32 za, zb;\n u32 *otp;\n u32 *tp;\n u32 uvw;\n zb = g.sz2;\n if (zb < g.sz3) zb = g.sz3;\n za = g.sz0;\n if (za < g.sz1) za = g.sz1;\n if (za < zb) za = zb;\n g.opz = za;\n if (code == 3) g.opz = za + 0x200;\n *(u32 *)&((PolyFT4 *)pkt)->x0 = *(u32 *)&tmpxy[0];\n *(u32 *)&((PolyFT4 *)pkt)->x1 = *(u32 *)&tmpxy[1];\n *(u32 *)&((PolyFT4 *)pkt)->x2 = *(u32 *)&tmpxy[2];\n tp = (u32 *)prim->w0;\n ((PolyFT4 *)pkt)->rgbc = tp[0] | 0x2000000;\n ((PolyFT4 *)pkt)->uvc0 = tp[1];\n ((PolyFT4 *)pkt)->uvp1 = tp[2];\n uvw = tp[3];\n ((PolyFT4 *)pkt)->uv2 = uvw;\n ((PolyFT4 *)pkt)->uv3 = uvw >> 16;\n otp = (u32 *)(((g.opz >> 2) << 2) + ot);\n *(u32 *)pkt = (*otp & m24) | 0x9000000;\n *otp = (*otp & 0xFF000000) | ((u32)pkt & m24);\n pkt += 0x28;\n }\n }\n }\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n D_800A5E60 = pkt;\n }\n}\n"} +{"ts": "2026-09-11 02:38:53", "label": "s104_r39", "rung": "E", "calib": {"head": "73fb6c442", "stamp": "15956e4a96c4"}, "tu": "src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c", "fn": "func_8017EDE8", "addr": 2149051880, "aliases": null, "header": false, "includers": 0, "nhash_before": "ec1e7ff2cb46a4b2658fe80a1aa9c25a972b42e9", "nhash_after": "cdcc4c81dbd3ad6147df9bc0606dc33f93fb779e", "source": "delever_regen R39 dup-join *(u16 *)((s32)a0 + 0x34) @36", "verdict": "LEVER-FREE", "sites": [], "compiles": 1, "seconds": 0.156, "objects": ["build/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.o"], "before_text": "void func_8017EDE8(void *a0)\n{\n u16 v1;\n\n v1 = *(u16 *)((s32)a0 + 0x34);\n switch (v1) {\n case 0:\n if (D_80078EBA == 3) {\n func_8017EC50((s32 *)a0);\n if (func_80185308(8) == 0) {\n return;\n }\n if (func_801846CC((s32)a0) == 0) {\n return;\n }\n {\n /* $v0 pin (cookbook \u00a772/\u00a7137): local-alloc gives the shorter-lived\n * `2` quantity $v0 and the 0xCC pointer $v1; the target has them the\n * other way round. The swap is invariant under every source\n * permutation tried (statement order, switch vs goto, hoisted\n * pointer, named constant) -- per \u00a7137 that invariance says the\n * lever is not in the source order, so the pointer is pinned.\n * The range is lw..sw inside this block and crosses no call, so\n * the \u00a774 caller-saved hazard does not apply. */\n register s32 *p __asm__(\"$2\"); // !FAKE: pin $2 \u2014 NEEDED DIFFERS (P36 rung B tus7)\n p = *(s32 **)((s32)a0 + 0xCC);\n *(s32 *)((s32)p + 0xB0) = 2;\n }\n func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60);\n } else {\n if (func_801846CC((s32)a0) == 0) {\n return;\n }\n func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60);\n }\n *(u16 *)((s32)a0 + 0x34) = 1;\n break;\n case 1:\n if (func_801846CC((s32)a0) != 0) {\n func_8017ECA0(a0);\n }\n break;\n }\n}\n", "after_text": "void func_8017EDE8(void *a0)\n{\n u16 v1;\n\n v1 = *(u16 *)((s32)a0 + 0x34);\n switch (v1) {\n case 0:\n if (D_80078EBA == 3) {\n func_8017EC50((s32 *)a0);\n if (func_80185308(8) == 0) {\n return;\n }\n if (func_801846CC((s32)a0) == 0) {\n return;\n }\n {\n /* $v0 pin (cookbook \u00a772/\u00a7137): local-alloc gives the shorter-lived\n * `2` quantity $v0 and the 0xCC pointer $v1; the target has them the\n * other way round. The swap is invariant under every source\n * permutation tried (statement order, switch vs goto, hoisted\n * pointer, named constant) -- per \u00a7137 that invariance says the\n * lever is not in the source order, so the pointer is pinned.\n * The range is lw..sw inside this block and crosses no call, so\n * the \u00a774 caller-saved hazard does not apply. */\n s32 *p;\n p = *(s32 **)((s32)a0 + 0xCC);\n *(s32 *)((s32)p + 0xB0) = 2;\n }\n func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60);\n *(u16 *)((s32)a0 + 0x34) = 1;\n } else {\n if (func_801846CC((s32)a0) == 0) {\n return;\n }\n func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60);\n *(u16 *)((s32)a0 + 0x34) = 1;\n }\n break;\n case 1:\n if (func_801846CC((s32)a0) != 0) {\n func_8017ECA0(a0);\n }\n break;\n }\n}\n"} diff --git a/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c b/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c index e8cf6ea38..c991cbb10 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c @@ -4707,7 +4707,6 @@ void func_8017DF84(s32 arg0, s32 arg1, s32 arg2, s32 arg3) gte_stsxy(&sxy[3]); gte_ldv3c(&box[4]); - __asm__ volatile (""); /* §47 live-length slider (carried from the twin) */ // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus7) gte_rtpt(); gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]); gte_ldv0(&box[7]); @@ -4811,11 +4810,12 @@ void func_8017DF84(s32 arg0, s32 arg1, s32 arg2, s32 arg3) if (g.sz0 > g.sz1) { za = g.sz0; if (za < g.sz2) za = g.sz2; + g.opz = za; } else { za = g.sz1; if (za < g.sz2) za = g.sz2; + g.opz = za; } - g.opz = za; if (code == 7) g.opz = za + 0x200; tp = (u32 *)prim->w0; ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000; diff --git a/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c b/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c index 09eb4dd94..13bd6cf19 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c @@ -3306,7 +3306,6 @@ void func_8017FA5C(s32 arg0, s32 arg1, s32 arg2) gte_stsxy(&sxy[3]); gte_ldv3c(&box[4]); - __asm__ volatile (""); /* §47 live-length slider: splits the &g.sz0/&g.sz1 254/254 tie */ // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus8) gte_rtpt(); gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]); gte_ldv0(&box[7]); @@ -3409,11 +3408,12 @@ void func_8017FA5C(s32 arg0, s32 arg1, s32 arg2) if (g.sz0 > g.sz1) { za = g.sz0; if (za < g.sz2) za = g.sz2; + g.opz = za; } else { za = g.sz1; if (za < g.sz2) za = g.sz2; + g.opz = za; } - g.opz = za; if (code == 7) g.opz = za + 0x200; tp = (u32 *)prim->w0; ((PolyFT3 *)pkt)->rgbc = tp[0]; diff --git a/src/ov_SC03_111/ov_SC03_111_jr_8017EC58.c b/src/ov_SC03_111/ov_SC03_111_jr_8017EC58.c index e89fc595b..0fd86951f 100644 --- a/src/ov_SC03_111/ov_SC03_111_jr_8017EC58.c +++ b/src/ov_SC03_111/ov_SC03_111_jr_8017EC58.c @@ -3170,7 +3170,6 @@ void func_8017FB38(s32 arg0, s32 arg1, s32 arg2, s32 arg3) gte_stsxy(&sxy[3]); gte_ldv3c(&box[4]); - __asm__ volatile (""); /* §47 live-length slider (carried from the twin) */ // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus8) gte_rtpt(); gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]); gte_ldv0(&box[7]); @@ -3274,11 +3273,12 @@ void func_8017FB38(s32 arg0, s32 arg1, s32 arg2, s32 arg3) if (g.sz0 > g.sz1) { za = g.sz0; if (za < g.sz2) za = g.sz2; + g.opz = za; } else { za = g.sz1; if (za < g.sz2) za = g.sz2; + g.opz = za; } - g.opz = za; if (code == 7) g.opz = za + 0x200; tp = (u32 *)prim->w0; ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000; diff --git a/src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.c b/src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.c index ed301c50e..ca52e0ea7 100644 --- a/src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.c +++ b/src/ov_SC03_117/ov_SC03_117_jr_8017BEBC.c @@ -4091,11 +4091,11 @@ void func_8017E498(s32 a0) { /* LOAD-BEARING (§5a cross-jump barrier, zero bytes): without it jump2 tail-merges the two identical [set $a0][jal] arms into one shared call site and the function comes out 2 instructions short. */ - __asm__ __volatile__(""); // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus8) + *(u16 *)(a0 + 0x34) += 1; } else { func_80178B18(a0, (s32)D_8018866C); + *(u16 *)(a0 + 0x34) += 1; } - *(u16 *)(a0 + 0x34) += 1; } } break; diff --git a/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c b/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c index 470d01b19..fddc5277f 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_8017FB84.c @@ -3192,7 +3192,6 @@ void func_80180A64(s32 arg0, s32 arg1, s32 arg2, s32 arg3) gte_stsxy(&sxy[3]); gte_ldv3c(&box[4]); - __asm__ volatile (""); /* §47 live-length slider (carried from the twin) */ // !FAKE: barrier — NEEDED DIFFERS (P36 rung B tus8) gte_rtpt(); gte_stsxy3(&sxy[4], &sxy[5], &sxy[6]); gte_ldv0(&box[7]); @@ -3296,11 +3295,12 @@ void func_80180A64(s32 arg0, s32 arg1, s32 arg2, s32 arg3) if (g.sz0 > g.sz1) { za = g.sz0; if (za < g.sz2) za = g.sz2; + g.opz = za; } else { za = g.sz1; if (za < g.sz2) za = g.sz2; + g.opz = za; } - g.opz = za; if (code == 7) g.opz = za + 0x200; tp = (u32 *)prim->w0; ((PolyFT3 *)pkt)->rgbc = tp[0] | 0x2000000; diff --git a/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c b/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c index 87774d76c..31f6654b9 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c @@ -4783,18 +4783,19 @@ void func_8017EDE8(void *a0) * lever is not in the source order, so the pointer is pinned. * The range is lw..sw inside this block and crosses no call, so * the §74 caller-saved hazard does not apply. */ - register s32 *p __asm__("$2"); // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B tus7) + s32 *p; p = *(s32 **)((s32)a0 + 0xCC); *(s32 *)((s32)p + 0xB0) = 2; } func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60); + *(u16 *)((s32)a0 + 0x34) = 1; } else { if (func_801846CC((s32)a0) == 0) { return; } func_801845FC((s32)a0, (s32)&D_801B95B0, 0, 0x60); + *(u16 *)((s32)a0 + 0x34) = 1; } - *(u16 *)((s32)a0 + 0x34) = 1; break; case 1: if (func_801846CC((s32)a0) != 0) {