Files
water111 08741f0a42 [jak2] float patch for bogus collide frags (#2686)
Should fix https://github.com/open-goal/jak-project/issues/2679

Here's a test program that will trigger the bug when near these guards:
```lisp
(define *cquery* (new 'global 'collide-query))

(defun test-bad-collide ()
  (let ((lower (new 'static 'vector  :x 1681893.8750  :y 61314.2031 :z 345208.6562 :w 1.))
        (upper (new 'static 'vector :x 1701603.8750 :y  67624.0625 :z 357881.0312 :w 1.))
        ;(cquery (new 'stack-no-clear 'collide-query))
        )
    (set! (-> *cquery* collide-with) (the-as collide-spec 1))
    (set! (-> *cquery* ignore-process0) #f)
    (set! (-> *cquery* ignore-process1) #f)
    (set! (-> *cquery* ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
    (set! (-> *cquery* action-mask) (collide-action solid))
    (set! (-> *cquery* bbox min quad) (-> lower quad))
    (set! (-> *cquery* bbox max quad) (-> upper quad))
    (format 0 "doing collide...~%")
    (fill-using-bounding-box *collide-cache* *cquery*)
    (format 0 "have ~d and ~d~%" (-> *collide-cache* num-tris) (-> *collide-cache* num-prims))
    )
  (none)
  )
```

As far as I can tell, there's a totally invalid collide-hash with an
inside `axis-scale.z`. On the PS2, it gets ignore because of how
float->int works for floats that are too big. On PC, it ends up using a
negative value and loop forever.
2023-06-04 15:19:08 -04:00

854 lines
35 KiB
Plaintext

b L1 | nop
nop | nop
b L2 | nop
nop | nop
b L13 | nop
nop | nop
b L21 | nop
nop | nop
nop | nop :e
nop | nop
;; ---------- memory layout
;; 0 - 4 camera
;; 4 - 119 upload4
;; 174 - 289 upload174
;; 344 - ?? upload344
;; 600 - ?? upload 600
;; 856 - 868 output0
;; 868 - 880 output1
;; 880 hmgescale
;; 881 invhscale
;; 882 texoffset
;; 883 texscale
;; 884 hvdfoff
;; 885 fog
;; 886 clrs[0]
;; 887 clrs[1]
;; 940 mystery[0]
;; 941 mystery[1]
;; 942 mystery[2]
;; 943 mystery[3]
;; ---------- vi's
;; vi01 - temp
;; vi02 - output addr
;; ----------- vf's
;; vf01 - output buffer addresses (rotated)
;; vf02 - hmgescale (constant)
;; vf03 - texoffset (constant)
;; vf04 - texscale (constant)
;; vf05 - hvdfoffset (constant)
;; vf06 - cpersx
;; vf07 - cpersy
;; vf08 - cpersz
;; vf09 - cpersw
;; vf12 - fog (constant)
;; vf13 - invhscale (constant)
;; MSCAL 10
L1:
iaddiu vi01, vi00, 0x358 | nop
iaddiu vi02, vi00, 0x364 | nop
mfir.x vf01, vi01 | nop
mfir.y vf01, vi02 | nop
mfir.z vf01, vi01 | nop
mfir.w vf01, vi02 | nop ;; vf01 = [856, 868, 856, 868]
lq.xyzw vf02, 880(vi00) | nop
lq.xyzw vf03, 882(vi00) | nop
lq.xyzw vf04, 883(vi00) | nop
lq.xyzw vf05, 884(vi00) | nop
lq.xyzw vf12, 885(vi00) | nop :e
lq.xyzw vf13, 881(vi00) | nop
;; END
;; mscal 2 init block.
L2:
iaddiu vi03, vi00, 0x158 | nop ;; vi03 = 344 (addr list)
ilwr.x vi08, vi03 | nop ;; vi08 = num tris
mtir vi02, vf01.x | nop ;; vi02 = output addr
iaddi vi03, vi03, 0x1 | addw.z vf25, vf00, vf00 ;; inc input ptr, set vf25.z = 1.
lq.xyzw vf25, 888(vi00) | addw.z vf26, vf00, vf00 ;; vf25 = adgif, vf26.z = 1.
lq.xyzw vf29, 889(vi00) | addw.z vf27, vf00, vf00 ;; vf29 = texflush, vf27.z = 1.
lq.xyzw vf30, 891(vi00) | addw.z vf28, vf00, vf00 ;; vf30 = trigif, vf28.z = 1.
lq.xyzw vf06, 0(vi00) | nop ;; vf06 -> vf09 = camera
lq.xyzw vf07, 1(vi00) | nop
lq.xyzw vf08, 2(vi00) | nop
lq.xyzw vf09, 3(vi00) | nop
mtir vi01, vf01.y | nop ;; vi01 is the second output buffer
sq.xyzw vf25, 0(vi02) | nop ;; init output buffers
sq.xyzw vf29, 1(vi02) | nop
sq.xyzw vf30, 2(vi02) | nop
sq.xyzw vf25, 0(vi01) | nop
sq.xyzw vf29, 1(vi01) | nop
sq.xyzw vf30, 2(vi01) | nop
;; mscal happy loop, from in344.
L3:
lqi.xyzw vf16, vi03 | nop ;; load tri addrs
nop | nop
nop | nop
nop | nop
mtir vi04, vf16.x | nop ;; vi04 = v0 addr
mtir vi05, vf16.y | nop ;; vi05 = v1 addr
mtir vi06, vf16.z | nop ;; vi06 = v2 add4r
nop | nop
lq.xyzw vf17, 4(vi04) | nop ;; load vertices from upload4 data: vf17 = v0 pos
lq.xyzw vf18, 4(vi05) | nop ;; vf18 = v1 pos
lq.xyzw vf19, 4(vi06) | nop ;; vf19 = v2 pos
nop | mulaw.xyzw ACC, vf09, vf00 ;; transform v0
move.xyzw vf15, vf17 | maddax.xyzw ACC, vf06, vf17 ;; vf15 = pre-transformed v0
nop | madday.xyzw ACC, vf07, vf17
nop | maddz.xyzw vf17, vf08, vf17 ;; vf17 = transformed(v0)
nop | mulaw.xyzw ACC, vf09, vf00 ;; start v1 trans
nop | sub.xyzw vf29, vf18, vf15 ;; vf29 = (v1 - v0) (pre-trans)
nop | sub.xyzw vf30, vf19, vf15 ;; vf30 = (v2 - v0) (pre-trans)
div Q, vf12.x, vf17.w | maddax.xyzw ACC, vf06, vf18 ;; Q = fog.x / transformed(v0).w, v1 trans
nop | mul.xyzw vf21, vf17, vf02 ;; vf21 = hmge_scale * transformed(v0)
nop | madday.xyzw ACC, vf07, vf18 ;; v1 trans
nop | maddz.xyzw vf18, vf08, vf18 ;; v1 trans, vf18 = transformed(v1)
nop | mulaw.xyzw ACC, vf09, vf00 ;; v2 trans
nop | maddax.xyzw ACC, vf06, vf19 ;; v2 trans
nop | madday.xyzw ACC, vf07, vf19 ;; v2 trans
div Q, vf12.x, vf18.w | mul.xyz vf17, vf17, Q ;; do perspective divide (transform(v0).xyz * fog.x / tf(v0).w)
nop | maddz.xyzw vf19, vf08, vf19 ;; vf19 = transformed(v2)
nop | mul.xyzw vf22, vf18, vf02 ;; vf22 = hmge_scale * transformed(v1)
nop | opmula.xyz ACC, vf29, vf30 ;; cross (v1 - v0) x (v2 - v0)
nop | add.xy vf25, vf17, vf03 ;; vf25 = v0's texture
nop | mulw.z vf17, vf17, vf12 ;; multiply by weird fog value.
nop | opmsub.xyz vf29, vf30, vf29 ;; vf29 = finish cross
div Q, vf12.x, vf19.w | mul.xyz vf18, vf18, Q ;; v1's perspective
nop | mul.xyzw vf23, vf19, vf02 ;; v2's hmge
nop | mul.xyz vf29, vf29, vf15 ;; dot with pre-trans v0 (kind sketch?)
nop | add.xy vf26, vf18, vf03 ;; v1's texture
nop | add.xyzw vf17, vf17, vf05 ;; v0's hvdf offset
nop | mulw.z vf18, vf18, vf12 ;; v1's fog 1/-1
nop | mul.xy vf25, vf25, vf04 ;; v0's texture scale
nop | mul.xyz vf19, vf19, Q ;; v2's perspective
nop | ftoi4.xyzw vf17, vf17 ;; v0 to GS format
fcset 0x0 | addy.x vf29, vf29, vf29 ;; dot product sum, clear add flags
nop | add.xyzw vf18, vf18, vf05 ;; v1's hvdf
nop | clipw.xyz vf21, vf21 ;; v0's clip
nop | mulw.z vf19, vf19, vf12 ;; v2's fog mult
sq.xyzw vf25, 4(vi02) | mul.xy vf26, vf26, vf04 ;; texscale
sq.xyzw vf17, 5(vi02) | addz.x vf29, vf29, vf29 ;; dot PRODUCT!
nop | ftoi4.xyzw vf18, vf18 ;; v1's ftoi
nop | add.xy vf27, vf19, vf03 ;; v2's texoffset
sq.xyzw vf26, 6(vi02) | add.xyzw vf19, vf19, vf05 ;; v2's hvdf
fsand vi01, 0x2 | clipw.xyz vf22, vf22 ;; check dp, clip v1
sq.xyzw vf18, 7(vi02) | clipw.xyz vf23, vf23 ;; clip v1
ibeq vi00, vi01, L4 | mul.xy vf27, vf27, vf04 ;; texscale
nop | nop
b L5 | nop
lq.xyzw vf31, 887(vi00) | nop ;; vf31 is one of the colors.
L4:
lq.xyzw vf31, 886(vi00) | nop
L5:
fcand vi01, 0x3ffff | ftoi4.xyzw vf19, vf19 ;; last ftoi
ibne vi00, vi01, L11 | nop ;; ssee if we need to do clipping.
iaddi vi08, vi08, -0x1 | nop ;; dec tri count
sq.xyzw vf27, 8(vi02) | nop
sq.xyzw vf31, 3(vi02) | nop
sq.xyzw vf19, 9(vi02) | nop
xgkick vi02 | nop ;; KICK
mtir vi02, vf01.y | nop ;; next output buffer
mr32.xyzw vf01, vf01 | nop
L6:
ibgtz vi08, L3 | nop ;; check tri count
nop | nop
;; next happy loop
iaddiu vi03, vi00, 0x158 | nop
ilwr.x vi08, vi03 | nop
ilwr.y vi01, vi03 | nop
iaddi vi03, vi03, 0x1 | nop
L7:
lqi.xyzw vf16, vi03 | nop
nop | nop
nop | nop
mtir vi04, vf16.x | nop
mtir vi05, vf16.y | nop
mtir vi06, vf16.z | nop
nop | nop
lq.xyzw vf17, 174(vi04) | nop
lq.xyzw vf18, 174(vi06) | nop
lq.xyzw vf19, 174(vi05) | nop
nop | mulaw.xyzw ACC, vf09, vf00
move.xyzw vf15, vf17 | maddax.xyzw ACC, vf06, vf17
nop | madday.xyzw ACC, vf07, vf17
nop | maddz.xyzw vf17, vf08, vf17
nop | mulaw.xyzw ACC, vf09, vf00
nop | sub.xyzw vf29, vf18, vf15
nop | sub.xyzw vf30, vf19, vf15
div Q, vf12.x, vf17.w | maddax.xyzw ACC, vf06, vf18
nop | mul.xyzw vf21, vf17, vf02
nop | madday.xyzw ACC, vf07, vf18
nop | maddz.xyzw vf18, vf08, vf18
nop | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf19
nop | madday.xyzw ACC, vf07, vf19
div Q, vf12.x, vf18.w | mul.xyz vf17, vf17, Q
nop | maddz.xyzw vf19, vf08, vf19
nop | mul.xyzw vf22, vf18, vf02
nop | opmula.xyz ACC, vf29, vf30
nop | add.xy vf25, vf17, vf03
nop | mulw.z vf17, vf17, vf12
nop | opmsub.xyz vf29, vf30, vf29
div Q, vf12.x, vf19.w | mul.xyz vf18, vf18, Q
nop | mul.xyzw vf23, vf19, vf02
nop | mul.xyz vf29, vf29, vf15
nop | add.xy vf26, vf18, vf03
nop | add.xyzw vf17, vf17, vf05
nop | mulw.z vf18, vf18, vf12
nop | mul.xy vf25, vf25, vf04
nop | mul.xyz vf19, vf19, Q
nop | ftoi4.xyzw vf17, vf17
fcset 0x0 | addy.x vf29, vf29, vf29
nop | add.xyzw vf18, vf18, vf05
nop | clipw.xyz vf21, vf21
sq.xyzw vf25, 4(vi02) | mulw.z vf19, vf19, vf12
sq.xyzw vf17, 5(vi02) | mul.xy vf26, vf26, vf04
iaddi vi08, vi08, -0x1 | addz.x vf29, vf29, vf29
nop | ftoi4.xyzw vf18, vf18
nop | add.xy vf27, vf19, vf03
sq.xyzw vf26, 6(vi02) | add.xyzw vf19, vf19, vf05
fsand vi01, 0x2 | clipw.xyz vf22, vf22
sq.xyzw vf18, 7(vi02) | clipw.xyz vf23, vf23
ibeq vi00, vi01, L8 | mul.xy vf27, vf27, vf04
nop | nop
b L9 | nop
lq.xyzw vf31, 887(vi00) | nop
L8:
lq.xyzw vf31, 886(vi00) | nop
L9:
fcand vi01, 0x3ffff | ftoi4.xyzw vf19, vf19
ibne vi00, vi01, L12 | nop
sq.xyzw vf27, 8(vi02) | nop
sq.xyzw vf31, 3(vi02) | nop
sq.xyzw vf19, 9(vi02) | nop
xgkick vi02 | nop
mtir vi02, vf01.y | nop
mr32.xyzw vf01, vf01 | nop
L10:
ibgtz vi08, L7 | nop
nop | nop
nop | nop :e
nop | nop
L11:
sq.xyzw vf21, 1000(vi00) | nop
sq.xyzw vf22, 1003(vi00) | nop
sq.xyzw vf23, 1006(vi00) | nop
sq.xyzw vf31, 942(vi00) | nop
mfir.x vf29, vi02 | nop
mfir.y vf29, vi03 | nop
mfir.z vf29, vi07 | nop
bal vi15, L36 | nop
mfir.w vf29, vi08 | nop
mtir vi08, vf29.w | nop
mtir vi03, vf29.y | nop
mtir vi07, vf29.z | nop
b L6 | nop
mtir vi02, vf29.x | nop
L12:
sq.xyzw vf21, 1000(vi00) | nop
sq.xyzw vf22, 1003(vi00) | nop
sq.xyzw vf23, 1006(vi00) | nop
sq.xyzw vf31, 942(vi00) | nop
mfir.x vf29, vi02 | nop
mfir.y vf29, vi03 | nop
mfir.z vf29, vi07 | nop
bal vi15, L36 | nop
mfir.w vf29, vi08 | nop
mtir vi08, vf29.w | nop
mtir vi03, vf29.y | nop
mtir vi07, vf29.z | nop
b L10 | nop
mtir vi02, vf29.x | nop
L13:
iaddiu vi03, vi00, 0x258 | nop ;; vi03 = 600
ilwr.x vi08, vi03 | nop ;; num quads
mtir vi02, vf01.x | nop ;; output buffer
iaddi vi03, vi03, 0x1 | addw.z vf25, vf00, vf00 ;; set 1's in texture
lq.xyzw vf25, 888(vi00) | addw.z vf26, vf00, vf00
lq.xyzw vf29, 889(vi00) | addw.z vf27, vf00, vf00
lq.xyzw vf30, 892(vi00) | nop ;;oops they forget vf28??
lq.xyzw vf06, 0(vi00) | nop
lq.xyzw vf07, 1(vi00) | nop
lq.xyzw vf08, 2(vi00) | nop
lq.xyzw vf09, 3(vi00) | nop
mtir vi01, vf01.y | nop
sq.xyzw vf25, 0(vi02) | nop
sq.xyzw vf29, 1(vi02) | nop
sq.xyzw vf30, 2(vi02) | nop
sq.xyzw vf25, 0(vi01) | nop
sq.xyzw vf29, 1(vi01) | nop
sq.xyzw vf30, 2(vi01) | nop
L14:
lqi.xyzw vf16, vi03 | nop
nop | nop
nop | nop
nop | nop
mtir vi06, vf16.z | nop
mtir vi04, vf16.x | nop
mtir vi05, vf16.y | nop
nop | nop
ibeq vi00, vi06, L15 | nop
nop | nop
lq.xyzw vf17, 4(vi04) | nop
lq.xyzw vf18, 4(vi05) | nop
lq.xyzw vf19, 174(vi05) | nop
b L16 | nop
lq.xyzw vf20, 174(vi04) | nop
L15:
lq.xyzw vf17, 4(vi05) | nop
lq.xyzw vf18, 4(vi04) | nop
lq.xyzw vf19, 174(vi04) | nop
lq.xyzw vf20, 174(vi05) | nop
L16:
move.xyzw vf15, vf17 | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf17
nop | madday.xyzw ACC, vf07, vf17
nop | maddz.xyzw vf17, vf08, vf17
nop | mulaw.xyzw ACC, vf09, vf00
nop | sub.xyzw vf29, vf18, vf15
nop | sub.xyzw vf30, vf19, vf15
div Q, vf12.x, vf17.w | maddax.xyzw ACC, vf06, vf18
nop | mul.xyzw vf21, vf17, vf02
nop | madday.xyzw ACC, vf07, vf18
nop | maddz.xyzw vf18, vf08, vf18
nop | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf19
nop | madday.xyzw ACC, vf07, vf19
div Q, vf12.x, vf18.w | mul.xyz vf17, vf17, Q
nop | maddz.xyzw vf19, vf08, vf19
nop | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf20
nop | madday.xyzw ACC, vf07, vf20
nop | maddz.xyzw vf20, vf08, vf20
nop | mul.xyzw vf22, vf18, vf02
div Q, vf12.x, vf19.w | mul.xyz vf18, vf18, Q
nop | add.xy vf25, vf17, vf03
nop | mulw.z vf17, vf17, vf12
nop | opmula.xyz ACC, vf29, vf30
nop | opmsub.xyz vf29, vf30, vf29
nop | mul.xyzw vf23, vf19, vf02
nop | mul.xyz vf29, vf29, vf15
div Q, vf12.x, vf20.w | mul.xyz vf19, vf19, Q
nop | add.xyzw vf17, vf17, vf05
nop | mul.xyzw vf24, vf20, vf02
nop | mul.xy vf25, vf25, vf04
nop | nop
nop | ftoi4.xyzw vf17, vf17
nop | add.xy vf26, vf18, vf03
nop | mul.xyz vf20, vf20, Q
nop | mulw.z vf18, vf18, vf12
nop | addy.x vf29, vf29, vf29
sq.xyzw vf25, 4(vi02) | nop
sq.xyzw vf17, 5(vi02) | nop
nop | add.xyzw vf18, vf18, vf05
nop | clipw.xyz vf21, vf21
nop | mul.xy vf26, vf26, vf04
nop | addz.x vf29, vf29, vf29
nop | ftoi4.xyzw vf18, vf18
nop | add.xy vf27, vf19, vf03
sq.xyzw vf26, 6(vi02) | mulw.z vf19, vf19, vf12
fsand vi01, 0x2 | clipw.xyz vf22, vf22
sq.xyzw vf18, 7(vi02) | clipw.xyz vf23, vf23
nop | clipw.xyz vf24, vf24
nop | add.xy vf28, vf20, vf03
nop | mulw.z vf20, vf20, vf12
nop | mul.xy vf27, vf27, vf04
nop | add.xyzw vf19, vf19, vf05
nop | nop
ibeq vi00, vi01, L17 | mul.xy vf28, vf28, vf04
nop | add.xyzw vf20, vf20, vf05
b L18 | nop
lq.xyzw vf31, 887(vi00) | nop
L17:
lq.xyzw vf31, 886(vi00) | nop
L18:
fcand vi01, 0xffffff | ftoi4.xyzw vf19, vf19
ibne vi00, vi01, L20 | nop
iaddi vi08, vi08, -0x1 | nop
sq.xyzw vf27, 8(vi02) | ftoi4.xyzw vf20, vf20
sq.xyzw vf31, 3(vi02) | nop
sq.xyzw vf19, 9(vi02) | nop
sq.xyzw vf28, 10(vi02) | nop
sq.xyzw vf20, 11(vi02) | nop
xgkick vi02 | nop
mtir vi02, vf01.y | nop
mr32.xyzw vf01, vf01 | nop
L19:
ibgtz vi08, L14 | nop
nop | nop
nop | nop :e
nop | nop
L20:
sq.xyzw vf21, 1000(vi00) | nop
sq.xyzw vf22, 1003(vi00) | nop
sq.xyzw vf23, 1006(vi00) | nop
sq.xyzw vf24, 1009(vi00) | nop
sq.xyzw vf31, 942(vi00) | nop
mfir.x vf29, vi02 | nop
mfir.y vf29, vi03 | nop
mfir.z vf29, vi07 | nop
bal vi15, L37 | nop
mfir.w vf29, vi08 | nop
mtir vi08, vf29.w | nop
mtir vi03, vf29.y | nop
mtir vi07, vf29.z | nop
b L19 | nop
mtir vi02, vf29.x | nop
;;;;;;;;;; WEIRD TRIANGLES
L21:
iaddiu vi03, vi00, 0x158 | nop
ilwr.x vi08, vi03 | nop
mtir vi02, vf01.x | nop
iaddi vi03, vi03, 0x1 | addw.z vf25, vf00, vf00
lq.xyzw vf25, 888(vi00) | addw.z vf26, vf00, vf00
lq.xyzw vf29, 889(vi00) | addw.z vf27, vf00, vf00
lq.xyzw vf30, 891(vi00) | addw.z vf28, vf00, vf00
lq.xyzw vf06, 0(vi00) | nop
lq.xyzw vf07, 1(vi00) | nop
lq.xyzw vf08, 2(vi00) | nop
lq.xyzw vf09, 3(vi00) | nop
mtir vi01, vf01.y | nop
sq.xyzw vf25, 0(vi02) | nop
sq.xyzw vf29, 1(vi02) | nop
sq.xyzw vf30, 2(vi02) | nop
sq.xyzw vf25, 0(vi01) | nop
sq.xyzw vf29, 1(vi01) | nop
sq.xyzw vf30, 2(vi01) | nop
L22:
lqi.xyzw vf16, vi03 | nop
nop | nop
nop | nop
nop | nop
mtir vi01, vf16.w | nop
mtir vi04, vf16.x | nop
mtir vi05, vf16.y | nop
mtir vi06, vf16.z | nop
ibeq vi00, vi01, L23 | nop
lq.xyzw vf17, 4(vi04) | nop
lq.xyzw vf18, 4(vi05) | nop
b L24 | nop
lq.xyzw vf19, 4(vi06) | nop
L23:
lq.xyzw vf19, 4(vi05) | nop
lq.xyzw vf18, 4(vi06) | nop
L24:
nop | mulaw.xyzw ACC, vf09, vf00
move.xyzw vf15, vf17 | maddax.xyzw ACC, vf06, vf17
nop | madday.xyzw ACC, vf07, vf17
nop | sub.xyzw vf29, vf18, vf17
nop | sub.xyzw vf30, vf19, vf17
nop | maddz.xyzw vf17, vf08, vf17
nop | mulaw.xyzw ACC, vf09, vf00
div Q, vf12.x, vf17.w | maddax.xyzw ACC, vf06, vf18
nop | madday.xyzw ACC, vf07, vf18
nop | mul.xyzw vf21, vf17, vf02
nop | maddz.xyzw vf18, vf08, vf18
nop | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf19
nop | madday.xyzw ACC, vf07, vf19
div Q, vf12.x, vf18.w | mul.xyz vf17, vf17, Q
nop | maddz.xyzw vf19, vf08, vf19
nop | mul.xyzw vf22, vf18, vf02
nop | opmula.xyz ACC, vf29, vf30
nop | opmsub.xyz vf29, vf30, vf29
nop | add.xy vf25, vf17, vf03
nop | mulw.z vf17, vf17, vf12
div Q, vf12.x, vf19.w | mul.xyz vf18, vf18, Q
nop | mul.xyzw vf23, vf19, vf02
nop | mul.xyz vf29, vf29, vf15
nop | add.xyzw vf17, vf17, vf05
nop | mul.xy vf25, vf25, vf04
nop | nop
nop | ftoi4.xyzw vf17, vf17
nop | add.xy vf26, vf18, vf03
nop | mulw.z vf18, vf18, vf12
fcset 0x0 | addy.x vf29, vf29, vf29
nop | mul.xyz vf19, vf19, Q
sq.xyzw vf25, 4(vi02) | nop
sq.xyzw vf17, 5(vi02) | add.xyzw vf18, vf18, vf05
nop | clipw.xyz vf21, vf21
nop | mul.xy vf26, vf26, vf04
nop | addz.x vf29, vf29, vf29
nop | ftoi4.xyzw vf18, vf18
nop | add.xy vf27, vf19, vf03
sq.xyzw vf26, 6(vi02) | mulw.z vf19, vf19, vf12
fsand vi01, 0x2 | clipw.xyz vf22, vf22
sq.xyzw vf18, 7(vi02) | clipw.xyz vf23, vf23
ibeq vi00, vi01, L25 | mul.xy vf27, vf27, vf04
nop | add.xyzw vf19, vf19, vf05
b L26 | nop
lq.xyzw vf31, 887(vi00) | nop
L25:
lq.xyzw vf31, 886(vi00) | nop
L26:
fcand vi01, 0x3ffff | ftoi4.xyzw vf19, vf19
ibne vi00, vi01, L34 | nop
iaddi vi08, vi08, -0x1 | nop
sq.xyzw vf27, 8(vi02) | nop
sq.xyzw vf31, 3(vi02) | nop
sq.xyzw vf19, 9(vi02) | nop
xgkick vi02 | nop
mtir vi02, vf01.y | nop
mr32.xyzw vf01, vf01 | nop
L27:
ibgtz vi08, L22 | nop
nop | nop
iaddiu vi03, vi00, 0x158 | nop
ilwr.x vi08, vi03 | nop
ilwr.y vi01, vi03 | nop
iaddi vi03, vi03, 0x1 | nop
L28:
lqi.xyzw vf16, vi03 | nop
nop | nop
nop | nop
mtir vi01, vf16.w | nop
mtir vi04, vf16.x | nop
mtir vi05, vf16.y | nop
mtir vi06, vf16.z | nop
ibne vi00, vi01, L29 | nop
lq.xyzw vf17, 174(vi04) | nop
lq.xyzw vf18, 174(vi05) | nop
b L30 | nop
lq.xyzw vf19, 174(vi06) | nop
L29:
lq.xyzw vf19, 174(vi05) | nop
lq.xyzw vf18, 174(vi06) | nop
L30:
nop | mulaw.xyzw ACC, vf09, vf00
move.xyzw vf15, vf17 | maddax.xyzw ACC, vf06, vf17
nop | madday.xyzw ACC, vf07, vf17
nop | maddz.xyzw vf17, vf08, vf17
nop | mulaw.xyzw ACC, vf09, vf00
nop | sub.xyzw vf29, vf18, vf15
nop | sub.xyzw vf30, vf19, vf15
div Q, vf12.x, vf17.w | maddax.xyzw ACC, vf06, vf18
nop | mul.xyzw vf21, vf17, vf02
nop | madday.xyzw ACC, vf07, vf18
nop | maddz.xyzw vf18, vf08, vf18
nop | mulaw.xyzw ACC, vf09, vf00
nop | maddax.xyzw ACC, vf06, vf19
nop | madday.xyzw ACC, vf07, vf19
div Q, vf12.x, vf18.w | mul.xyz vf17, vf17, Q
nop | maddz.xyzw vf19, vf08, vf19
nop | mul.xyzw vf22, vf18, vf02
nop | opmula.xyz ACC, vf29, vf30
nop | opmsub.xyz vf29, vf30, vf29
nop | add.xy vf25, vf17, vf03
nop | mulw.z vf17, vf17, vf12
div Q, vf12.x, vf19.w | mul.xyz vf18, vf18, Q
nop | mul.xyzw vf23, vf19, vf02
nop | mul.xyz vf29, vf29, vf15
nop | add.xyzw vf17, vf17, vf05
nop | mul.xy vf25, vf25, vf04
nop | nop
nop | add.xy vf26, vf18, vf03
nop | ftoi4.xyzw vf17, vf17
nop | mulw.z vf18, vf18, vf12
fcset 0x0 | addy.x vf29, vf29, vf29
nop | mul.xyz vf19, vf19, Q
sq.xyzw vf25, 4(vi02) | nop
sq.xyzw vf17, 5(vi02) | add.xyzw vf18, vf18, vf05
nop | clipw.xyz vf21, vf21
nop | mul.xy vf26, vf26, vf04
nop | addz.x vf29, vf29, vf29
nop | ftoi4.xyzw vf18, vf18
nop | add.xy vf27, vf19, vf03
sq.xyzw vf26, 6(vi02) | mulw.z vf19, vf19, vf12
fsand vi01, 0x2 | clipw.xyz vf22, vf22
sq.xyzw vf18, 7(vi02) | clipw.xyz vf23, vf23
ibeq vi00, vi01, L31 | mul.xy vf27, vf27, vf04
nop | add.xyzw vf19, vf19, vf05
b L32 | nop
lq.xyzw vf31, 887(vi00) | nop
L31:
lq.xyzw vf31, 886(vi00) | nop
L32:
fcand vi01, 0x3ffff | ftoi4.xyzw vf19, vf19
ibne vi00, vi01, L35 | nop
iaddi vi08, vi08, -0x1 | nop
sq.xyzw vf27, 8(vi02) | nop
sq.xyzw vf31, 3(vi02) | nop
sq.xyzw vf19, 9(vi02) | nop
xgkick vi02 | nop
mtir vi02, vf01.y | nop
mr32.xyzw vf01, vf01 | nop
L33:
ibgtz vi08, L28 | nop
nop | nop
nop | nop :e
nop | nop
L34:
sq.xyzw vf21, 1000(vi00) | nop
sq.xyzw vf22, 1003(vi00) | nop
sq.xyzw vf23, 1006(vi00) | nop
sq.xyzw vf31, 942(vi00) | nop
mfir.x vf29, vi02 | nop
mfir.y vf29, vi03 | nop
mfir.z vf29, vi07 | nop
bal vi15, L36 | nop
mfir.w vf29, vi08 | nop
mtir vi08, vf29.w | nop
mtir vi03, vf29.y | nop
mtir vi07, vf29.z | nop
b L27 | nop
mtir vi02, vf29.x | nop
L35:
sq.xyzw vf21, 1000(vi00) | nop
sq.xyzw vf22, 1003(vi00) | nop
sq.xyzw vf23, 1006(vi00) | nop
sq.xyzw vf31, 942(vi00) | nop
mfir.x vf29, vi02 | nop
mfir.y vf29, vi03 | nop
mfir.z vf29, vi07 | nop
bal vi15, L36 | nop
mfir.w vf29, vi08 | nop
mtir vi08, vf29.w | nop
mtir vi03, vf29.y | nop
mtir vi07, vf29.z | nop
b L33 | nop
mtir vi02, vf29.x | nop
L36:
sq.xyzw vf00, 893(vi00) | nop
sq.xyzw vf00, 900(vi00) | nop
sq.xyzw vf00, 907(vi00) | nop
sq.xyzw vf00, 914(vi00) | nop
sq.xyzw vf00, 921(vi00) | nop
sq.xyzw vf00, 928(vi00) | nop
iaddiu vi01, vi00, 0x2d3 | nop
isw.z vi01, 893(vi00) | nop
iaddiu vi01, vi00, 0x2d5 | nop
isw.z vi01, 900(vi00) | nop
iaddiu vi01, vi00, 0x2d7 | nop
isw.z vi01, 907(vi00) | nop
iaddiu vi01, vi00, 0x2d9 | nop
isw.z vi01, 914(vi00) | nop
iaddiu vi01, vi00, 0x2db | nop
isw.z vi01, 921(vi00) | nop
iaddiu vi01, vi00, 0x2dd | nop
isw.z vi01, 928(vi00) | nop
iaddiu vi03, vi00, 0x3b0 | nop
iaddiu vi04, vi00, 0x3af | nop
mfir.x vf31, vi15 | nop
iaddi vi05, vi00, 0x0 | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3e8 | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3eb | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3ee | nop
b L47 | nop
nop | nop
L37:
sq.xyzw vf00, 893(vi00) | nop
sq.xyzw vf00, 900(vi00) | nop
sq.xyzw vf00, 907(vi00) | nop
sq.xyzw vf00, 914(vi00) | nop
sq.xyzw vf00, 921(vi00) | nop
sq.xyzw vf00, 928(vi00) | nop
iaddiu vi01, vi00, 0x2d3 | nop
isw.z vi01, 893(vi00) | nop
iaddiu vi01, vi00, 0x2d5 | nop
isw.z vi01, 900(vi00) | nop
iaddiu vi01, vi00, 0x2d7 | nop
isw.z vi01, 907(vi00) | nop
iaddiu vi01, vi00, 0x2d9 | nop
isw.z vi01, 914(vi00) | nop
iaddiu vi01, vi00, 0x2db | nop
isw.z vi01, 921(vi00) | nop
iaddiu vi01, vi00, 0x2dd | nop
isw.z vi01, 928(vi00) | nop
iaddiu vi03, vi00, 0x3b0 | nop
iaddiu vi04, vi00, 0x3af | nop
mfir.x vf31, vi15 | nop
iaddi vi05, vi00, 0x0 | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3e8 | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3eb | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3ee | nop
bal vi15, L38 | nop
iaddiu vi07, vi00, 0x3f1 | nop
b L47 | nop
nop | nop
L38:
iaddiu vi09, vi00, 0x37d | nop
L39:
iaddi vi10, vi00, 0x0 | nop
L40:
isubiu vi01, vi09, 0x3a7 | nop
ilwr.y vi08, vi09 | nop
ibgez vi01, L44 | nop
ilwr.z vi06, vi09 | nop
lq.xyzw vf15, 0(vi07) | nop
lq.xyzw vf14, 0(vi08) | nop
ibne vi00, vi08, L41 | nop
iswr.y vi07, vi09 | nop
jalr vi11, vi06 | nop
iswr.x vi07, vi09 | nop
nop | nop
nop | nop
nop | nop
fsand vi02, 0x2 | nop
ibne vi00, vi02, L45 | nop
nop | nop
b L40 | nop
iaddi vi09, vi09, 0x7 | nop
L41:
jalr vi11, vi06 | nop
nop | nop
nop | nop
nop | nop
fsand vi01, 0x2 | nop
fsand vi02, 0x2 | nop
ibne vi00, vi01, L43 | nop
nop | nop
ibne vi00, vi02, L42 | nop
nop | nop
b L40 | nop
iaddi vi09, vi09, 0x7 | nop
L42:
bal vi11, L52 | nop
iaddi vi07, vi09, 0x1 | nop
sq.xyzw vf16, 1(vi09) | nop
b L40 | nop
iaddi vi09, vi09, 0x7 | nop
L43:
ibne vi00, vi02, L45 | nop
nop | nop
bal vi11, L53 | nop
nop | nop
sq.xyzw vf16, 4(vi09) | nop
iaddi vi09, vi09, 0x7 | nop
isw.x vi09, 935(vi10) | nop
isw.y vi07, 935(vi10) | nop
iaddi vi10, vi10, 0x1 | nop
b L40 | nop
iaddi vi07, vi09, -0x3 | nop
L44:
lq.xyzw vf14, 0(vi07) | nop
iaddi vi05, vi05, 0x1 | nop
div Q, vf00.w, vf14.w | nop
nop | mul.xyzw vf14, vf14, vf13
iaddi vi03, vi03, 0x2 | nop
waitq | subw.w vf14, vf00, vf00
nop | mul.xyz vf14, vf14, Q
nop | add.xy vf26, vf14, vf03
nop | mulw.z vf14, vf14, vf12
nop | add.xyzw vf14, vf14, vf05
nop | mul.xy vf26, vf26, vf04
sq.xyzw vf26, -2(vi03) | ftoi4.xyzw vf14, vf14
sq.xyzw vf14, -1(vi03) | nop
L45:
iblez vi10, L46 | nop
nop | nop
ilw.x vi09, 934(vi10) | nop
ilw.y vi07, 934(vi10) | nop
b L40 | nop
iaddi vi10, vi10, -0x1 | nop
L46:
jr vi15 | nop
nop | nop
L47:
iaddiu vi09, vi00, 0x37d | nop
L48:
ilwr.x vi08, vi09 | nop
ilwr.y vi07, vi09 | nop
ilwr.z vi06, vi09 | nop
nop | nop
ibeq vi00, vi08, L50 | nop
lq.xyzw vf14, 0(vi07) | nop
ibeq vi07, vi08, L50 | nop
lq.xyzw vf15, 0(vi08) | nop
jalr vi11, vi06 | nop
nop | nop
nop | nop
nop | nop
fsand vi01, 0x2 | nop
fsand vi02, 0x2 | nop
ibeq vi02, vi01, L50 | nop
nop | nop
ibeq vi00, vi01, L49 | nop
nop | nop
bal vi11, L53 | nop
nop | nop
sq.xyzw vf16, 4(vi09) | nop
iaddi vi07, vi09, 0x4 | nop
ior vi12, vi09, vi00 | nop
bal vi15, L39 | nop
iaddi vi09, vi09, 0x7 | nop
b L50 | nop
ior vi09, vi12, vi00 | nop
L49:
bal vi11, L52 | nop
nop | nop
sq.xyzw vf16, 1(vi09) | nop
iaddi vi07, vi09, 0x1 | nop
ior vi12, vi09, vi00 | nop
bal vi15, L39 | nop
iaddi vi09, vi09, 0x7 | nop
ior vi09, vi12, vi00 | nop
L50:
isubiu vi01, vi09, 0x3a0 | nop
iswr.x vi00, vi09 | nop
iswr.y vi00, vi09 | nop
ibltz vi01, L48 | nop
iaddi vi09, vi09, 0x7 | nop
ibeq vi00, vi05, L51 | nop
mtir vi15, vf31.x | nop
iaddiu vi05, vi05, 0x4000 | nop
iaddiu vi05, vi05, 0x4000 | nop
iswr.x vi05, vi04 | nop
iaddiu vi01, vi00, 0x3ac | nop
xgkick vi01 | nop
lq.xyzw vf30, 888(vi00) | nop
lq.xyzw vf31, 890(vi00) | nop
iaddiu vi01, vi00, 0x3fe | nop
isubiu vi02, vi00, 0x7fff | nop
sq.xyzw vf30, 0(vi01) | nop
iswr.x vi02, vi01 | nop
sq.xyzw vf31, 1(vi01) | nop
nop | nop
xgkick vi01 | nop
L51:
nop | nop
jr vi15 | nop
nop | nop
jr vi11 | addx.w vf30, vf14, vf14
nop | addx.w vf31, vf15, vf15
jr vi11 | subx.w vf30, vf14, vf14
nop | subx.w vf31, vf15, vf15
jr vi11 | addy.w vf30, vf14, vf14
nop | addy.w vf31, vf15, vf15
jr vi11 | suby.w vf30, vf14, vf14
nop | suby.w vf31, vf15, vf15
jr vi11 | addz.w vf30, vf14, vf14
nop | addz.w vf31, vf15, vf15
jr vi11 | subz.w vf30, vf14, vf14
nop | subz.w vf31, vf15, vf15
L52:
nop | subw.w vf31, vf30, vf31
div Q, vf30.w, vf31.w | sub.xyzw vf16, vf15, vf14
waitq | mul.xyzw vf16, vf16, Q
jr vi11 | add.xyzw vf16, vf14, vf16
nop | nop
L53:
nop | subw.w vf30, vf30, vf31
div Q, vf31.w, vf30.w | sub.xyzw vf16, vf14, vf15
waitq | mul.xyzw vf16, vf16, Q
jr vi11 | sub.xyzw vf16, vf15, vf16
nop | nop
lq. vf00, 0(vi00) | addx. vf00, vf00, vf00