void PointOfIntersectionOfFaceAndLine(void *v0, const void *v1, const void *v2, const void *face)
{
/*
* (a, b, c) = v1
* (d, e, f) = v2 - v1
* (A, B, C, D) = (Ax + By + Cz + D = 0)
*
* t = -(aA + bB + cC + D) / (Ad + Be + Cf)
*
* (x, y, z) = (a, b, c) + t(d, e, f)
*/
asm __volatile__("
lqc2 vf16,0x0(%1) # v1 (a, b, c)
lqc2 vf17,0x0(%2) # v2
lqc2 vf18,0x0(%3) # face (A B C D)
vsub.xyz vf17,vf17,vf16 # vf17 = (d e f)
vmul.xyz vf19,vf16,vf18 # (aA bB cC)
vmul.xyz vf20,vf17,vf18 # (Ad Be Cf)
#
# vf19.w = -(aA + bB + cC + D)
#
vsuba.w ACC,vf00,vf00
vmsubax.w ACC,vf00,vf19x
vmsubay.w ACC,vf00,vf19y
vmsubaz.w ACC,vf00,vf19z
vmsubw.w vf19,vf00,vf18w
#
# vf20.w = (Ad + Be + Cf)
#
vmulax.w ACC,vf00,vf20x
vmadday.w ACC,vf00,vf20y
vmaddz.w vf20,vf00,vf20z
#
# Q = -(aA + bB + cC + D) / (Ad + Be + Cf)
#
vdiv Q,vf19w,vf20w
#
# vf16 = (a b c) + Q(d e f)
#
vadda.xyz ACC,vf00,vf16
vwaitq
vmaddq.xyz vf16,vf17,Q
sqc2 vf16,0x0(%0)
"
:
: "r"(v0), "r"(v1), "r"(v2), "r"(face)
);
}