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