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