3dnow_normal.S revision caa5f7e75ecdbfa8bae03acfb9369a77baa7833e
1caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane/* $Id: 3dnow_normal.S,v 1.7 2004/04/08 08:10:37 alanh Exp $ */
21b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
31b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes/*
41b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Mesa 3-D graphics library
55c31f8678b7ad10145c434c00461115449a357e0Brian Paul * Version:  5.1
61b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
75c31f8678b7ad10145c434c00461115449a357e0Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
81b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
91b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Permission is hereby granted, free of charge, to any person obtaining a
101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * copy of this software and associated documentation files (the "Software"),
111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * to deal in the Software without restriction, including without limitation
121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * the rights to use, copy, modify, merge, publish, distribute, sublicense,
131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * and/or sell copies of the Software, and to permit persons to whom the
141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Software is furnished to do so, subject to the following conditions:
151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * The above copyright notice and this permission notice shall be included
171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * in all copies or substantial portions of the Software.
181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes */
261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes/*
281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * 3Dnow assembly code by Holger Waechtler
291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes */
301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#include "matypes.h"
321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#include "norm_args.h"
331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes        SEG_TEXT
351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#define M(i)    REGOFF(i * 4, ECX)
371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#define STRIDE  REGOFF(12, ESI)
381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normalize_normals)
421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normalize_normals):
431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
44caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDI )
511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
53854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
54854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
55854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
56854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP )        /*   count > 0 ??  */
611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TN_end) )
621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
63854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF (V4F_COUNT, ESI), EBP )
641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EAX )
681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDX )                  /*  save counter & pointer for   */
691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes                                        /*  the normalize pass           */
70caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
71caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 24
721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(0), MM3 )            /*  m1              | m0         */
741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(4), MM4 )            /*  m5              | m4         */
751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(2), MM5 )            /*                  | m2         */
771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( M(6), MM5 )            /*  m6              | m2         */
781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(8), MM6 )            /*  m9              | m8         */
801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(10), MM7 )           /*                  | m10        */
811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                 */
831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JNE        ( LLBL (G3TN_scale_end ) )
841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /*               | scale           */
861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )             /* scale         | scale           */
871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* scale * m1    | scale * m0      */
891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* scale * m5    | scale * m4      */
901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM5 )             /* scale * m6    | scale * m2      */
911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* scale * m9    | scale * m8      */
921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM7 )             /*               | scale * m10     */
931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
9445d21ca58755098e8fd47e1083c68e244c4f903cBrian PaulALIGNTEXT32
951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_scale_end):
9645d21ca58755098e8fd47e1083c68e244c4f903cBrian PaulLLBL (G3TN_transform):
971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND (EDX), MM0 )    /*  x1              | x0         */
981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF (8, EDX), MM2 ) /*                  | x2         */
991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /*  x1              | x0           */
1011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /*  x2              | x2           */
1021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /*  x1*m1           | x0*m0        */
104946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
1051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
1071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /*  x1*m5           | x0*m4        */
1091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /*  x0*m4+x1*m5     | x0*m0+x1*m1  */
1101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /*  x2*m6           | x2*m2        */
1121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4+x1*m5+x2*m6| x0*m0+...+x2**/
1131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND (EDX), MM1 )    /*  x1           | x0              */
115946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                   */
1161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8           */
1181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF (8, EDX), MM2 ) /*               | x2              */
1191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10          */
1211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /*  *not used*   | x0*m8+x1*m9     */
1221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /*  *not used*   | x0*m8+x1*m9+x2*m*/
1241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /*  next normal                    */
1251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
1271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
128946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /*  write r2                       */
1291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /*  decrement normal counter       */
1301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TN_transform) )
1311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDX )                  /*  end of transform ---           */
1341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EAX )                  /*    now normalizing ...          */
1351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
1361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                 */
1381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TN_norm ) )    /*  calculate lengths              */
1391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
1421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_norm_w_lengths):
1431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGOFF(12,EAX) )
1451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
14645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EAX), MM0 )     /*  x1              | x0           */
14745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EAX), MM1 )  /*                  | x2           */
14845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
1491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND (EDI), MM3 )    /*                  | length (x)   */
1501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM1 )             /*                  | x2 (normalize*/
1511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /*  length (x)      | length (x)   */
1531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /*  x1 (normalized) | x0 (normalize*/
1541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /*  next normal                    */
1561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDI )        /*  next length                    */
1571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDI) )
1591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, REGIND(EAX) )     /*  write new x0, x1               */
1611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( MM1, REGOFF(8, EAX) )  /*  write new x2                   */
1621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
163946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
1641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /*  decrement normal counter       */
1651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TN_norm_w_lengths) )
1671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3TN_exit_3dnow) )
1681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
1701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_norm):
1711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
1731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1745c31f8678b7ad10145c434c00461115449a357e0Brian Paul    MOVQ       ( REGIND (EAX), MM0 )    /*  x1             | x0           */
1755c31f8678b7ad10145c434c00461115449a357e0Brian Paul    MOVD       ( REGOFF(8, EAX), MM1 )  /*                 | x2           */
1765c31f8678b7ad10145c434c00461115449a357e0Brian Paul
1771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM3 )             /*  x1              | x0           */
1781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM1, MM4 )             /*                  | x2           */
1791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /*  x1*x1           | x0*x0        */
181946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
1821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM1, MM4 )             /*                  | x2*x2        */
1841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                  | x0*x0+x2*x2  */
1851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* **not used**    | x0*x0+x1*x1+x2**/
1871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /*  1/sqrt (x0*x0+x1*x1+x2*x2)     */
1881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
1901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
1911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /*  decrement normal counter       */
1931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
1941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
1961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
1971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM0 )             /*  x1 (normalized) | x0 (normalize*/
1991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
200946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /*  write new x0, x1              */
2011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM1 )             /*                 | x2 (normalize*/
2021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
203946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /*  write new x2                  */
2041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TN_norm) )
2051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_exit_3dnow):
2071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
2081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_end):
2101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
2111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
2121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
2131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
2141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
2181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normalize_normals_no_rot)
2191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normalize_normals_no_rot):
2201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
221caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef FRAME_OFFSET
222caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
2231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
2251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
2261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
2271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDI )
2291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
2301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
231854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
232854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
2331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
234854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
2351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
236854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
2371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP ) /*   count > 0 ??  */
2391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNNR_end) )
2401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
2421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(0), MM0 )            /*               | m0                 */
2441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( M(5), MM0 )            /* m5            | m0                 */
2451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(10), MM2 )           /*               | m10                */
2471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* m10           | m10                */
2481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                    */
2501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JNE        ( LLBL (G3TNNR_scale_end ) )
2511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM7 )       /*               | scale              */
2531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM7, MM7 )             /* scale         | scale              */
2541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM0 )             /* scale * m5    | scale * m0         */
2561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /* scale * m10   | scale * m10        */
2571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
2591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_scale_end):
2601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /* lengths == 0 ?                     */
2611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNNR_norm) )   /* need to calculate lengths          */
2621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDI), MM3 )     /*                 | length (x)       */
2641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
2671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_norm_w_lengths):           /* use precalculated lengths          */
2681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
2701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
27145d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM6 )     /* x1            | x0                 */
27245d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM7 )  /*               | x2                 */
27345d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
2741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* x1*m5         | x0*m0              */
2751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                        */
2761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
2781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM7 )             /*               | x2*m10             */
280946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
2811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM7 )             /*               | x2 (normalized)  */
2831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /* length (x)    | length (x)       */
2841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDI )        /* next length                        */
2861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM6 )             /* x1 (normalized) | x0 (normalized)  */
2871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /* decrement normal counter           */
289946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM6, REGOFF(-16, EAX) ) /* write r0, r1                      */
2901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
291946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM7, REGOFF(-8, EAX) ) /* write r2                           */
2921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDI), MM3 )     /*                 | length (x)       */
2931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TNNR_norm_w_lengths) )
2951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3TNNR_exit_3dnow) )
2961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
2981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_norm):                     /* need to calculate lengths          */
2991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
3011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
30245d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM6 )     /* x1              | x0               */
30345d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM7 )  /*                 | x2               */
30445d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
3051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* x1*m5           | x0*m0            */
306946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
3071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM7 )             /*                 | x2*m10           */
3091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM6, MM3 )             /* x1 (transformed)| x0 (transformed) */
3101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM7, MM4 )             /*                 | x2 (transformed) */
3121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM3 )             /* x1*x1           | x0*x0            */
3131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM4 )             /*                 | x2*x2            */
3161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* **not used**    | x0*x0+x1*x1      */
3171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                 | x0*x0+x1*x1+x2*x2*/
3191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal            */
3201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
3221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /* 1/sqrt (x0*x0+x1*x1+x2*x2)         */
3241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
3251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
3271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
3281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
3301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /* decrement normal counter           */
3311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
3331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM6 )             /* x1 (normalized) | x0 (normalized)  */
3341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
335946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM6, REGOFF(-16, EAX) ) /* write r0, r1                      */
3361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM7 )             /*                 | x2 (normalized)  */
3371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
338946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM7, REGOFF(-8, EAX) ) /* write r2                           */
3391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TNNR_norm) )
3401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_exit_3dnow):
3431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
3441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_end):
3461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
3471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
3481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
3491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
3501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
3571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_rescale_normals_no_rot)
3581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_rescale_normals_no_rot):
3591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
360caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef FRAME_OFFSET
361caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
3621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
3641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
3651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
3661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, EAX )
3681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EDX )
369854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, EAX), EBP ) /*  dest->count = in->count   */
370854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EDX) )
3711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
3721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
3731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
374854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EDX), EAX ) /*  dest->start  */
375854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
3761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP )
3781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TRNR_end) )
3791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
3811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM6 )       /*               | scale              */
3831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM6, MM6 )             /* scale         | scale              */
3841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(ECX), MM0 )     /*               | m0                 */
3861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(20, ECX), MM0 ) /* m5            | m0                 */
3871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM0 )             /* scale*m5      | scale*m0           */
3891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM2 ) /*               | m10                */
3901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM2 )             /*               | scale*m10          */
3921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
3941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TRNR_rescale):
3951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
39745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
39845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM4 )     /* x1            | x0                 */
39945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM5 )  /*               | x2                 */
40045d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
4011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* x1*m5         | x0*m0              */
4021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                        */
4031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
4051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM5 )             /*               | x2*m10             */
407946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
4081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /* decrement normal counter           */
410946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM4, REGOFF(-16, EAX) ) /* write r0, r1                      */
4111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
412946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM5, REGOFF(-8, EAX) ) /* write r2                           */
4131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TRNR_rescale) ) /* cnt > 0 ? -> process next normal  */
4141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
4161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TRNR_end):
4181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
4191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
4201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
4211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
4221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
4281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_rescale_normals)
4291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_rescale_normals):
4301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
431caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
432caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
4331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
4351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
4361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
4381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
4391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
440854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
441854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
442854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
443854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
4441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
4451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )
4471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TR_end) )
4481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
4501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(ECX), MM3 )     /* m1            | m0                 */
4521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(16,ECX), MM4 )  /* m5            | m4                 */
4541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /* scale       */
4551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8,ECX), MM5 )   /*               | m2                 */
4571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )             /* scale         | scale              */
4581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(24, ECX), MM5 )
4601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* scale*m1      | scale*m0           */
4611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(32, ECX), MM6 ) /* m9            | m8*/
4631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* scale*m5      | scale*m4           */
4641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM7 ) /*               | m10                */
4661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM5 )             /* scale*m6      | scale*m2           */
4671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* scale*m9      | scale*m8           */
4691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM7 )             /*               | scale*m10          */
4711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
4731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TR_rescale):
4741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
4761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
47745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM0 )     /* x1            | x0                 */
47845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
47945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
4801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /* x1            | x0                 */
4811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* x2            | x2                 */
4821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1*m1         | x0*m0              */
484946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
4851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /* x1*m5         | x0*m4              */
4871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /* x0*m4+x1*m5   | x0*m0+x1*m1        */
4881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(EDX), MM1 )     /* x1            | x0                 */
4901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /* x2*m6         | x2*m2              */
4921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4...+x2*m6| x0*m0+x1*m1+x2*m2  */
4931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
4951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                    */
4961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
4981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
499946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                      */
5001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8              */
5011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10             */
5031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /* *not used*    | x0*m8+x1*m9        */
5041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /* *not used*    | x0*m8+x1*m9+x2*m10 */
506946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write r2                           */
5071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EDI )                  /* decrement normal counter           */
5091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TR_rescale) )
5101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TR_end):
5141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( ESI )
5151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( EDI )
5161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
5171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
5251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normals_no_rot)
5261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normals_no_rot):
5271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
528caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
529caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
5301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
5321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
5331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
5351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
5361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
537854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
538854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
539854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
540854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
5411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
5421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )
5441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNR_end) )
5451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(ECX), MM0 )     /*               | m0                 */
5491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(20, ECX), MM0 ) /* m5            | m0                 */
5501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM2 ) /*               | m10                */
5521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* m10           | m10                */
5531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
5551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNR_transform):
5561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
5581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
55945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM4 )     /* x1            | x0                 */
56045d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM5 )  /*               | x2                 */
56145d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
5621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* x1*m5         | x0*m0              */
5631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX)           /* next normal      */
5641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
5661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM5 )             /*               | x2*m10             */
568946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
5691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EDI )                  /* decrement normal counter           */
571946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM4, REGOFF(-16, EAX) ) /* write r0, r1                      */
5721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
573946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM5, REGOFF(-8, EAX) ) /* write r2                           */
5741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3TNR_transform) )
5751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNR_end):
5791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( ESI )
5801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( EDI )
5811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
5821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
5911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normals)
5921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normals):
5931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
594caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
595caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
5961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
5981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
5991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
6011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
6021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
603854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
604854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
605854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
606854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
6071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
6081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /* count > 0 ??                       */
6101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3T_end) )
6111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
6131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(ECX), MM3 )     /* m1            | m0                 */
6151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(16, ECX), MM4 ) /* m5            | m4                 */
6161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, ECX), MM5 )  /*               | m2                 */
6181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(24, ECX), MM5 ) /* m6            | m2                 */
6191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(32, ECX), MM6 ) /* m9            | m8                 */
6211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM7 ) /*               | m10                */
6221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
6241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3T_transform):
6251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
6271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
62845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM0 )     /* x1            | x0                 */
62945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
63045d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
6311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /* x1            | x0                 */
6321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* x2            | x2                 */
6331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1*m1         | x0*m0              */
635946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
6361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /* x1*m5         | x0*m4              */
6381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /* x0*m4+x1*m5   | x0*m0+x1*m1        */
6391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /* x2*m6         | x2*m2              */
6411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4...+x2*m6| x0*m0+x1*m1+x2*m2  */
6421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(EDX), MM1 )     /* x1            | x0                 */
644946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                      */
6451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8              */
6471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
6481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10             */
6501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal               */
6511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
6531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /* *not used*    | x0*m8+x1*m9        */
6551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /* *not used*    | x0*m8+x1*m9+x2*m10 */
6561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
657946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write r2                           */
6581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EDI )                  /* decrement normal counter           */
65945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
6601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3T_transform) )
6611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
6631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3T_end):
6651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L  ( ESI )
6661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L  ( EDI )
6671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
6681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
6751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_normalize_normals)
6761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_normalize_normals):
6771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
678caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
679caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
6801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
6821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
6831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
6841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
6861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
687854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
688854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
689854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
690854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), ECX ) /*  in->start    */
6911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDX )
6921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP ) /* count > 0 ?? */
6941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3N_end) )
6951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
6971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDX )        /* lengths == 0 ?                     */
6991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3N_norm2) )     /* calculate lengths                  */
7001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
7021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_norm1):                       /* use precalculated lengths          */
7031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EAX) )
7051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
70645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM0 )     /* x1              | x0               */
70745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM1 )  /*                 | x2               */
70845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
7091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDX), MM3 )     /*                 | length (x)       */
7101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM1 )             /*                 | x2 (normalized)  */
7111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /* length (x)      | length (x)       */
7131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, ECX )          /* next normal            */
7141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
7161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1 (normalized) | x0 (normalized)  */
7181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, REGIND(EAX) )     /* write new x0, x1                   */
7191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( MM1, REGOFF(8, EAX) )  /* write new x2                       */
721946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
7221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDX )        /* next length                        */
7241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /* decrement normal counter           */
7251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3N_norm1) )
7271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3N_end1) )
7291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
7311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_norm2):                       /* need to calculate lengths          */
7321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
7341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
7361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
73745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM0 )     /* x1              | x0               */
73845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM1 )  /*                 | x2               */
73945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
7404c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul    MOVQ       ( MM0, MM3 )             /* x1              | x0               */
7414c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul    ADD_L      ( STRIDE, ECX )          /* next normal    */
7424c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul
7431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* x1*x1           | x0*x0            */
7441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM1, MM4 )             /*                 | x2               */
7451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
746946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
7471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM1, MM4 )             /*                 | x2*x2            */
7481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                 | x0*x0+x2*x2      */
7501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* x0*x0+...+x2*x2 | x0*x0+x1*x1+x2*x2*/
7511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /* 1/sqrt (x0*x0+x1*x1+x2*x2)         */
7531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
7541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
7561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
7571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
7591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EBP )                  /* decrement normal counter           */
7601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
7621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM0 )             /* x1 (normalized) | x0 (normalized)  */
764946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write new x0, x1                  */
7651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM1 )             /*                 | x2 (normalized)  */
767946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write new x2                       */
7681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3N_norm2) )
7701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_end1):
7721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
7731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_end):
7751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
7761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
7771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
7781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
7791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
7861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_rescale_normals)
7871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_rescale_normals):
7881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
789caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
790caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
7911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
7921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
7931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
7951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
796854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDX ) /*  dest->count = in->count   */
797854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDX, REGOFF(V4F_COUNT, EAX) )
798854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
799854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), ECX ) /*  in->start    */
8001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDX )
8021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3R_end) )
8031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
8051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /* scale                              */
8071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )
8081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
8101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3R_rescale):
8111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
8131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
81445d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM1 )     /* x1            | x0                 */
81545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM2 )  /*               | x2                 */
81645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
8171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM1 )             /* x1*scale      | x0*scale           */
8181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, ECX )          /* next normal                  */
8191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
8211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM2 )             /*               | x2*scale           */
823946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
8241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
825946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM1, REGOFF(-16, EAX) ) /* write r0, r1                      */
826946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM2, REGOFF(-8, EAX) ) /* write r2                           */
8271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    DEC_L      ( EDX )                  /* decrement normal counter           */
8291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JA         ( LLBL (G3R_rescale) )
8301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
8321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3R_end):
8341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
8351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
8361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
837