11b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
21b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes/*
31b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Mesa 3-D graphics library
45c31f8678b7ad10145c434c00461115449a357e0Brian Paul * Version:  5.1
51b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
65c31f8678b7ad10145c434c00461115449a357e0Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
71b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
81b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Permission is hereby granted, free of charge, to any person obtaining a
91b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * copy of this software and associated documentation files (the "Software"),
101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * to deal in the Software without restriction, including without limitation
111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * the rights to use, copy, modify, merge, publish, distribute, sublicense,
121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * and/or sell copies of the Software, and to permit persons to whom the
131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * Software is furnished to do so, subject to the following conditions:
141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * The above copyright notice and this permission notice shall be included
161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * in all copies or substantial portions of the Software.
171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes *
181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes */
251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes/*
271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes * 3Dnow assembly code by Holger Waechtler
281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes */
291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
30462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#ifdef USE_3DNOW_ASM
31462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane
323474e9de924d92a941b4ea33ecc694f5fad2651fJosé Fonseca#include "assyntax.h"
331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#include "matypes.h"
341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#include "norm_args.h"
351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes        SEG_TEXT
371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#define M(i)    REGOFF(i * 4, ECX)
391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes#define STRIDE  REGOFF(12, ESI)
401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normalize_normals)
44932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_normalize_normals)
451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normalize_normals):
461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
47caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDI )
541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
56854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
57854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
58854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
59854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP )        /*   count > 0 ??  */
641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TN_end) )
651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
66854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF (V4F_COUNT, ESI), EBP )
671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EAX )
711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDX )                  /*  save counter & pointer for   */
721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes                                        /*  the normalize pass           */
73caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
74caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 24
751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(0), MM3 )            /*  m1              | m0         */
771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(4), MM4 )            /*  m5              | m4         */
781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(2), MM5 )            /*                  | m2         */
801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( M(6), MM5 )            /*  m6              | m2         */
811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(8), MM6 )            /*  m9              | m8         */
831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( M(10), MM7 )           /*                  | m10        */
841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                 */
861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JNE        ( LLBL (G3TN_scale_end ) )
871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /*               | scale           */
891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )             /* scale         | scale           */
901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* scale * m1    | scale * m0      */
921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* scale * m5    | scale * m4      */
931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM5 )             /* scale * m6    | scale * m2      */
941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* scale * m9    | scale * m8      */
951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM7 )             /*               | scale * m10     */
961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
9745d21ca58755098e8fd47e1083c68e244c4f903cBrian PaulALIGNTEXT32
981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_scale_end):
9945d21ca58755098e8fd47e1083c68e244c4f903cBrian PaulLLBL (G3TN_transform):
1001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND (EDX), MM0 )    /*  x1              | x0         */
1011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF (8, EDX), MM2 ) /*                  | x2         */
1021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /*  x1              | x0           */
1041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /*  x2              | x2           */
1051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /*  x1*m1           | x0*m0        */
107946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
1081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
1101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /*  x1*m5           | x0*m4        */
1121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /*  x0*m4+x1*m5     | x0*m0+x1*m1  */
1131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /*  x2*m6           | x2*m2        */
1151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4+x1*m5+x2*m6| x0*m0+...+x2**/
1161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND (EDX), MM1 )    /*  x1           | x0              */
118946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                   */
1191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8           */
1211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF (8, EDX), MM2 ) /*               | x2              */
1221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10          */
1241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /*  *not used*   | x0*m8+x1*m9     */
1251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /*  *not used*   | x0*m8+x1*m9+x2*m*/
1271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /*  next normal                    */
1281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
1301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
131946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /*  write r2                       */
13286e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )                  /*  decrement normal counter       */
13386e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TN_transform) )
1341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDX )                  /*  end of transform ---           */
1371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EAX )                  /*    now normalizing ...          */
1381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
1391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                 */
1411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TN_norm ) )    /*  calculate lengths              */
1421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
1451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_norm_w_lengths):
1461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGOFF(12,EAX) )
1481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
14945d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EAX), MM0 )     /*  x1              | x0           */
15045d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EAX), MM1 )  /*                  | x2           */
15145d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
1521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND (EDI), MM3 )    /*                  | length (x)   */
1531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM1 )             /*                  | x2 (normalize*/
1541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /*  length (x)      | length (x)   */
1561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /*  x1 (normalized) | x0 (normalize*/
1571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /*  next normal                    */
1591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDI )        /*  next length                    */
1601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDI) )
1621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, REGIND(EAX) )     /*  write new x0, x1               */
1641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( MM1, REGOFF(8, EAX) )  /*  write new x2                   */
1651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
166946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
16786e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /*  decrement normal counter       */
1681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
16986e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TN_norm_w_lengths) )
1701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3TN_exit_3dnow) )
1711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
1731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_norm):
1741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
1761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1775c31f8678b7ad10145c434c00461115449a357e0Brian Paul    MOVQ       ( REGIND (EAX), MM0 )    /*  x1             | x0           */
1785c31f8678b7ad10145c434c00461115449a357e0Brian Paul    MOVD       ( REGOFF(8, EAX), MM1 )  /*                 | x2           */
1795c31f8678b7ad10145c434c00461115449a357e0Brian Paul
1801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM3 )             /*  x1              | x0           */
1811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM1, MM4 )             /*                  | x2           */
1821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /*  x1*x1           | x0*x0        */
184946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /*  next r                         */
1851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM1, MM4 )             /*                  | x2*x2        */
1871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                  | x0*x0+x2*x2  */
1881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* **not used**    | x0*x0+x1*x1+x2**/
1901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /*  1/sqrt (x0*x0+x1*x1+x2*x2)     */
1911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
1931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
1941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
19586e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )                  /*  decrement normal counter       */
1961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
1971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
1981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
1991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
2001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM0 )             /*  x1 (normalized) | x0 (normalize*/
2021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
203946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /*  write new x0, x1              */
2041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM1 )             /*                 | x2 (normalize*/
2051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
206946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /*  write new x2                  */
20786e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TN_norm) )
2081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_exit_3dnow):
2101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
2111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TN_end):
2131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
2141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
2151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
2161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
2171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
2211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normalize_normals_no_rot)
222932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_normalize_normals_no_rot)
2231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normalize_normals_no_rot):
2241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
225caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef FRAME_OFFSET
226caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
2271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
2291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
2301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
2311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDI )
2331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
2341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
235854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
236854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
2371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
238854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
2391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
240854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
2411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP ) /*   count > 0 ??  */
2431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNNR_end) )
2441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
2461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(0), MM0 )            /*               | m0                 */
2481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( M(5), MM0 )            /* m5            | m0                 */
2491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( M(10), MM2 )           /*               | m10                */
2511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* m10           | m10                */
2521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /*  lengths == 0 ?                    */
2541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JNE        ( LLBL (G3TNNR_scale_end ) )
2551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM7 )       /*               | scale              */
2571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM7, MM7 )             /* scale         | scale              */
2581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM0 )             /* scale * m5    | scale * m0         */
2601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /* scale * m10   | scale * m10        */
2611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
2631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_scale_end):
2641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /* lengths == 0 ?                     */
2651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNNR_norm) )   /* need to calculate lengths          */
2661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDI), MM3 )     /*                 | length (x)       */
2681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
2711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_norm_w_lengths):           /* use precalculated lengths          */
2721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
2741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
27545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM6 )     /* x1            | x0                 */
27645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM7 )  /*               | x2                 */
27745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
2781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* x1*m5         | x0*m0              */
2791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                        */
2801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
2821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM7 )             /*               | x2*m10             */
284946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
2851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM7 )             /*               | x2 (normalized)  */
2871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /* length (x)    | length (x)       */
2881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
2891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDI )        /* next length                        */
2901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM6 )             /* x1 (normalized) | x0 (normalized)  */
2911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
29286e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /* decrement normal counter           */
293946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM6, REGOFF(-16, EAX) ) /* write r0, r1                      */
2941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
295946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM7, REGOFF(-8, EAX) ) /* write r2                           */
2961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDI), MM3 )     /*                 | length (x)       */
2971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
29886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TNNR_norm_w_lengths) )
2991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3TNNR_exit_3dnow) )
3001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
3021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_norm):                     /* need to calculate lengths          */
3031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
3051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
30645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM6 )     /* x1              | x0               */
30745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM7 )  /*                 | x2               */
30845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
3091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* x1*m5           | x0*m0            */
310946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
3111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM7 )             /*                 | x2*m10           */
3131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM6, MM3 )             /* x1 (transformed)| x0 (transformed) */
3141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM7, MM4 )             /*                 | x2 (transformed) */
3161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM3 )             /* x1*x1           | x0*x0            */
3171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM4 )             /*                 | x2*x2            */
3201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* **not used**    | x0*x0+x1*x1      */
3211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                 | x0*x0+x1*x1+x2*x2*/
3231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal            */
3241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
3261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /* 1/sqrt (x0*x0+x1*x1+x2*x2)         */
3281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
3291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
3311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
3321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
33486e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /* decrement normal counter           */
3351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
3371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM6 )             /* x1 (normalized) | x0 (normalized)  */
3381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
339946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM6, REGOFF(-16, EAX) ) /* write r0, r1                      */
3401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM7 )             /*                 | x2 (normalized)  */
3411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
342946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM7, REGOFF(-8, EAX) ) /* write r2                           */
34386e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TNNR_norm) )
3441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_exit_3dnow):
3471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
3481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNNR_end):
3501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
3511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
3521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
3531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
3541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
3611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_rescale_normals_no_rot)
362932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_rescale_normals_no_rot)
3631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_rescale_normals_no_rot):
3641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
365caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef FRAME_OFFSET
366caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
3671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
3691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
3701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
3711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, EAX )
3731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EDX )
374854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, EAX), EBP ) /*  dest->count = in->count   */
375854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EDX) )
3761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
3771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
3781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
379854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EDX), EAX ) /*  dest->start  */
380854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
3811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP )
3831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TRNR_end) )
3841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
3861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM6 )       /*               | scale              */
3881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM6, MM6 )             /* scale         | scale              */
3891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(ECX), MM0 )     /*               | m0                 */
3911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(20, ECX), MM0 ) /* m5            | m0                 */
3921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM0 )             /* scale*m5      | scale*m0           */
3941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM2 ) /*               | m10                */
3951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM2 )             /*               | scale*m10          */
3971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
3981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
3991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TRNR_rescale):
4001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
40245d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
40345d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM4 )     /* x1            | x0                 */
40445d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM5 )  /*               | x2                 */
40545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
4061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* x1*m5         | x0*m0              */
4071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                        */
4081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
4101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM5 )             /*               | x2*m10             */
412946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
4131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
41486e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /* decrement normal counter           */
415946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM4, REGOFF(-16, EAX) ) /* write r0, r1                      */
4161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
417946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM5, REGOFF(-8, EAX) ) /* write r2                           */
41886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TRNR_rescale) ) /* cnt > 0 ? -> process next normal  */
4191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
4211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TRNR_end):
4231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
4241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
4251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
4261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
4271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
4331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_rescale_normals)
434932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_rescale_normals)
4351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_rescale_normals):
4361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
437caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
438caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
4391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
4411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
4421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
4441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
4451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
446854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
447854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
448854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
449854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
4501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
4511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )
4531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TR_end) )
4541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
4561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(ECX), MM3 )     /* m1            | m0                 */
4581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(16,ECX), MM4 )  /* m5            | m4                 */
4601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /* scale       */
4611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8,ECX), MM5 )   /*               | m2                 */
4631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )             /* scale         | scale              */
4641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(24, ECX), MM5 )
4661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* scale*m1      | scale*m0           */
4671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4681b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(32, ECX), MM6 ) /* m9            | m8*/
4691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* scale*m5      | scale*m4           */
4701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM7 ) /*               | m10                */
4721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM5 )             /* scale*m6      | scale*m2           */
4731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM6 )             /* scale*m9      | scale*m8           */
4751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM7 )             /*               | scale*m10          */
4771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
4791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TR_rescale):
4801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
4821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
48345d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM0 )     /* x1            | x0                 */
48445d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
48545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
4861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /* x1            | x0                 */
4871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* x2            | x2                 */
4881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1*m1         | x0*m0              */
490946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
4911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /* x1*m5         | x0*m4              */
4931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /* x0*m4+x1*m5   | x0*m0+x1*m1        */
4941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(EDX), MM1 )     /* x1            | x0                 */
4961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
4971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /* x2*m6         | x2*m2              */
4981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4...+x2*m6| x0*m0+x1*m1+x2*m2  */
4991b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
5011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal                    */
5021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
5041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
505946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                      */
5061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8              */
5071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10             */
5091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /* *not used*    | x0*m8+x1*m9        */
5101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /* *not used*    | x0*m8+x1*m9+x2*m10 */
512946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write r2                           */
5131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
51486e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EDI )        /* decrement normal counter           */
51586e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TR_rescale) )
5161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TR_end):
5201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( ESI )
5211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( EDI )
5221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
5231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
5311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normals_no_rot)
532932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_normals_no_rot)
5331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normals_no_rot):
5341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
535caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
536caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
5371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
5391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
5401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
5421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
5431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
544854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
545854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
546854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
547854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
5481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
5491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )
5511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3TNR_end) )
5521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(ECX), MM0 )     /*               | m0                 */
5561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(20, ECX), MM0 ) /* m5            | m0                 */
5571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM2 ) /*               | m10                */
5591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* m10           | m10                */
5601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
5621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNR_transform):
5631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
5651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
56645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM4 )     /* x1            | x0                 */
56745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM5 )  /*               | x2                 */
56845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
5691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM4 )             /* x1*m5         | x0*m0              */
5701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX)           /* next normal      */
5711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
5731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM2, MM5 )             /*               | x2*m10             */
575946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
5761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
57786e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EDI )        /* decrement normal counter           */
578946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM4, REGOFF(-16, EAX) ) /* write r0, r1                      */
5791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
580946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM5, REGOFF(-8, EAX) ) /* write r2                           */
58186e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3TNR_transform) )
5821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
5841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3TNR_end):
5861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( ESI )
5871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L       ( EDI )
5881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
5891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5961b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
5971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
5981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_transform_normals)
599932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_transform_normals)
6001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_transform_normals):
6011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
602caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
603caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
6041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
6061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
6071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
6091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
6101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_MAT, ECX )
611854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDI ) /*  dest->count = in->count   */
612854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDI, REGOFF(V4F_COUNT, EAX) )
613854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
614854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), EDX ) /*  in->start    */
6151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( REGOFF(MATRIX_INV, ECX), ECX ) /*  mat->inv     */
6161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDI )        /* count > 0 ??                       */
6181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3T_end) )
6191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
6211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(ECX), MM3 )     /* m1            | m0                 */
6231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(16, ECX), MM4 ) /* m5            | m4                 */
6241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, ECX), MM5 )  /*               | m2                 */
6261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( REGOFF(24, ECX), MM5 ) /* m6            | m2                 */
6271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGOFF(32, ECX), MM6 ) /* m9            | m8                 */
6291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(40, ECX), MM7 ) /*               | m10                */
6301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
6321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3T_transform):
6331b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
6351b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
63645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(EDX), MM0 )     /* x1            | x0                 */
63745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
63845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
6391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, MM1 )             /* x1            | x0                 */
6401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM2, MM2 )             /* x2            | x2                 */
6411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1*m1         | x0*m0              */
643946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
6441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM4, MM1 )             /* x1*m5         | x0*m4              */
6461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM0 )             /* x0*m4+x1*m5   | x0*m0+x1*m1        */
6471b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6481b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM2 )             /* x2*m6         | x2*m2              */
6491b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM0 )             /* x0*m4...+x2*m6| x0*m0+x1*m1+x2*m2  */
6501b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6511b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( REGIND(EDX), MM1 )     /* x1            | x0                 */
652946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write r0, r1                      */
6531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM6, MM1 )             /* x1*m9         | x0*m8              */
6551b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGOFF(8, EDX), MM2 )  /*               | x2                 */
6561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM7, MM2 )             /*               | x2*m10             */
6581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, EDX )          /* next normal               */
6591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EDX) )
6611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM1, MM1 )             /* *not used*    | x0*m8+x1*m9        */
6631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM2, MM1 )             /* *not used*    | x0*m8+x1*m9+x2*m10 */
6641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
665946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write r2                           */
66686e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EDI )        /* decrement normal counter           */
66745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
66886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3T_transform) )
6691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
6711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3T_end):
6731b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L  ( ESI )
6741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L  ( EDI )
6751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
6761b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6781b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
6831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_normalize_normals)
684932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_normalize_normals)
6851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_normalize_normals):
6861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
687caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
688caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 12
6891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
6911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
6921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EBP )
6931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
6941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
6951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
696854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EBP ) /*  dest->count = in->count   */
697854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EBP, REGOFF(V4F_COUNT, EAX) )
698854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
699854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), ECX ) /*  in->start    */
7001b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_LENGTHS, EDX )
7011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EBP ) /* count > 0 ?? */
7031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3N_end) )
7041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
7061b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7071b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDX )        /* lengths == 0 ?                     */
7081b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3N_norm2) )     /* calculate lengths                  */
7091b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
7111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_norm1):                       /* use precalculated lengths          */
7121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(EAX) )
7141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
71545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM0 )     /* x1              | x0               */
71645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM1 )  /*                 | x2               */
71745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
7181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( REGIND(EDX), MM3 )     /*                 | length (x)       */
7191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM1 )             /*                 | x2 (normalized)  */
7201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )             /* length (x)      | length (x)       */
7221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, ECX )          /* next normal            */
7231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7241b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
7251b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7261b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM3, MM0 )             /* x1 (normalized) | x0 (normalized)  */
7271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM0, REGIND(EAX) )     /* write new x0, x1                   */
7281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( MM1, REGOFF(8, EAX) )  /* write new x2                       */
730946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
7311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( CONST(4), EDX )        /* next length                        */
73386e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /* decrement normal counter           */
7341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
73586e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3N_norm1) )
7361b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JMP        ( LLBL (G3N_end1) )
7381b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7391b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
7401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_norm2):                       /* need to calculate lengths          */
7411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
7431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
7451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
74645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM0 )     /* x1              | x0               */
74745d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM1 )  /*                 | x2               */
74845d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
7494c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul    MOVQ       ( MM0, MM3 )             /* x1              | x0               */
7504c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul    ADD_L      ( STRIDE, ECX )          /* next normal    */
7514c3bb69a94d665b794e38024d7e99ef4722adb72Brian Paul
7521b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM3 )             /* x1*x1           | x0*x0            */
7531b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM1, MM4 )             /*                 | x2               */
7541b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
755946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
7561b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM1, MM4 )             /*                 | x2*x2            */
7571b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7581b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFADD      ( MM4, MM3 )             /*                 | x0*x0+x2*x2      */
7591b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFACC      ( MM3, MM3 )             /* x0*x0+...+x2*x2 | x0*x0+x1*x1+x2*x2*/
7601b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7611b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQRT    ( MM3, MM5 )             /* 1/sqrt (x0*x0+x1*x1+x2*x2)         */
7621b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVQ       ( MM5, MM4 )
7631b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7641b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM3, MM3 )
7651b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM5 )
7661b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7671b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRSQIT1   ( MM3, MM5 )
76886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EBP )        /* decrement normal counter           */
7691b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7701b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFRCPIT2   ( MM4, MM5 )
7711b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7721b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM0 )             /* x1 (normalized) | x0 (normalized)  */
773946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM0, REGOFF(-16, EAX) ) /* write new x0, x1                  */
7741b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7751b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM5, MM1 )             /*                 | x2 (normalized)  */
776946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM1, REGOFF(-8, EAX) ) /* write new x2                       */
7771b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
77886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3N_norm2) )
7791b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7801b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_end1):
7811b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
7821b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7831b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3N_end):
7841b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EBP )
7851b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
7861b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
7871b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
7881b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7891b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7901b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7911b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7921b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7931b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
7941b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT16
7951b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLOBL GLNAME(_mesa_3dnow_rescale_normals)
796932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN(_mesa_3dnow_rescale_normals)
7971b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesGLNAME(_mesa_3dnow_rescale_normals):
7981b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
799caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#undef  FRAME_OFFSET
800caa5f7e75ecdbfa8bae03acfb9369a77baa7833eAlan Hourihane#define FRAME_OFFSET 8
8011b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( EDI )
8021b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUSH_L     ( ESI )
8031b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8041b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_IN, ESI )
8051b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOV_L      ( ARG_DEST, EAX )
806854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_COUNT, ESI), EDX ) /*  dest->count = in->count   */
807854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( EDX, REGOFF(V4F_COUNT, EAX) )
808854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, EAX), EAX ) /*  dest->start  */
809854b4a3b5456e0a381df49de854fdb315899dfc2Daniel Borca    MOV_L      ( REGOFF(V4F_START, ESI), ECX ) /*  in->start    */
8101b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8111b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    CMP_L      ( CONST(0), EDX )
8121b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    JE         ( LLBL (G3R_end) )
8131b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8141b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
8151b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8161b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    MOVD       ( ARG_SCALE, MM0 )       /* scale                              */
8171b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PUNPCKLDQ  ( MM0, MM0 )
8181b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8191b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesALIGNTEXT32
8201b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3R_rescale):
8211b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8221b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCHW  ( REGIND(EAX) )
8231b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
82445d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVQ       ( REGIND(ECX), MM1 )     /* x1            | x0                 */
82545d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul    MOVD       ( REGOFF(8, ECX), MM2 )  /*               | x2                 */
82645d21ca58755098e8fd47e1083c68e244c4f903cBrian Paul
8271b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM1 )             /* x1*scale      | x0*scale           */
8281b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    ADD_L      ( STRIDE, ECX )          /* next normal                  */
8291b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8301b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PREFETCH   ( REGIND(ECX) )
8311b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8321b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    PFMUL      ( MM0, MM2 )             /*               | x2*scale           */
833946ad2720a00696a59a253d81110ea96d397a463Brian Paul    ADD_L      ( CONST(16), EAX )       /* next r                             */
8341b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
835946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVQ       ( MM1, REGOFF(-16, EAX) ) /* write r0, r1                      */
836946ad2720a00696a59a253d81110ea96d397a463Brian Paul    MOVD       ( MM2, REGOFF(-8, EAX) ) /* write r2                           */
8371b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
83886e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    SUB_L      ( CONST(1), EDX )        /* decrement normal counter           */
83986e4f52f3c0f79592c49f7fb4182b500b15431d7Patrick Baggett    JNZ        ( LLBL (G3R_rescale) )
8401b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8411b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    FEMMS
8421b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes
8431b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth HughesLLBL (G3R_end):
8441b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( ESI )
8451b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    POP_L      ( EDI )
8461b2fef5c28a40cd001598071e25b876ad4fccdd1Gareth Hughes    RET
847462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane
848462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif
849fcdc6a7d2488defd66bc7e8398c6d8c9a6190a1aKristian Høgsberg
850fcdc6a7d2488defd66bc7e8398c6d8c9a6190a1aKristian Høgsberg#if defined (__ELF__) && defined (__linux__)
851fcdc6a7d2488defd66bc7e8398c6d8c9a6190a1aKristian Høgsberg	.section .note.GNU-stack,"",%progbits
852fcdc6a7d2488defd66bc7e8398c6d8c9a6190a1aKristian Høgsberg#endif
853