// SPDX-License-Identifier: LGPL-3.0-linking-exception
asm
        //vL := vLS- vP*LightDestFactor;
        movups xmm4, vP
        movups xmm6,LightDestFactor4
        mulps xmm6, xmm4   //keep xmm4 = vP
        movaps xmm0, xmm1
        subps xmm0, xmm6

        movups xmm2, vV //preload xmm2 (A)

        //normalize(vL);
        movaps xmm6, xmm0   //save
        mulps xmm0, xmm0

        {$IFDEF PARAM_USESSE3}
        haddps xmm0,xmm0
        haddps xmm0,xmm0
        {$ELSE}
        //mix1
        movaps xmm7, xmm0
        shufps xmm7, xmm7, $4e
        addps xmm0, xmm7
        //mix2
        movaps xmm7, xmm0
        shufps xmm7, xmm7, $11
        addps xmm0, xmm7
        {$ENDIF}

        //1/sqrt
        rsqrtps xmm0, xmm0
        mulps xmm0, xmm6  //apply


        //vH := vL + vV;  (A)
        //xmm2 = vV
        addps xmm2, xmm0



        //vectproduct(vS1,vS2,vN);
        movups xmm6, vS1
        shufps xmm6, xmm6, Shift231

        movups xmm7, vS2
        shufps xmm7, xmm7, Shift312

        movaps xmm3,xmm6
        mulps xmm3,xmm7

        movups xmm6, vS1
        shufps xmm6, xmm6, Shift312

        movups xmm7, vS2
        shufps xmm7, xmm7, Shift231

        mulps xmm7,xmm6
        subps xmm3,xmm7
        //end of vectproduct


        //normalize(vH);
        movaps xmm6, xmm2   //save
        mulps xmm2, xmm2

        {$IFDEF PARAM_USESSE3}
        haddps xmm2,xmm2
        haddps xmm2,xmm2
        {$ELSE}
        //mix1
        movaps xmm7, xmm2
        shufps xmm7, xmm7, $4e
        addps xmm2, xmm7
        //mix2
        movaps xmm7, xmm2
        shufps xmm7, xmm7, $11
        addps xmm2, xmm7
        {$ENDIF}

        //1/sqrt
        rsqrtps xmm2, xmm2
        mulps xmm2, xmm6  //apply

        //normalize(vN);
        movaps xmm6, xmm3   //save
        mulps xmm3, xmm3

        {$IFDEF PARAM_USESSE3}
        haddps xmm3,xmm3
        haddps xmm3,xmm3
        {$ELSE}
        //mix1
        movaps xmm7, xmm3
        shufps xmm7, xmm7, $4e
        addps xmm3, xmm7
        //mix2
        movaps xmm7, xmm3
        shufps xmm7, xmm7, $11
        addps xmm3, xmm7
        {$ENDIF}

        //1/sqrt
        rsqrtps xmm3, xmm3
        mulps xmm3, xmm6  //apply

        //LdotN := vN * vL;
        movups xmm5, xmm3
        mulps xmm5, xmm0
        //mix1
        movaps xmm7, xmm5
        shufps xmm7, xmm7, $4e
        addps xmm5, xmm7
        //mix2
        movaps xmm7, xmm5
        shufps xmm7, xmm7, $11
        addps xmm5, xmm7
        //:=
        movss LdotN, xmm5

        //vD := vLS-vP;
        movaps xmm5, xmm1
        subps xmm5, xmm4

        //dist := sqrt(vD*vD);
        mulps xmm5, xmm5

        {$IFDEF PARAM_USESSE3}
        haddps xmm5,xmm5
        haddps xmm5,xmm5
        {$ELSE}
        //mix1
        movaps xmm7, xmm5
        shufps xmm7, xmm7, $4e
        addps xmm5, xmm7
        //mix2
        movaps xmm7, xmm5
        shufps xmm7, xmm7, $11
        addps xmm5, xmm7
        {$ENDIF}

        //:= sqrt
        sqrtss xmm5,xmm5
        movss dist, xmm5

        //NH := vH * vN;
        movups xmm6, xmm2
        mulps xmm6, xmm3

        {$IFDEF PARAM_USESSE3}
        haddps xmm6,xmm6
        haddps xmm6,xmm6
        {$ELSE}
        //mix1
        movaps xmm7, xmm6
        shufps xmm7, xmm7, $4e
        addps xmm6, xmm7
        //mix2
        movaps xmm7, xmm6
        shufps xmm7, xmm7, $11
        addss xmm6, xmm7
        {$ENDIF}
        //:=
        movss NH, xmm6
      end;
